@payloadcms/payload-cloud 3.17.1 → 3.18.0-canary.030d28e

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/email.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { nodemailerAdapter } from '@payloadcms/email-nodemailer';
2
2
  import type { PayloadCloudEmailOptions } from './types.js';
3
3
  type NodemailerAdapter = ReturnType<typeof nodemailerAdapter>;
4
- export declare const payloadCloudEmail: (args: PayloadCloudEmailOptions) => Promise<NodemailerAdapter> | undefined;
4
+ export declare const payloadCloudEmail: (args: PayloadCloudEmailOptions) => Promise<NodemailerAdapter | undefined>;
5
5
  export {};
6
6
  //# sourceMappingURL=email.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAGhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAE1D,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE7D,eAAO,MAAM,iBAAiB,SACtB,wBAAwB,KAC7B,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAyD/B,CAAA"}
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAGhE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAE1D,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE7D,eAAO,MAAM,iBAAiB,SACtB,wBAAwB,KAC7B,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAyDvC,CAAA"}
package/dist/email.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/email.ts"],"sourcesContent":["import { nodemailerAdapter } from '@payloadcms/email-nodemailer'\nimport nodemailer from 'nodemailer'\n\nimport type { PayloadCloudEmailOptions } from './types.js'\n\ntype NodemailerAdapter = ReturnType<typeof nodemailerAdapter>\n\nexport const payloadCloudEmail = async (\n args: PayloadCloudEmailOptions,\n): Promise<NodemailerAdapter> | undefined => {\n if (process.env.PAYLOAD_CLOUD !== 'true' || !args) {\n return undefined\n }\n\n if (!args.apiKey) {\n throw new Error('apiKey must be provided to use Payload Cloud Email')\n }\n if (!args.defaultDomain) {\n throw new Error('defaultDomain must be provided to use Payload Cloud Email')\n }\n\n // Check if already has email configuration\n\n if (args.config.email) {\n // eslint-disable-next-line no-console\n console.log(\n 'Payload Cloud Email is enabled but email configuration is already provided in Payload config. If this is intentional, set `email: false` in the Payload Cloud plugin options.',\n )\n return args.config.email\n }\n\n const { apiKey, defaultDomain, skipVerify } = args\n\n const customDomainEnvs = Object.keys(process.env).filter(\n (e) => e.startsWith('PAYLOAD_CLOUD_EMAIL_DOMAIN_') && !e.endsWith('API_KEY'),\n )\n\n const customDomains = customDomainEnvs.map((e) => process.env[e]).filter(Boolean)\n\n if (customDomains.length) {\n // eslint-disable-next-line no-console\n console.log(\n `Configuring Payload Cloud Email for ${[defaultDomain, ...(customDomains || [])].join(', ')}`,\n )\n }\n\n const defaultFromName = args.defaultFromName || 'Payload CMS'\n const defaultFromAddress =\n args.defaultFromAddress || `cms@${customDomains.length ? customDomains[0] : defaultDomain}`\n\n const emailAdapter = await nodemailerAdapter({\n defaultFromAddress,\n defaultFromName,\n skipVerify,\n transport: nodemailer.createTransport({\n auth: {\n pass: apiKey,\n user: 'resend',\n },\n host: 'smtp.resend.com',\n port: 465,\n secure: true,\n }),\n })\n\n return emailAdapter\n}\n"],"names":["nodemailerAdapter","nodemailer","payloadCloudEmail","args","process","env","PAYLOAD_CLOUD","undefined","apiKey","Error","defaultDomain","config","email","console","log","skipVerify","customDomainEnvs","Object","keys","filter","e","startsWith","endsWith","customDomains","map","Boolean","length","join","defaultFromName","defaultFromAddress","emailAdapter","transport","createTransport","auth","pass","user","host","port","secure"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,+BAA8B;AAChE,OAAOC,gBAAgB,aAAY;AAMnC,OAAO,MAAMC,oBAAoB,OAC/BC;IAEA,IAAIC,QAAQC,GAAG,CAACC,aAAa,KAAK,UAAU,CAACH,MAAM;QACjD,OAAOI;IACT;IAEA,IAAI,CAACJ,KAAKK,MAAM,EAAE;QAChB,MAAM,IAAIC,MAAM;IAClB;IACA,IAAI,CAACN,KAAKO,aAAa,EAAE;QACvB,MAAM,IAAID,MAAM;IAClB;IAEA,2CAA2C;IAE3C,IAAIN,KAAKQ,MAAM,CAACC,KAAK,EAAE;QACrB,sCAAsC;QACtCC,QAAQC,GAAG,CACT;QAEF,OAAOX,KAAKQ,MAAM,CAACC,KAAK;IAC1B;IAEA,MAAM,EAAEJ,MAAM,EAAEE,aAAa,EAAEK,UAAU,EAAE,GAAGZ;IAE9C,MAAMa,mBAAmBC,OAAOC,IAAI,CAACd,QAAQC,GAAG,EAAEc,MAAM,CACtD,CAACC,IAAMA,EAAEC,UAAU,CAAC,kCAAkC,CAACD,EAAEE,QAAQ,CAAC;IAGpE,MAAMC,gBAAgBP,iBAAiBQ,GAAG,CAAC,CAACJ,IAAMhB,QAAQC,GAAG,CAACe,EAAE,EAAED,MAAM,CAACM;IAEzE,IAAIF,cAAcG,MAAM,EAAE;QACxB,sCAAsC;QACtCb,QAAQC,GAAG,CACT,CAAC,oCAAoC,EAAE;YAACJ;eAAmBa,iBAAiB,EAAE;SAAE,CAACI,IAAI,CAAC,OAAO;IAEjG;IAEA,MAAMC,kBAAkBzB,KAAKyB,eAAe,IAAI;IAChD,MAAMC,qBACJ1B,KAAK0B,kBAAkB,IAAI,CAAC,IAAI,EAAEN,cAAcG,MAAM,GAAGH,aAAa,CAAC,EAAE,GAAGb,eAAe;IAE7F,MAAMoB,eAAe,MAAM9B,kBAAkB;QAC3C6B;QACAD;QACAb;QACAgB,WAAW9B,WAAW+B,eAAe,CAAC;YACpCC,MAAM;gBACJC,MAAM1B;gBACN2B,MAAM;YACR;YACAC,MAAM;YACNC,MAAM;YACNC,QAAQ;QACV;IACF;IAEA,OAAOR;AACT,EAAC"}
1
+ {"version":3,"sources":["../src/email.ts"],"sourcesContent":["import { nodemailerAdapter } from '@payloadcms/email-nodemailer'\nimport nodemailer from 'nodemailer'\n\nimport type { PayloadCloudEmailOptions } from './types.js'\n\ntype NodemailerAdapter = ReturnType<typeof nodemailerAdapter>\n\nexport const payloadCloudEmail = async (\n args: PayloadCloudEmailOptions,\n): Promise<NodemailerAdapter | undefined> => {\n if (process.env.PAYLOAD_CLOUD !== 'true' || !args) {\n return undefined\n }\n\n if (!args.apiKey) {\n throw new Error('apiKey must be provided to use Payload Cloud Email')\n }\n if (!args.defaultDomain) {\n throw new Error('defaultDomain must be provided to use Payload Cloud Email')\n }\n\n // Check if already has email configuration\n\n if (args.config.email) {\n // eslint-disable-next-line no-console\n console.log(\n 'Payload Cloud Email is enabled but email configuration is already provided in Payload config. If this is intentional, set `email: false` in the Payload Cloud plugin options.',\n )\n return args.config.email\n }\n\n const { apiKey, defaultDomain, skipVerify } = args\n\n const customDomainEnvs = Object.keys(process.env).filter(\n (e) => e.startsWith('PAYLOAD_CLOUD_EMAIL_DOMAIN_') && !e.endsWith('API_KEY'),\n )\n\n const customDomains = customDomainEnvs.map((e) => process.env[e]).filter(Boolean)\n\n if (customDomains.length) {\n // eslint-disable-next-line no-console\n console.log(\n `Configuring Payload Cloud Email for ${[defaultDomain, ...(customDomains || [])].join(', ')}`,\n )\n }\n\n const defaultFromName = args.defaultFromName || 'Payload CMS'\n const defaultFromAddress =\n args.defaultFromAddress || `cms@${customDomains.length ? customDomains[0] : defaultDomain}`\n\n const emailAdapter = await nodemailerAdapter({\n defaultFromAddress,\n defaultFromName,\n skipVerify,\n transport: nodemailer.createTransport({\n auth: {\n pass: apiKey,\n user: 'resend',\n },\n host: 'smtp.resend.com',\n port: 465,\n secure: true,\n }),\n })\n\n return emailAdapter\n}\n"],"names":["nodemailerAdapter","nodemailer","payloadCloudEmail","args","process","env","PAYLOAD_CLOUD","undefined","apiKey","Error","defaultDomain","config","email","console","log","skipVerify","customDomainEnvs","Object","keys","filter","e","startsWith","endsWith","customDomains","map","Boolean","length","join","defaultFromName","defaultFromAddress","emailAdapter","transport","createTransport","auth","pass","user","host","port","secure"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,+BAA8B;AAChE,OAAOC,gBAAgB,aAAY;AAMnC,OAAO,MAAMC,oBAAoB,OAC/BC;IAEA,IAAIC,QAAQC,GAAG,CAACC,aAAa,KAAK,UAAU,CAACH,MAAM;QACjD,OAAOI;IACT;IAEA,IAAI,CAACJ,KAAKK,MAAM,EAAE;QAChB,MAAM,IAAIC,MAAM;IAClB;IACA,IAAI,CAACN,KAAKO,aAAa,EAAE;QACvB,MAAM,IAAID,MAAM;IAClB;IAEA,2CAA2C;IAE3C,IAAIN,KAAKQ,MAAM,CAACC,KAAK,EAAE;QACrB,sCAAsC;QACtCC,QAAQC,GAAG,CACT;QAEF,OAAOX,KAAKQ,MAAM,CAACC,KAAK;IAC1B;IAEA,MAAM,EAAEJ,MAAM,EAAEE,aAAa,EAAEK,UAAU,EAAE,GAAGZ;IAE9C,MAAMa,mBAAmBC,OAAOC,IAAI,CAACd,QAAQC,GAAG,EAAEc,MAAM,CACtD,CAACC,IAAMA,EAAEC,UAAU,CAAC,kCAAkC,CAACD,EAAEE,QAAQ,CAAC;IAGpE,MAAMC,gBAAgBP,iBAAiBQ,GAAG,CAAC,CAACJ,IAAMhB,QAAQC,GAAG,CAACe,EAAE,EAAED,MAAM,CAACM;IAEzE,IAAIF,cAAcG,MAAM,EAAE;QACxB,sCAAsC;QACtCb,QAAQC,GAAG,CACT,CAAC,oCAAoC,EAAE;YAACJ;eAAmBa,iBAAiB,EAAE;SAAE,CAACI,IAAI,CAAC,OAAO;IAEjG;IAEA,MAAMC,kBAAkBzB,KAAKyB,eAAe,IAAI;IAChD,MAAMC,qBACJ1B,KAAK0B,kBAAkB,IAAI,CAAC,IAAI,EAAEN,cAAcG,MAAM,GAAGH,aAAa,CAAC,EAAE,GAAGb,eAAe;IAE7F,MAAMoB,eAAe,MAAM9B,kBAAkB;QAC3C6B;QACAD;QACAb;QACAgB,WAAW9B,WAAW+B,eAAe,CAAC;YACpCC,MAAM;gBACJC,MAAM1B;gBACN2B,MAAM;YACR;YACAC,MAAM;YACNC,MAAM;YACNC,QAAQ;QACV;IACF;IAEA,OAAOR;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"afterDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEhG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKjD,UAAU,IAAI;IACZ,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAED,eAAO,MAAM,kBAAkB,oBAE5B,IAAI,KAAG,yBAAyB,CAAC,QAAQ,GAAG,UAAU,GAAG,cAAc,CA0BzE,CAAA"}
1
+ {"version":3,"file":"afterDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEhG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKjD,UAAU,IAAI;IACZ,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAED,eAAO,MAAM,kBAAkB,oBAE5B,IAAI,KAAG,yBAAyB,CAAC,QAAQ,GAAG,UAAU,GAAG,cAAc,CA4BzE,CAAA"}
@@ -5,8 +5,8 @@ export const getAfterDeleteHook = ({ collection })=>{
5
5
  try {
6
6
  const { identityID, storageClient } = await getStorageClient();
7
7
  const filesToDelete = [
8
- doc.filename,
9
- ...Object.values(doc?.sizes || []).map((resizedFileData)=>resizedFileData?.filename)
8
+ doc.filename || '',
9
+ ...Object.values(doc?.sizes || []).map((resizedFileData)=>resizedFileData.filename).filter((filename)=>filename !== null)
10
10
  ];
11
11
  const promises = filesToDelete.map(async (filename)=>{
12
12
  await storageClient.deleteObject({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/afterDelete.ts"],"sourcesContent":["import type { CollectionAfterDeleteHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport type { TypeWithPrefix } from '../types.js'\n\nimport { createKey } from '../utilities/createKey.js'\nimport { getStorageClient } from '../utilities/getStorageClient.js'\n\ninterface Args {\n collection: CollectionConfig\n}\n\nexport const getAfterDeleteHook = ({\n collection,\n}: Args): CollectionAfterDeleteHook<FileData & TypeWithID & TypeWithPrefix> => {\n return async ({ doc, req }) => {\n try {\n const { identityID, storageClient } = await getStorageClient()\n\n const filesToDelete: string[] = [\n doc.filename,\n ...Object.values(doc?.sizes || []).map((resizedFileData) => resizedFileData?.filename),\n ]\n\n const promises = filesToDelete.map(async (filename) => {\n await storageClient.deleteObject({\n Bucket: process.env.PAYLOAD_CLOUD_BUCKET,\n Key: createKey({ collection: collection.slug, filename, identityID }),\n })\n })\n\n await Promise.all(promises)\n } catch (err: unknown) {\n req.payload.logger.error(\n `There was an error while deleting files corresponding to the ${collection.labels?.singular} with ID ${doc.id}:`,\n )\n req.payload.logger.error(err)\n }\n return doc\n }\n}\n"],"names":["createKey","getStorageClient","getAfterDeleteHook","collection","doc","req","identityID","storageClient","filesToDelete","filename","Object","values","sizes","map","resizedFileData","promises","deleteObject","Bucket","process","env","PAYLOAD_CLOUD_BUCKET","Key","slug","Promise","all","err","payload","logger","error","labels","singular","id"],"mappings":"AAIA,SAASA,SAAS,QAAQ,4BAA2B;AACrD,SAASC,gBAAgB,QAAQ,mCAAkC;AAMnE,OAAO,MAAMC,qBAAqB,CAAC,EACjCC,UAAU,EACL;IACL,OAAO,OAAO,EAAEC,GAAG,EAAEC,GAAG,EAAE;QACxB,IAAI;YACF,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAG,MAAMN;YAE5C,MAAMO,gBAA0B;gBAC9BJ,IAAIK,QAAQ;mBACTC,OAAOC,MAAM,CAACP,KAAKQ,SAAS,EAAE,EAAEC,GAAG,CAAC,CAACC,kBAAoBA,iBAAiBL;aAC9E;YAED,MAAMM,WAAWP,cAAcK,GAAG,CAAC,OAAOJ;gBACxC,MAAMF,cAAcS,YAAY,CAAC;oBAC/BC,QAAQC,QAAQC,GAAG,CAACC,oBAAoB;oBACxCC,KAAKrB,UAAU;wBAAEG,YAAYA,WAAWmB,IAAI;wBAAEb;wBAAUH;oBAAW;gBACrE;YACF;YAEA,MAAMiB,QAAQC,GAAG,CAACT;QACpB,EAAE,OAAOU,KAAc;YACrBpB,IAAIqB,OAAO,CAACC,MAAM,CAACC,KAAK,CACtB,CAAC,6DAA6D,EAAEzB,WAAW0B,MAAM,EAAEC,SAAS,SAAS,EAAE1B,IAAI2B,EAAE,CAAC,CAAC,CAAC;YAElH1B,IAAIqB,OAAO,CAACC,MAAM,CAACC,KAAK,CAACH;QAC3B;QACA,OAAOrB;IACT;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/afterDelete.ts"],"sourcesContent":["import type { CollectionAfterDeleteHook, CollectionConfig, FileData, TypeWithID } from 'payload'\n\nimport type { TypeWithPrefix } from '../types.js'\n\nimport { createKey } from '../utilities/createKey.js'\nimport { getStorageClient } from '../utilities/getStorageClient.js'\n\ninterface Args {\n collection: CollectionConfig\n}\n\nexport const getAfterDeleteHook = ({\n collection,\n}: Args): CollectionAfterDeleteHook<FileData & TypeWithID & TypeWithPrefix> => {\n return async ({ doc, req }) => {\n try {\n const { identityID, storageClient } = await getStorageClient()\n\n const filesToDelete: string[] = [\n doc.filename || '',\n ...Object.values(doc?.sizes || [])\n .map((resizedFileData) => resizedFileData.filename)\n .filter((filename): filename is string => filename !== null),\n ]\n\n const promises = filesToDelete.map(async (filename) => {\n await storageClient.deleteObject({\n Bucket: process.env.PAYLOAD_CLOUD_BUCKET,\n Key: createKey({ collection: collection.slug, filename, identityID }),\n })\n })\n\n await Promise.all(promises)\n } catch (err: unknown) {\n req.payload.logger.error(\n `There was an error while deleting files corresponding to the ${collection.labels?.singular} with ID ${doc.id}:`,\n )\n req.payload.logger.error(err)\n }\n return doc\n }\n}\n"],"names":["createKey","getStorageClient","getAfterDeleteHook","collection","doc","req","identityID","storageClient","filesToDelete","filename","Object","values","sizes","map","resizedFileData","filter","promises","deleteObject","Bucket","process","env","PAYLOAD_CLOUD_BUCKET","Key","slug","Promise","all","err","payload","logger","error","labels","singular","id"],"mappings":"AAIA,SAASA,SAAS,QAAQ,4BAA2B;AACrD,SAASC,gBAAgB,QAAQ,mCAAkC;AAMnE,OAAO,MAAMC,qBAAqB,CAAC,EACjCC,UAAU,EACL;IACL,OAAO,OAAO,EAAEC,GAAG,EAAEC,GAAG,EAAE;QACxB,IAAI;YACF,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAE,GAAG,MAAMN;YAE5C,MAAMO,gBAA0B;gBAC9BJ,IAAIK,QAAQ,IAAI;mBACbC,OAAOC,MAAM,CAACP,KAAKQ,SAAS,EAAE,EAC9BC,GAAG,CAAC,CAACC,kBAAoBA,gBAAgBL,QAAQ,EACjDM,MAAM,CAAC,CAACN,WAAiCA,aAAa;aAC1D;YAED,MAAMO,WAAWR,cAAcK,GAAG,CAAC,OAAOJ;gBACxC,MAAMF,cAAcU,YAAY,CAAC;oBAC/BC,QAAQC,QAAQC,GAAG,CAACC,oBAAoB;oBACxCC,KAAKtB,UAAU;wBAAEG,YAAYA,WAAWoB,IAAI;wBAAEd;wBAAUH;oBAAW;gBACrE;YACF;YAEA,MAAMkB,QAAQC,GAAG,CAACT;QACpB,EAAE,OAAOU,KAAc;YACrBrB,IAAIsB,OAAO,CAACC,MAAM,CAACC,KAAK,CACtB,CAAC,6DAA6D,EAAE1B,WAAW2B,MAAM,EAAEC,SAAS,SAAS,EAAE3B,IAAI4B,EAAE,CAAC,CAAC,CAAC;YAElH3B,IAAIsB,OAAO,CAACC,MAAM,CAACC,KAAK,CAACH;QAC3B;QACA,OAAOtB;IACT;AACF,EAAC"}
package/dist/plugin.js CHANGED
@@ -115,7 +115,7 @@ export const payloadCloudPlugin = (pluginOptions)=>async (incomingConfig)=>{
115
115
  if (pluginOptions?.enableAutoRun === false || !config.jobs) {
116
116
  return config;
117
117
  }
118
- const oldAutoRunCopy = config.jobs.autoRun;
118
+ const oldAutoRunCopy = config.jobs.autoRun ?? [];
119
119
  const newAutoRun = async (payload)=>{
120
120
  const instance = generateRandomString();
121
121
  await payload.updateGlobal({
@@ -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 (every minute)',\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 newAutoRun = async (payload: Payload) => {\n const instance = generateRandomString()\n\n await payload.updateGlobal({\n slug: 'payload-cloud-instance',\n data: {\n instance,\n },\n })\n\n await waitRandomTime()\n\n const cloudInstance = await payload.findGlobal({\n slug: 'payload-cloud-instance',\n })\n\n if (cloudInstance.instance !== instance) {\n return []\n }\n if (!config.jobs?.autoRun) {\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\nfunction waitRandomTime(): Promise<void> {\n const min = 1000 // 1 second in milliseconds\n const max = 5000 // 5 seconds in milliseconds\n const randomTime = Math.floor(Math.random() * (max - min + 1)) + min\n\n return new Promise((resolve) => setTimeout(resolve, randomTime))\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","newAutoRun","payload","instance","updateGlobal","data","waitRandomTime","cloudInstance","findGlobal","min","max","randomTime","Promise","resolve","setTimeout"],"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 }),\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 (every minute)',\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 newAutoRun = async (payload: Payload) => {\n const instance = generateRandomString()\n\n await payload.updateGlobal({\n slug: 'payload-cloud-instance',\n data: {\n instance,\n },\n })\n\n await waitRandomTime()\n\n const cloudInstance = await payload.findGlobal({\n slug: 'payload-cloud-instance',\n })\n\n if (cloudInstance.instance !== instance) {\n return []\n }\n if (!config.jobs?.autoRun) {\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\nfunction waitRandomTime(): Promise<void> {\n const min = 1000 // 1 second in milliseconds\n const max = 5000 // 5 seconds in milliseconds\n const randomTime = Math.floor(Math.random() * (max - min + 1)) + min\n\n return new Promise((resolve) => setTimeout(resolve, randomTime))\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","newAutoRun","payload","instance","updateGlobal","data","waitRandomTime","cloudInstance","findGlobal","min","max","randomTime","Promise","resolve","setTimeout"],"mappings":"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"}
@@ -33,7 +33,7 @@ export const getStaticHandler = ({ cachingOptions, collection })=>{
33
33
  Bucket: process.env.PAYLOAD_CLOUD_BUCKET,
34
34
  Key: key
35
35
  });
36
- if (!object.Body) {
36
+ if (!object.Body || !object.ContentType || !object.ETag) {
37
37
  return new Response(null, {
38
38
  status: 404,
39
39
  statusText: 'Not Found'
@@ -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) => {\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) {\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","Response","status","statusText","bodyBuffer","headers","Headers","String","ContentLength","ContentType","ETag","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,EAAE;gBAChB,OAAO,IAAIC,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEA,MAAMC,aAAa,MAAMnC,eAAe0B,OAAOK,IAAI;YAEnD,OAAO,IAAIC,SAASG,YAAY;gBAC9BC,SAAS,IAAIC,QAAQ;oBACnB,kBAAkBC,OAAOZ,OAAOa,aAAa;oBAC7C,gBAAgBb,OAAOc,WAAW;oBAClC,GAAIzB,kBAAkB;wBAAE,iBAAiB,CAAC,gBAAgB,EAAEJ,QAAQ;oBAAC,CAAC;oBACtE8B,MAAMf,OAAOe,IAAI;gBACnB;gBACAR,QAAQ;YACV;QACF,EAAE,OAAOS,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,IAAIU,SAAS,MAAM;oBAAEC,QAAQ;oBAAKC,YAAY;gBAAY;YACnE;YAEAd,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,IAAIU,SAAS,yBAAyB;gBAAEC,QAAQ;YAAI;QAC7D;IACF;AACF,EAAC"}
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 +1 @@
1
- {"version":3,"file":"authAsCognitoUser.d.ts","sourceRoot":"","sources":["../../src/utilities/authAsCognitoUser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAMpE,eAAO,MAAM,iBAAiB,aAClB,MAAM,YACN,MAAM,KACf,OAAO,CAAC,kBAAkB,CAmC5B,CAAA"}
1
+ {"version":3,"file":"authAsCognitoUser.d.ts","sourceRoot":"","sources":["../../src/utilities/authAsCognitoUser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAMpE,eAAO,MAAM,iBAAiB,aAClB,MAAM,YACN,MAAM,KACf,OAAO,CAAC,kBAAkB,CA0C5B,CAAA"}
@@ -5,6 +5,12 @@ export const authAsCognitoUser = async (username, password)=>{
5
5
  if (sessionAndToken?.isValid()) {
6
6
  return sessionAndToken;
7
7
  }
8
+ if (!process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID) {
9
+ throw new Error('PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID is required');
10
+ }
11
+ if (!process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID) {
12
+ throw new Error('PAYLOAD_CLOUD_COGNITO_USER_POOL_ID is required');
13
+ }
8
14
  const userPool = new CognitoUserPool({
9
15
  ClientId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID,
10
16
  UserPoolId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/authAsCognitoUser.ts"],"sourcesContent":["import type { CognitoUserSession } from 'amazon-cognito-identity-js'\n\nimport { AuthenticationDetails, CognitoUser, CognitoUserPool } from 'amazon-cognito-identity-js'\n\nlet sessionAndToken: CognitoUserSession | null = null\n\nexport const authAsCognitoUser = async (\n username: string,\n password: string,\n): Promise<CognitoUserSession> => {\n // TODO: Check that isValid evaluates expiration\n if (sessionAndToken?.isValid()) {\n return sessionAndToken\n }\n\n const userPool = new CognitoUserPool({\n ClientId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID,\n UserPoolId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID,\n })\n\n const authenticationDetails = new AuthenticationDetails({\n Password: password,\n Username: username,\n })\n\n const cognitoUser = new CognitoUser({\n Pool: userPool,\n Username: username,\n })\n\n const result: CognitoUserSession = await new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authenticationDetails, {\n onFailure: (err: Error) => {\n reject(err)\n },\n onSuccess: (res) => {\n resolve(res)\n },\n })\n })\n\n sessionAndToken = result\n\n return sessionAndToken\n}\n"],"names":["AuthenticationDetails","CognitoUser","CognitoUserPool","sessionAndToken","authAsCognitoUser","username","password","isValid","userPool","ClientId","process","env","PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID","UserPoolId","PAYLOAD_CLOUD_COGNITO_USER_POOL_ID","authenticationDetails","Password","Username","cognitoUser","Pool","result","Promise","resolve","reject","authenticateUser","onFailure","err","onSuccess","res"],"mappings":"AAEA,SAASA,qBAAqB,EAAEC,WAAW,EAAEC,eAAe,QAAQ,6BAA4B;AAEhG,IAAIC,kBAA6C;AAEjD,OAAO,MAAMC,oBAAoB,OAC/BC,UACAC;IAEA,gDAAgD;IAChD,IAAIH,iBAAiBI,WAAW;QAC9B,OAAOJ;IACT;IAEA,MAAMK,WAAW,IAAIN,gBAAgB;QACnCO,UAAUC,QAAQC,GAAG,CAACC,yCAAyC;QAC/DC,YAAYH,QAAQC,GAAG,CAACG,kCAAkC;IAC5D;IAEA,MAAMC,wBAAwB,IAAIf,sBAAsB;QACtDgB,UAAUV;QACVW,UAAUZ;IACZ;IAEA,MAAMa,cAAc,IAAIjB,YAAY;QAClCkB,MAAMX;QACNS,UAAUZ;IACZ;IAEA,MAAMe,SAA6B,MAAM,IAAIC,QAAQ,CAACC,SAASC;QAC7DL,YAAYM,gBAAgB,CAACT,uBAAuB;YAClDU,WAAW,CAACC;gBACVH,OAAOG;YACT;YACAC,WAAW,CAACC;gBACVN,QAAQM;YACV;QACF;IACF;IAEAzB,kBAAkBiB;IAElB,OAAOjB;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/authAsCognitoUser.ts"],"sourcesContent":["import type { CognitoUserSession } from 'amazon-cognito-identity-js'\n\nimport { AuthenticationDetails, CognitoUser, CognitoUserPool } from 'amazon-cognito-identity-js'\n\nlet sessionAndToken: CognitoUserSession | null = null\n\nexport const authAsCognitoUser = async (\n username: string,\n password: string,\n): Promise<CognitoUserSession> => {\n // TODO: Check that isValid evaluates expiration\n if (sessionAndToken?.isValid()) {\n return sessionAndToken\n }\n\n if (!process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID) {\n throw new Error('PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID is required')\n }\n if (!process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID) {\n throw new Error('PAYLOAD_CLOUD_COGNITO_USER_POOL_ID is required')\n }\n\n const userPool = new CognitoUserPool({\n ClientId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID,\n UserPoolId: process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID,\n })\n\n const authenticationDetails = new AuthenticationDetails({\n Password: password,\n Username: username,\n })\n\n const cognitoUser = new CognitoUser({\n Pool: userPool,\n Username: username,\n })\n\n const result: CognitoUserSession = await new Promise((resolve, reject) => {\n cognitoUser.authenticateUser(authenticationDetails, {\n onFailure: (err: Error) => {\n reject(err)\n },\n onSuccess: (res) => {\n resolve(res)\n },\n })\n })\n\n sessionAndToken = result\n\n return sessionAndToken\n}\n"],"names":["AuthenticationDetails","CognitoUser","CognitoUserPool","sessionAndToken","authAsCognitoUser","username","password","isValid","process","env","PAYLOAD_CLOUD_COGNITO_USER_POOL_CLIENT_ID","Error","PAYLOAD_CLOUD_COGNITO_USER_POOL_ID","userPool","ClientId","UserPoolId","authenticationDetails","Password","Username","cognitoUser","Pool","result","Promise","resolve","reject","authenticateUser","onFailure","err","onSuccess","res"],"mappings":"AAEA,SAASA,qBAAqB,EAAEC,WAAW,EAAEC,eAAe,QAAQ,6BAA4B;AAEhG,IAAIC,kBAA6C;AAEjD,OAAO,MAAMC,oBAAoB,OAC/BC,UACAC;IAEA,gDAAgD;IAChD,IAAIH,iBAAiBI,WAAW;QAC9B,OAAOJ;IACT;IAEA,IAAI,CAACK,QAAQC,GAAG,CAACC,yCAAyC,EAAE;QAC1D,MAAM,IAAIC,MAAM;IAClB;IACA,IAAI,CAACH,QAAQC,GAAG,CAACG,kCAAkC,EAAE;QACnD,MAAM,IAAID,MAAM;IAClB;IAEA,MAAME,WAAW,IAAIX,gBAAgB;QACnCY,UAAUN,QAAQC,GAAG,CAACC,yCAAyC;QAC/DK,YAAYP,QAAQC,GAAG,CAACG,kCAAkC;IAC5D;IAEA,MAAMI,wBAAwB,IAAIhB,sBAAsB;QACtDiB,UAAUX;QACVY,UAAUb;IACZ;IAEA,MAAMc,cAAc,IAAIlB,YAAY;QAClCmB,MAAMP;QACNK,UAAUb;IACZ;IAEA,MAAMgB,SAA6B,MAAM,IAAIC,QAAQ,CAACC,SAASC;QAC7DL,YAAYM,gBAAgB,CAACT,uBAAuB;YAClDU,WAAW,CAACC;gBACVH,OAAOG;YACT;YACAC,WAAW,CAACC;gBACVN,QAAQM;YACV;QACF;IACF;IAEA1B,kBAAkBkB;IAElB,OAAOlB;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"getStorageClient.d.ts","sourceRoot":"","sources":["../../src/utilities/getStorageClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAKzC,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,GAAG,CAAC,EAAE,CAAA;CACtB,CAAC,CAAA;AAMF,eAAO,MAAM,gBAAgB,EAAE,gBAwC9B,CAAA"}
1
+ {"version":3,"file":"getStorageClient.d.ts","sourceRoot":"","sources":["../../src/utilities/getStorageClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAKzC,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,GAAG,CAAC,EAAE,CAAA;CACtB,CAAC,CAAA;AAMF,eAAO,MAAM,gBAAgB,EAAE,gBAkD9B,CAAA"}
@@ -12,6 +12,15 @@ export const getStorageClient = async ()=>{
12
12
  storageClient
13
13
  };
14
14
  }
15
+ if (!process.env.PAYLOAD_CLOUD_PROJECT_ID) {
16
+ throw new Error('PAYLOAD_CLOUD_PROJECT_ID is required');
17
+ }
18
+ if (!process.env.PAYLOAD_CLOUD_COGNITO_PASSWORD) {
19
+ throw new Error('PAYLOAD_CLOUD_COGNITO_PASSWORD is required');
20
+ }
21
+ if (!process.env.PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID) {
22
+ throw new Error('PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID is required');
23
+ }
15
24
  session = await authAsCognitoUser(process.env.PAYLOAD_CLOUD_PROJECT_ID, process.env.PAYLOAD_CLOUD_COGNITO_PASSWORD);
16
25
  const cognitoIdentity = new CognitoIdentityClient({
17
26
  credentials: fromCognitoIdentityPool({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getStorageClient.ts"],"sourcesContent":["import type { CognitoUserSession } from 'amazon-cognito-identity-js'\n\nimport { CognitoIdentityClient } from '@aws-sdk/client-cognito-identity'\nimport * as AWS from '@aws-sdk/client-s3'\nimport { fromCognitoIdentityPool } from '@aws-sdk/credential-providers'\n\nimport { authAsCognitoUser } from './authAsCognitoUser.js'\n\nexport type GetStorageClient = () => Promise<{\n identityID: string\n storageClient: AWS.S3\n}>\n\nlet storageClient: AWS.S3 | null = null\nlet session: CognitoUserSession | null = null\nlet identityID: string\n\nexport const getStorageClient: GetStorageClient = async () => {\n if (storageClient && session?.isValid()) {\n return {\n identityID,\n storageClient,\n }\n }\n\n session = await authAsCognitoUser(\n process.env.PAYLOAD_CLOUD_PROJECT_ID,\n process.env.PAYLOAD_CLOUD_COGNITO_PASSWORD,\n )\n\n const cognitoIdentity = new CognitoIdentityClient({\n credentials: fromCognitoIdentityPool({\n clientConfig: {\n region: 'us-east-1',\n },\n identityPoolId: process.env.PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID,\n logins: {\n [`cognito-idp.us-east-1.amazonaws.com/${process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID}`]:\n session.getIdToken().getJwtToken(),\n },\n }),\n })\n\n const credentials = await cognitoIdentity.config.credentials()\n\n // @ts-expect-error - Incorrect AWS types\n identityID = credentials.identityId\n\n storageClient = new AWS.S3({\n credentials,\n region: process.env.PAYLOAD_CLOUD_BUCKET_REGION,\n })\n\n return {\n identityID,\n storageClient,\n }\n}\n"],"names":["CognitoIdentityClient","AWS","fromCognitoIdentityPool","authAsCognitoUser","storageClient","session","identityID","getStorageClient","isValid","process","env","PAYLOAD_CLOUD_PROJECT_ID","PAYLOAD_CLOUD_COGNITO_PASSWORD","cognitoIdentity","credentials","clientConfig","region","identityPoolId","PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID","logins","PAYLOAD_CLOUD_COGNITO_USER_POOL_ID","getIdToken","getJwtToken","config","identityId","S3","PAYLOAD_CLOUD_BUCKET_REGION"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,mCAAkC;AACxE,YAAYC,SAAS,qBAAoB;AACzC,SAASC,uBAAuB,QAAQ,gCAA+B;AAEvE,SAASC,iBAAiB,QAAQ,yBAAwB;AAO1D,IAAIC,gBAA+B;AACnC,IAAIC,UAAqC;AACzC,IAAIC;AAEJ,OAAO,MAAMC,mBAAqC;IAChD,IAAIH,iBAAiBC,SAASG,WAAW;QACvC,OAAO;YACLF;YACAF;QACF;IACF;IAEAC,UAAU,MAAMF,kBACdM,QAAQC,GAAG,CAACC,wBAAwB,EACpCF,QAAQC,GAAG,CAACE,8BAA8B;IAG5C,MAAMC,kBAAkB,IAAIb,sBAAsB;QAChDc,aAAaZ,wBAAwB;YACnCa,cAAc;gBACZC,QAAQ;YACV;YACAC,gBAAgBR,QAAQC,GAAG,CAACQ,sCAAsC;YAClEC,QAAQ;gBACN,CAAC,CAAC,oCAAoC,EAAEV,QAAQC,GAAG,CAACU,kCAAkC,EAAE,CAAC,EACvFf,QAAQgB,UAAU,GAAGC,WAAW;YACpC;QACF;IACF;IAEA,MAAMR,cAAc,MAAMD,gBAAgBU,MAAM,CAACT,WAAW;IAE5D,yCAAyC;IACzCR,aAAaQ,YAAYU,UAAU;IAEnCpB,gBAAgB,IAAIH,IAAIwB,EAAE,CAAC;QACzBX;QACAE,QAAQP,QAAQC,GAAG,CAACgB,2BAA2B;IACjD;IAEA,OAAO;QACLpB;QACAF;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getStorageClient.ts"],"sourcesContent":["import type { CognitoUserSession } from 'amazon-cognito-identity-js'\n\nimport { CognitoIdentityClient } from '@aws-sdk/client-cognito-identity'\nimport * as AWS from '@aws-sdk/client-s3'\nimport { fromCognitoIdentityPool } from '@aws-sdk/credential-providers'\n\nimport { authAsCognitoUser } from './authAsCognitoUser.js'\n\nexport type GetStorageClient = () => Promise<{\n identityID: string\n storageClient: AWS.S3\n}>\n\nlet storageClient: AWS.S3 | null = null\nlet session: CognitoUserSession | null = null\nlet identityID: string\n\nexport const getStorageClient: GetStorageClient = async () => {\n if (storageClient && session?.isValid()) {\n return {\n identityID,\n storageClient,\n }\n }\n\n if (!process.env.PAYLOAD_CLOUD_PROJECT_ID) {\n throw new Error('PAYLOAD_CLOUD_PROJECT_ID is required')\n }\n if (!process.env.PAYLOAD_CLOUD_COGNITO_PASSWORD) {\n throw new Error('PAYLOAD_CLOUD_COGNITO_PASSWORD is required')\n }\n if (!process.env.PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID) {\n throw new Error('PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID is required')\n }\n\n session = await authAsCognitoUser(\n process.env.PAYLOAD_CLOUD_PROJECT_ID,\n process.env.PAYLOAD_CLOUD_COGNITO_PASSWORD,\n )\n\n const cognitoIdentity = new CognitoIdentityClient({\n credentials: fromCognitoIdentityPool({\n clientConfig: {\n region: 'us-east-1',\n },\n identityPoolId: process.env.PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID,\n logins: {\n [`cognito-idp.us-east-1.amazonaws.com/${process.env.PAYLOAD_CLOUD_COGNITO_USER_POOL_ID}`]:\n session.getIdToken().getJwtToken(),\n },\n }),\n })\n\n const credentials = await cognitoIdentity.config.credentials()\n\n // @ts-expect-error - Incorrect AWS types\n identityID = credentials.identityId\n\n storageClient = new AWS.S3({\n credentials,\n region: process.env.PAYLOAD_CLOUD_BUCKET_REGION,\n })\n\n return {\n identityID,\n storageClient,\n }\n}\n"],"names":["CognitoIdentityClient","AWS","fromCognitoIdentityPool","authAsCognitoUser","storageClient","session","identityID","getStorageClient","isValid","process","env","PAYLOAD_CLOUD_PROJECT_ID","Error","PAYLOAD_CLOUD_COGNITO_PASSWORD","PAYLOAD_CLOUD_COGNITO_IDENTITY_POOL_ID","cognitoIdentity","credentials","clientConfig","region","identityPoolId","logins","PAYLOAD_CLOUD_COGNITO_USER_POOL_ID","getIdToken","getJwtToken","config","identityId","S3","PAYLOAD_CLOUD_BUCKET_REGION"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,mCAAkC;AACxE,YAAYC,SAAS,qBAAoB;AACzC,SAASC,uBAAuB,QAAQ,gCAA+B;AAEvE,SAASC,iBAAiB,QAAQ,yBAAwB;AAO1D,IAAIC,gBAA+B;AACnC,IAAIC,UAAqC;AACzC,IAAIC;AAEJ,OAAO,MAAMC,mBAAqC;IAChD,IAAIH,iBAAiBC,SAASG,WAAW;QACvC,OAAO;YACLF;YACAF;QACF;IACF;IAEA,IAAI,CAACK,QAAQC,GAAG,CAACC,wBAAwB,EAAE;QACzC,MAAM,IAAIC,MAAM;IAClB;IACA,IAAI,CAACH,QAAQC,GAAG,CAACG,8BAA8B,EAAE;QAC/C,MAAM,IAAID,MAAM;IAClB;IACA,IAAI,CAACH,QAAQC,GAAG,CAACI,sCAAsC,EAAE;QACvD,MAAM,IAAIF,MAAM;IAClB;IAEAP,UAAU,MAAMF,kBACdM,QAAQC,GAAG,CAACC,wBAAwB,EACpCF,QAAQC,GAAG,CAACG,8BAA8B;IAG5C,MAAME,kBAAkB,IAAIf,sBAAsB;QAChDgB,aAAad,wBAAwB;YACnCe,cAAc;gBACZC,QAAQ;YACV;YACAC,gBAAgBV,QAAQC,GAAG,CAACI,sCAAsC;YAClEM,QAAQ;gBACN,CAAC,CAAC,oCAAoC,EAAEX,QAAQC,GAAG,CAACW,kCAAkC,EAAE,CAAC,EACvFhB,QAAQiB,UAAU,GAAGC,WAAW;YACpC;QACF;IACF;IAEA,MAAMP,cAAc,MAAMD,gBAAgBS,MAAM,CAACR,WAAW;IAE5D,yCAAyC;IACzCV,aAAaU,YAAYS,UAAU;IAEnCrB,gBAAgB,IAAIH,IAAIyB,EAAE,CAAC;QACzBV;QACAE,QAAQT,QAAQC,GAAG,CAACiB,2BAA2B;IACjD;IAEA,OAAO;QACLrB;QACAF;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/payload-cloud",
3
- "version": "3.17.1",
3
+ "version": "3.18.0-canary.030d28e",
4
4
  "description": "The official Payload Cloud plugin",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -38,16 +38,16 @@
38
38
  "amazon-cognito-identity-js": "^6.1.2",
39
39
  "nodemailer": "6.9.10",
40
40
  "resend": "^0.17.2",
41
- "@payloadcms/email-nodemailer": "3.17.1"
41
+ "@payloadcms/email-nodemailer": "3.18.0-canary.030d28e"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/jest": "29.5.12",
45
45
  "@types/nodemailer": "6.4.14",
46
46
  "ts-jest": "^29.1.0",
47
- "payload": "3.17.1"
47
+ "payload": "3.18.0-canary.030d28e"
48
48
  },
49
49
  "peerDependencies": {
50
- "payload": "3.17.1"
50
+ "payload": "3.18.0-canary.030d28e"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "pnpm build:types && pnpm build:swc",