payload 3.5.0 → 3.5.1-canary.15a5791
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/auth/operations/forgotPassword.js +1 -2
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +3 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/operations/create.d.ts +2 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +23 -4
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/duplicate.d.ts +8 -14
- package/dist/collections/operations/duplicate.d.ts.map +1 -1
- package/dist/collections/operations/duplicate.js +7 -289
- package/dist/collections/operations/duplicate.js.map +1 -1
- package/dist/collections/operations/local/create.d.ts +2 -1
- package/dist/collections/operations/local/create.d.ts.map +1 -1
- package/dist/collections/operations/local/create.js +2 -1
- package/dist/collections/operations/local/create.js.map +1 -1
- package/dist/collections/operations/local/duplicate.d.ts +3 -1
- package/dist/collections/operations/local/duplicate.d.ts.map +1 -1
- package/dist/collections/operations/local/duplicate.js +2 -1
- package/dist/collections/operations/local/duplicate.js.map +1 -1
- package/dist/config/types.d.ts +12 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/migrations/migrate.d.ts.map +1 -1
- package/dist/database/migrations/migrate.js +3 -1
- package/dist/database/migrations/migrate.js.map +1 -1
- package/dist/database/migrations/migrateDown.d.ts.map +1 -1
- package/dist/database/migrations/migrateDown.js +3 -1
- package/dist/database/migrations/migrateDown.js.map +1 -1
- package/dist/database/migrations/migrateRefresh.d.ts.map +1 -1
- package/dist/database/migrations/migrateRefresh.js +3 -1
- package/dist/database/migrations/migrateRefresh.js.map +1 -1
- package/dist/database/migrations/migrateReset.d.ts.map +1 -1
- package/dist/database/migrations/migrateReset.js +3 -1
- package/dist/database/migrations/migrateReset.js.map +1 -1
- package/dist/database/types.d.ts +0 -2
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/duplicateDocument/index.d.ts +16 -0
- package/dist/duplicateDocument/index.d.ts.map +1 -0
- package/dist/duplicateDocument/index.js +84 -0
- package/dist/duplicateDocument/index.js.map +1 -0
- package/dist/exports/shared.d.ts +2 -0
- package/dist/exports/shared.d.ts.map +1 -1
- package/dist/exports/shared.js +2 -0
- package/dist/exports/shared.js.map +1 -1
- package/dist/fields/config/client.d.ts +1 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +2 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/queues/config/types/workflowTypes.d.ts +4 -0
- package/dist/queues/config/types/workflowTypes.d.ts.map +1 -1
- package/dist/queues/config/types/workflowTypes.js.map +1 -1
- package/dist/queues/localAPI.d.ts +7 -1
- package/dist/queues/localAPI.d.ts.map +1 -1
- package/dist/queues/localAPI.js +10 -0
- package/dist/queues/localAPI.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts +7 -2
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +19 -2
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts +3 -3
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +22 -16
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/utilities/flattenTopLevelFields.d.ts.map +1 -1
- package/dist/utilities/flattenTopLevelFields.js +7 -15
- package/dist/utilities/flattenTopLevelFields.js.map +1 -1
- package/package.json +3 -3
|
@@ -70,8 +70,7 @@ export const forgotPasswordOperation = async (incomingArgs)=>{
|
|
|
70
70
|
return null;
|
|
71
71
|
}
|
|
72
72
|
user.resetPasswordToken = token;
|
|
73
|
-
user.resetPasswordExpiration = new Date(collectionConfig.auth?.forgotPassword?.expiration
|
|
74
|
-
;
|
|
73
|
+
user.resetPasswordExpiration = new Date(Date.now() + (collectionConfig.auth?.forgotPassword?.expiration ?? expiration ?? 3600000)).toISOString();
|
|
75
74
|
user = await payload.update({
|
|
76
75
|
id: user.id,
|
|
77
76
|
collection: collectionConfig.slug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/operations/forgotPassword.ts"],"sourcesContent":["import crypto from 'crypto'\nimport httpStatus from 'http-status'\nimport { URL } from 'url'\n\nimport type {\n AuthOperationsFromCollectionSlug,\n Collection,\n} from '../../collections/config/types.js'\nimport type { CollectionSlug } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { APIError } from '../../errors/index.js'\nimport { Forbidden } from '../../index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLoginOptions } from '../getLoginOptions.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data: {\n [key: string]: unknown\n } & AuthOperationsFromCollectionSlug<TSlug>['forgotPassword']\n disableEmail?: boolean\n expiration?: number\n req: PayloadRequest\n}\n\nexport type Result = string\n\nexport const forgotPasswordOperation = async <TSlug extends CollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<null | string> => {\n const loginWithUsername = incomingArgs.collection.config.auth.loginWithUsername\n const { data } = incomingArgs\n\n const { canLoginWithEmail, canLoginWithUsername } = getLoginOptions(loginWithUsername)\n\n const sanitizedEmail =\n (canLoginWithEmail && (incomingArgs.data.email || '').toLowerCase().trim()) || null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n let args = incomingArgs\n\n if (incomingArgs.collection.config.auth.disableLocalStrategy) {\n throw new Forbidden(incomingArgs.req.t)\n }\n if (!sanitizedEmail && !sanitizedUsername) {\n throw new APIError(\n `Missing ${loginWithUsername ? 'username' : 'email'}.`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'forgotPassword',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n disableEmail,\n expiration,\n req: {\n payload: { config, email },\n payload,\n },\n req,\n } = args\n\n // /////////////////////////////////////\n // Forget password\n // /////////////////////////////////////\n\n let token: string = crypto.randomBytes(20).toString('hex')\n type UserDoc = {\n email?: string\n id: number | string\n resetPasswordExpiration?: string\n resetPasswordToken?: string\n }\n\n if (!sanitizedEmail && !sanitizedUsername) {\n throw new APIError(\n `Missing ${loginWithUsername ? 'username' : 'email'}.`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n let whereConstraint: Where = {}\n\n if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = {\n email: {\n equals: sanitizedEmail,\n },\n }\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = {\n username: {\n equals: sanitizedUsername,\n },\n }\n }\n\n let user = await payload.db.findOne<UserDoc>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })\n\n // We don't want to indicate specifically that an email was not found,\n // as doing so could lead to the exposure of registered emails.\n // Therefore, we prefer to fail silently.\n if (!user) {\n return null\n }\n\n user.resetPasswordToken = token\n user.resetPasswordExpiration = new Date(\n collectionConfig.auth?.forgotPassword?.expiration || expiration || Date.now() + 3600000,\n ).toISOString() // 1 hour\n\n user = await payload.update({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n if (!disableEmail && user.email) {\n const protocol = new URL(req.url).protocol // includes the final :\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}//${req.headers.get('host')}`\n\n let html = `${req.t('authentication:youAreReceivingResetPassword')}\n <a href=\"${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token}\">${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token}</a>\n ${req.t('authentication:youDidNotRequestPassword')}`\n\n if (typeof collectionConfig.auth.forgotPassword?.generateEmailHTML === 'function') {\n html = await collectionConfig.auth.forgotPassword.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:resetYourPassword')\n\n if (typeof collectionConfig.auth.forgotPassword?.generateEmailSubject === 'function') {\n subject = await collectionConfig.auth.forgotPassword.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n await email.sendEmail({\n from: `\"${email.defaultFromName}\" <${email.defaultFromAddress}>`,\n html,\n subject,\n to: user.email,\n })\n }\n\n // /////////////////////////////////////\n // afterForgotPassword - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterForgotPassword.reduce(async (priorHook, hook) => {\n await priorHook\n await hook({ args, collection: args.collection?.config, context: req.context })\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n token = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'forgotPassword',\n result: token,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return token\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","httpStatus","URL","buildAfterOperation","APIError","Forbidden","commitTransaction","initTransaction","killTransaction","getLoginOptions","forgotPasswordOperation","incomingArgs","loginWithUsername","collection","config","auth","data","canLoginWithEmail","canLoginWithUsername","sanitizedEmail","email","toLowerCase","trim","sanitizedUsername","username","args","disableLocalStrategy","req","t","BAD_REQUEST","shouldCommit","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","disableEmail","expiration","payload","token","randomBytes","toString","whereConstraint","equals","user","db","findOne","slug","where","resetPasswordToken","resetPasswordExpiration","Date","forgotPassword","now","toISOString","update","id","protocol","url","serverURL","headers","get","html","routes","admin","reset","generateEmailHTML","subject","generateEmailSubject","sendEmail","from","defaultFromName","defaultFromAddress","to","afterForgotPassword","result","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/operations/forgotPassword.ts"],"sourcesContent":["import crypto from 'crypto'\nimport httpStatus from 'http-status'\nimport { URL } from 'url'\n\nimport type {\n AuthOperationsFromCollectionSlug,\n Collection,\n} from '../../collections/config/types.js'\nimport type { CollectionSlug } from '../../index.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\n\nimport { buildAfterOperation } from '../../collections/operations/utils.js'\nimport { APIError } from '../../errors/index.js'\nimport { Forbidden } from '../../index.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLoginOptions } from '../getLoginOptions.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data: {\n [key: string]: unknown\n } & AuthOperationsFromCollectionSlug<TSlug>['forgotPassword']\n disableEmail?: boolean\n expiration?: number\n req: PayloadRequest\n}\n\nexport type Result = string\n\nexport const forgotPasswordOperation = async <TSlug extends CollectionSlug>(\n incomingArgs: Arguments<TSlug>,\n): Promise<null | string> => {\n const loginWithUsername = incomingArgs.collection.config.auth.loginWithUsername\n const { data } = incomingArgs\n\n const { canLoginWithEmail, canLoginWithUsername } = getLoginOptions(loginWithUsername)\n\n const sanitizedEmail =\n (canLoginWithEmail && (incomingArgs.data.email || '').toLowerCase().trim()) || null\n const sanitizedUsername =\n 'username' in data && typeof data?.username === 'string'\n ? data.username.toLowerCase().trim()\n : null\n\n let args = incomingArgs\n\n if (incomingArgs.collection.config.auth.disableLocalStrategy) {\n throw new Forbidden(incomingArgs.req.t)\n }\n if (!sanitizedEmail && !sanitizedUsername) {\n throw new APIError(\n `Missing ${loginWithUsername ? 'username' : 'email'}.`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n try {\n const shouldCommit = await initTransaction(args.req)\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection?.config,\n context: args.req.context,\n operation: 'forgotPassword',\n req: args.req,\n })) || args\n }, Promise.resolve())\n\n const {\n collection: { config: collectionConfig },\n disableEmail,\n expiration,\n req: {\n payload: { config, email },\n payload,\n },\n req,\n } = args\n\n // /////////////////////////////////////\n // Forget password\n // /////////////////////////////////////\n\n let token: string = crypto.randomBytes(20).toString('hex')\n type UserDoc = {\n email?: string\n id: number | string\n resetPasswordExpiration?: string\n resetPasswordToken?: string\n }\n\n if (!sanitizedEmail && !sanitizedUsername) {\n throw new APIError(\n `Missing ${loginWithUsername ? 'username' : 'email'}.`,\n httpStatus.BAD_REQUEST,\n )\n }\n\n let whereConstraint: Where = {}\n\n if (canLoginWithEmail && sanitizedEmail) {\n whereConstraint = {\n email: {\n equals: sanitizedEmail,\n },\n }\n } else if (canLoginWithUsername && sanitizedUsername) {\n whereConstraint = {\n username: {\n equals: sanitizedUsername,\n },\n }\n }\n\n let user = await payload.db.findOne<UserDoc>({\n collection: collectionConfig.slug,\n req,\n where: whereConstraint,\n })\n\n // We don't want to indicate specifically that an email was not found,\n // as doing so could lead to the exposure of registered emails.\n // Therefore, we prefer to fail silently.\n if (!user) {\n return null\n }\n\n user.resetPasswordToken = token\n user.resetPasswordExpiration = new Date(\n Date.now() + (collectionConfig.auth?.forgotPassword?.expiration ?? expiration ?? 3600000),\n ).toISOString()\n\n user = await payload.update({\n id: user.id,\n collection: collectionConfig.slug,\n data: user,\n req,\n })\n\n if (!disableEmail && user.email) {\n const protocol = new URL(req.url).protocol // includes the final :\n const serverURL =\n config.serverURL !== null && config.serverURL !== ''\n ? config.serverURL\n : `${protocol}//${req.headers.get('host')}`\n\n let html = `${req.t('authentication:youAreReceivingResetPassword')}\n <a href=\"${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token}\">${serverURL}${config.routes.admin}${config.admin.routes.reset}/${token}</a>\n ${req.t('authentication:youDidNotRequestPassword')}`\n\n if (typeof collectionConfig.auth.forgotPassword?.generateEmailHTML === 'function') {\n html = await collectionConfig.auth.forgotPassword.generateEmailHTML({\n req,\n token,\n user,\n })\n }\n\n let subject = req.t('authentication:resetYourPassword')\n\n if (typeof collectionConfig.auth.forgotPassword?.generateEmailSubject === 'function') {\n subject = await collectionConfig.auth.forgotPassword.generateEmailSubject({\n req,\n token,\n user,\n })\n }\n\n await email.sendEmail({\n from: `\"${email.defaultFromName}\" <${email.defaultFromAddress}>`,\n html,\n subject,\n to: user.email,\n })\n }\n\n // /////////////////////////////////////\n // afterForgotPassword - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterForgotPassword.reduce(async (priorHook, hook) => {\n await priorHook\n await hook({ args, collection: args.collection?.config, context: req.context })\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n token = await buildAfterOperation({\n args,\n collection: args.collection?.config,\n operation: 'forgotPassword',\n result: token,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return token\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","httpStatus","URL","buildAfterOperation","APIError","Forbidden","commitTransaction","initTransaction","killTransaction","getLoginOptions","forgotPasswordOperation","incomingArgs","loginWithUsername","collection","config","auth","data","canLoginWithEmail","canLoginWithUsername","sanitizedEmail","email","toLowerCase","trim","sanitizedUsername","username","args","disableLocalStrategy","req","t","BAD_REQUEST","shouldCommit","hooks","beforeOperation","reduce","priorHook","hook","context","operation","Promise","resolve","collectionConfig","disableEmail","expiration","payload","token","randomBytes","toString","whereConstraint","equals","user","db","findOne","slug","where","resetPasswordToken","resetPasswordExpiration","Date","now","forgotPassword","toISOString","update","id","protocol","url","serverURL","headers","get","html","routes","admin","reset","generateEmailHTML","subject","generateEmailSubject","sendEmail","from","defaultFromName","defaultFromAddress","to","afterForgotPassword","result","error"],"mappings":"AAAA,OAAOA,YAAY,SAAQ;AAC3B,OAAOC,gBAAgB,cAAa;AACpC,SAASC,GAAG,QAAQ,MAAK;AASzB,SAASC,mBAAmB,QAAQ,wCAAuC;AAC3E,SAASC,QAAQ,QAAQ,wBAAuB;AAChD,SAASC,SAAS,QAAQ,iBAAgB;AAC1C,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,eAAe,QAAQ,wBAAuB;AAcvD,OAAO,MAAMC,0BAA0B,OACrCC;IAEA,MAAMC,oBAAoBD,aAAaE,UAAU,CAACC,MAAM,CAACC,IAAI,CAACH,iBAAiB;IAC/E,MAAM,EAAEI,IAAI,EAAE,GAAGL;IAEjB,MAAM,EAAEM,iBAAiB,EAAEC,oBAAoB,EAAE,GAAGT,gBAAgBG;IAEpE,MAAMO,iBACJ,AAACF,qBAAqB,AAACN,CAAAA,aAAaK,IAAI,CAACI,KAAK,IAAI,EAAC,EAAGC,WAAW,GAAGC,IAAI,MAAO;IACjF,MAAMC,oBACJ,cAAcP,QAAQ,OAAOA,MAAMQ,aAAa,WAC5CR,KAAKQ,QAAQ,CAACH,WAAW,GAAGC,IAAI,KAChC;IAEN,IAAIG,OAAOd;IAEX,IAAIA,aAAaE,UAAU,CAACC,MAAM,CAACC,IAAI,CAACW,oBAAoB,EAAE;QAC5D,MAAM,IAAIrB,UAAUM,aAAagB,GAAG,CAACC,CAAC;IACxC;IACA,IAAI,CAACT,kBAAkB,CAACI,mBAAmB;QACzC,MAAM,IAAInB,SACR,CAAC,QAAQ,EAAEQ,oBAAoB,aAAa,QAAQ,CAAC,CAAC,EACtDX,WAAW4B,WAAW;IAE1B;IAEA,IAAI;QACF,MAAMC,eAAe,MAAMvB,gBAAgBkB,KAAKE,GAAG;QAEnD,wCAAwC;QACxC,+BAA+B;QAC/B,wCAAwC;QAExC,MAAMF,KAAKZ,UAAU,CAACC,MAAM,CAACiB,KAAK,CAACC,eAAe,CAACC,MAAM,CAAC,OAAOC,WAAWC;YAC1E,MAAMD;YAENT,OACE,AAAC,MAAMU,KAAK;gBACVV;gBACAZ,YAAYY,KAAKZ,UAAU,EAAEC;gBAC7BsB,SAASX,KAAKE,GAAG,CAACS,OAAO;gBACzBC,WAAW;gBACXV,KAAKF,KAAKE,GAAG;YACf,MAAOF;QACX,GAAGa,QAAQC,OAAO;QAElB,MAAM,EACJ1B,YAAY,EAAEC,QAAQ0B,gBAAgB,EAAE,EACxCC,YAAY,EACZC,UAAU,EACVf,KAAK,EACHgB,SAAS,EAAE7B,MAAM,EAAEM,KAAK,EAAE,EAC1BuB,OAAO,EACR,EACDhB,GAAG,EACJ,GAAGF;QAEJ,wCAAwC;QACxC,kBAAkB;QAClB,wCAAwC;QAExC,IAAImB,QAAgB5C,OAAO6C,WAAW,CAAC,IAAIC,QAAQ,CAAC;QAQpD,IAAI,CAAC3B,kBAAkB,CAACI,mBAAmB;YACzC,MAAM,IAAInB,SACR,CAAC,QAAQ,EAAEQ,oBAAoB,aAAa,QAAQ,CAAC,CAAC,EACtDX,WAAW4B,WAAW;QAE1B;QAEA,IAAIkB,kBAAyB,CAAC;QAE9B,IAAI9B,qBAAqBE,gBAAgB;YACvC4B,kBAAkB;gBAChB3B,OAAO;oBACL4B,QAAQ7B;gBACV;YACF;QACF,OAAO,IAAID,wBAAwBK,mBAAmB;YACpDwB,kBAAkB;gBAChBvB,UAAU;oBACRwB,QAAQzB;gBACV;YACF;QACF;QAEA,IAAI0B,OAAO,MAAMN,QAAQO,EAAE,CAACC,OAAO,CAAU;YAC3CtC,YAAY2B,iBAAiBY,IAAI;YACjCzB;YACA0B,OAAON;QACT;QAEA,sEAAsE;QACtE,+DAA+D;QAC/D,yCAAyC;QACzC,IAAI,CAACE,MAAM;YACT,OAAO;QACT;QAEAA,KAAKK,kBAAkB,GAAGV;QAC1BK,KAAKM,uBAAuB,GAAG,IAAIC,KACjCA,KAAKC,GAAG,KAAMjB,CAAAA,iBAAiBzB,IAAI,EAAE2C,gBAAgBhB,cAAcA,cAAc,OAAM,GACvFiB,WAAW;QAEbV,OAAO,MAAMN,QAAQiB,MAAM,CAAC;YAC1BC,IAAIZ,KAAKY,EAAE;YACXhD,YAAY2B,iBAAiBY,IAAI;YACjCpC,MAAMiC;YACNtB;QACF;QAEA,IAAI,CAACc,gBAAgBQ,KAAK7B,KAAK,EAAE;YAC/B,MAAM0C,WAAW,IAAI5D,IAAIyB,IAAIoC,GAAG,EAAED,QAAQ,CAAC,uBAAuB;;YAClE,MAAME,YACJlD,OAAOkD,SAAS,KAAK,QAAQlD,OAAOkD,SAAS,KAAK,KAC9ClD,OAAOkD,SAAS,GAChB,GAAGF,SAAS,EAAE,EAAEnC,IAAIsC,OAAO,CAACC,GAAG,CAAC,SAAS;YAE/C,IAAIC,OAAO,GAAGxC,IAAIC,CAAC,CAAC,+CAA+C;aAC5D,EAAEoC,YAAYlD,OAAOsD,MAAM,CAACC,KAAK,GAAGvD,OAAOuD,KAAK,CAACD,MAAM,CAACE,KAAK,CAAC,CAAC,EAAE1B,MAAM,EAAE,EAAEoB,YAAYlD,OAAOsD,MAAM,CAACC,KAAK,GAAGvD,OAAOuD,KAAK,CAACD,MAAM,CAACE,KAAK,CAAC,CAAC,EAAE1B,MAAM;IACzJ,EAAEjB,IAAIC,CAAC,CAAC,4CAA4C;YAElD,IAAI,OAAOY,iBAAiBzB,IAAI,CAAC2C,cAAc,EAAEa,sBAAsB,YAAY;gBACjFJ,OAAO,MAAM3B,iBAAiBzB,IAAI,CAAC2C,cAAc,CAACa,iBAAiB,CAAC;oBAClE5C;oBACAiB;oBACAK;gBACF;YACF;YAEA,IAAIuB,UAAU7C,IAAIC,CAAC,CAAC;YAEpB,IAAI,OAAOY,iBAAiBzB,IAAI,CAAC2C,cAAc,EAAEe,yBAAyB,YAAY;gBACpFD,UAAU,MAAMhC,iBAAiBzB,IAAI,CAAC2C,cAAc,CAACe,oBAAoB,CAAC;oBACxE9C;oBACAiB;oBACAK;gBACF;YACF;YAEA,MAAM7B,MAAMsD,SAAS,CAAC;gBACpBC,MAAM,CAAC,CAAC,EAAEvD,MAAMwD,eAAe,CAAC,GAAG,EAAExD,MAAMyD,kBAAkB,CAAC,CAAC,CAAC;gBAChEV;gBACAK;gBACAM,IAAI7B,KAAK7B,KAAK;YAChB;QACF;QAEA,wCAAwC;QACxC,mCAAmC;QACnC,wCAAwC;QAExC,MAAMoB,iBAAiBT,KAAK,CAACgD,mBAAmB,CAAC9C,MAAM,CAAC,OAAOC,WAAWC;YACxE,MAAMD;YACN,MAAMC,KAAK;gBAAEV;gBAAMZ,YAAYY,KAAKZ,UAAU,EAAEC;gBAAQsB,SAAST,IAAIS,OAAO;YAAC;QAC/E,GAAGE,QAAQC,OAAO;QAElB,wCAAwC;QACxC,8BAA8B;QAC9B,wCAAwC;QAExCK,QAAQ,MAAMzC,oBAAoB;YAChCsB;YACAZ,YAAYY,KAAKZ,UAAU,EAAEC;YAC7BuB,WAAW;YACX2C,QAAQpC;QACV;QAEA,IAAId,cAAc;YAChB,MAAMxB,kBAAkBqB;QAC1B;QAEA,OAAOiB;IACT,EAAE,OAAOqC,OAAgB;QACvB,MAAMzE,gBAAgBiB,KAAKE,GAAG;QAC9B,MAAMsD;IACR;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAiB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAiB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,CAAC,yBAAyB,CA8LnC,CAAA"}
|
|
@@ -155,6 +155,9 @@ export const sanitizeCollection = async (config, collection, /**
|
|
|
155
155
|
} else {
|
|
156
156
|
sanitized.auth.loginWithUsername = false;
|
|
157
157
|
}
|
|
158
|
+
if (!collection?.admin?.useAsTitle) {
|
|
159
|
+
sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email';
|
|
160
|
+
}
|
|
158
161
|
sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth));
|
|
159
162
|
}
|
|
160
163
|
if (collection?.admin?.pagination?.limits?.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = (config.collections || []).reduce(\n (acc, c) => {\n acc.push(c.slug)\n return acc\n },\n [collection.slug],\n )\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","sanitized","validRelationships","collections","reduce","acc","c","push","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = (config.collections || []).reduce(\n (acc, c) => {\n acc.push(c.slug)\n return acc\n },\n [collection.slug],\n )\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","sanitized","validRelationships","collections","reduce","acc","c","push","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CollectionSlug } from '../../index.js';
|
|
2
2
|
import type { PayloadRequest, PopulateType, SelectType, TransformCollectionWithSelect } from '../../types/index.js';
|
|
3
|
-
import type { Collection, RequiredDataFromCollectionSlug, SelectFromCollectionSlug } from '../config/types.js';
|
|
3
|
+
import type { Collection, DataFromCollectionSlug, RequiredDataFromCollectionSlug, SelectFromCollectionSlug } from '../config/types.js';
|
|
4
4
|
export type Arguments<TSlug extends CollectionSlug> = {
|
|
5
5
|
autosave?: boolean;
|
|
6
6
|
collection: Collection;
|
|
@@ -9,6 +9,7 @@ export type Arguments<TSlug extends CollectionSlug> = {
|
|
|
9
9
|
disableTransaction?: boolean;
|
|
10
10
|
disableVerificationEmail?: boolean;
|
|
11
11
|
draft?: boolean;
|
|
12
|
+
duplicateFromID?: DataFromCollectionSlug<TSlug>['id'];
|
|
12
13
|
overrideAccess?: boolean;
|
|
13
14
|
overwriteExistingFiles?: boolean;
|
|
14
15
|
populate?: PopulateType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAIV,UAAU,EACV,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAEV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAIV,UAAU,EACV,sBAAsB,EACtB,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;AAqB3B,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,8BAA8B,CAAC,KAAK,CAAC,CAAA;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,eAAe,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA;IACrD,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,KAAK,SAAS,cAAc,EAC5B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,CA0VvD,CAAA"}
|
|
@@ -3,6 +3,7 @@ import { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js';
|
|
|
3
3
|
import executeAccess from '../../auth/executeAccess.js';
|
|
4
4
|
import { sendVerificationEmail } from '../../auth/sendVerificationEmail.js';
|
|
5
5
|
import { registerLocalStrategy } from '../../auth/strategies/local/register.js';
|
|
6
|
+
import { getDuplicateDocumentData } from '../../duplicateDocument/index.js';
|
|
6
7
|
import { afterChange } from '../../fields/hooks/afterChange/index.js';
|
|
7
8
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
8
9
|
import { beforeChange } from '../../fields/hooks/beforeChange/index.js';
|
|
@@ -40,9 +41,23 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
40
41
|
req: args.req
|
|
41
42
|
}) || args;
|
|
42
43
|
}, Promise.resolve());
|
|
43
|
-
const { autosave = false, collection: { config: collectionConfig }, collection, depth, disableVerificationEmail, draft = false, overrideAccess, overwriteExistingFiles = false, populate, req: { fallbackLocale, locale, payload, payload: { config } }, req, select, showHiddenFields } = args;
|
|
44
|
+
const { autosave = false, collection: { config: collectionConfig }, collection, depth, disableVerificationEmail, draft = false, duplicateFromID, overrideAccess, overwriteExistingFiles = false, populate, req: { fallbackLocale, locale, payload, payload: { config } }, req, select, showHiddenFields } = args;
|
|
44
45
|
let { data } = args;
|
|
45
46
|
const shouldSaveDraft = Boolean(draft && collectionConfig.versions.drafts);
|
|
47
|
+
let duplicatedFromDocWithLocales = {};
|
|
48
|
+
let duplicatedFromDoc = {};
|
|
49
|
+
if (duplicateFromID) {
|
|
50
|
+
const duplicateResult = await getDuplicateDocumentData({
|
|
51
|
+
id: duplicateFromID,
|
|
52
|
+
collectionConfig,
|
|
53
|
+
draftArg: shouldSaveDraft,
|
|
54
|
+
overrideAccess,
|
|
55
|
+
req,
|
|
56
|
+
shouldSaveDraft
|
|
57
|
+
});
|
|
58
|
+
duplicatedFromDoc = duplicateResult.duplicatedFromDoc;
|
|
59
|
+
duplicatedFromDocWithLocales = duplicateResult.duplicatedFromDocWithLocales;
|
|
60
|
+
}
|
|
46
61
|
// /////////////////////////////////////
|
|
47
62
|
// Access
|
|
48
63
|
// /////////////////////////////////////
|
|
@@ -59,7 +74,9 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
59
74
|
collection,
|
|
60
75
|
config,
|
|
61
76
|
data,
|
|
77
|
+
isDuplicating: Boolean(duplicateFromID),
|
|
62
78
|
operation: 'create',
|
|
79
|
+
originalDoc: duplicatedFromDoc,
|
|
63
80
|
overwriteExistingFiles,
|
|
64
81
|
req,
|
|
65
82
|
throwOnMissingFile: !shouldSaveDraft && collection.config.upload.filesRequiredOnCreate !== false
|
|
@@ -72,7 +89,7 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
72
89
|
collection: collectionConfig,
|
|
73
90
|
context: req.context,
|
|
74
91
|
data,
|
|
75
|
-
doc:
|
|
92
|
+
doc: duplicatedFromDoc,
|
|
76
93
|
global: null,
|
|
77
94
|
operation: 'create',
|
|
78
95
|
overrideAccess,
|
|
@@ -88,6 +105,7 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
88
105
|
context: req.context,
|
|
89
106
|
data,
|
|
90
107
|
operation: 'create',
|
|
108
|
+
originalDoc: duplicatedFromDoc,
|
|
91
109
|
req
|
|
92
110
|
}) || data;
|
|
93
111
|
}, Promise.resolve());
|
|
@@ -101,6 +119,7 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
101
119
|
context: req.context,
|
|
102
120
|
data,
|
|
103
121
|
operation: 'create',
|
|
122
|
+
originalDoc: duplicatedFromDoc,
|
|
104
123
|
req
|
|
105
124
|
}) || data;
|
|
106
125
|
}, Promise.resolve());
|
|
@@ -111,8 +130,8 @@ export const createOperation = async (incomingArgs)=>{
|
|
|
111
130
|
collection: collectionConfig,
|
|
112
131
|
context: req.context,
|
|
113
132
|
data,
|
|
114
|
-
doc:
|
|
115
|
-
docWithLocales:
|
|
133
|
+
doc: duplicatedFromDoc,
|
|
134
|
+
docWithLocales: duplicatedFromDocWithLocales,
|
|
116
135
|
global: null,
|
|
117
136
|
operation: 'create',
|
|
118
137
|
req,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/create.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { CollectionSlug, JsonObject } from '../../index.js'\nimport type {\n Document,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n AfterChangeHook,\n BeforeOperationHook,\n BeforeValidateHook,\n Collection,\n RequiredDataFromCollectionSlug,\n SelectFromCollectionSlug,\n} from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'\nimport { registerLocalStrategy } from '../../auth/strategies/local/register.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport { generateFileData } from '../../uploads/generateFileData.js'\nimport { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js'\nimport { uploadFiles } from '../../uploads/uploadFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utils.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n autosave?: boolean\n collection: Collection\n data: RequiredDataFromCollectionSlug<TSlug>\n depth?: number\n disableTransaction?: boolean\n disableVerificationEmail?: boolean\n draft?: boolean\n overrideAccess?: boolean\n overwriteExistingFiles?: boolean\n populate?: PopulateType\n req: PayloadRequest\n select?: SelectType\n showHiddenFields?: boolean\n}\n\nexport const createOperation = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: Arguments<TSlug>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n ensureUsernameOrEmail<TSlug>({\n authOptions: args.collection.config.auth,\n collectionSlug: args.collection.config.slug,\n data: args.data,\n operation: 'create',\n req: args.req,\n })\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(\n async (priorHook: BeforeOperationHook | Promise<void>, hook: BeforeOperationHook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection.config,\n context: args.req.context,\n operation: 'create',\n req: args.req,\n })) || args\n },\n Promise.resolve(),\n )\n\n const {\n autosave = false,\n collection: { config: collectionConfig },\n collection,\n depth,\n disableVerificationEmail,\n draft = false,\n overrideAccess,\n overwriteExistingFiles = false,\n populate,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { config },\n },\n req,\n select,\n showHiddenFields,\n } = args\n\n let { data } = args\n\n const shouldSaveDraft = Boolean(draft && collectionConfig.versions.drafts)\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n if (!overrideAccess) {\n await executeAccess({ data, req }, collectionConfig.access.create)\n }\n\n // /////////////////////////////////////\n // Generate data for all files and sizes\n // /////////////////////////////////////\n\n const { data: newFileData, files: filesToUpload } = await generateFileData({\n collection,\n config,\n data,\n operation: 'create',\n overwriteExistingFiles,\n req,\n throwOnMissingFile:\n !shouldSaveDraft && collection.config.upload.filesRequiredOnCreate !== false,\n })\n\n data = newFileData\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: {},\n global: null,\n operation: 'create',\n overrideAccess,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collections\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeValidate.reduce(\n async (priorHook: BeforeValidateHook | Promise<void>, hook: BeforeValidateHook) => {\n await priorHook\n\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'create',\n req,\n })) || data\n },\n Promise.resolve(),\n )\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeChange.reduce(async (priorHook, hook) => {\n await priorHook\n\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'create',\n req,\n })) || data\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const resultWithLocales = await beforeChange<JsonObject>({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: {},\n docWithLocales: {},\n global: null,\n operation: 'create',\n req,\n skipValidation:\n shouldSaveDraft &&\n collectionConfig.versions.drafts &&\n !collectionConfig.versions.drafts.validate,\n })\n\n // /////////////////////////////////////\n // Write files to local storage\n // /////////////////////////////////////\n\n if (!collectionConfig.upload.disableLocalStorage) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n // /////////////////////////////////////\n // Create\n // /////////////////////////////////////\n\n let doc\n\n if (collectionConfig.auth && !collectionConfig.auth.disableLocalStrategy) {\n if (collectionConfig.auth.verify) {\n resultWithLocales._verified = Boolean(resultWithLocales._verified) || false\n resultWithLocales._verificationToken = crypto.randomBytes(20).toString('hex')\n }\n\n doc = await registerLocalStrategy({\n collection: collectionConfig,\n doc: resultWithLocales,\n password: data.password as string,\n payload: req.payload,\n req,\n select,\n })\n } else {\n doc = await payload.db.create({\n collection: collectionConfig.slug,\n data: resultWithLocales,\n req,\n select,\n })\n }\n\n const verificationToken = doc._verificationToken\n let result: Document = sanitizeInternalFields(doc)\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await saveVersion({\n id: result.id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Send verification email if applicable\n // /////////////////////////////////////\n\n if (collectionConfig.auth && collectionConfig.auth.verify && result.email) {\n await sendVerificationEmail({\n collection: { config: collectionConfig },\n config: payload.config,\n disableEmail: disableVerificationEmail,\n email: payload.email,\n req,\n token: verificationToken,\n user: result,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: result,\n draft,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n req,\n })) || result\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'create',\n previousDoc: {},\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterChange.reduce(\n async (priorHook: AfterChangeHook | Promise<void>, hook: AfterChangeHook) => {\n await priorHook\n\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n operation: 'create',\n previousDoc: {},\n req: args.req,\n })) || result\n },\n Promise.resolve(),\n )\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<TSlug>({\n args,\n collection: collectionConfig,\n operation: 'create',\n result,\n })\n\n await unlinkTempFiles({ collectionConfig, config, req })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","ensureUsernameOrEmail","executeAccess","sendVerificationEmail","registerLocalStrategy","afterChange","afterRead","beforeChange","beforeValidate","generateFileData","unlinkTempFiles","uploadFiles","commitTransaction","initTransaction","killTransaction","sanitizeInternalFields","saveVersion","buildAfterOperation","createOperation","incomingArgs","args","shouldCommit","disableTransaction","req","authOptions","collection","config","auth","collectionSlug","slug","data","operation","hooks","beforeOperation","reduce","priorHook","hook","context","Promise","resolve","autosave","collectionConfig","depth","disableVerificationEmail","draft","overrideAccess","overwriteExistingFiles","populate","fallbackLocale","locale","payload","select","showHiddenFields","shouldSaveDraft","Boolean","versions","drafts","access","create","newFileData","files","filesToUpload","throwOnMissingFile","upload","filesRequiredOnCreate","doc","global","resultWithLocales","docWithLocales","skipValidation","validate","disableLocalStorage","disableLocalStrategy","verify","_verified","_verificationToken","randomBytes","toString","password","db","verificationToken","result","id","email","disableEmail","token","user","previousDoc","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/create.ts"],"sourcesContent":["import crypto from 'crypto'\n\nimport type { CollectionSlug, JsonObject } from '../../index.js'\nimport type {\n Document,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n AfterChangeHook,\n BeforeOperationHook,\n BeforeValidateHook,\n Collection,\n DataFromCollectionSlug,\n RequiredDataFromCollectionSlug,\n SelectFromCollectionSlug,\n} from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport { sendVerificationEmail } from '../../auth/sendVerificationEmail.js'\nimport { registerLocalStrategy } from '../../auth/strategies/local/register.js'\nimport { getDuplicateDocumentData } from '../../duplicateDocument/index.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../fields/hooks/beforeValidate/index.js'\nimport { generateFileData } from '../../uploads/generateFileData.js'\nimport { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js'\nimport { uploadFiles } from '../../uploads/uploadFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utils.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n autosave?: boolean\n collection: Collection\n data: RequiredDataFromCollectionSlug<TSlug>\n depth?: number\n disableTransaction?: boolean\n disableVerificationEmail?: boolean\n draft?: boolean\n duplicateFromID?: DataFromCollectionSlug<TSlug>['id']\n overrideAccess?: boolean\n overwriteExistingFiles?: boolean\n populate?: PopulateType\n req: PayloadRequest\n select?: SelectType\n showHiddenFields?: boolean\n}\n\nexport const createOperation = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: Arguments<TSlug>,\n): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n let args = incomingArgs\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(args.req))\n\n ensureUsernameOrEmail<TSlug>({\n authOptions: args.collection.config.auth,\n collectionSlug: args.collection.config.slug,\n data: args.data,\n operation: 'create',\n req: args.req,\n })\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n await args.collection.config.hooks.beforeOperation.reduce(\n async (priorHook: BeforeOperationHook | Promise<void>, hook: BeforeOperationHook) => {\n await priorHook\n\n args =\n (await hook({\n args,\n collection: args.collection.config,\n context: args.req.context,\n operation: 'create',\n req: args.req,\n })) || args\n },\n Promise.resolve(),\n )\n\n const {\n autosave = false,\n collection: { config: collectionConfig },\n collection,\n depth,\n disableVerificationEmail,\n draft = false,\n duplicateFromID,\n overrideAccess,\n overwriteExistingFiles = false,\n populate,\n req: {\n fallbackLocale,\n locale,\n payload,\n payload: { config },\n },\n req,\n select,\n showHiddenFields,\n } = args\n\n let { data } = args\n\n const shouldSaveDraft = Boolean(draft && collectionConfig.versions.drafts)\n\n let duplicatedFromDocWithLocales: JsonObject = {}\n let duplicatedFromDoc: JsonObject = {}\n\n if (duplicateFromID) {\n const duplicateResult = await getDuplicateDocumentData({\n id: duplicateFromID,\n collectionConfig,\n draftArg: shouldSaveDraft,\n overrideAccess,\n req,\n shouldSaveDraft,\n })\n\n duplicatedFromDoc = duplicateResult.duplicatedFromDoc\n duplicatedFromDocWithLocales = duplicateResult.duplicatedFromDocWithLocales\n }\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n if (!overrideAccess) {\n await executeAccess({ data, req }, collectionConfig.access.create)\n }\n\n // /////////////////////////////////////\n // Generate data for all files and sizes\n // /////////////////////////////////////\n\n const { data: newFileData, files: filesToUpload } = await generateFileData({\n collection,\n config,\n data,\n isDuplicating: Boolean(duplicateFromID),\n operation: 'create',\n originalDoc: duplicatedFromDoc,\n overwriteExistingFiles,\n req,\n throwOnMissingFile:\n !shouldSaveDraft && collection.config.upload.filesRequiredOnCreate !== false,\n })\n\n data = newFileData\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n data = await beforeValidate({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: duplicatedFromDoc,\n global: null,\n operation: 'create',\n overrideAccess,\n req,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collections\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeValidate.reduce(\n async (priorHook: BeforeValidateHook | Promise<void>, hook: BeforeValidateHook) => {\n await priorHook\n\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'create',\n originalDoc: duplicatedFromDoc,\n req,\n })) || data\n },\n Promise.resolve(),\n )\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.beforeChange.reduce(async (priorHook, hook) => {\n await priorHook\n\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'create',\n originalDoc: duplicatedFromDoc,\n req,\n })) || data\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const resultWithLocales = await beforeChange<JsonObject>({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: duplicatedFromDoc,\n docWithLocales: duplicatedFromDocWithLocales,\n global: null,\n operation: 'create',\n req,\n skipValidation:\n shouldSaveDraft &&\n collectionConfig.versions.drafts &&\n !collectionConfig.versions.drafts.validate,\n })\n\n // /////////////////////////////////////\n // Write files to local storage\n // /////////////////////////////////////\n\n if (!collectionConfig.upload.disableLocalStorage) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n // /////////////////////////////////////\n // Create\n // /////////////////////////////////////\n\n let doc\n\n if (collectionConfig.auth && !collectionConfig.auth.disableLocalStrategy) {\n if (collectionConfig.auth.verify) {\n resultWithLocales._verified = Boolean(resultWithLocales._verified) || false\n resultWithLocales._verificationToken = crypto.randomBytes(20).toString('hex')\n }\n\n doc = await registerLocalStrategy({\n collection: collectionConfig,\n doc: resultWithLocales,\n password: data.password as string,\n payload: req.payload,\n req,\n select,\n })\n } else {\n doc = await payload.db.create({\n collection: collectionConfig.slug,\n data: resultWithLocales,\n req,\n select,\n })\n }\n\n const verificationToken = doc._verificationToken\n let result: Document = sanitizeInternalFields(doc)\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n await saveVersion({\n id: result.id,\n autosave,\n collection: collectionConfig,\n docWithLocales: result,\n payload,\n req,\n })\n }\n\n // /////////////////////////////////////\n // Send verification email if applicable\n // /////////////////////////////////////\n\n if (collectionConfig.auth && collectionConfig.auth.verify && result.email) {\n await sendVerificationEmail({\n collection: { config: collectionConfig },\n config: payload.config,\n disableEmail: disableVerificationEmail,\n email: payload.email,\n req,\n token: verificationToken,\n user: result,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: result,\n draft,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook) => {\n await priorHook\n\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n req,\n })) || result\n }, Promise.resolve())\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'create',\n previousDoc: {},\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n await collectionConfig.hooks.afterChange.reduce(\n async (priorHook: AfterChangeHook | Promise<void>, hook: AfterChangeHook) => {\n await priorHook\n\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n operation: 'create',\n previousDoc: {},\n req: args.req,\n })) || result\n },\n Promise.resolve(),\n )\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation<TSlug>({\n args,\n collection: collectionConfig,\n operation: 'create',\n result,\n })\n\n await unlinkTempFiles({ collectionConfig, config, req })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["crypto","ensureUsernameOrEmail","executeAccess","sendVerificationEmail","registerLocalStrategy","getDuplicateDocumentData","afterChange","afterRead","beforeChange","beforeValidate","generateFileData","unlinkTempFiles","uploadFiles","commitTransaction","initTransaction","killTransaction","sanitizeInternalFields","saveVersion","buildAfterOperation","createOperation","incomingArgs","args","shouldCommit","disableTransaction","req","authOptions","collection","config","auth","collectionSlug","slug","data","operation","hooks","beforeOperation","reduce","priorHook","hook","context","Promise","resolve","autosave","collectionConfig","depth","disableVerificationEmail","draft","duplicateFromID","overrideAccess","overwriteExistingFiles","populate","fallbackLocale","locale","payload","select","showHiddenFields","shouldSaveDraft","Boolean","versions","drafts","duplicatedFromDocWithLocales","duplicatedFromDoc","duplicateResult","id","draftArg","access","create","newFileData","files","filesToUpload","isDuplicating","originalDoc","throwOnMissingFile","upload","filesRequiredOnCreate","doc","global","resultWithLocales","docWithLocales","skipValidation","validate","disableLocalStorage","disableLocalStrategy","verify","_verified","_verificationToken","randomBytes","toString","password","db","verificationToken","result","email","disableEmail","token","user","previousDoc","error"],"mappings":"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"}
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
+
import type { DeepPartial } from 'ts-essentials';
|
|
1
2
|
import type { CollectionSlug } from '../../index.js';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
disableTransaction?: boolean;
|
|
8
|
-
draft?: boolean;
|
|
3
|
+
import type { TransformCollectionWithSelect } from '../../types/index.js';
|
|
4
|
+
import type { RequiredDataFromCollectionSlug, SelectFromCollectionSlug } from '../config/types.js';
|
|
5
|
+
import { type Arguments as CreateArguments } from './create.js';
|
|
6
|
+
export type Arguments<TSlug extends CollectionSlug> = {
|
|
7
|
+
data?: DeepPartial<RequiredDataFromCollectionSlug<TSlug>>;
|
|
9
8
|
id: number | string;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
req: PayloadRequest;
|
|
13
|
-
select?: SelectType;
|
|
14
|
-
showHiddenFields?: boolean;
|
|
15
|
-
};
|
|
16
|
-
export declare const duplicateOperation: <TSlug extends CollectionSlug, TSelect extends SelectFromCollectionSlug<TSlug>>(incomingArgs: Arguments) => Promise<TransformCollectionWithSelect<TSlug, TSelect>>;
|
|
9
|
+
} & Omit<CreateArguments<TSlug>, 'data' | 'duplicateFromID'>;
|
|
10
|
+
export declare const duplicateOperation: <TSlug extends CollectionSlug, TSelect extends SelectFromCollectionSlug<TSlug>>(incomingArgs: Arguments<TSlug>) => Promise<TransformCollectionWithSelect<TSlug, TSelect>>;
|
|
17
11
|
//# sourceMappingURL=duplicate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicate.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/duplicate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duplicate.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/duplicate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAElG,OAAO,EAAE,KAAK,SAAS,IAAI,eAAe,EAAmB,MAAM,aAAa,CAAA;AAEhF,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,IAAI,CAAC,EAAE,WAAW,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAA;IACzD,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CACpB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAA;AAE5D,eAAO,MAAM,kBAAkB,GAC7B,KAAK,SAAS,cAAc,EAC5B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,CAOvD,CAAA"}
|