payload 4.0.0-beta.3 → 4.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/cli/defineCLICommand.js +1 -1
- package/dist/cli/defineCLICommand.js.map +1 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/utilities/update.js +1 -1
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.js +2 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/exports/build-config.d.ts +9 -0
- package/dist/exports/build-config.d.ts.map +1 -0
- package/dist/exports/build-config.js +38 -0
- package/dist/exports/build-config.js.map +1 -0
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +4 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +22 -15
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +2 -2
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +12 -3
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/stagedUpload.js.map +1 -1
- package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
- package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
- package/dist/utilities/cloneValidationRequest.js.map +1 -1
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/documentMatchingWhereExists.js +1 -1
- package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseValidationLocale.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/package.json +11 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +1 -1
|
@@ -43,7 +43,7 @@ export type RouterAdapterRouter = {
|
|
|
43
43
|
*/
|
|
44
44
|
replace: (path: string, options?: {
|
|
45
45
|
scroll?: boolean;
|
|
46
|
-
}) => void;
|
|
46
|
+
}) => Promise<void> | void;
|
|
47
47
|
/**
|
|
48
48
|
* Use this property to standardize behaviors across different router implementations.
|
|
49
49
|
* Set it up to sync client state to the URL without triggering a second server load.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/admin/adapters/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,CAAA;AAEvF,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB;;OAEG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5D;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IAC/
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/admin/adapters/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,CAAA;AAEvF,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB;;OAEG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5D;;OAEG;IACH,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB;;OAEG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/E;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAClC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/adapters/router.ts"],"sourcesContent":["import type React from 'react'\n\n/**\n * Client-side router adapter to abstract away framework-specific routing implementations.\n * This way plugins and server components can use server-only APIs without directly importing any framework-specific modules.\n *\n * @example\n * ```tsx\n * // Next.js router adapter (simplified):\n * import { useRouter as useNextRouter, usePathname as useNextPathname } from 'next/navigation'\n *\n * const NextRouterAdapter: RouterAdapterComponent = ({ children }) => {\n * const router = useNextRouter()\n * const pathname = useNextPathname()\n *\n * return (\n * <RouterAdapterContext value={{ router, pathname, ... }}>\n * {children}\n * </RouterAdapterContext>\n * )\n * }\n * ```\n */\nexport type RouterAdapterComponent = React.ComponentType<{ children: React.ReactNode }>\n\nexport type RouterAdapterRouter = {\n /**\n * Navigate back to the previous page in the history stack.\n */\n back: () => void\n /**\n * Navigate to a new path.\n */\n push: (path: string, options?: { scroll?: boolean }) => void\n /**\n * Refresh the current route.\n */\n refresh: () => void\n /**\n * Replace the current path with a new one.\n */\n replace: (path: string, options?: { scroll?: boolean }) => void\n /**\n * Use this property to standardize behaviors across different router implementations.\n * Set it up to sync client state to the URL without triggering a second server load.\n *\n * In Next.js, calling `window.history.replaceState` directly is sufficient, as Next.js does not observe history mutations.\n * In TanStack Router, however, `history.replaceState` is monkeypatched to notify the router of changes.\n */\n replaceState?: (url: string) => void\n}\n\nexport type LinkAdapterProps = {\n children?: React.ReactNode\n href: string\n prefetch?: boolean\n ref?: React.Ref<HTMLAnchorElement>\n replace?: boolean\n scroll?: boolean\n} & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>\n"],"names":[],"mappings":"AAoDA,WAO+D"}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/adapters/router.ts"],"sourcesContent":["import type React from 'react'\n\n/**\n * Client-side router adapter to abstract away framework-specific routing implementations.\n * This way plugins and server components can use server-only APIs without directly importing any framework-specific modules.\n *\n * @example\n * ```tsx\n * // Next.js router adapter (simplified):\n * import { useRouter as useNextRouter, usePathname as useNextPathname } from 'next/navigation'\n *\n * const NextRouterAdapter: RouterAdapterComponent = ({ children }) => {\n * const router = useNextRouter()\n * const pathname = useNextPathname()\n *\n * return (\n * <RouterAdapterContext value={{ router, pathname, ... }}>\n * {children}\n * </RouterAdapterContext>\n * )\n * }\n * ```\n */\nexport type RouterAdapterComponent = React.ComponentType<{ children: React.ReactNode }>\n\nexport type RouterAdapterRouter = {\n /**\n * Navigate back to the previous page in the history stack.\n */\n back: () => void\n /**\n * Navigate to a new path.\n */\n push: (path: string, options?: { scroll?: boolean }) => void\n /**\n * Refresh the current route.\n */\n refresh: () => void\n /**\n * Replace the current path with a new one.\n */\n replace: (path: string, options?: { scroll?: boolean }) => Promise<void> | void\n /**\n * Use this property to standardize behaviors across different router implementations.\n * Set it up to sync client state to the URL without triggering a second server load.\n *\n * In Next.js, calling `window.history.replaceState` directly is sufficient, as Next.js does not observe history mutations.\n * In TanStack Router, however, `history.replaceState` is monkeypatched to notify the router of changes.\n */\n replaceState?: (url: string) => void\n}\n\nexport type LinkAdapterProps = {\n children?: React.ReactNode\n href: string\n prefetch?: boolean\n ref?: React.Ref<HTMLAnchorElement>\n replace?: boolean\n scroll?: boolean\n} & Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'>\n"],"names":[],"mappings":"AAoDA,WAO+D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/admin/initAdminContext.ts"],"sourcesContent":["import type { I18n, I18nClient } from '@payloadcms/translations'\n\nimport { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { ImportMap } from '../cli/commands/generateImportMap/generateImportMap.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { CreatePayloadRequestArgs } from '../utilities/createPayloadRequest.js'\nimport type { ServerAdapter } from './adapters/server.js'\nimport type { AdminContext } from './functions/index.js'\n\nimport { applyUserReadAccess } from '../auth/applyUserReadAccess.js'\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getAccessResults } from '../auth/getAccessResults.js'\nimport { getPayload } from '../index.js'\nimport { createPayloadRequest } from '../utilities/createPayloadRequest.js'\nimport { getRequestLanguage } from '../utilities/getRequestLanguage.js'\nimport { parseCookies } from '../utilities/parseCookies.js'\nimport { getRequestLocale } from './getRequestLocale.js'\n\nexport type PartialAdminContext = {\n i18n: I18nClient\n} & Pick<PayloadRequest, 'payload' | 'responseHeaders' | 'user'>\n\n/** Framework-provided request-scoped caching hooks used to deduplicate admin context creation. */\nexport type AdminContextCache = {\n /** Reuses locale preference resolution across admin contexts. */\n getLocale?: (\n resolveLocale: () => Promise<Pick<AdminContext, 'locale'>>,\n ...cacheArgs: unknown[]\n ) => Promise<Pick<AdminContext, 'locale'>>\n /** Reuses Payload, i18n, and authentication state within the current request. */\n getPartial: (\n createPartialContext: () => Promise<PartialAdminContext>,\n ) => Promise<PartialAdminContext>\n /** Reuses a complete admin context for the supplied key and cache arguments. */\n getRequest: (\n createContext: () => Promise<AdminContext>,\n key: string,\n ...cacheArgs: unknown[]\n ) => Promise<AdminContext>\n}\n\nexport type InitAdminContextArgs = {\n /**\n * Optional framework-owned request-scoped cache.\n * Framework adapters control its lifetime to prevent request state from leaking between requests.\n */\n cache?: AdminContextCache\n canSetHeaders?: boolean\n configPromise: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n /** Identifies the complete admin context within `cache`; required when a cache is supplied. */\n key?: string\n overrides?: Omit<CreatePayloadRequestArgs, 'payload'>\n requestURL?: string\n serverAdapter: ServerAdapter\n}\n\n/**\n * Creates the request context used by framework adapters to render the admin panel.\n */\nexport async function initAdminContext({\n cache,\n canSetHeaders,\n configPromise,\n importMap,\n key,\n overrides,\n requestURL,\n serverAdapter,\n}: InitAdminContextArgs): Promise<AdminContext> {\n if (cache && !key) {\n throw new Error('initAdminContext requires a key when cache is provided')\n }\n\n const headers = await serverAdapter.getHeaders()\n const cookies = parseCookies(headers)\n\n const createPartialContext = async (): Promise<PartialAdminContext> => {\n const config = await configPromise\n const payload = await getPayload({ config, cron: true, importMap })\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers,\n payload,\n })\n\n return {\n i18n,\n payload,\n responseHeaders,\n user,\n }\n }\n\n const partialContext = cache\n ? await cache.getPartial(createPartialContext)\n : await createPartialContext()\n\n const createContext = async (): Promise<AdminContext> => {\n const { i18n, payload, responseHeaders, user } = partialContext\n const { req: reqOverrides, ...optionsOverrides } = overrides || {}\n const hasOptionsUserOverride = Object.hasOwn(optionsOverrides, 'user')\n const hasReqUserOverride = Object.hasOwn(reqOverrides ?? {}, 'user')\n const hasUserOverride = hasOptionsUserOverride || hasReqUserOverride\n const userOverride = hasOptionsUserOverride ? optionsOverrides.user : reqOverrides?.user\n const requestDefaults = getRequestDefaults({ requestURL })\n\n const req = await createPayloadRequest({\n req: {\n headers,\n host: headers.get('host') ?? undefined,\n i18n: i18n as I18n,\n responseHeaders,\n server: serverAdapter,\n user,\n ...requestDefaults,\n ...(reqOverrides || {}),\n },\n ...(optionsOverrides || {}),\n payload,\n })\n\n if (hasUserOverride && userOverride == null) {\n req.user = null\n }\n\n const resolveLocale = async (): Promise<Pick<AdminContext, 'locale'>> => ({\n locale: await getRequestLocale({ req }),\n })\n const { locale } = cache?.getLocale\n ? await cache.getLocale(\n resolveLocale,\n payload,\n req.user?.collection,\n req.user?.id,\n req.query.locale,\n )\n : await resolveLocale()\n\n req.locale = locale?.code\n\n let userWithReadAccess = req.user\n\n if (!hasUserOverride && req.user) {\n try {\n const collectionSlug = req.user.collection ?? payload.config.admin.user\n const collection = payload.collections[collectionSlug]?.config\n\n if (!collection?.auth) {\n throw new Error('Authenticated user collection not found')\n }\n\n userWithReadAccess = await applyUserReadAccess({\n collection,\n depth: collection.auth.depth,\n overrideAccess: false,\n req,\n showHiddenFields: false,\n user: req.user,\n })\n } catch (error) {\n payload.logger.error({ err: error })\n req.user = null\n userWithReadAccess = null\n }\n }\n\n const permissions = await getAccessResults({ req })\n\n return {\n cookies,\n locale,\n permissions,\n req,\n user: userWithReadAccess,\n }\n }\n\n const result = cache\n ? await cache.getRequest(createContext, key!, overrides)\n : await createContext()\n\n return {\n ...result,\n req: {\n ...result.req,\n ...(result.req.context\n ? {\n context: { ...result.req.context },\n }\n : {}),\n },\n }\n}\n\nfunction getRequestDefaults({\n requestURL,\n}: {\n requestURL?: string\n}): Partial<Pick<PayloadRequest, 'query' | 'url'>> {\n if (!requestURL) {\n return {}\n }\n\n try {\n const url = new URL(requestURL)\n\n return {\n ...(url.search\n ? {\n query: qs.parse(url.search, {\n depth: 10,\n ignoreQueryPrefix: true,\n }) as PayloadRequest['query'],\n }\n : {}),\n url: requestURL,\n }\n } catch {\n return {}\n }\n}\n"],"names":["initI18n","qs","applyUserReadAccess","executeAuthStrategies","getAccessResults","getPayload","createPayloadRequest","getRequestLanguage","parseCookies","getRequestLocale","initAdminContext","cache","canSetHeaders","configPromise","importMap","key","overrides","requestURL","serverAdapter","Error","headers","getHeaders","cookies","createPartialContext","config","payload","cron","languageCode","i18n","context","language","responseHeaders","user","partialContext","getPartial","createContext","req","reqOverrides","optionsOverrides","hasOptionsUserOverride","Object","hasOwn","hasReqUserOverride","hasUserOverride","userOverride","requestDefaults","getRequestDefaults","host","get","undefined","server","resolveLocale","locale","getLocale","collection","id","query","code","userWithReadAccess","collectionSlug","admin","collections","auth","depth","overrideAccess","showHiddenFields","error","logger","err","permissions","result","getRequest","url","URL","search","parse","ignoreQueryPrefix"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/admin/initAdminContext.ts"],"sourcesContent":["import type { I18n, I18nClient } from '@payloadcms/translations'\n\nimport { initI18n } from '@payloadcms/translations'\nimport * as qs from 'qs-esm'\n\nimport type { ImportMap } from '../cli/commands/generateImportMap/generateImportMap.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { CreatePayloadRequestArgs } from '../utilities/createPayloadRequest.js'\nimport type { ServerAdapter } from './adapters/server.js'\nimport type { AdminContext } from './functions/index.js'\n\nimport { applyUserReadAccess } from '../auth/applyUserReadAccess.js'\nimport { executeAuthStrategies } from '../auth/executeAuthStrategies.js'\nimport { getAccessResults } from '../auth/getAccessResults.js'\nimport { getPayload } from '../index.js'\nimport { createPayloadRequest } from '../utilities/createPayloadRequest.js'\nimport { getRequestLanguage } from '../utilities/getRequestLanguage.js'\nimport { parseCookies } from '../utilities/parseCookies.js'\nimport { getRequestLocale } from './getRequestLocale.js'\n\nexport type PartialAdminContext = {\n i18n: I18nClient\n} & Pick<PayloadRequest, 'payload' | 'responseHeaders' | 'user'>\n\n/** Framework-provided request-scoped caching hooks used to deduplicate admin context creation. */\nexport type AdminContextCache = {\n /** Reuses locale preference resolution across admin contexts. */\n getLocale?: (\n resolveLocale: () => Promise<Pick<AdminContext, 'locale'>>,\n ...cacheArgs: unknown[]\n ) => Promise<Pick<AdminContext, 'locale'>>\n /** Reuses Payload, i18n, and authentication state within the current request. */\n getPartial: (\n createPartialContext: () => Promise<PartialAdminContext>,\n ) => Promise<PartialAdminContext>\n /** Reuses a complete admin context for the supplied key and cache arguments. */\n getRequest: (\n createContext: () => Promise<AdminContext>,\n key: string,\n ...cacheArgs: unknown[]\n ) => Promise<AdminContext>\n}\n\nexport type InitAdminContextArgs = {\n /**\n * Optional framework-owned request-scoped cache.\n * Framework adapters control its lifetime to prevent request state from leaking between requests.\n */\n cache?: AdminContextCache\n canSetHeaders?: boolean\n configPromise: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n /** Identifies the complete admin context within `cache`; required when a cache is supplied. */\n key?: string\n overrides?: Omit<CreatePayloadRequestArgs, 'payload'>\n requestURL?: string\n serverAdapter: ServerAdapter\n}\n\n/**\n * Creates the request context used by framework adapters to render the admin panel.\n */\nexport async function initAdminContext({\n cache,\n canSetHeaders,\n configPromise,\n importMap,\n key,\n overrides,\n requestURL,\n serverAdapter,\n}: InitAdminContextArgs): Promise<AdminContext> {\n if (cache && !key) {\n throw new Error('initAdminContext requires a key when cache is provided')\n }\n\n const headers = await serverAdapter.getHeaders()\n const cookies = parseCookies(headers)\n\n const createPartialContext = async (): Promise<PartialAdminContext> => {\n const config = await configPromise\n const payload = await getPayload({ config, cron: true, importMap })\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const i18n = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers,\n payload,\n })\n\n return {\n i18n,\n payload,\n responseHeaders,\n user,\n }\n }\n\n const partialContext = cache\n ? await cache.getPartial(createPartialContext)\n : await createPartialContext()\n\n const createContext = async (): Promise<AdminContext> => {\n const { i18n, payload, responseHeaders, user } = partialContext\n const { req: reqOverrides, ...optionsOverrides } = overrides || {}\n const hasOptionsUserOverride = Object.hasOwn(optionsOverrides, 'user')\n const hasReqUserOverride = Object.hasOwn(reqOverrides ?? {}, 'user')\n const hasUserOverride = hasOptionsUserOverride || hasReqUserOverride\n const userOverride = hasOptionsUserOverride ? optionsOverrides.user : reqOverrides?.user\n const requestDefaults = getRequestDefaults({ requestURL })\n\n const req = await createPayloadRequest({\n req: {\n headers,\n host: headers.get('host') ?? undefined,\n i18n: i18n as I18n,\n responseHeaders,\n server: serverAdapter,\n user,\n ...requestDefaults,\n ...(reqOverrides || {}),\n },\n ...(optionsOverrides || {}),\n payload,\n })\n\n if (hasUserOverride && userOverride == null) {\n req.user = null\n }\n\n const resolveLocale = async (): Promise<Pick<AdminContext, 'locale'>> => ({\n locale: await getRequestLocale({ req }),\n })\n const { locale } = cache?.getLocale\n ? await cache.getLocale(\n resolveLocale,\n payload,\n req.user?.collection,\n req.user?.id,\n req.query.locale,\n )\n : await resolveLocale()\n\n req.locale = locale?.code\n\n let userWithReadAccess = req.user\n\n if (!hasUserOverride && req.user) {\n try {\n const collectionSlug = req.user.collection ?? payload.config.admin.user\n const collection = payload.collections[collectionSlug]?.config\n\n if (!collection?.auth) {\n throw new Error('Authenticated user collection not found')\n }\n\n userWithReadAccess = await applyUserReadAccess({\n collection,\n depth: collection.auth.depth,\n overrideAccess: false,\n req,\n showHiddenFields: false,\n user: req.user,\n })\n } catch (error) {\n payload.logger.error({ err: error })\n req.user = null\n userWithReadAccess = null\n }\n }\n\n const permissions = await getAccessResults({ req })\n\n return {\n cookies,\n locale,\n permissions,\n req,\n user: userWithReadAccess,\n }\n }\n\n const result = cache\n ? await cache.getRequest(createContext, key!, overrides)\n : await createContext()\n\n return {\n ...result,\n req: {\n ...result.req,\n ...(result.req.context\n ? {\n context: { ...result.req.context },\n }\n : {}),\n },\n }\n}\n\nfunction getRequestDefaults({\n requestURL,\n}: {\n requestURL?: string\n}): Partial<Pick<PayloadRequest, 'query' | 'url'>> {\n if (!requestURL) {\n return {}\n }\n\n try {\n const url = new URL(requestURL)\n\n return {\n ...(url.search\n ? {\n query: qs.parse(url.search, {\n depth: 10,\n ignoreQueryPrefix: true,\n }),\n }\n : {}),\n url: requestURL,\n }\n } catch {\n return {}\n }\n}\n"],"names":["initI18n","qs","applyUserReadAccess","executeAuthStrategies","getAccessResults","getPayload","createPayloadRequest","getRequestLanguage","parseCookies","getRequestLocale","initAdminContext","cache","canSetHeaders","configPromise","importMap","key","overrides","requestURL","serverAdapter","Error","headers","getHeaders","cookies","createPartialContext","config","payload","cron","languageCode","i18n","context","language","responseHeaders","user","partialContext","getPartial","createContext","req","reqOverrides","optionsOverrides","hasOptionsUserOverride","Object","hasOwn","hasReqUserOverride","hasUserOverride","userOverride","requestDefaults","getRequestDefaults","host","get","undefined","server","resolveLocale","locale","getLocale","collection","id","query","code","userWithReadAccess","collectionSlug","admin","collections","auth","depth","overrideAccess","showHiddenFields","error","logger","err","permissions","result","getRequest","url","URL","search","parse","ignoreQueryPrefix"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/getFieldsToSign.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Field, TabAsField } from '../fields/config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\n\nconst reservedJWTFields = new Set(['collection', 'email', 'exp', 'iat', 'id', 'sid'])\n\ntype TraverseFieldsArgs = {\n data: Record<string, unknown>\n fields: (Field | TabAsField)[]\n result: Record<string, unknown>\n}\nconst traverseFields = ({\n data,\n // parent,\n fields,\n result,\n}: TraverseFieldsArgs) => {\n fields.forEach((field) => {\n switch (field.type) {\n case 'collapsible':\n case 'row': {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n break\n }\n case 'group': {\n if (fieldAffectsData(field)) {\n const groupData: Record<string, unknown> =\n (data[field.name] as Record<string, unknown>) ?? {}\n let targetResult\n if (typeof field.saveToJWT === 'string') {\n targetResult = field.saveToJWT\n result[field.saveToJWT] = groupData\n } else if (field.saveToJWT) {\n targetResult = field.name\n result[field.name] = groupData\n }\n const groupResult = (targetResult ? result[targetResult] : result) as Record<\n string,\n unknown\n >\n traverseFields({\n data: groupData,\n fields: field.fields,\n result: groupResult,\n })\n break\n } else {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n\n break\n }\n }\n case 'tab': {\n if (tabHasName(field)) {\n const tabData: Record<string, unknown> =\n (data[field.name] as Record<string, unknown>) ?? {}\n let targetResult\n if (typeof field.saveToJWT === 'string') {\n targetResult = field.saveToJWT\n result[field.saveToJWT] = tabData\n } else if (field.saveToJWT) {\n targetResult = field.name\n result[field.name] = tabData\n }\n const tabResult = (targetResult ? result[targetResult] : result) as Record<\n string,\n unknown\n >\n traverseFields({\n data: tabData,\n fields: field.fields,\n result: tabResult,\n })\n } else {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n }\n break\n }\n case 'tabs': {\n traverseFields({\n data,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n result,\n })\n break\n }\n default:\n if (fieldAffectsData(field)) {\n if (field.saveToJWT) {\n if (typeof field.saveToJWT === 'string') {\n result[field.saveToJWT] = data[field.name]\n delete result[field.name]\n } else {\n result[field.name] = data[field.name]
|
|
1
|
+
{"version":3,"sources":["../../src/auth/getFieldsToSign.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { Field, TabAsField } from '../fields/config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\n\nconst reservedJWTFields = new Set(['collection', 'email', 'exp', 'iat', 'id', 'sid'])\n\ntype TraverseFieldsArgs = {\n data: Record<string, unknown>\n fields: (Field | TabAsField)[]\n result: Record<string, unknown>\n}\nconst traverseFields = ({\n data,\n // parent,\n fields,\n result,\n}: TraverseFieldsArgs) => {\n fields.forEach((field) => {\n switch (field.type) {\n case 'collapsible':\n case 'row': {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n break\n }\n case 'group': {\n if (fieldAffectsData(field)) {\n const groupData: Record<string, unknown> =\n (data[field.name] as Record<string, unknown>) ?? {}\n let targetResult\n if (typeof field.saveToJWT === 'string') {\n targetResult = field.saveToJWT\n result[field.saveToJWT] = groupData\n } else if (field.saveToJWT) {\n targetResult = field.name\n result[field.name] = groupData\n }\n const groupResult = (targetResult ? result[targetResult] : result) as Record<\n string,\n unknown\n >\n traverseFields({\n data: groupData,\n fields: field.fields,\n result: groupResult,\n })\n break\n } else {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n\n break\n }\n }\n case 'tab': {\n if (tabHasName(field)) {\n const tabData: Record<string, unknown> =\n (data[field.name] as Record<string, unknown>) ?? {}\n let targetResult\n if (typeof field.saveToJWT === 'string') {\n targetResult = field.saveToJWT\n result[field.saveToJWT] = tabData\n } else if (field.saveToJWT) {\n targetResult = field.name\n result[field.name] = tabData\n }\n const tabResult = (targetResult ? result[targetResult] : result) as Record<\n string,\n unknown\n >\n traverseFields({\n data: tabData,\n fields: field.fields,\n result: tabResult,\n })\n } else {\n traverseFields({\n data,\n fields: field.fields,\n result,\n })\n }\n break\n }\n case 'tabs': {\n traverseFields({\n data,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n result,\n })\n break\n }\n default:\n if (fieldAffectsData(field)) {\n if (field.saveToJWT) {\n if (typeof field.saveToJWT === 'string') {\n result[field.saveToJWT] = data[field.name]\n delete result[field.name]\n } else {\n result[field.name] = data[field.name]\n }\n } else if (field.saveToJWT === false) {\n delete result[field.name]\n }\n }\n }\n })\n return result\n}\nexport const getFieldsToSign = (args: {\n collectionConfig: CollectionConfig\n email: string\n sid?: string\n user: PayloadRequest['user']\n}): Record<string, unknown> => {\n const { collectionConfig, email, sid, user } = args\n\n const fieldsToSign = Object.create(null) as Record<string, unknown>\n\n traverseFields({\n data: user!,\n fields: collectionConfig.fields,\n result: fieldsToSign,\n })\n\n for (const fieldName of reservedJWTFields) {\n delete fieldsToSign[fieldName]\n }\n\n fieldsToSign.id = user?.id\n fieldsToSign.collection = collectionConfig.slug\n fieldsToSign.email = email\n\n if (sid) {\n fieldsToSign.sid = sid\n }\n\n return fieldsToSign\n}\n"],"names":["fieldAffectsData","tabHasName","reservedJWTFields","Set","traverseFields","data","fields","result","forEach","field","type","groupData","name","targetResult","saveToJWT","groupResult","tabData","tabResult","tabs","map","tab","getFieldsToSign","args","collectionConfig","email","sid","user","fieldsToSign","Object","create","fieldName","id","collection","slug"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/loginWithCookie.ts"],"sourcesContent":["import type { Collection } from '../collections/config/types.js'\nimport type { AuthCollectionSlug } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { generateCookie } from './cookies.js'\nimport type { LoginResult } from './operations/login.js'\n\nimport { generatePayloadCookie } from './cookies.js'\nimport { loginOperation } from './operations/login.js'\n\ntype CookieObject = Extract<ReturnType<typeof generateCookie<true>>, { name: string }>\n\ntype LoginWithCookieArgs<TReturnCookieAsObject extends boolean> = {\n collection: Collection\n data: Parameters<typeof loginOperation>[0]['data']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n /** Return the cookie as parts rather than a serialized header string. */\n returnCookieAsObject?: TReturnCookieAsObject\n}\n\n/**\n * Runs the login operation and builds the auth cookie from its token, then\n * applies `auth.removeTokenFromResponses` to the returned result.\n *\n * The order matters: the token has to be read before the flag strips it, or the\n * caller ends up returning a user with no way to establish a session. Shared by\n * the REST login handler and the framework adapters' `login` server function so\n * that ordering only exists in one place.\n */\nexport const loginWithCookie = async <\n TSlug extends AuthCollectionSlug,\n TReturnCookieAsObject extends boolean = false,\n>({\n collection,\n data,\n depth,\n overrideAccess,\n req,\n returnCookieAsObject,\n}: LoginWithCookieArgs<TReturnCookieAsObject>): Promise<{\n cookie: TReturnCookieAsObject extends true ? CookieObject : string\n result: LoginResult<TSlug>\n}> => {\n const result = await loginOperation({\n collection,\n data,\n depth,\n overrideAccess,\n req,\n })\n\n const cookie = generatePayloadCookie({\n collectionAuthConfig: collection.config.auth,\n cookiePrefix: req.payload.config.cookiePrefix,\n returnCookieAsObject: returnCookieAsObject ?? false,\n token: result.token!,\n })
|
|
1
|
+
{"version":3,"sources":["../../src/auth/loginWithCookie.ts"],"sourcesContent":["import type { Collection } from '../collections/config/types.js'\nimport type { AuthCollectionSlug } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { generateCookie } from './cookies.js'\nimport type { LoginResult } from './operations/login.js'\n\nimport { generatePayloadCookie } from './cookies.js'\nimport { loginOperation } from './operations/login.js'\n\ntype CookieObject = Extract<ReturnType<typeof generateCookie<true>>, { name: string }>\n\ntype LoginWithCookieArgs<TReturnCookieAsObject extends boolean> = {\n collection: Collection\n data: Parameters<typeof loginOperation>[0]['data']\n depth?: number\n overrideAccess?: boolean\n req: PayloadRequest\n /** Return the cookie as parts rather than a serialized header string. */\n returnCookieAsObject?: TReturnCookieAsObject\n}\n\n/**\n * Runs the login operation and builds the auth cookie from its token, then\n * applies `auth.removeTokenFromResponses` to the returned result.\n *\n * The order matters: the token has to be read before the flag strips it, or the\n * caller ends up returning a user with no way to establish a session. Shared by\n * the REST login handler and the framework adapters' `login` server function so\n * that ordering only exists in one place.\n */\nexport const loginWithCookie = async <\n TSlug extends AuthCollectionSlug,\n TReturnCookieAsObject extends boolean = false,\n>({\n collection,\n data,\n depth,\n overrideAccess,\n req,\n returnCookieAsObject,\n}: LoginWithCookieArgs<TReturnCookieAsObject>): Promise<{\n cookie: TReturnCookieAsObject extends true ? CookieObject : string\n result: LoginResult<TSlug>\n}> => {\n const result = await loginOperation({\n collection,\n data,\n depth,\n overrideAccess,\n req,\n })\n\n const cookie = generatePayloadCookie({\n collectionAuthConfig: collection.config.auth,\n cookiePrefix: req.payload.config.cookiePrefix,\n returnCookieAsObject: returnCookieAsObject ?? false,\n token: result.token!,\n })\n\n if (collection.config.auth.removeTokenFromResponses) {\n delete result.token\n }\n\n return { cookie, result }\n}\n"],"names":["generatePayloadCookie","loginOperation","loginWithCookie","collection","data","depth","overrideAccess","req","returnCookieAsObject","result","cookie","collectionAuthConfig","config","auth","cookiePrefix","payload","token","removeTokenFromResponses"],"mappings":"AAMA,SAASA,qBAAqB,QAAQ,eAAc;AACpD,SAASC,cAAc,QAAQ,wBAAuB;AActD;;;;;;;;CAQC,GACD,OAAO,MAAMC,kBAAkB,OAG7B,EACAC,UAAU,EACVC,IAAI,EACJC,KAAK,EACLC,cAAc,EACdC,GAAG,EACHC,oBAAoB,EACuB;IAI3C,MAAMC,SAAS,MAAMR,eAAe;QAClCE;QACAC;QACAC;QACAC;QACAC;IACF;IAEA,MAAMG,SAASV,sBAAsB;QACnCW,sBAAsBR,WAAWS,MAAM,CAACC,IAAI;QAC5CC,cAAcP,IAAIQ,OAAO,CAACH,MAAM,CAACE,YAAY;QAC7CN,sBAAsBA,wBAAwB;QAC9CQ,OAAOP,OAAOO,KAAK;IACrB;IAEA,IAAIb,WAAWS,MAAM,CAACC,IAAI,CAACI,wBAAwB,EAAE;QACnD,OAAOR,OAAOO,KAAK;IACrB;IAEA,OAAO;QAAEN;QAAQD;IAAO;AAC1B,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/serverFunctions/cookies.ts"],"sourcesContent":["import type { CookieOptions } from '../../admin/adapters/cookies.js'\nimport type { ServerAdapter } from '../../admin/adapters/server.js'\nimport type { Auth } from '../types.js'\n\nimport { generateExpiredPayloadCookie, generatePayloadCookie } from '../cookies.js'\n\n/**\n * Object form returned by `generatePayloadCookie`/`generateExpiredPayloadCookie`\n * when `returnCookieAsObject` is `true`.\n */\nexport type GeneratedCookie = {\n domain?: string\n expires?: string\n httpOnly?: boolean\n maxAge?: number\n name: string\n path?: string\n sameSite?: 'Lax' | 'None' | 'Strict'\n secure?: boolean\n value: string | undefined\n}\n\n// `generateCookie` emits capitalized `SameSite` values (as they appear in the\n// header); `CookieOptions` takes the lowercase form.\nconst toCookieOptions = (cookie: GeneratedCookie): CookieOptions => ({\n domain: cookie.domain,\n expires: cookie.expires ? new Date(cookie.expires) : undefined,\n httpOnly: cookie.httpOnly,\n maxAge: cookie.maxAge,\n path: cookie.path,\n sameSite: cookie.sameSite?.toLowerCase() as CookieOptions['sameSite'],\n secure: cookie.secure,\n})\n\ntype AuthCookieArgs = {\n authConfig: Auth\n cookiePrefix: string\n serverAdapter: ServerAdapter\n}\n\n/** Writes an already-generated cookie through the framework's cookie API. */\nexport async function applyAuthCookie({\n cookie,\n serverAdapter,\n}: {\n cookie: GeneratedCookie\n serverAdapter: ServerAdapter\n}): Promise<void> {\n if (!cookie.value) {\n return\n }\n\n await serverAdapter.setCookie(cookie.name, cookie.value, toCookieOptions(cookie))\n}\n\n/** Writes the Payload auth cookie for `token` through the framework's cookie API. */\nexport async function setAuthCookie({\n authConfig,\n cookiePrefix,\n serverAdapter,\n token,\n}: { token: string } & AuthCookieArgs): Promise<void> {\n const cookie = generatePayloadCookie({\n collectionAuthConfig: authConfig,\n cookiePrefix,\n returnCookieAsObject: true,\n token,\n })
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/serverFunctions/cookies.ts"],"sourcesContent":["import type { CookieOptions } from '../../admin/adapters/cookies.js'\nimport type { ServerAdapter } from '../../admin/adapters/server.js'\nimport type { Auth } from '../types.js'\n\nimport { generateExpiredPayloadCookie, generatePayloadCookie } from '../cookies.js'\n\n/**\n * Object form returned by `generatePayloadCookie`/`generateExpiredPayloadCookie`\n * when `returnCookieAsObject` is `true`.\n */\nexport type GeneratedCookie = {\n domain?: string\n expires?: string\n httpOnly?: boolean\n maxAge?: number\n name: string\n path?: string\n sameSite?: 'Lax' | 'None' | 'Strict'\n secure?: boolean\n value: string | undefined\n}\n\n// `generateCookie` emits capitalized `SameSite` values (as they appear in the\n// header); `CookieOptions` takes the lowercase form.\nconst toCookieOptions = (cookie: GeneratedCookie): CookieOptions => ({\n domain: cookie.domain,\n expires: cookie.expires ? new Date(cookie.expires) : undefined,\n httpOnly: cookie.httpOnly,\n maxAge: cookie.maxAge,\n path: cookie.path,\n sameSite: cookie.sameSite?.toLowerCase() as CookieOptions['sameSite'],\n secure: cookie.secure,\n})\n\ntype AuthCookieArgs = {\n authConfig: Auth\n cookiePrefix: string\n serverAdapter: ServerAdapter\n}\n\n/** Writes an already-generated cookie through the framework's cookie API. */\nexport async function applyAuthCookie({\n cookie,\n serverAdapter,\n}: {\n cookie: GeneratedCookie\n serverAdapter: ServerAdapter\n}): Promise<void> {\n if (!cookie.value) {\n return\n }\n\n await serverAdapter.setCookie(cookie.name, cookie.value, toCookieOptions(cookie))\n}\n\n/** Writes the Payload auth cookie for `token` through the framework's cookie API. */\nexport async function setAuthCookie({\n authConfig,\n cookiePrefix,\n serverAdapter,\n token,\n}: { token: string } & AuthCookieArgs): Promise<void> {\n const cookie = generatePayloadCookie({\n collectionAuthConfig: authConfig,\n cookiePrefix,\n returnCookieAsObject: true,\n token,\n })\n\n await applyAuthCookie({ cookie, serverAdapter })\n}\n\n/**\n * Expires the Payload auth cookie. Written with the same `domain`/`path`/`secure`\n * attributes it was set with — a mismatched `domain` leaves the original cookie\n * in place.\n */\nexport async function clearAuthCookie({\n authConfig,\n cookiePrefix,\n serverAdapter,\n}: AuthCookieArgs): Promise<void> {\n const cookie = generateExpiredPayloadCookie({\n collectionAuthConfig: authConfig,\n cookiePrefix,\n returnCookieAsObject: true,\n })\n\n await serverAdapter.setCookie(cookie.name, '', toCookieOptions(cookie))\n}\n\n/** Reads the request's existing Payload auth cookie, if any. */\nexport async function getExistingAuthToken({\n cookiePrefix,\n serverAdapter,\n}: {\n cookiePrefix: string\n serverAdapter: ServerAdapter\n}): Promise<{ name: string; value: string } | undefined> {\n const store = await serverAdapter.getCookies()\n const allCookies = store.getAll?.()\n\n if (allCookies) {\n return allCookies.find((cookie) => cookie.name.startsWith(cookiePrefix))\n }\n\n return store.get(`${cookiePrefix}-token`) ?? undefined\n}\n"],"names":["generateExpiredPayloadCookie","generatePayloadCookie","toCookieOptions","cookie","domain","expires","Date","undefined","httpOnly","maxAge","path","sameSite","toLowerCase","secure","applyAuthCookie","serverAdapter","value","setCookie","name","setAuthCookie","authConfig","cookiePrefix","token","collectionAuthConfig","returnCookieAsObject","clearAuthCookie","getExistingAuthToken","store","getCookies","allCookies","getAll","find","startsWith","get"],"mappings":"AAIA,SAASA,4BAA4B,EAAEC,qBAAqB,QAAQ,gBAAe;AAkBnF,8EAA8E;AAC9E,qDAAqD;AACrD,MAAMC,kBAAkB,CAACC,SAA4C,CAAA;QACnEC,QAAQD,OAAOC,MAAM;QACrBC,SAASF,OAAOE,OAAO,GAAG,IAAIC,KAAKH,OAAOE,OAAO,IAAIE;QACrDC,UAAUL,OAAOK,QAAQ;QACzBC,QAAQN,OAAOM,MAAM;QACrBC,MAAMP,OAAOO,IAAI;QACjBC,UAAUR,OAAOQ,QAAQ,EAAEC;QAC3BC,QAAQV,OAAOU,MAAM;IACvB,CAAA;AAQA,2EAA2E,GAC3E,OAAO,eAAeC,gBAAgB,EACpCX,MAAM,EACNY,aAAa,EAId;IACC,IAAI,CAACZ,OAAOa,KAAK,EAAE;QACjB;IACF;IAEA,MAAMD,cAAcE,SAAS,CAACd,OAAOe,IAAI,EAAEf,OAAOa,KAAK,EAAEd,gBAAgBC;AAC3E;AAEA,mFAAmF,GACnF,OAAO,eAAegB,cAAc,EAClCC,UAAU,EACVC,YAAY,EACZN,aAAa,EACbO,KAAK,EAC8B;IACnC,MAAMnB,SAASF,sBAAsB;QACnCsB,sBAAsBH;QACtBC;QACAG,sBAAsB;QACtBF;IACF;IAEA,MAAMR,gBAAgB;QAAEX;QAAQY;IAAc;AAChD;AAEA;;;;CAIC,GACD,OAAO,eAAeU,gBAAgB,EACpCL,UAAU,EACVC,YAAY,EACZN,aAAa,EACE;IACf,MAAMZ,SAASH,6BAA6B;QAC1CuB,sBAAsBH;QACtBC;QACAG,sBAAsB;IACxB;IAEA,MAAMT,cAAcE,SAAS,CAACd,OAAOe,IAAI,EAAE,IAAIhB,gBAAgBC;AACjE;AAEA,8DAA8D,GAC9D,OAAO,eAAeuB,qBAAqB,EACzCL,YAAY,EACZN,aAAa,EAId;IACC,MAAMY,QAAQ,MAAMZ,cAAca,UAAU;IAC5C,MAAMC,aAAaF,MAAMG,MAAM;IAE/B,IAAID,YAAY;QACd,OAAOA,WAAWE,IAAI,CAAC,CAAC5B,SAAWA,OAAOe,IAAI,CAACc,UAAU,CAACX;IAC5D;IAEA,OAAOM,MAAMM,GAAG,CAAC,GAAGZ,aAAa,MAAM,CAAC,KAAKd;AAC/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/auth/serverFunctions/login.ts"],"sourcesContent":["import type { ServerAdapter } from '../../admin/adapters/server.js'\nimport type { SanitizedConfig } from '../../config/types.js'\nimport type { AuthCollectionSlug } from '../../index.js'\nimport type { MaybePromise } from '../../types/index.js'\nimport type { LoginResult } from '../operations/login.js'\n\nimport { getPayload } from '../../index.js'\nimport { createPayloadRequest } from '../../utilities/createPayloadRequest.js'\nimport { loginWithCookie } from '../loginWithCookie.js'\nimport { applyAuthCookie } from './cookies.js'\n\nexport type LoginArgs<TSlug extends AuthCollectionSlug> = {\n collection: TSlug\n config: MaybePromise<SanitizedConfig>\n password: string\n serverAdapter: ServerAdapter\n} & ({ email: string; username?: never } | { email?: never; username: string })\n\n/**\n * `LoginArgs` as the adapters expose it — they bind `serverAdapter` themselves.\n * Distributes over the email/username union so the either-or survives; a plain\n * `Omit` collapses the union and accepts both keys at once.\n */\nexport type LoginArgsWithoutServerAdapter<TSlug extends AuthCollectionSlug> =\n LoginArgs<TSlug> extends infer TArgs\n ? TArgs extends unknown\n ? Omit<TArgs, 'serverAdapter'>\n : never\n : never\n\n/**\n * Logs a user in and writes the auth cookie through the supplied `serverAdapter`,\n * so the function is framework-agnostic; each adapter binds its own.\n */\nexport async function login<TSlug extends AuthCollectionSlug>({\n collection,\n config,\n email,\n password,\n serverAdapter,\n username,\n}: LoginArgs<TSlug>): Promise<LoginResult<TSlug>> {\n const payload = await getPayload({ config, cron: true })\n\n const authConfig = payload.collections[collection]?.config.auth\n\n if (!authConfig) {\n throw new Error(`No auth config found for collection: ${collection}`)\n }\n\n const loginWithUsername = authConfig.loginWithUsername ?? false\n\n if (loginWithUsername) {\n if (loginWithUsername.allowEmailLogin) {\n if (!email && !username) {\n throw new Error('Email or username is required.')\n }\n } else {\n if (!username) {\n throw new Error('Username is required.')\n }\n }\n } else {\n if (!email) {\n throw new Error('Email is required.')\n }\n }\n\n let loginData\n\n if (loginWithUsername) {\n loginData = username ? { password, username } : { email, password }\n } else {\n loginData = { email, password }\n }\n\n const collectionConfig = payload.collections[collection]!\n\n const { cookie, result } = await loginWithCookie({\n collection: collectionConfig,\n data: loginData as Parameters<typeof loginWithCookie>[0]['data'],\n overrideAccess: true,\n req: await createPayloadRequest({ payload }),\n returnCookieAsObject: true,\n })\n\n await applyAuthCookie({ cookie, serverAdapter })\n\n return result
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/serverFunctions/login.ts"],"sourcesContent":["import type { ServerAdapter } from '../../admin/adapters/server.js'\nimport type { SanitizedConfig } from '../../config/types.js'\nimport type { AuthCollectionSlug } from '../../index.js'\nimport type { MaybePromise } from '../../types/index.js'\nimport type { LoginResult } from '../operations/login.js'\n\nimport { getPayload } from '../../index.js'\nimport { createPayloadRequest } from '../../utilities/createPayloadRequest.js'\nimport { loginWithCookie } from '../loginWithCookie.js'\nimport { applyAuthCookie } from './cookies.js'\n\nexport type LoginArgs<TSlug extends AuthCollectionSlug> = {\n collection: TSlug\n config: MaybePromise<SanitizedConfig>\n password: string\n serverAdapter: ServerAdapter\n} & ({ email: string; username?: never } | { email?: never; username: string })\n\n/**\n * `LoginArgs` as the adapters expose it — they bind `serverAdapter` themselves.\n * Distributes over the email/username union so the either-or survives; a plain\n * `Omit` collapses the union and accepts both keys at once.\n */\nexport type LoginArgsWithoutServerAdapter<TSlug extends AuthCollectionSlug> =\n LoginArgs<TSlug> extends infer TArgs\n ? TArgs extends unknown\n ? Omit<TArgs, 'serverAdapter'>\n : never\n : never\n\n/**\n * Logs a user in and writes the auth cookie through the supplied `serverAdapter`,\n * so the function is framework-agnostic; each adapter binds its own.\n */\nexport async function login<TSlug extends AuthCollectionSlug>({\n collection,\n config,\n email,\n password,\n serverAdapter,\n username,\n}: LoginArgs<TSlug>): Promise<LoginResult<TSlug>> {\n const payload = await getPayload({ config, cron: true })\n\n const authConfig = payload.collections[collection]?.config.auth\n\n if (!authConfig) {\n throw new Error(`No auth config found for collection: ${collection}`)\n }\n\n const loginWithUsername = authConfig.loginWithUsername ?? false\n\n if (loginWithUsername) {\n if (loginWithUsername.allowEmailLogin) {\n if (!email && !username) {\n throw new Error('Email or username is required.')\n }\n } else {\n if (!username) {\n throw new Error('Username is required.')\n }\n }\n } else {\n if (!email) {\n throw new Error('Email is required.')\n }\n }\n\n let loginData\n\n if (loginWithUsername) {\n loginData = username ? { password, username } : { email, password }\n } else {\n loginData = { email, password }\n }\n\n const collectionConfig = payload.collections[collection]!\n\n const { cookie, result } = await loginWithCookie({\n collection: collectionConfig,\n data: loginData as Parameters<typeof loginWithCookie>[0]['data'],\n overrideAccess: true,\n req: await createPayloadRequest({ payload }),\n returnCookieAsObject: true,\n })\n\n await applyAuthCookie({ cookie, serverAdapter })\n\n return result\n}\n"],"names":["getPayload","createPayloadRequest","loginWithCookie","applyAuthCookie","login","collection","config","email","password","serverAdapter","username","payload","cron","authConfig","collections","auth","Error","loginWithUsername","allowEmailLogin","loginData","collectionConfig","cookie","result","data","overrideAccess","req","returnCookieAsObject"],"mappings":"AAMA,SAASA,UAAU,QAAQ,iBAAgB;AAC3C,SAASC,oBAAoB,QAAQ,0CAAyC;AAC9E,SAASC,eAAe,QAAQ,wBAAuB;AACvD,SAASC,eAAe,QAAQ,eAAc;AAqB9C;;;CAGC,GACD,OAAO,eAAeC,MAAwC,EAC5DC,UAAU,EACVC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,aAAa,EACbC,QAAQ,EACS;IACjB,MAAMC,UAAU,MAAMX,WAAW;QAAEM;QAAQM,MAAM;IAAK;IAEtD,MAAMC,aAAaF,QAAQG,WAAW,CAACT,WAAW,EAAEC,OAAOS;IAE3D,IAAI,CAACF,YAAY;QACf,MAAM,IAAIG,MAAM,CAAC,qCAAqC,EAAEX,YAAY;IACtE;IAEA,MAAMY,oBAAoBJ,WAAWI,iBAAiB,IAAI;IAE1D,IAAIA,mBAAmB;QACrB,IAAIA,kBAAkBC,eAAe,EAAE;YACrC,IAAI,CAACX,SAAS,CAACG,UAAU;gBACvB,MAAM,IAAIM,MAAM;YAClB;QACF,OAAO;YACL,IAAI,CAACN,UAAU;gBACb,MAAM,IAAIM,MAAM;YAClB;QACF;IACF,OAAO;QACL,IAAI,CAACT,OAAO;YACV,MAAM,IAAIS,MAAM;QAClB;IACF;IAEA,IAAIG;IAEJ,IAAIF,mBAAmB;QACrBE,YAAYT,WAAW;YAAEF;YAAUE;QAAS,IAAI;YAAEH;YAAOC;QAAS;IACpE,OAAO;QACLW,YAAY;YAAEZ;YAAOC;QAAS;IAChC;IAEA,MAAMY,mBAAmBT,QAAQG,WAAW,CAACT,WAAW;IAExD,MAAM,EAAEgB,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMpB,gBAAgB;QAC/CG,YAAYe;QACZG,MAAMJ;QACNK,gBAAgB;QAChBC,KAAK,MAAMxB,qBAAqB;YAAEU;QAAQ;QAC1Ce,sBAAsB;IACxB;IAEA,MAAMvB,gBAAgB;QAAEkB;QAAQZ;IAAc;IAE9C,OAAOa;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/defineCLICommand.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\nimport type {\n CLICommand,\n CLICommandResult,\n CLIFieldOverride,\n CLIHelp,\n CLIInputSchema,\n CLIRuntime,\n} from '../config/types.js'\nimport type { MaybePromise } from '../types/index.js'\n\ntype CLICommandDefinition<TInput extends CLIInputSchema> = {\n aliases?: string[]\n allowUnknownOption?: boolean\n cli?:\n | false\n | Partial<Record<Extract<keyof StandardSchemaV1.InferInput<TInput>, string>, CLIFieldOverride>>\n description: string\n examples?: string[]\n /**\n * Runs after Payload validates the command input. `args` contains the validated values.\n *\n * - Return nothing when the command succeeds without a result.\n * - Return a number to set the process exit code.\n * - Return `{ result }` to include data in JSON output.\n * - Return `{ exitCode, result }` when the command needs both.\n *\n * Console and Payload logger output is sent to stderr in JSON mode. Use `isJSON` when the\n * command's behavior itself needs to change for machine-readable output.\n */\n handler: (\n context: {\n args: StandardSchemaV1.InferOutput<TInput>\n help: CLIHelp\n isJSON: boolean\n } & Pick<CLIRuntime, 'getConfig' | 'getPayload'>,\n ) => MaybePromise<CLICommandResult | number | void>\n helpGroup?: string\n input: TInput\n}\n\n/** Defines a CLI command from its input schema, shell input, and handler. */\nexport const defineCLICommand = <TInput extends CLIInputSchema>(\n definition: CLICommandDefinition<TInput>,\n): CLICommand => {\n const { cli, input } = definition\n const schema = input['~standard'].jsonSchema.input({ target: 'draft-2020-12' })\n\n if (schema.type !== 'object') {\n throw new Error('CLI command input schema must describe an object.')\n }\n\n const properties = (schema.properties ?? {}) as Record<string, unknown>\n const overrides = cli === false ? {} : (cli ?? {})\n\n for (const field of Object.keys(overrides)) {\n if (!(field in properties)) {\n throw new Error(`CLI command configures unknown input '${field}'.`)\n }\n }\n\n return {\n ...definition,\n allowUnknownOption: definition.allowUnknownOption ?? false,\n cli: cli === false ? false : overrides,\n handler: definition.handler
|
|
1
|
+
{"version":3,"sources":["../../src/cli/defineCLICommand.ts"],"sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\nimport type {\n CLICommand,\n CLICommandResult,\n CLIFieldOverride,\n CLIHelp,\n CLIInputSchema,\n CLIRuntime,\n} from '../config/types.js'\nimport type { MaybePromise } from '../types/index.js'\n\ntype CLICommandDefinition<TInput extends CLIInputSchema> = {\n aliases?: string[]\n allowUnknownOption?: boolean\n cli?:\n | false\n | Partial<Record<Extract<keyof StandardSchemaV1.InferInput<TInput>, string>, CLIFieldOverride>>\n description: string\n examples?: string[]\n /**\n * Runs after Payload validates the command input. `args` contains the validated values.\n *\n * - Return nothing when the command succeeds without a result.\n * - Return a number to set the process exit code.\n * - Return `{ result }` to include data in JSON output.\n * - Return `{ exitCode, result }` when the command needs both.\n *\n * Console and Payload logger output is sent to stderr in JSON mode. Use `isJSON` when the\n * command's behavior itself needs to change for machine-readable output.\n */\n handler: (\n context: {\n args: StandardSchemaV1.InferOutput<TInput>\n help: CLIHelp\n isJSON: boolean\n } & Pick<CLIRuntime, 'getConfig' | 'getPayload'>,\n ) => MaybePromise<CLICommandResult | number | void>\n helpGroup?: string\n input: TInput\n}\n\n/** Defines a CLI command from its input schema, shell input, and handler. */\nexport const defineCLICommand = <TInput extends CLIInputSchema>(\n definition: CLICommandDefinition<TInput>,\n): CLICommand => {\n const { cli, input } = definition\n const schema = input['~standard'].jsonSchema.input({ target: 'draft-2020-12' })\n\n if (schema.type !== 'object') {\n throw new Error('CLI command input schema must describe an object.')\n }\n\n const properties = (schema.properties ?? {}) as Record<string, unknown>\n const overrides = cli === false ? {} : (cli ?? {})\n\n for (const field of Object.keys(overrides)) {\n if (!(field in properties)) {\n throw new Error(`CLI command configures unknown input '${field}'.`)\n }\n }\n\n return {\n ...definition,\n allowUnknownOption: definition.allowUnknownOption ?? false,\n cli: cli === false ? false : overrides,\n handler: definition.handler,\n input,\n schema,\n }\n}\n"],"names":["defineCLICommand","definition","cli","input","schema","jsonSchema","target","type","Error","properties","overrides","field","Object","keys","allowUnknownOption","handler"],"mappings":"AA0CA,2EAA2E,GAC3E,OAAO,MAAMA,mBAAmB,CAC9BC;IAEA,MAAM,EAAEC,GAAG,EAAEC,KAAK,EAAE,GAAGF;IACvB,MAAMG,SAASD,KAAK,CAAC,YAAY,CAACE,UAAU,CAACF,KAAK,CAAC;QAAEG,QAAQ;IAAgB;IAE7E,IAAIF,OAAOG,IAAI,KAAK,UAAU;QAC5B,MAAM,IAAIC,MAAM;IAClB;IAEA,MAAMC,aAAcL,OAAOK,UAAU,IAAI,CAAC;IAC1C,MAAMC,YAAYR,QAAQ,QAAQ,CAAC,IAAKA,OAAO,CAAC;IAEhD,KAAK,MAAMS,SAASC,OAAOC,IAAI,CAACH,WAAY;QAC1C,IAAI,CAAEC,CAAAA,SAASF,UAAS,GAAI;YAC1B,MAAM,IAAID,MAAM,CAAC,sCAAsC,EAAEG,MAAM,EAAE,CAAC;QACpE;IACF;IAEA,OAAO;QACL,GAAGV,UAAU;QACba,oBAAoBb,WAAWa,kBAAkB,IAAI;QACrDZ,KAAKA,QAAQ,QAAQ,QAAQQ;QAC7BK,SAASd,WAAWc,OAAO;QAC3BZ;QACAC;IACF;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/config/client.ts"],"sourcesContent":["import type { I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type { StaticDescription } from '../../admin/types.js'\nimport type { ImportMap } from '../../cli/commands/generateImportMap/generateImportMap.js'\nimport type {\n LivePreviewConfig,\n ServerOnlyLivePreviewProperties,\n StaticLabel,\n} from '../../config/types.js'\nimport type { ClientField } from '../../fields/config/client.js'\nimport type { ClientHierarchyConfig } from '../../hierarchy/types.js'\nimport type { Payload } from '../../types/index.js'\nimport type { SanitizedUploadConfig, UploadInstructionsCapability } from '../../uploads/types.js'\nimport type { SanitizedCollectionConfig } from './types.js'\n\nimport { createClientFields } from '../../fields/config/client.js'\n\nexport type ServerOnlyCollectionProperties = keyof Pick<\n SanitizedCollectionConfig,\n | 'access'\n | 'custom'\n | 'endpoints'\n | 'flattenedFields'\n | 'hooks'\n | 'indexes'\n | 'joins'\n | 'llmInstructions'\n | 'polymorphicJoins'\n | 'sanitizedIndexes'\n | 'select'\n>\n\nexport type ServerOnlyCollectionAdminProperties = keyof Pick<\n SanitizedCollectionConfig['admin'],\n 'baseFilter' | 'baseListFilter' | 'components' | 'formatDocURL' | 'hidden'\n>\n\nexport type ServerOnlyUploadProperties = keyof Pick<\n SanitizedCollectionConfig['upload'],\n | 'admin'\n | 'adminThumbnail'\n | 'externalFileHeaderFilter'\n | 'fileOperations'\n | 'handlers'\n | 'modifyResponseHeaders'\n | 'uploadInstructions'\n>\n\ntype ClientUploadConfig = {\n uploadInstructions: Pick<UploadInstructionsCapability, 'useInAdmin'>\n} & Omit<SanitizedUploadConfig, 'fileOperations' | 'uploadInstructions'>\n\nexport type ClientCollectionConfig = {\n admin: {\n description?: StaticDescription\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n preview?: boolean\n } & Omit<\n SanitizedCollectionConfig['admin'],\n | 'components'\n | 'description'\n | 'formatDocURL'\n | 'joins'\n | 'livePreview'\n | 'preview'\n | ServerOnlyCollectionAdminProperties\n >\n auth?: {\n forgotPassword: Pick<SanitizedCollectionConfig['auth']['forgotPassword'], 'minRequestInterval'>\n verify?: true\n } & Omit<SanitizedCollectionConfig['auth'], 'forgotPassword' | 'strategies' | 'verify'>\n fields: ClientField[]\n hierarchy?: ClientHierarchyConfig | false\n labels: {\n plural: StaticLabel\n singular: StaticLabel\n }\n upload: ClientUploadConfig\n} & Omit<\n SanitizedCollectionConfig,\n 'admin' | 'auth' | 'fields' | 'hierarchy' | 'labels' | 'upload' | ServerOnlyCollectionProperties\n>\n\nconst serverOnlyCollectionProperties: Partial<ServerOnlyCollectionProperties>[] = [\n 'hooks',\n 'access',\n 'endpoints',\n 'custom',\n 'joins',\n 'llmInstructions',\n 'polymorphicJoins',\n 'flattenedFields',\n 'indexes',\n 'sanitizedIndexes',\n 'select',\n // `upload`\n // `admin`\n // are all handled separately\n]\n\nconst serverOnlyUploadProperties: Partial<ServerOnlyUploadProperties>[] = [\n 'admin',\n 'adminThumbnail',\n 'externalFileHeaderFilter',\n 'fileOperations',\n 'handlers',\n 'modifyResponseHeaders',\n 'uploadInstructions',\n]\n\nconst serverOnlyCollectionAdminProperties: Partial<ServerOnlyCollectionAdminProperties>[] = [\n 'hidden',\n 'baseFilter',\n 'baseListFilter',\n 'components',\n 'formatDocURL',\n // 'preview' is handled separately\n // `livePreview` is handled separately\n]\n\nexport const createClientCollectionConfig = ({\n collection,\n defaultIDType,\n i18n,\n importMap,\n}: {\n collection: SanitizedCollectionConfig\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): ClientCollectionConfig => {\n const clientCollection = {} as Partial<ClientCollectionConfig>\n\n for (const key in collection) {\n if (serverOnlyCollectionProperties.includes(key as any)) {\n continue\n }\n switch (key) {\n case 'admin':\n if (!collection.admin) {\n break\n }\n\n clientCollection.admin = {} as ClientCollectionConfig['admin']\n\n for (const adminKey in collection.admin) {\n if (serverOnlyCollectionAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if (\n typeof collection.admin.description === 'string' ||\n typeof collection.admin.description === 'object'\n ) {\n if (collection.admin.description) {\n clientCollection.admin.description = collection.admin.description\n }\n } else if (typeof collection.admin.description === 'function') {\n const description = collection.admin.description({ t: i18n.t as TFunction })\n\n if (description) {\n clientCollection.admin.description = description\n }\n }\n break\n\n case 'livePreview':\n clientCollection.admin.livePreview = {}\n\n if (collection.admin.livePreview?.breakpoints) {\n clientCollection.admin.livePreview.breakpoints =\n collection.admin.livePreview.breakpoints\n }\n\n break\n\n case 'preview':\n if (collection.admin.preview) {\n clientCollection.admin.preview = true\n }\n\n break\n\n default:\n ;(clientCollection as any).admin[adminKey] =\n collection.admin[adminKey as keyof SanitizedCollectionConfig['admin']]\n }\n }\n\n break\n\n case 'auth':\n if (!collection.auth) {\n break\n }\n\n clientCollection.auth = {} as { verify?: true } & SanitizedCollectionConfig['auth']\n\n clientCollection.auth.forgotPassword = {\n minRequestInterval: collection.auth.forgotPassword.minRequestInterval,\n }\n\n if (collection.auth.cookies) {\n clientCollection.auth.cookies = collection.auth.cookies\n }\n\n if (collection.auth.depth !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.depth = collection.auth.depth\n }\n\n if (collection.auth.disableLocalStrategy) {\n clientCollection.auth.disableLocalStrategy = collection.auth.disableLocalStrategy\n }\n\n if (collection.auth.lockTime !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.lockTime = collection.auth.lockTime\n }\n\n if (collection.auth.loginWithUsername) {\n clientCollection.auth.loginWithUsername = collection.auth.loginWithUsername\n }\n\n if (collection.auth.maxLoginAttempts !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.maxLoginAttempts = collection.auth.maxLoginAttempts\n }\n\n if (collection.auth.removeTokenFromResponses) {\n clientCollection.auth.removeTokenFromResponses = collection.auth.removeTokenFromResponses\n }\n\n if (collection.auth.useAPIKey) {\n clientCollection.auth.useAPIKey = collection.auth.useAPIKey\n }\n\n if (collection.auth.tokenExpiration) {\n clientCollection.auth.tokenExpiration = collection.auth.tokenExpiration\n }\n\n if (collection.auth.verify) {\n clientCollection.auth.verify = true\n }\n\n break\n\n case 'fields':\n clientCollection.fields = createClientFields({\n defaultIDType,\n fields: collection.fields,\n i18n,\n importMap,\n })\n\n break\n\n case 'hierarchy': {\n if (!collection.hierarchy || typeof collection.hierarchy !== 'object') {\n clientCollection.hierarchy = false\n break\n }\n\n // Strip slugify function as it can't cross server-client boundary\n const { slugify: _slugify, ...clientHierarchy } = collection.hierarchy\n clientCollection.hierarchy = clientHierarchy as ClientHierarchyConfig\n\n break\n }\n\n case 'labels':\n clientCollection.labels = {\n plural:\n typeof collection.labels.plural === 'function'\n ? collection.labels.plural({ i18n, t: i18n.t as TFunction })\n : collection.labels.plural,\n singular:\n typeof collection.labels.singular === 'function'\n ? collection.labels.singular({ i18n, t: i18n.t as TFunction })\n : collection.labels.singular,\n }\n\n break\n\n case 'upload':\n if (!collection.upload) {\n break\n }\n\n clientCollection.upload = {\n uploadInstructions: {\n useInAdmin: collection.upload.uploadInstructions?.useInAdmin ?? false,\n },\n } as ClientUploadConfig\n\n for (const uploadKey in collection.upload) {\n if (serverOnlyUploadProperties.includes(uploadKey as any)) {\n continue\n }\n\n if (uploadKey === 'variants') {\n clientCollection.upload.variants = collection.upload.variants?.map((size) => {\n const sanitizedSize = { ...size }\n if ('generateImageName' in sanitizedSize) {\n delete sanitizedSize.generateImageName\n }\n return sanitizedSize\n })\n } else {\n ;(clientCollection.upload as any)[uploadKey] =\n collection.upload[uploadKey as keyof SanitizedUploadConfig]\n }\n }\n\n break\n\n default:\n ;(clientCollection as any)[key] = collection[key as keyof SanitizedCollectionConfig]\n }\n }\n\n return clientCollection as ClientCollectionConfig\n}\n\nexport const createClientCollectionConfigs = ({\n collections,\n defaultIDType,\n i18n,\n importMap,\n}: {\n collections: SanitizedCollectionConfig[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): ClientCollectionConfig[] => {\n const clientCollections = new Array(collections.length)\n\n for (let i = 0; i < collections.length; i++) {\n const collection = collections[i]!\n\n clientCollections[i] = createClientCollectionConfig({\n collection,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n return clientCollections\n}\n"],"names":["createClientFields","serverOnlyCollectionProperties","serverOnlyUploadProperties","serverOnlyCollectionAdminProperties","createClientCollectionConfig","collection","defaultIDType","i18n","importMap","clientCollection","key","includes","admin","adminKey","description","t","livePreview","breakpoints","preview","auth","forgotPassword","minRequestInterval","cookies","depth","undefined","disableLocalStrategy","lockTime","loginWithUsername","maxLoginAttempts","removeTokenFromResponses","useAPIKey","tokenExpiration","verify","fields","hierarchy","slugify","_slugify","clientHierarchy","labels","plural","singular","upload","uploadInstructions","useInAdmin","uploadKey","variants","map","size","sanitizedSize","generateImageName","createClientCollectionConfigs","collections","clientCollections","Array","length","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/config/client.ts"],"sourcesContent":["import type { I18nClient, TFunction } from '@payloadcms/translations'\n\nimport type { StaticDescription } from '../../admin/types.js'\nimport type { ImportMap } from '../../cli/commands/generateImportMap/generateImportMap.js'\nimport type {\n LivePreviewConfig,\n ServerOnlyLivePreviewProperties,\n StaticLabel,\n} from '../../config/types.js'\nimport type { ClientField } from '../../fields/config/client.js'\nimport type { ClientHierarchyConfig } from '../../hierarchy/types.js'\nimport type { Payload } from '../../types/index.js'\nimport type { SanitizedUploadConfig, UploadInstructionsCapability } from '../../uploads/types.js'\nimport type { SanitizedCollectionConfig } from './types.js'\n\nimport { createClientFields } from '../../fields/config/client.js'\n\nexport type ServerOnlyCollectionProperties = keyof Pick<\n SanitizedCollectionConfig,\n | 'access'\n | 'custom'\n | 'endpoints'\n | 'flattenedFields'\n | 'hooks'\n | 'indexes'\n | 'joins'\n | 'llmInstructions'\n | 'polymorphicJoins'\n | 'sanitizedIndexes'\n | 'select'\n>\n\nexport type ServerOnlyCollectionAdminProperties = keyof Pick<\n SanitizedCollectionConfig['admin'],\n 'baseFilter' | 'baseListFilter' | 'components' | 'formatDocURL' | 'hidden'\n>\n\nexport type ServerOnlyUploadProperties = keyof Pick<\n SanitizedCollectionConfig['upload'],\n | 'admin'\n | 'adminThumbnail'\n | 'externalFileHeaderFilter'\n | 'fileOperations'\n | 'handlers'\n | 'modifyResponseHeaders'\n | 'uploadInstructions'\n>\n\ntype ClientUploadConfig = {\n uploadInstructions: Pick<UploadInstructionsCapability, 'useInAdmin'>\n} & Omit<SanitizedUploadConfig, 'fileOperations' | 'uploadInstructions'>\n\nexport type ClientCollectionConfig = {\n admin: {\n description?: StaticDescription\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n preview?: boolean\n } & Omit<\n SanitizedCollectionConfig['admin'],\n | 'components'\n | 'description'\n | 'formatDocURL'\n | 'joins'\n | 'livePreview'\n | 'preview'\n | ServerOnlyCollectionAdminProperties\n >\n auth?: {\n forgotPassword: Pick<SanitizedCollectionConfig['auth']['forgotPassword'], 'minRequestInterval'>\n verify?: true\n } & Omit<SanitizedCollectionConfig['auth'], 'forgotPassword' | 'strategies' | 'verify'>\n fields: ClientField[]\n hierarchy?: ClientHierarchyConfig | false\n labels: {\n plural: StaticLabel\n singular: StaticLabel\n }\n upload: ClientUploadConfig\n} & Omit<\n SanitizedCollectionConfig,\n 'admin' | 'auth' | 'fields' | 'hierarchy' | 'labels' | 'upload' | ServerOnlyCollectionProperties\n>\n\nconst serverOnlyCollectionProperties: Partial<ServerOnlyCollectionProperties>[] = [\n 'hooks',\n 'access',\n 'endpoints',\n 'custom',\n 'joins',\n 'llmInstructions',\n 'polymorphicJoins',\n 'flattenedFields',\n 'indexes',\n 'sanitizedIndexes',\n 'select',\n // `upload`\n // `admin`\n // are all handled separately\n]\n\nconst serverOnlyUploadProperties: Partial<ServerOnlyUploadProperties>[] = [\n 'admin',\n 'adminThumbnail',\n 'externalFileHeaderFilter',\n 'fileOperations',\n 'handlers',\n 'modifyResponseHeaders',\n 'uploadInstructions',\n]\n\nconst serverOnlyCollectionAdminProperties: Partial<ServerOnlyCollectionAdminProperties>[] = [\n 'hidden',\n 'baseFilter',\n 'baseListFilter',\n 'components',\n 'formatDocURL',\n // 'preview' is handled separately\n // `livePreview` is handled separately\n]\n\nexport const createClientCollectionConfig = ({\n collection,\n defaultIDType,\n i18n,\n importMap,\n}: {\n collection: SanitizedCollectionConfig\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): ClientCollectionConfig => {\n const clientCollection = {} as Partial<ClientCollectionConfig>\n\n for (const key in collection) {\n if (serverOnlyCollectionProperties.includes(key as any)) {\n continue\n }\n switch (key) {\n case 'admin':\n if (!collection.admin) {\n break\n }\n\n clientCollection.admin = {}\n\n for (const adminKey in collection.admin) {\n if (serverOnlyCollectionAdminProperties.includes(adminKey as any)) {\n continue\n }\n\n switch (adminKey) {\n case 'description':\n if (\n typeof collection.admin.description === 'string' ||\n typeof collection.admin.description === 'object'\n ) {\n if (collection.admin.description) {\n clientCollection.admin.description = collection.admin.description\n }\n } else if (typeof collection.admin.description === 'function') {\n const description = collection.admin.description({ t: i18n.t as TFunction })\n\n if (description) {\n clientCollection.admin.description = description\n }\n }\n break\n\n case 'livePreview':\n clientCollection.admin.livePreview = {}\n\n if (collection.admin.livePreview?.breakpoints) {\n clientCollection.admin.livePreview.breakpoints =\n collection.admin.livePreview.breakpoints\n }\n\n break\n\n case 'preview':\n if (collection.admin.preview) {\n clientCollection.admin.preview = true\n }\n\n break\n\n default:\n ;(clientCollection as any).admin[adminKey] =\n collection.admin[adminKey as keyof SanitizedCollectionConfig['admin']]\n }\n }\n\n break\n\n case 'auth':\n if (!collection.auth) {\n break\n }\n\n clientCollection.auth = {} as { verify?: true } & SanitizedCollectionConfig['auth']\n\n clientCollection.auth.forgotPassword = {\n minRequestInterval: collection.auth.forgotPassword.minRequestInterval,\n }\n\n if (collection.auth.cookies) {\n clientCollection.auth.cookies = collection.auth.cookies\n }\n\n if (collection.auth.depth !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.depth = collection.auth.depth\n }\n\n if (collection.auth.disableLocalStrategy) {\n clientCollection.auth.disableLocalStrategy = collection.auth.disableLocalStrategy\n }\n\n if (collection.auth.lockTime !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.lockTime = collection.auth.lockTime\n }\n\n if (collection.auth.loginWithUsername) {\n clientCollection.auth.loginWithUsername = collection.auth.loginWithUsername\n }\n\n if (collection.auth.maxLoginAttempts !== undefined) {\n // Check for undefined as it can be a number (0)\n clientCollection.auth.maxLoginAttempts = collection.auth.maxLoginAttempts\n }\n\n if (collection.auth.removeTokenFromResponses) {\n clientCollection.auth.removeTokenFromResponses = collection.auth.removeTokenFromResponses\n }\n\n if (collection.auth.useAPIKey) {\n clientCollection.auth.useAPIKey = collection.auth.useAPIKey\n }\n\n if (collection.auth.tokenExpiration) {\n clientCollection.auth.tokenExpiration = collection.auth.tokenExpiration\n }\n\n if (collection.auth.verify) {\n clientCollection.auth.verify = true\n }\n\n break\n\n case 'fields':\n clientCollection.fields = createClientFields({\n defaultIDType,\n fields: collection.fields,\n i18n,\n importMap,\n })\n\n break\n\n case 'hierarchy': {\n if (!collection.hierarchy || typeof collection.hierarchy !== 'object') {\n clientCollection.hierarchy = false\n break\n }\n\n // Strip slugify function as it can't cross server-client boundary\n const { slugify: _slugify, ...clientHierarchy } = collection.hierarchy\n clientCollection.hierarchy = clientHierarchy\n\n break\n }\n\n case 'labels':\n clientCollection.labels = {\n plural:\n typeof collection.labels.plural === 'function'\n ? collection.labels.plural({ i18n, t: i18n.t as TFunction })\n : collection.labels.plural,\n singular:\n typeof collection.labels.singular === 'function'\n ? collection.labels.singular({ i18n, t: i18n.t as TFunction })\n : collection.labels.singular,\n }\n\n break\n\n case 'upload':\n if (!collection.upload) {\n break\n }\n\n clientCollection.upload = {\n uploadInstructions: {\n useInAdmin: collection.upload.uploadInstructions?.useInAdmin ?? false,\n },\n } as ClientUploadConfig\n\n for (const uploadKey in collection.upload) {\n if (serverOnlyUploadProperties.includes(uploadKey as any)) {\n continue\n }\n\n if (uploadKey === 'variants') {\n clientCollection.upload.variants = collection.upload.variants?.map((size) => {\n const sanitizedSize = { ...size }\n if ('generateImageName' in sanitizedSize) {\n delete sanitizedSize.generateImageName\n }\n return sanitizedSize\n })\n } else {\n ;(clientCollection.upload as any)[uploadKey] =\n collection.upload[uploadKey as keyof SanitizedUploadConfig]\n }\n }\n\n break\n\n default:\n ;(clientCollection as any)[key] = collection[key as keyof SanitizedCollectionConfig]\n }\n }\n\n return clientCollection as ClientCollectionConfig\n}\n\nexport const createClientCollectionConfigs = ({\n collections,\n defaultIDType,\n i18n,\n importMap,\n}: {\n collections: SanitizedCollectionConfig[]\n defaultIDType: Payload['config']['db']['defaultIDType']\n i18n: I18nClient\n importMap: ImportMap\n}): ClientCollectionConfig[] => {\n const clientCollections = new Array(collections.length)\n\n for (let i = 0; i < collections.length; i++) {\n const collection = collections[i]!\n\n clientCollections[i] = createClientCollectionConfig({\n collection,\n defaultIDType,\n i18n,\n importMap,\n })\n }\n\n return clientCollections\n}\n"],"names":["createClientFields","serverOnlyCollectionProperties","serverOnlyUploadProperties","serverOnlyCollectionAdminProperties","createClientCollectionConfig","collection","defaultIDType","i18n","importMap","clientCollection","key","includes","admin","adminKey","description","t","livePreview","breakpoints","preview","auth","forgotPassword","minRequestInterval","cookies","depth","undefined","disableLocalStrategy","lockTime","loginWithUsername","maxLoginAttempts","removeTokenFromResponses","useAPIKey","tokenExpiration","verify","fields","hierarchy","slugify","_slugify","clientHierarchy","labels","plural","singular","upload","uploadInstructions","useInAdmin","uploadKey","variants","map","size","sanitizedSize","generateImageName","createClientCollectionConfigs","collections","clientCollections","Array","length","i"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findByID.ts"],"sourcesContent":["import type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, FindOptions, JoinQuery } from '../../index.js'\nimport type {\n ApplyDisableErrors,\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { NotFound } from '../../errors/index.js'\nimport { afterRead, type AfterReadArgs } from '../../fields/hooks/afterRead/index.js'\nimport { validateQueryPaths } from '../../index.js'\nimport { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\nimport { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type FindByIDArgs = {\n collection: Collection\n currentDepth?: number\n /**\n * You may pass the document data directly which will skip the `db.findOne` database query.\n * This is useful if you want to use this endpoint solely for running hooks and populating data.\n */\n data?: Record<string, unknown>\n depth?: number\n disableErrors?: boolean\n draft?: boolean\n id: number | string\n includeLockStatus?: boolean\n joins?: JoinQuery\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<AfterReadArgs<JsonObject>, 'flattenLocales'> &\n Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findByIDOperation = async <\n TSlug extends CollectionSlug,\n TDisableErrors extends boolean,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: FindByIDArgs,\n): Promise<ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>> => {\n let args = incomingArgs\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'read',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n draft: replaceWithVersion = false,\n flattenLocales,\n includeLockStatus: includeLockStatusFromArgs,\n joins,\n overrideAccess = false,\n populate,\n req: { fallbackLocale, locale, t },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n const includeLockStatus =\n includeLockStatusFromArgs && req.payload.collections?.[lockedDocumentsCollectionSlug]\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, disableErrors, req },\n collectionConfig.access.read,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResult === false) {\n return null!\n }\n\n const isValidID =\n (typeof id === 'string' && id.length > 0) || (typeof id === 'number' && Number.isFinite(id))\n\n if (!isValidID) {\n throw new NotFound(t)\n }\n\n const where = { id: { equals: id } }\n\n let fullWhere = combineQueries(where, accessResult)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({\n fields: collectionConfig.flattenedFields,\n payload: args.req.payload,\n where: fullWhere,\n })\n\n const sanitizedJoins = await sanitizeJoinQuery({\n collectionConfig,\n joins,\n overrideAccess,\n req,\n })\n\n // execute only if there's a custom ID and potentially overwriten access on id\n if (req.payload.collections[collectionConfig.slug]!.customIDType) {\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n where,\n })\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n const shouldQueryDrafts = !args.data && replaceWithVersion && hasDraftsEnabled(collectionConfig)\n let docWithLocales: DataFromCollectionSlug<TSlug> | null | undefined\n let query = fullWhere\n\n let dbSelect = select\n\n if (\n collectionConfig.versions?.drafts &&\n replaceWithVersion &&\n select &&\n getSelectMode(select) === 'include'\n ) {\n dbSelect = { ...select, createdAt: true, updatedAt: true }\n }\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n draftsEnabled: replaceWithVersion,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n locale: locale!,\n req: {\n transactionID: req.transactionID,\n } as PayloadRequest,\n select: dbSelect,\n where: fullWhere,\n }\n\n if (shouldQueryDrafts) {\n query = appendVersionToQueryKey(fullWhere)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n versionFields: buildVersionCollectionFields(req.payload.config, collectionConfig, true),\n where: appendVersionToQueryKey(where),\n })\n\n const { docs } = await req.payload.db.queryDrafts<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: getQueryDraftsSelect({ select }),\n where: query,\n })\n\n docWithLocales = docs[0]\n\n if (!docWithLocales) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(where),\n })\n\n if (!existingVersions[0]) {\n query = fullWhere\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n }\n } else {\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n\n if (!docWithLocales && !args.data) {\n if (!disableErrors) {\n throw new NotFound(req.t)\n }\n return null!\n }\n\n let result: DataFromCollectionSlug<TSlug> =\n (args.data as DataFromCollectionSlug<TSlug>) ?? docWithLocales!\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Include Lock Status if required\n // /////////////////////////////////////\n\n if (includeLockStatus && id) {\n let lockStatus: (JsonObject & TypeWithID) | null = null\n\n try {\n const lockDocumentsProp = collectionConfig?.lockDocuments\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const lockedDocument = await req.payload.find({\n collection: lockedDocumentsCollectionSlug,\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n req,\n where: {\n and: [\n {\n 'document.relationTo': {\n equals: collectionConfig.slug,\n },\n },\n {\n 'document.value': {\n equals: id,\n },\n },\n // Query where the lock is newer than the current time minus lock time\n {\n updatedAt: {\n greater_than: new Date(new Date().getTime() - lockDurationInMilliseconds),\n },\n },\n ],\n },\n })\n\n if (lockedDocument && lockedDocument.docs.length > 0) {\n lockStatus = lockedDocument.docs[0]!\n }\n } catch {\n // swallow error\n }\n\n result._isLocked = !!lockStatus\n result._userEditing = lockStatus?.user?.value ?? null\n }\n\n // /////////////////////////////////////\n // Replace document with draft if available\n // /////////////////////////////////////\n\n if (!shouldQueryDrafts && replaceWithVersion && hasDraftsEnabled(collectionConfig)) {\n result = await replaceWithDraftIfAvailable({\n accessResult,\n doc: result,\n entity: collectionConfig,\n entityType: 'collection',\n overrideAccess,\n req,\n select,\n })\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result,\n draft: replaceWithVersion,\n fallbackLocale: fallbackLocale!,\n flattenLocales,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result as ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","resolveSelect","sanitizeSelect","buildVersionCollectionFields","appendVersionToQueryKey","getQueryDraftsSelect","replaceWithDraftIfAvailable","buildAfterOperation","buildBeforeOperation","findByIDOperation","incomingArgs","args","collection","config","operation","overrideAccess","id","collectionConfig","currentDepth","depth","disableErrors","draft","replaceWithVersion","flattenLocales","includeLockStatus","includeLockStatusFromArgs","joins","populate","req","fallbackLocale","locale","t","select","incomingSelect","showHiddenFields","trash","payload","collections","fields","flattenedFields","accessResult","slug","access","read","isValidID","length","Number","isFinite","where","equals","fullWhere","enableTrash","sanitizedJoins","customIDType","shouldQueryDrafts","data","docWithLocales","query","dbSelect","versions","drafts","createdAt","updatedAt","findOneArgs","draftsEnabled","payloadAPI","transactionID","versionFields","docs","db","queryDrafts","limit","pagination","existingVersions","parent","findOne","result","auth","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","and","greater_than","Date","getTime","_isLocked","_userEditing","user","value","doc","entity","entityType","hooks","beforeRead","hook","context","global"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findByID.ts"],"sourcesContent":["import type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, FindOptions, JoinQuery } from '../../index.js'\nimport type {\n ApplyDisableErrors,\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { NotFound } from '../../errors/index.js'\nimport { afterRead, type AfterReadArgs } from '../../fields/hooks/afterRead/index.js'\nimport { validateQueryPaths } from '../../index.js'\nimport { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\nimport { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type FindByIDArgs = {\n collection: Collection\n currentDepth?: number\n /**\n * You may pass the document data directly which will skip the `db.findOne` database query.\n * This is useful if you want to use this endpoint solely for running hooks and populating data.\n */\n data?: Record<string, unknown>\n depth?: number\n disableErrors?: boolean\n draft?: boolean\n id: number | string\n includeLockStatus?: boolean\n joins?: JoinQuery\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<AfterReadArgs<JsonObject>, 'flattenLocales'> &\n Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findByIDOperation = async <\n TSlug extends CollectionSlug,\n TDisableErrors extends boolean,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: FindByIDArgs,\n): Promise<ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>> => {\n let args = incomingArgs\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'read',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n draft: replaceWithVersion = false,\n flattenLocales,\n includeLockStatus: includeLockStatusFromArgs,\n joins,\n overrideAccess = false,\n populate,\n req: { fallbackLocale, locale, t },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n const includeLockStatus =\n includeLockStatusFromArgs && req.payload.collections?.[lockedDocumentsCollectionSlug]\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, disableErrors, req },\n collectionConfig.access.read,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResult === false) {\n return null!\n }\n\n const isValidID =\n (typeof id === 'string' && id.length > 0) || (typeof id === 'number' && Number.isFinite(id))\n\n if (!isValidID) {\n throw new NotFound(t)\n }\n\n const where = { id: { equals: id } }\n\n let fullWhere = combineQueries(where, accessResult)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({\n fields: collectionConfig.flattenedFields,\n payload: args.req.payload,\n where: fullWhere,\n })\n\n const sanitizedJoins = await sanitizeJoinQuery({\n collectionConfig,\n joins,\n overrideAccess,\n req,\n })\n\n // execute only if there's a custom ID and potentially overwriten access on id\n if (req.payload.collections[collectionConfig.slug]!.customIDType) {\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n where,\n })\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n const shouldQueryDrafts = !args.data && replaceWithVersion && hasDraftsEnabled(collectionConfig)\n let docWithLocales: DataFromCollectionSlug<TSlug> | null | undefined\n let query = fullWhere\n\n let dbSelect = select\n\n if (\n collectionConfig.versions?.drafts &&\n replaceWithVersion &&\n select &&\n getSelectMode(select) === 'include'\n ) {\n dbSelect = { ...select, createdAt: true, updatedAt: true }\n }\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n draftsEnabled: replaceWithVersion,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n locale: locale!,\n req: {\n transactionID: req.transactionID,\n },\n select: dbSelect,\n where: fullWhere,\n }\n\n if (shouldQueryDrafts) {\n query = appendVersionToQueryKey(fullWhere)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n versionFields: buildVersionCollectionFields(req.payload.config, collectionConfig, true),\n where: appendVersionToQueryKey(where),\n })\n\n const { docs } = await req.payload.db.queryDrafts<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: getQueryDraftsSelect({ select }),\n where: query,\n })\n\n docWithLocales = docs[0]\n\n if (!docWithLocales) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(where),\n })\n\n if (!existingVersions[0]) {\n query = fullWhere\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n }\n } else {\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n\n if (!docWithLocales && !args.data) {\n if (!disableErrors) {\n throw new NotFound(req.t)\n }\n return null!\n }\n\n let result: DataFromCollectionSlug<TSlug> =\n (args.data as DataFromCollectionSlug<TSlug>) ?? docWithLocales!\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Include Lock Status if required\n // /////////////////////////////////////\n\n if (includeLockStatus && id) {\n let lockStatus: (JsonObject & TypeWithID) | null = null\n\n try {\n const lockDocumentsProp = collectionConfig?.lockDocuments\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const lockedDocument = await req.payload.find({\n collection: lockedDocumentsCollectionSlug,\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n req,\n where: {\n and: [\n {\n 'document.relationTo': {\n equals: collectionConfig.slug,\n },\n },\n {\n 'document.value': {\n equals: id,\n },\n },\n // Query where the lock is newer than the current time minus lock time\n {\n updatedAt: {\n greater_than: new Date(new Date().getTime() - lockDurationInMilliseconds),\n },\n },\n ],\n },\n })\n\n if (lockedDocument && lockedDocument.docs.length > 0) {\n lockStatus = lockedDocument.docs[0]!\n }\n } catch {\n // swallow error\n }\n\n result._isLocked = !!lockStatus\n result._userEditing = lockStatus?.user?.value ?? null\n }\n\n // /////////////////////////////////////\n // Replace document with draft if available\n // /////////////////////////////////////\n\n if (!shouldQueryDrafts && replaceWithVersion && hasDraftsEnabled(collectionConfig)) {\n result = await replaceWithDraftIfAvailable({\n accessResult,\n doc: result,\n entity: collectionConfig,\n entityType: 'collection',\n overrideAccess,\n req,\n select,\n })\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result,\n draft: replaceWithVersion,\n fallbackLocale: fallbackLocale!,\n flattenLocales,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result as ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","resolveSelect","sanitizeSelect","buildVersionCollectionFields","appendVersionToQueryKey","getQueryDraftsSelect","replaceWithDraftIfAvailable","buildAfterOperation","buildBeforeOperation","findByIDOperation","incomingArgs","args","collection","config","operation","overrideAccess","id","collectionConfig","currentDepth","depth","disableErrors","draft","replaceWithVersion","flattenLocales","includeLockStatus","includeLockStatusFromArgs","joins","populate","req","fallbackLocale","locale","t","select","incomingSelect","showHiddenFields","trash","payload","collections","fields","flattenedFields","accessResult","slug","access","read","isValidID","length","Number","isFinite","where","equals","fullWhere","enableTrash","sanitizedJoins","customIDType","shouldQueryDrafts","data","docWithLocales","query","dbSelect","versions","drafts","createdAt","updatedAt","findOneArgs","draftsEnabled","payloadAPI","transactionID","versionFields","docs","db","queryDrafts","limit","pagination","existingVersions","parent","findOne","result","auth","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","and","greater_than","Date","getTime","_isLocked","_userEditing","user","value","doc","entity","entityType","hooks","beforeRead","hook","context","global"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport {\n isInheritedReadVersionsAccess,\n withInheritedReadVersionsParentID,\n} from '../../versions/isInheritedReadVersionsAccess.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { prefetchVersionForInheritedReadAccess } from './utilities/prefetchVersionForInheritedReadAccess.js'\n\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <TData extends TypeWithID = any>(\n args: Arguments,\n): Promise<TypeWithVersion<TData>> => {\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n if (!id) {\n throw new APIError('Missing ID of version.', httpStatus.BAD_REQUEST)\n }\n\n if (!hasVersionsEnabled(collectionConfig)) {\n if (disableErrors) {\n return null!\n }\n\n throw new NotFound(req.t)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n })\n\n const where = { id: { equals: id } }\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n const inheritsReadAccess = isInheritedReadVersionsAccess(collectionConfig.access.readVersions)\n const shouldPrefetchVersion = !overrideAccess && inheritsReadAccess\n const prefetched = shouldPrefetchVersion\n ? await prefetchVersionForInheritedReadAccess<TData>({\n id,\n collectionConfig,\n locale: locale!,\n req,\n select,\n trash,\n })\n : undefined\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n id,\n slug: collectionConfig.slug,\n disableErrors,\n req,\n },\n inheritsReadAccess\n ? (accessArgs) =>\n collectionConfig.access.readVersions(\n withInheritedReadVersionsParentID(accessArgs, prefetched?.parentID),\n )\n : collectionConfig.access.readVersions,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResults === false) {\n return null!\n }\n\n const hasWhereAccess = typeof accessResults === 'object'\n\n let fullWhere = combineQueries(where, accessResults)\n\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n let result = prefetched?.version as TypeWithVersion<TData>\n\n if (!shouldPrefetchVersion || hasWhereAccess) {\n const versionsQuery = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select,\n where: fullWhere,\n })\n\n result = versionsQuery.docs[0]!\n }\n\n if (!result) {\n if (!disableErrors) {\n if (!hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n return null!\n }\n\n if (collectionConfig.upload && !overrideAccess) {\n const filename = (result.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: result.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n\n if (!result.version) {\n // Fallback if not selected\n ;(result as any).version = {}\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n if (collectionConfig.upload) {\n result.version = markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: result.version as Record<string, unknown>,\n req,\n versionID: result.id,\n }) as TData\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n}\n"],"names":["executeAccess","combineQueries","sanitizeWhereQuery","APIError","Forbidden","NotFound","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","hasVersionsEnabled","httpStatus","resolveSelect","sanitizeSelect","buildVersionCollectionFields","isInheritedReadVersionsAccess","withInheritedReadVersionsParentID","buildAfterOperation","buildBeforeOperation","prefetchVersionForInheritedReadAccess","findVersionByIDOperation","args","id","collection","config","collectionConfig","currentDepth","depth","disableErrors","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","BAD_REQUEST","t","operation","where","equals","versionFields","fields","versions","inheritsReadAccess","access","readVersions","shouldPrefetchVersion","prefetched","undefined","accessResults","slug","accessArgs","parentID","hasWhereAccess","fullWhere","deletedAtPath","enableTrash","result","version","versionsQuery","db","findVersions","limit","pagination","docs","upload","filename","documentID","parent","hooks","beforeRead","length","hook","context","doc","query","draft","global","collectionSlug","versionID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport {\n isInheritedReadVersionsAccess,\n withInheritedReadVersionsParentID,\n} from '../../versions/isInheritedReadVersionsAccess.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { prefetchVersionForInheritedReadAccess } from './utilities/prefetchVersionForInheritedReadAccess.js'\n\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <TData extends TypeWithID = any>(\n args: Arguments,\n): Promise<TypeWithVersion<TData>> => {\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n if (!id) {\n throw new APIError('Missing ID of version.', httpStatus.BAD_REQUEST)\n }\n\n if (!hasVersionsEnabled(collectionConfig)) {\n if (disableErrors) {\n return null!\n }\n\n throw new NotFound(req.t)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n })\n\n const where = { id: { equals: id } }\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n const inheritsReadAccess = isInheritedReadVersionsAccess(collectionConfig.access.readVersions)\n const shouldPrefetchVersion = !overrideAccess && inheritsReadAccess\n const prefetched = shouldPrefetchVersion\n ? await prefetchVersionForInheritedReadAccess<TData>({\n id,\n collectionConfig,\n locale: locale!,\n req,\n select,\n trash,\n })\n : undefined\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n id,\n slug: collectionConfig.slug,\n disableErrors,\n req,\n },\n inheritsReadAccess\n ? (accessArgs) =>\n collectionConfig.access.readVersions(\n withInheritedReadVersionsParentID(accessArgs, prefetched?.parentID),\n )\n : collectionConfig.access.readVersions,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResults === false) {\n return null!\n }\n\n const hasWhereAccess = typeof accessResults === 'object'\n\n let fullWhere = combineQueries(where, accessResults)\n\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n let result = prefetched?.version as TypeWithVersion<TData>\n\n if (!shouldPrefetchVersion || hasWhereAccess) {\n const versionsQuery = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select,\n where: fullWhere,\n })\n\n result = versionsQuery.docs[0]!\n }\n\n if (!result) {\n if (!disableErrors) {\n if (!hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n return null!\n }\n\n if (collectionConfig.upload && !overrideAccess) {\n const filename = (result.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: result.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n\n if (!result.version) {\n // Fallback if not selected\n ;(result as any).version = {}\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n if (collectionConfig.upload) {\n result.version = markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: result.version,\n req,\n versionID: result.id,\n })\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n}\n"],"names":["executeAccess","combineQueries","sanitizeWhereQuery","APIError","Forbidden","NotFound","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","hasVersionsEnabled","httpStatus","resolveSelect","sanitizeSelect","buildVersionCollectionFields","isInheritedReadVersionsAccess","withInheritedReadVersionsParentID","buildAfterOperation","buildBeforeOperation","prefetchVersionForInheritedReadAccess","findVersionByIDOperation","args","id","collection","config","collectionConfig","currentDepth","depth","disableErrors","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","BAD_REQUEST","t","operation","where","equals","versionFields","fields","versions","inheritsReadAccess","access","readVersions","shouldPrefetchVersion","prefetched","undefined","accessResults","slug","accessArgs","parentID","hasWhereAccess","fullWhere","deletedAtPath","enableTrash","result","version","versionsQuery","db","findVersions","limit","pagination","docs","upload","filename","documentID","parent","hooks","beforeRead","length","hook","context","doc","query","draft","global","collectionSlug","versionID"],"mappings":"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"}
|