payload 3.90.2 → 3.91.0-internal.07e4582

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.
Files changed (35) hide show
  1. package/bin.js +3 -14
  2. package/dist/auth/endpoints/refresh.d.ts.map +1 -1
  3. package/dist/auth/endpoints/refresh.js +4 -6
  4. package/dist/auth/endpoints/refresh.js.map +1 -1
  5. package/dist/bin/index.d.ts.map +1 -1
  6. package/dist/bin/index.js +15 -0
  7. package/dist/bin/index.js.map +1 -1
  8. package/dist/bin/index.spec.js +54 -0
  9. package/dist/bin/index.spec.js.map +1 -0
  10. package/dist/collections/operations/findByID.d.ts.map +1 -1
  11. package/dist/collections/operations/findByID.js +54 -6
  12. package/dist/collections/operations/findByID.js.map +1 -1
  13. package/dist/database/createSchemaBuildContext.d.ts +12 -0
  14. package/dist/database/createSchemaBuildContext.d.ts.map +1 -0
  15. package/dist/database/createSchemaBuildContext.js +24 -0
  16. package/dist/database/createSchemaBuildContext.js.map +1 -0
  17. package/dist/database/createSchemaBuildContext.spec.js +146 -0
  18. package/dist/database/createSchemaBuildContext.spec.js.map +1 -0
  19. package/dist/exports/internal.d.ts +2 -0
  20. package/dist/exports/internal.d.ts.map +1 -1
  21. package/dist/exports/internal.js +1 -0
  22. package/dist/exports/internal.js.map +1 -1
  23. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  24. package/dist/globals/operations/findVersionByID.js +4 -3
  25. package/dist/globals/operations/findVersionByID.js.map +1 -1
  26. package/dist/queues/utilities/updateJob.d.ts.map +1 -1
  27. package/dist/queues/utilities/updateJob.js +15 -0
  28. package/dist/queues/utilities/updateJob.js.map +1 -1
  29. package/dist/utilities/getNextJsHMRURL.d.ts.map +1 -1
  30. package/dist/utilities/getNextJsHMRURL.js +4 -2
  31. package/dist/utilities/getNextJsHMRURL.js.map +1 -1
  32. package/dist/utilities/getNextJsHMRURL.spec.js +11 -0
  33. package/dist/utilities/getNextJsHMRURL.spec.js.map +1 -1
  34. package/lexicalLoader.mjs +26 -0
  35. package/package.json +5 -4
package/bin.js CHANGED
@@ -15,7 +15,7 @@ if (disableTranspile) {
15
15
  await bin()
16
16
  }
17
17
 
18
- void start()
18
+ await start()
19
19
  } else {
20
20
  const filename = fileURLToPath(import.meta.url)
21
21
  const dirname = path.dirname(filename)
@@ -23,17 +23,6 @@ if (disableTranspile) {
23
23
 
24
24
  if (!useSwc) {
25
25
  const start = async () => {
26
- // tsx 4.22.4 uses Node's synchronous `module.registerHooks` API when it is available
27
- // (Node v23.5+). On those versions that code path leaks tsx's internal `?namespace=...`
28
- // query string onto resolved specifiers — including Node built-ins like `node:crypto` —
29
- // which Node then tries to open as a file, failing with ENOENT. Removing `registerHooks`
30
- // forces tsx to fall back to its older async `module.register()` worker path, which does
31
- // not have this bug. See https://github.com/payloadcms/payload/issues/16949
32
- const nodeModule = await import('node:module')
33
- if (typeof nodeModule.default.registerHooks === 'function') {
34
- nodeModule.default.registerHooks = undefined
35
- }
36
-
37
26
  // Use tsx
38
27
  let tsImport = (await import('tsx/esm/api')).tsImport
39
28
 
@@ -41,7 +30,7 @@ if (disableTranspile) {
41
30
  await bin()
42
31
  }
43
32
 
44
- void start()
33
+ await start()
45
34
  } else if (useSwc) {
46
35
  const { register } = await import('node:module')
47
36
  // Remove --use-swc from arguments
@@ -60,6 +49,6 @@ if (disableTranspile) {
60
49
  await bin()
61
50
  }
62
51
 
63
- void start()
52
+ await start()
64
53
  }
65
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/endpoints/refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAO3D,eAAO,MAAM,cAAc,EAAE,cAuC5B,CAAA"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/auth/endpoints/refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAO3D,eAAO,MAAM,cAAc,EAAE,cAwC5B,CAAA"}
@@ -14,21 +14,19 @@ export const refreshHandler = async (req)=>{
14
14
  collection,
15
15
  req
16
16
  });
17
+ const { refreshedToken, ...resultWithoutToken } = result;
17
18
  if (result.setCookie) {
18
19
  const cookie = generatePayloadCookie({
19
20
  collectionAuthConfig: collection.config.auth,
20
21
  cookiePrefix: req.payload.config.cookiePrefix,
21
- token: result.refreshedToken
22
+ token: refreshedToken
22
23
  });
23
- if (collection.config.auth.removeTokenFromResponses) {
24
- // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
25
- delete result.refreshedToken;
26
- }
27
24
  headers.set('Set-Cookie', cookie);
28
25
  }
26
+ const responseResult = collection.config.auth.removeTokenFromResponses ? resultWithoutToken : result;
29
27
  return Response.json({
30
28
  message: t('authentication:tokenRefreshSuccessful'),
31
- ...result
29
+ ...responseResult
32
30
  }, {
33
31
  headers,
34
32
  status: httpStatus.OK
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/auth/endpoints/refresh.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { PayloadHandler } from '../../config/types.js'\n\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { generatePayloadCookie } from '../cookies.js'\nimport { refreshOperation } from '../operations/refresh.js'\n\nexport const refreshHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n const { t } = req\n\n const headers = headersWithCors({\n headers: new Headers(),\n req,\n })\n\n const result = await refreshOperation({\n collection,\n req,\n })\n\n if (result.setCookie) {\n const cookie = generatePayloadCookie({\n collectionAuthConfig: collection.config.auth,\n cookiePrefix: req.payload.config.cookiePrefix,\n token: result.refreshedToken,\n })\n\n if (collection.config.auth.removeTokenFromResponses) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n delete result.refreshedToken\n }\n\n headers.set('Set-Cookie', cookie)\n }\n\n return Response.json(\n {\n message: t('authentication:tokenRefreshSuccessful'),\n ...result,\n },\n {\n headers,\n status: httpStatus.OK,\n },\n )\n}\n"],"names":["status","httpStatus","getRequestCollection","headersWithCors","generatePayloadCookie","refreshOperation","refreshHandler","req","collection","t","headers","Headers","result","setCookie","cookie","collectionAuthConfig","config","auth","cookiePrefix","payload","token","refreshedToken","removeTokenFromResponses","set","Response","json","message","OK"],"mappings":"AAAA,SAASA,UAAUC,UAAU,QAAQ,cAAa;AAIlD,SAASC,oBAAoB,QAAQ,sCAAqC;AAC1E,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,SAASC,gBAAgB,QAAQ,2BAA0B;AAE3D,OAAO,MAAMC,iBAAiC,OAAOC;IACnD,MAAMC,aAAaN,qBAAqBK;IACxC,MAAM,EAAEE,CAAC,EAAE,GAAGF;IAEd,MAAMG,UAAUP,gBAAgB;QAC9BO,SAAS,IAAIC;QACbJ;IACF;IAEA,MAAMK,SAAS,MAAMP,iBAAiB;QACpCG;QACAD;IACF;IAEA,IAAIK,OAAOC,SAAS,EAAE;QACpB,MAAMC,SAASV,sBAAsB;YACnCW,sBAAsBP,WAAWQ,MAAM,CAACC,IAAI;YAC5CC,cAAcX,IAAIY,OAAO,CAACH,MAAM,CAACE,YAAY;YAC7CE,OAAOR,OAAOS,cAAc;QAC9B;QAEA,IAAIb,WAAWQ,MAAM,CAACC,IAAI,CAACK,wBAAwB,EAAE;YACnD,oFAAoF;YACpF,OAAOV,OAAOS,cAAc;QAC9B;QAEAX,QAAQa,GAAG,CAAC,cAAcT;IAC5B;IAEA,OAAOU,SAASC,IAAI,CAClB;QACEC,SAASjB,EAAE;QACX,GAAGG,MAAM;IACX,GACA;QACEF;QACAV,QAAQC,WAAW0B,EAAE;IACvB;AAEJ,EAAC"}
1
+ {"version":3,"sources":["../../../src/auth/endpoints/refresh.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\nimport type { PayloadHandler } from '../../config/types.js'\n\nimport { getRequestCollection } from '../../utilities/getRequestEntity.js'\nimport { headersWithCors } from '../../utilities/headersWithCors.js'\nimport { generatePayloadCookie } from '../cookies.js'\nimport { refreshOperation } from '../operations/refresh.js'\n\nexport const refreshHandler: PayloadHandler = async (req) => {\n const collection = getRequestCollection(req)\n const { t } = req\n\n const headers = headersWithCors({\n headers: new Headers(),\n req,\n })\n\n const result = await refreshOperation({\n collection,\n req,\n })\n\n const { refreshedToken, ...resultWithoutToken } = result\n\n if (result.setCookie) {\n const cookie = generatePayloadCookie({\n collectionAuthConfig: collection.config.auth,\n cookiePrefix: req.payload.config.cookiePrefix,\n token: refreshedToken,\n })\n\n headers.set('Set-Cookie', cookie)\n }\n\n const responseResult = collection.config.auth.removeTokenFromResponses\n ? resultWithoutToken\n : result\n\n return Response.json(\n {\n message: t('authentication:tokenRefreshSuccessful'),\n ...responseResult,\n },\n {\n headers,\n status: httpStatus.OK,\n },\n )\n}\n"],"names":["status","httpStatus","getRequestCollection","headersWithCors","generatePayloadCookie","refreshOperation","refreshHandler","req","collection","t","headers","Headers","result","refreshedToken","resultWithoutToken","setCookie","cookie","collectionAuthConfig","config","auth","cookiePrefix","payload","token","set","responseResult","removeTokenFromResponses","Response","json","message","OK"],"mappings":"AAAA,SAASA,UAAUC,UAAU,QAAQ,cAAa;AAIlD,SAASC,oBAAoB,QAAQ,sCAAqC;AAC1E,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,qBAAqB,QAAQ,gBAAe;AACrD,SAASC,gBAAgB,QAAQ,2BAA0B;AAE3D,OAAO,MAAMC,iBAAiC,OAAOC;IACnD,MAAMC,aAAaN,qBAAqBK;IACxC,MAAM,EAAEE,CAAC,EAAE,GAAGF;IAEd,MAAMG,UAAUP,gBAAgB;QAC9BO,SAAS,IAAIC;QACbJ;IACF;IAEA,MAAMK,SAAS,MAAMP,iBAAiB;QACpCG;QACAD;IACF;IAEA,MAAM,EAAEM,cAAc,EAAE,GAAGC,oBAAoB,GAAGF;IAElD,IAAIA,OAAOG,SAAS,EAAE;QACpB,MAAMC,SAASZ,sBAAsB;YACnCa,sBAAsBT,WAAWU,MAAM,CAACC,IAAI;YAC5CC,cAAcb,IAAIc,OAAO,CAACH,MAAM,CAACE,YAAY;YAC7CE,OAAOT;QACT;QAEAH,QAAQa,GAAG,CAAC,cAAcP;IAC5B;IAEA,MAAMQ,iBAAiBhB,WAAWU,MAAM,CAACC,IAAI,CAACM,wBAAwB,GAClEX,qBACAF;IAEJ,OAAOc,SAASC,IAAI,CAClB;QACEC,SAASnB,EAAE;QACX,GAAGe,cAAc;IACnB,GACA;QACEd;QACAV,QAAQC,WAAW4B,EAAE;IACvB;AAEJ,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,GAAG,qBAkCf,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,GAAG,qBAoDf,CAAA"}
package/dist/bin/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable no-console */ import { Cron } from 'croner';
2
2
  import minimist from 'minimist';
3
+ import * as nodeModule from 'node:module';
3
4
  import { pathToFileURL } from 'node:url';
4
5
  import path from 'path';
5
6
  import { findConfig } from '../config/find.js';
@@ -22,6 +23,20 @@ const availableScripts = [
22
23
  ];
23
24
  export const bin = async ()=>{
24
25
  loadEnv();
26
+ // Lexical 0.50's Node entry points use top-level dynamic imports that can stall under tsx.
27
+ // Select its equivalent static exports after loading the user's environment instead.
28
+ const environmentCondition = process.env.NODE_ENV === 'production' ? 'production' : 'development';
29
+ if (typeof nodeModule.registerHooks === 'function') {
30
+ const { initialize, resolve } = await import(new URL('../../lexicalLoader.mjs', import.meta.url).href);
31
+ initialize(environmentCondition);
32
+ nodeModule.registerHooks({
33
+ resolve
34
+ });
35
+ } else {
36
+ nodeModule.register('../../lexicalLoader.mjs', import.meta.url, {
37
+ data: environmentCondition
38
+ });
39
+ }
25
40
  process.env.DISABLE_PAYLOAD_HMR = 'true';
26
41
  const args = minimist(process.argv.slice(2));
27
42
  const script = (typeof args._[0] === 'string' ? args._[0] : '').toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { Cron } from 'croner'\nimport minimist from 'minimist'\nimport { pathToFileURL } from 'node:url'\nimport path from 'path'\n\nimport { findConfig } from '../config/find.js'\nimport { getPayload, type Payload } from '../index.js'\nimport { generateImportMap } from './generateImportMap/index.js'\nimport { generateTypes } from './generateTypes.js'\nimport { info } from './info.js'\nimport { loadEnv } from './loadEnv.js'\nimport { migrate, availableCommands as migrateCommands } from './migrate.js'\n\n// Note: this does not account for any user bin scripts\nconst availableScripts = [\n 'generate:db-schema',\n 'generate:importmap',\n 'generate:types',\n 'info',\n 'jobs:run',\n 'jobs:handle-schedules',\n 'run',\n ...migrateCommands,\n] as const\n\nexport const bin = async () => {\n loadEnv()\n process.env.DISABLE_PAYLOAD_HMR = 'true'\n\n const args = minimist(process.argv.slice(2))\n const script = (typeof args._[0] === 'string' ? args._[0] : '').toLowerCase()\n\n if (args.cron) {\n new Cron(\n args.cron,\n async () => {\n // If the bin script initializes payload (getPayload), this will only happen once, as getPayload\n // caches the payload instance on the module scope => no need to manually cache and manage getPayload initialization\n // outside the Cron here.\n await runBinScript({ args, script })\n },\n {\n // Do not run consecutive crons if previous crons still ongoing\n protect: true,\n // TODO: Remove this compatibility option in 4.0. This only exists to ensure backwards-compatibility between Croner v9 and Croner v10 cron syntax\n sloppyRanges: true,\n },\n )\n\n process.stdin.resume() // Keep the process alive\n\n return\n } else {\n const { payload } = await runBinScript({ args, script })\n if (payload) {\n await payload.destroy() // close database connections after running jobs so process can exit cleanly\n }\n process.exit(0)\n }\n}\n\nasync function runBinScript({\n args,\n script,\n}: {\n args: minimist.ParsedArgs\n script: string\n}): Promise<{\n /**\n * Scripts can return a payload instance if it exists. The bin script runner can then safely\n * shut off the instance, depending on if it's running in a cron job or not.\n */\n payload?: Payload\n}> {\n if (script === 'info') {\n await info()\n return {}\n }\n\n if (script === 'run') {\n const scriptPath = args._[1]\n if (!scriptPath) {\n console.error('Please provide a script path to run.')\n process.exit(1)\n }\n\n const absoluteScriptPath = path.resolve(process.cwd(), scriptPath)\n\n // Modify process.argv to remove 'run' and the script path\n const originalArgv = process.argv\n process.argv = [process.argv[0]!, process.argv[1]!, ...args._.slice(2)]\n\n try {\n await import(pathToFileURL(absoluteScriptPath).toString())\n } catch (error) {\n console.error(`Error running script: ${absoluteScriptPath}`)\n console.error(error)\n process.exit(1)\n } finally {\n // Restore original process.argv\n process.argv = originalArgv\n }\n return {}\n }\n\n const configPath = findConfig()\n const configPromise = await import(pathToFileURL(configPath).toString())\n let config = await configPromise\n if (config.default) {\n config = await config.default\n }\n\n const userBinScript = Array.isArray(config.bin)\n ? config.bin.find(({ key }: { key: string }) => key === script)\n : false\n\n if (userBinScript) {\n try {\n const module = await import(pathToFileURL(userBinScript.scriptPath).toString())\n\n if (!module.script || typeof module.script !== 'function') {\n console.error(\n `Could not find \"script\" function export for script ${userBinScript.key} in ${userBinScript.scriptPath}`,\n )\n } else {\n await module.script(config).catch((err: unknown) => {\n console.log(`Script ${userBinScript.key} failed, details:`)\n console.error(err)\n })\n }\n } catch (err) {\n console.log(`Could not find associated bin script for the ${userBinScript.key} command`)\n console.error(err)\n }\n\n return {}\n }\n\n if (script.startsWith('migrate')) {\n await migrate({ config, parsedArgs: args })\n return {}\n }\n\n if (script === 'generate:types') {\n await generateTypes(config)\n return {}\n }\n\n if (script === 'generate:importmap') {\n await generateImportMap(config)\n return {}\n }\n\n if (script === 'jobs:run') {\n const payload = await getPayload({ config }) // Do not setup crons here - this bin script can set up its own crons\n const limit = args.limit ? parseInt(args.limit, 10) : undefined\n const queue = args.queue ? args.queue : undefined\n const allQueues = !!args['all-queues']\n const handleSchedules = !!args['handle-schedules']\n\n if (handleSchedules) {\n await payload.jobs.handleSchedules({\n allQueues,\n queue,\n })\n }\n\n await payload.jobs.run({\n allQueues,\n limit,\n queue,\n })\n\n return { payload }\n }\n\n if (script === 'jobs:handle-schedules') {\n const payload = await getPayload({ config }) // Do not setup crons here - this bin script can set up its own crons\n const queue = args.queue ? args.queue : undefined\n const allQueues = !!args['all-queues']\n\n await payload.jobs.handleSchedules({\n allQueues,\n queue,\n })\n\n return { payload }\n }\n\n if (script === 'generate:db-schema') {\n // Barebones instance to access database adapter, without connecting to the DB\n const payload = await getPayload({ config, disableDBConnect: true, disableOnInit: true }) // Do not setup crons here\n\n if (typeof payload.db.generateSchema !== 'function') {\n payload.logger.error({\n msg: `${payload.db.packageName} does not support database schema generation`,\n })\n\n await payload.destroy()\n process.exit(1)\n }\n\n await payload.db.generateSchema({\n log: args.log === 'false' ? false : true,\n prettify: args.prettify === 'false' ? false : true,\n })\n\n return { payload }\n }\n\n console.error(script ? `Unknown command: \"${script}\"` : 'Please provide a command to run')\n console.log(`\\nAvailable commands:\\n${availableScripts.map((c) => ` - ${c}`).join('\\n')}`)\n\n process.exit(1)\n}\n"],"names":["Cron","minimist","pathToFileURL","path","findConfig","getPayload","generateImportMap","generateTypes","info","loadEnv","migrate","availableCommands","migrateCommands","availableScripts","bin","process","env","DISABLE_PAYLOAD_HMR","args","argv","slice","script","_","toLowerCase","cron","runBinScript","protect","sloppyRanges","stdin","resume","payload","destroy","exit","scriptPath","console","error","absoluteScriptPath","resolve","cwd","originalArgv","toString","configPath","configPromise","config","default","userBinScript","Array","isArray","find","key","module","catch","err","log","startsWith","parsedArgs","limit","parseInt","undefined","queue","allQueues","handleSchedules","jobs","run","disableDBConnect","disableOnInit","db","generateSchema","logger","msg","packageName","prettify","map","c","join"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/bin/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { Cron } from 'croner'\nimport minimist from 'minimist'\nimport * as nodeModule from 'node:module'\nimport { pathToFileURL } from 'node:url'\nimport path from 'path'\n\nimport { findConfig } from '../config/find.js'\nimport { getPayload, type Payload } from '../index.js'\nimport { generateImportMap } from './generateImportMap/index.js'\nimport { generateTypes } from './generateTypes.js'\nimport { info } from './info.js'\nimport { loadEnv } from './loadEnv.js'\nimport { migrate, availableCommands as migrateCommands } from './migrate.js'\n\n// Note: this does not account for any user bin scripts\nconst availableScripts = [\n 'generate:db-schema',\n 'generate:importmap',\n 'generate:types',\n 'info',\n 'jobs:run',\n 'jobs:handle-schedules',\n 'run',\n ...migrateCommands,\n] as const\n\nexport const bin = async () => {\n loadEnv()\n\n // Lexical 0.50's Node entry points use top-level dynamic imports that can stall under tsx.\n // Select its equivalent static exports after loading the user's environment instead.\n const environmentCondition = process.env.NODE_ENV === 'production' ? 'production' : 'development'\n\n if (typeof nodeModule.registerHooks === 'function') {\n const { initialize, resolve } = await import(\n new URL('../../lexicalLoader.mjs', import.meta.url).href\n )\n\n initialize(environmentCondition)\n nodeModule.registerHooks({ resolve })\n } else {\n nodeModule.register('../../lexicalLoader.mjs', import.meta.url, {\n data: environmentCondition,\n })\n }\n\n process.env.DISABLE_PAYLOAD_HMR = 'true'\n\n const args = minimist(process.argv.slice(2))\n const script = (typeof args._[0] === 'string' ? args._[0] : '').toLowerCase()\n\n if (args.cron) {\n new Cron(\n args.cron,\n async () => {\n // If the bin script initializes payload (getPayload), this will only happen once, as getPayload\n // caches the payload instance on the module scope => no need to manually cache and manage getPayload initialization\n // outside the Cron here.\n await runBinScript({ args, script })\n },\n {\n // Do not run consecutive crons if previous crons still ongoing\n protect: true,\n // TODO: Remove this compatibility option in 4.0. This only exists to ensure backwards-compatibility between Croner v9 and Croner v10 cron syntax\n sloppyRanges: true,\n },\n )\n\n process.stdin.resume() // Keep the process alive\n\n return\n } else {\n const { payload } = await runBinScript({ args, script })\n if (payload) {\n await payload.destroy() // close database connections after running jobs so process can exit cleanly\n }\n process.exit(0)\n }\n}\n\nasync function runBinScript({\n args,\n script,\n}: {\n args: minimist.ParsedArgs\n script: string\n}): Promise<{\n /**\n * Scripts can return a payload instance if it exists. The bin script runner can then safely\n * shut off the instance, depending on if it's running in a cron job or not.\n */\n payload?: Payload\n}> {\n if (script === 'info') {\n await info()\n return {}\n }\n\n if (script === 'run') {\n const scriptPath = args._[1]\n if (!scriptPath) {\n console.error('Please provide a script path to run.')\n process.exit(1)\n }\n\n const absoluteScriptPath = path.resolve(process.cwd(), scriptPath)\n\n // Modify process.argv to remove 'run' and the script path\n const originalArgv = process.argv\n process.argv = [process.argv[0]!, process.argv[1]!, ...args._.slice(2)]\n\n try {\n await import(pathToFileURL(absoluteScriptPath).toString())\n } catch (error) {\n console.error(`Error running script: ${absoluteScriptPath}`)\n console.error(error)\n process.exit(1)\n } finally {\n // Restore original process.argv\n process.argv = originalArgv\n }\n return {}\n }\n\n const configPath = findConfig()\n const configPromise = await import(pathToFileURL(configPath).toString())\n let config = await configPromise\n if (config.default) {\n config = await config.default\n }\n\n const userBinScript = Array.isArray(config.bin)\n ? config.bin.find(({ key }: { key: string }) => key === script)\n : false\n\n if (userBinScript) {\n try {\n const module = await import(pathToFileURL(userBinScript.scriptPath).toString())\n\n if (!module.script || typeof module.script !== 'function') {\n console.error(\n `Could not find \"script\" function export for script ${userBinScript.key} in ${userBinScript.scriptPath}`,\n )\n } else {\n await module.script(config).catch((err: unknown) => {\n console.log(`Script ${userBinScript.key} failed, details:`)\n console.error(err)\n })\n }\n } catch (err) {\n console.log(`Could not find associated bin script for the ${userBinScript.key} command`)\n console.error(err)\n }\n\n return {}\n }\n\n if (script.startsWith('migrate')) {\n await migrate({ config, parsedArgs: args })\n return {}\n }\n\n if (script === 'generate:types') {\n await generateTypes(config)\n return {}\n }\n\n if (script === 'generate:importmap') {\n await generateImportMap(config)\n return {}\n }\n\n if (script === 'jobs:run') {\n const payload = await getPayload({ config }) // Do not setup crons here - this bin script can set up its own crons\n const limit = args.limit ? parseInt(args.limit, 10) : undefined\n const queue = args.queue ? args.queue : undefined\n const allQueues = !!args['all-queues']\n const handleSchedules = !!args['handle-schedules']\n\n if (handleSchedules) {\n await payload.jobs.handleSchedules({\n allQueues,\n queue,\n })\n }\n\n await payload.jobs.run({\n allQueues,\n limit,\n queue,\n })\n\n return { payload }\n }\n\n if (script === 'jobs:handle-schedules') {\n const payload = await getPayload({ config }) // Do not setup crons here - this bin script can set up its own crons\n const queue = args.queue ? args.queue : undefined\n const allQueues = !!args['all-queues']\n\n await payload.jobs.handleSchedules({\n allQueues,\n queue,\n })\n\n return { payload }\n }\n\n if (script === 'generate:db-schema') {\n // Barebones instance to access database adapter, without connecting to the DB\n const payload = await getPayload({ config, disableDBConnect: true, disableOnInit: true }) // Do not setup crons here\n\n if (typeof payload.db.generateSchema !== 'function') {\n payload.logger.error({\n msg: `${payload.db.packageName} does not support database schema generation`,\n })\n\n await payload.destroy()\n process.exit(1)\n }\n\n await payload.db.generateSchema({\n log: args.log === 'false' ? false : true,\n prettify: args.prettify === 'false' ? false : true,\n })\n\n return { payload }\n }\n\n console.error(script ? `Unknown command: \"${script}\"` : 'Please provide a command to run')\n console.log(`\\nAvailable commands:\\n${availableScripts.map((c) => ` - ${c}`).join('\\n')}`)\n\n process.exit(1)\n}\n"],"names":["Cron","minimist","nodeModule","pathToFileURL","path","findConfig","getPayload","generateImportMap","generateTypes","info","loadEnv","migrate","availableCommands","migrateCommands","availableScripts","bin","environmentCondition","process","env","NODE_ENV","registerHooks","initialize","resolve","URL","url","href","register","data","DISABLE_PAYLOAD_HMR","args","argv","slice","script","_","toLowerCase","cron","runBinScript","protect","sloppyRanges","stdin","resume","payload","destroy","exit","scriptPath","console","error","absoluteScriptPath","cwd","originalArgv","toString","configPath","configPromise","config","default","userBinScript","Array","isArray","find","key","module","catch","err","log","startsWith","parsedArgs","limit","parseInt","undefined","queue","allQueues","handleSchedules","jobs","run","disableDBConnect","disableOnInit","db","generateSchema","logger","msg","packageName","prettify","map","c","join"],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
7
+ const binPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../bin.js');
8
+ describe('CLI exit codes', ()=>{
9
+ let testDir;
10
+ beforeEach(async ()=>{
11
+ testDir = await mkdtemp(path.join(tmpdir(), 'payload-cli-exit-'));
12
+ });
13
+ afterEach(async ()=>{
14
+ await rm(testDir, {
15
+ force: true,
16
+ recursive: true
17
+ });
18
+ });
19
+ it.each([
20
+ {
21
+ exitCode: 0,
22
+ source: 'await Promise.resolve()',
23
+ state: 'completes'
24
+ },
25
+ {
26
+ exitCode: 13,
27
+ source: 'await new Promise(() => {})',
28
+ state: 'remains pending'
29
+ },
30
+ {
31
+ exitCode: 1,
32
+ source: "throw new Error('EXPECTED_FAILURE')",
33
+ state: 'throws'
34
+ }
35
+ ])('should exit with code $exitCode when the script $state', async ({ exitCode, source })=>{
36
+ const scriptPath = path.join(testDir, 'script.mjs');
37
+ await writeFile(scriptPath, `console.log('SCRIPT_STARTED')\n${source}\n`);
38
+ const result = spawnSync(process.execPath, [
39
+ binPath,
40
+ 'run',
41
+ scriptPath
42
+ ], {
43
+ cwd: testDir,
44
+ encoding: 'utf8',
45
+ timeout: 10_000
46
+ });
47
+ expect(result.error).toBeUndefined();
48
+ expect(result.signal).toBeNull();
49
+ expect(result.stdout).toContain('SCRIPT_STARTED');
50
+ expect(result.status).toBe(exitCode);
51
+ });
52
+ });
53
+
54
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/bin/index.spec.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { mkdtemp, rm, writeFile } from 'node:fs/promises'\nimport { tmpdir } from 'node:os'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest'\n\nconst binPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../bin.js')\n\ndescribe('CLI exit codes', () => {\n let testDir: string\n\n beforeEach(async () => {\n testDir = await mkdtemp(path.join(tmpdir(), 'payload-cli-exit-'))\n })\n\n afterEach(async () => {\n await rm(testDir, { force: true, recursive: true })\n })\n\n it.each([\n { exitCode: 0, source: 'await Promise.resolve()', state: 'completes' },\n { exitCode: 13, source: 'await new Promise(() => {})', state: 'remains pending' },\n { exitCode: 1, source: \"throw new Error('EXPECTED_FAILURE')\", state: 'throws' },\n ])('should exit with code $exitCode when the script $state', async ({ exitCode, source }) => {\n const scriptPath = path.join(testDir, 'script.mjs')\n\n await writeFile(scriptPath, `console.log('SCRIPT_STARTED')\\n${source}\\n`)\n\n const result = spawnSync(process.execPath, [binPath, 'run', scriptPath], {\n cwd: testDir,\n encoding: 'utf8',\n timeout: 10_000,\n })\n\n expect(result.error).toBeUndefined()\n expect(result.signal).toBeNull()\n expect(result.stdout).toContain('SCRIPT_STARTED')\n expect(result.status).toBe(exitCode)\n })\n})\n"],"names":["spawnSync","mkdtemp","rm","writeFile","tmpdir","path","fileURLToPath","afterEach","beforeEach","describe","expect","it","binPath","resolve","dirname","url","testDir","join","force","recursive","each","exitCode","source","state","scriptPath","result","process","execPath","cwd","encoding","timeout","error","toBeUndefined","signal","toBeNull","stdout","toContain","status","toBe"],"mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,OAAO,EAAEC,EAAE,EAAEC,SAAS,QAAQ,mBAAkB;AACzD,SAASC,MAAM,QAAQ,UAAS;AAChC,OAAOC,UAAU,YAAW;AAC5B,SAASC,aAAa,QAAQ,WAAU;AACxC,SAASC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAEpE,MAAMC,UAAUP,KAAKQ,OAAO,CAACR,KAAKS,OAAO,CAACR,cAAc,YAAYS,GAAG,IAAI;AAE3EN,SAAS,kBAAkB;IACzB,IAAIO;IAEJR,WAAW;QACTQ,UAAU,MAAMf,QAAQI,KAAKY,IAAI,CAACb,UAAU;IAC9C;IAEAG,UAAU;QACR,MAAML,GAAGc,SAAS;YAAEE,OAAO;YAAMC,WAAW;QAAK;IACnD;IAEAR,GAAGS,IAAI,CAAC;QACN;YAAEC,UAAU;YAAGC,QAAQ;YAA2BC,OAAO;QAAY;QACrE;YAAEF,UAAU;YAAIC,QAAQ;YAA+BC,OAAO;QAAkB;QAChF;YAAEF,UAAU;YAAGC,QAAQ;YAAuCC,OAAO;QAAS;KAC/E,EAAE,0DAA0D,OAAO,EAAEF,QAAQ,EAAEC,MAAM,EAAE;QACtF,MAAME,aAAanB,KAAKY,IAAI,CAACD,SAAS;QAEtC,MAAMb,UAAUqB,YAAY,CAAC,+BAA+B,EAAEF,OAAO,EAAE,CAAC;QAExE,MAAMG,SAASzB,UAAU0B,QAAQC,QAAQ,EAAE;YAACf;YAAS;YAAOY;SAAW,EAAE;YACvEI,KAAKZ;YACLa,UAAU;YACVC,SAAS;QACX;QAEApB,OAAOe,OAAOM,KAAK,EAAEC,aAAa;QAClCtB,OAAOe,OAAOQ,MAAM,EAAEC,QAAQ;QAC9BxB,OAAOe,OAAOU,MAAM,EAAEC,SAAS,CAAC;QAChC1B,OAAOe,OAAOY,MAAM,EAAEC,IAAI,CAACjB;IAC7B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"findByID.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findByID.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACV,UAAU,EAEV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAA;AAYrF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GACnD,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEjD,eAAO,MAAM,iBAAiB,GAC5B,KAAK,SAAS,cAAc,EAC5B,cAAc,SAAS,OAAO,EAC9B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,YAAY,KACzB,OAAO,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAsS3F,CAAA"}
1
+ {"version":3,"file":"findByID.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findByID.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,6BAA6B,EAC9B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EACV,UAAU,EAEV,wBAAwB,EAEzB,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,uCAAuC,CAAA;AAerF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GACnD,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEjD,eAAO,MAAM,iBAAiB,GAC5B,KAAK,SAAS,cAAc,EAC5B,cAAc,SAAS,OAAO,EAC9B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,YAAY,KACzB,OAAO,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAuV3F,CAAA"}
@@ -11,6 +11,9 @@ import { getSelectMode } from '../../utilities/getSelectMode.js';
11
11
  import { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js';
12
12
  import { killTransaction } from '../../utilities/killTransaction.js';
13
13
  import { sanitizeSelect } from '../../utilities/sanitizeSelect.js';
14
+ import { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js';
15
+ import { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js';
16
+ import { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js';
14
17
  import { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js';
15
18
  import { buildAfterOperation } from './utilities/buildAfterOperation.js';
16
19
  import { buildBeforeOperation } from './utilities/buildBeforeOperation.js';
@@ -45,6 +48,10 @@ export const findByIDOperation = async (incomingArgs)=>{
45
48
  if (accessResult === false) {
46
49
  return null;
47
50
  }
51
+ const isValidID = typeof id === 'string' && id.length > 0 || typeof id === 'number' && Number.isFinite(id);
52
+ if (!isValidID) {
53
+ throw new NotFound(t);
54
+ }
48
55
  const where = {
49
56
  id: {
50
57
  equals: id
@@ -80,6 +87,9 @@ export const findByIDOperation = async (incomingArgs)=>{
80
87
  // /////////////////////////////////////
81
88
  // Find by ID
82
89
  // /////////////////////////////////////
90
+ const shouldQueryDrafts = !args.data && replaceWithVersion && hasDraftsEnabled(collectionConfig);
91
+ let docFromDB;
92
+ let query = fullWhere;
83
93
  let dbSelect = select;
84
94
  if (collectionConfig.versions?.drafts && replaceWithVersion && select && getSelectMode(select) === 'include') {
85
95
  dbSelect = {
@@ -99,10 +109,48 @@ export const findByIDOperation = async (incomingArgs)=>{
99
109
  select: dbSelect,
100
110
  where: fullWhere
101
111
  };
102
- if (!findOneArgs.where?.and?.[0]?.id) {
103
- throw new NotFound(t);
112
+ if (shouldQueryDrafts) {
113
+ query = appendVersionToQueryKey(fullWhere);
114
+ await validateQueryPaths({
115
+ collectionConfig,
116
+ overrideAccess,
117
+ req,
118
+ versionFields: buildVersionCollectionFields(req.payload.config, collectionConfig, true),
119
+ where: appendVersionToQueryKey(where)
120
+ });
121
+ const { docs } = await req.payload.db.queryDrafts({
122
+ collection: collectionConfig.slug,
123
+ joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,
124
+ limit: 1,
125
+ locale: locale,
126
+ pagination: false,
127
+ req,
128
+ select: getQueryDraftsSelect({
129
+ select
130
+ }),
131
+ where: query
132
+ });
133
+ docFromDB = docs[0];
134
+ if (!docFromDB) {
135
+ const { docs: existingVersions } = await req.payload.db.queryDrafts({
136
+ collection: collectionConfig.slug,
137
+ limit: 1,
138
+ locale: locale,
139
+ pagination: false,
140
+ req,
141
+ select: {
142
+ parent: true
143
+ },
144
+ where: appendVersionToQueryKey(where)
145
+ });
146
+ if (!existingVersions[0]) {
147
+ query = fullWhere;
148
+ docFromDB = await req.payload.db.findOne(findOneArgs);
149
+ }
150
+ }
151
+ } else {
152
+ docFromDB = await req.payload.db.findOne(findOneArgs);
104
153
  }
105
- const docFromDB = await req.payload.db.findOne(findOneArgs);
106
154
  if (!docFromDB && !args.data) {
107
155
  if (!disableErrors) {
108
156
  throw new NotFound(req.t);
@@ -170,7 +218,7 @@ export const findByIDOperation = async (incomingArgs)=>{
170
218
  // /////////////////////////////////////
171
219
  // Replace document with draft if available
172
220
  // /////////////////////////////////////
173
- if (replaceWithVersion && hasDraftsEnabled(collectionConfig)) {
221
+ if (!shouldQueryDrafts && replaceWithVersion && hasDraftsEnabled(collectionConfig)) {
174
222
  result = await replaceWithDraftIfAvailable({
175
223
  accessResult,
176
224
  doc: result,
@@ -191,7 +239,7 @@ export const findByIDOperation = async (incomingArgs)=>{
191
239
  context: req.context,
192
240
  doc: result,
193
241
  overrideAccess,
194
- query: findOneArgs.where,
242
+ query,
195
243
  req
196
244
  }) || result;
197
245
  }
@@ -226,7 +274,7 @@ export const findByIDOperation = async (incomingArgs)=>{
226
274
  context: req.context,
227
275
  doc: result,
228
276
  overrideAccess,
229
- query: findOneArgs.where,
277
+ query,
230
278
  req
231
279
  }) || result;
232
280
  }
@@ -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 { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.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 try {\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 forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess({ id, disableErrors, req }, collectionConfig.access.read)\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 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 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 (!findOneArgs.where?.and?.[0]?.id) {\n throw new NotFound(t)\n }\n\n const docFromDB = await req.payload.db.findOne(findOneArgs)\n\n if (!docFromDB && !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>) ?? docFromDB!\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 (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: findOneArgs.where,\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: findOneArgs.where,\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<\n TransformCollectionWithSelect<TSlug, TSelect>,\n TDisableErrors\n >\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","killTransaction","sanitizeSelect","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","forceSelect","accessResult","access","read","where","equals","fullWhere","enableTrash","sanitizedJoins","slug","customIDType","dbSelect","versions","drafts","createdAt","updatedAt","findOneArgs","draftsEnabled","payloadAPI","transactionID","and","docFromDB","db","findOne","data","result","auth","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","limit","pagination","greater_than","Date","getTime","docs","length","_isLocked","_userEditing","user","value","doc","entity","entityType","hooks","beforeRead","hook","context","query","global","error"],"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 { killTransaction } from '../../utilities/killTransaction.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 try {\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 forceSelect: collectionConfig.forceSelect,\n select: incomingSelect,\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess({ id, disableErrors, req }, collectionConfig.access.read)\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 docFromDB: 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 docFromDB = docs[0]\n\n if (!docFromDB) {\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 docFromDB = await req.payload.db.findOne(findOneArgs)\n }\n }\n } else {\n docFromDB = await req.payload.db.findOne(findOneArgs)\n }\n\n if (!docFromDB && !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>) ?? docFromDB!\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<\n TransformCollectionWithSelect<TSlug, TSelect>,\n TDisableErrors\n >\n } catch (error: unknown) {\n await killTransaction(args.req)\n throw error\n }\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","killTransaction","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","forceSelect","accessResult","access","read","isValidID","length","Number","isFinite","where","equals","fullWhere","enableTrash","sanitizedJoins","slug","customIDType","shouldQueryDrafts","data","docFromDB","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","error"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type SchemaBuildContext<TSchema> = {
2
+ clear: () => void;
3
+ getOrCreate: (args: {
4
+ build: () => TSchema;
5
+ cacheKey: string;
6
+ definition: object;
7
+ }) => TSchema;
8
+ };
9
+ export declare const createSchemaBuildContext: <TSchema>({ isCacheEnabled, }?: {
10
+ isCacheEnabled?: boolean;
11
+ }) => SchemaBuildContext<TSchema>;
12
+ //# sourceMappingURL=createSchemaBuildContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSchemaBuildContext.d.ts","sourceRoot":"","sources":["../../src/database/createSchemaBuildContext.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAAI;IACxC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAA;CAC/F,CAAA;AAED,eAAO,MAAM,wBAAwB,GAAI,OAAO,wBAE7C;IACD,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,KAAQ,kBAAkB,CAAC,OAAO,CA2BlC,CAAA"}
@@ -0,0 +1,24 @@
1
+ export const createSchemaBuildContext = ({ isCacheEnabled = true } = {})=>{
2
+ let schemasByDefinition = new WeakMap();
3
+ return {
4
+ clear: ()=>{
5
+ schemasByDefinition = new WeakMap();
6
+ },
7
+ getOrCreate: ({ build, cacheKey, definition })=>{
8
+ const schemasByKey = schemasByDefinition.get(definition);
9
+ if (!isCacheEnabled) {
10
+ return build();
11
+ }
12
+ if (schemasByKey?.has(cacheKey)) {
13
+ return schemasByKey.get(cacheKey);
14
+ }
15
+ const schema = build();
16
+ const storedSchemasByKey = schemasByKey ?? new Map();
17
+ storedSchemasByKey.set(cacheKey, schema);
18
+ schemasByDefinition.set(definition, storedSchemasByKey);
19
+ return schema;
20
+ }
21
+ };
22
+ };
23
+
24
+ //# sourceMappingURL=createSchemaBuildContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/database/createSchemaBuildContext.ts"],"sourcesContent":["export type SchemaBuildContext<TSchema> = {\n clear: () => void\n getOrCreate: (args: { build: () => TSchema; cacheKey: string; definition: object }) => TSchema\n}\n\nexport const createSchemaBuildContext = <TSchema>({\n isCacheEnabled = true,\n}: {\n isCacheEnabled?: boolean\n} = {}): SchemaBuildContext<TSchema> => {\n let schemasByDefinition = new WeakMap<object, Map<string, TSchema>>()\n\n return {\n clear: () => {\n schemasByDefinition = new WeakMap<object, Map<string, TSchema>>()\n },\n getOrCreate: ({ build, cacheKey, definition }) => {\n const schemasByKey = schemasByDefinition.get(definition)\n\n if (!isCacheEnabled) {\n return build()\n }\n\n if (schemasByKey?.has(cacheKey)) {\n return schemasByKey.get(cacheKey)!\n }\n\n const schema = build()\n const storedSchemasByKey = schemasByKey ?? new Map<string, TSchema>()\n\n storedSchemasByKey.set(cacheKey, schema)\n schemasByDefinition.set(definition, storedSchemasByKey)\n\n return schema\n },\n }\n}\n"],"names":["createSchemaBuildContext","isCacheEnabled","schemasByDefinition","WeakMap","clear","getOrCreate","build","cacheKey","definition","schemasByKey","get","has","schema","storedSchemasByKey","Map","set"],"mappings":"AAKA,OAAO,MAAMA,2BAA2B,CAAU,EAChDC,iBAAiB,IAAI,EAGtB,GAAG,CAAC,CAAC;IACJ,IAAIC,sBAAsB,IAAIC;IAE9B,OAAO;QACLC,OAAO;YACLF,sBAAsB,IAAIC;QAC5B;QACAE,aAAa,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,UAAU,EAAE;YAC3C,MAAMC,eAAeP,oBAAoBQ,GAAG,CAACF;YAE7C,IAAI,CAACP,gBAAgB;gBACnB,OAAOK;YACT;YAEA,IAAIG,cAAcE,IAAIJ,WAAW;gBAC/B,OAAOE,aAAaC,GAAG,CAACH;YAC1B;YAEA,MAAMK,SAASN;YACf,MAAMO,qBAAqBJ,gBAAgB,IAAIK;YAE/CD,mBAAmBE,GAAG,CAACR,UAAUK;YACjCV,oBAAoBa,GAAG,CAACP,YAAYK;YAEpC,OAAOD;QACT;IACF;AACF,EAAC"}
@@ -0,0 +1,146 @@
1
+ import { describe, expect, test, vi } from 'vitest';
2
+ import { createSchemaBuildContext } from './createSchemaBuildContext.js';
3
+ describe('createSchemaBuildContext', ()=>{
4
+ test('should build once for the same definition identity and variant', ()=>{
5
+ const context = createSchemaBuildContext();
6
+ const definition = {};
7
+ const artifact = {};
8
+ const build = vi.fn(()=>artifact);
9
+ const first = context.getOrCreate({
10
+ build,
11
+ definition,
12
+ cacheKey: 'block:hero'
13
+ });
14
+ const second = context.getOrCreate({
15
+ build,
16
+ definition,
17
+ cacheKey: 'block:hero'
18
+ });
19
+ expect(first).toBe(artifact);
20
+ expect(second).toBe(artifact);
21
+ expect(build).toHaveBeenCalledOnce();
22
+ });
23
+ test('should build separate artifacts for separate variants', ()=>{
24
+ const context = createSchemaBuildContext();
25
+ const definition = {};
26
+ const live = context.getOrCreate({
27
+ build: ()=>({
28
+ variant: 'live'
29
+ }),
30
+ definition,
31
+ cacheKey: 'block:hero'
32
+ });
33
+ const version = context.getOrCreate({
34
+ build: ()=>({
35
+ variant: 'version'
36
+ }),
37
+ definition,
38
+ cacheKey: 'block:hero-version'
39
+ });
40
+ expect(live).not.toBe(version);
41
+ });
42
+ test('should build a fresh artifact when caching is disabled', ()=>{
43
+ const context = createSchemaBuildContext({
44
+ isCacheEnabled: false
45
+ });
46
+ const definition = {};
47
+ const build = vi.fn(()=>({}));
48
+ const first = context.getOrCreate({
49
+ build,
50
+ definition,
51
+ cacheKey: 'block:hero'
52
+ });
53
+ const second = context.getOrCreate({
54
+ build,
55
+ definition,
56
+ cacheKey: 'block:hero'
57
+ });
58
+ expect(first).not.toBe(second);
59
+ expect(build).toHaveBeenCalledTimes(2);
60
+ });
61
+ test('should not merge equal definitions with different object identities', ()=>{
62
+ const context = createSchemaBuildContext();
63
+ const first = context.getOrCreate({
64
+ build: ()=>({
65
+ source: 'first'
66
+ }),
67
+ definition: {
68
+ slug: 'hero'
69
+ },
70
+ cacheKey: 'block:hero'
71
+ });
72
+ const second = context.getOrCreate({
73
+ build: ()=>({
74
+ source: 'second'
75
+ }),
76
+ definition: {
77
+ slug: 'hero'
78
+ },
79
+ cacheKey: 'block:hero'
80
+ });
81
+ expect(first).not.toBe(second);
82
+ });
83
+ test('should not share artifacts between contexts', ()=>{
84
+ const definition = {};
85
+ const firstContext = createSchemaBuildContext();
86
+ const secondContext = createSchemaBuildContext();
87
+ const first = firstContext.getOrCreate({
88
+ build: ()=>({
89
+ context: 'first'
90
+ }),
91
+ definition,
92
+ cacheKey: 'block:hero'
93
+ });
94
+ const second = secondContext.getOrCreate({
95
+ build: ()=>({
96
+ context: 'second'
97
+ }),
98
+ definition,
99
+ cacheKey: 'block:hero'
100
+ });
101
+ expect(first).not.toBe(second);
102
+ });
103
+ test('should retry after a builder throws', ()=>{
104
+ const context = createSchemaBuildContext();
105
+ const definition = {};
106
+ const artifact = {};
107
+ const build = vi.fn();
108
+ build.mockImplementationOnce(()=>{
109
+ throw new Error('build failed');
110
+ });
111
+ build.mockReturnValueOnce(artifact);
112
+ expect(()=>context.getOrCreate({
113
+ build,
114
+ cacheKey: 'block:hero',
115
+ definition
116
+ })).toThrow('build failed');
117
+ expect(context.getOrCreate({
118
+ build,
119
+ cacheKey: 'block:hero',
120
+ definition
121
+ })).toBe(artifact);
122
+ expect(build).toHaveBeenCalledTimes(2);
123
+ });
124
+ test('should reset artifacts when cleared', ()=>{
125
+ const context = createSchemaBuildContext();
126
+ const definition = {};
127
+ const first = context.getOrCreate({
128
+ build: ()=>({
129
+ build: 1
130
+ }),
131
+ definition,
132
+ cacheKey: 'block:hero'
133
+ });
134
+ context.clear();
135
+ const second = context.getOrCreate({
136
+ build: ()=>({
137
+ build: 2
138
+ }),
139
+ definition,
140
+ cacheKey: 'block:hero'
141
+ });
142
+ expect(second).not.toBe(first);
143
+ });
144
+ });
145
+
146
+ //# sourceMappingURL=createSchemaBuildContext.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/database/createSchemaBuildContext.spec.ts"],"sourcesContent":["import { describe, expect, test, vi } from 'vitest'\n\nimport { createSchemaBuildContext } from './createSchemaBuildContext.js'\n\ndescribe('createSchemaBuildContext', () => {\n test('should build once for the same definition identity and variant', () => {\n const context = createSchemaBuildContext<object>()\n const definition = {}\n const artifact = {}\n const build = vi.fn(() => artifact)\n\n const first = context.getOrCreate({\n build,\n definition,\n cacheKey: 'block:hero',\n })\n const second = context.getOrCreate({\n build,\n definition,\n cacheKey: 'block:hero',\n })\n\n expect(first).toBe(artifact)\n expect(second).toBe(artifact)\n expect(build).toHaveBeenCalledOnce()\n })\n\n test('should build separate artifacts for separate variants', () => {\n const context = createSchemaBuildContext<object>()\n const definition = {}\n\n const live = context.getOrCreate({\n build: () => ({ variant: 'live' }),\n definition,\n cacheKey: 'block:hero',\n })\n const version = context.getOrCreate({\n build: () => ({ variant: 'version' }),\n definition,\n cacheKey: 'block:hero-version',\n })\n\n expect(live).not.toBe(version)\n })\n\n test('should build a fresh artifact when caching is disabled', () => {\n const context = createSchemaBuildContext<object>({ isCacheEnabled: false })\n const definition = {}\n const build = vi.fn(() => ({}))\n\n const first = context.getOrCreate({\n build,\n definition,\n cacheKey: 'block:hero',\n })\n const second = context.getOrCreate({\n build,\n definition,\n cacheKey: 'block:hero',\n })\n\n expect(first).not.toBe(second)\n expect(build).toHaveBeenCalledTimes(2)\n })\n\n test('should not merge equal definitions with different object identities', () => {\n const context = createSchemaBuildContext<object>()\n const first = context.getOrCreate({\n build: () => ({ source: 'first' }),\n definition: { slug: 'hero' },\n cacheKey: 'block:hero',\n })\n const second = context.getOrCreate({\n build: () => ({ source: 'second' }),\n definition: { slug: 'hero' },\n cacheKey: 'block:hero',\n })\n\n expect(first).not.toBe(second)\n })\n\n test('should not share artifacts between contexts', () => {\n const definition = {}\n const firstContext = createSchemaBuildContext<object>()\n const secondContext = createSchemaBuildContext<object>()\n const first = firstContext.getOrCreate({\n build: () => ({ context: 'first' }),\n definition,\n cacheKey: 'block:hero',\n })\n const second = secondContext.getOrCreate({\n build: () => ({ context: 'second' }),\n definition,\n cacheKey: 'block:hero',\n })\n\n expect(first).not.toBe(second)\n })\n\n test('should retry after a builder throws', () => {\n const context = createSchemaBuildContext<object>()\n const definition = {}\n const artifact = {}\n const build = vi.fn<() => object>()\n build.mockImplementationOnce(() => {\n throw new Error('build failed')\n })\n build.mockReturnValueOnce(artifact)\n\n expect(() => context.getOrCreate({ build, cacheKey: 'block:hero', definition })).toThrow(\n 'build failed',\n )\n expect(context.getOrCreate({ build, cacheKey: 'block:hero', definition })).toBe(artifact)\n expect(build).toHaveBeenCalledTimes(2)\n })\n\n test('should reset artifacts when cleared', () => {\n const context = createSchemaBuildContext<object>()\n const definition = {}\n const first = context.getOrCreate({\n build: () => ({ build: 1 }),\n definition,\n cacheKey: 'block:hero',\n })\n\n context.clear()\n\n const second = context.getOrCreate({\n build: () => ({ build: 2 }),\n definition,\n cacheKey: 'block:hero',\n })\n\n expect(second).not.toBe(first)\n })\n})\n"],"names":["describe","expect","test","vi","createSchemaBuildContext","context","definition","artifact","build","fn","first","getOrCreate","cacheKey","second","toBe","toHaveBeenCalledOnce","live","variant","version","not","isCacheEnabled","toHaveBeenCalledTimes","source","slug","firstContext","secondContext","mockImplementationOnce","Error","mockReturnValueOnce","toThrow","clear"],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
  * Modules exported here are not part of the public API and are subject to change without notice and without a major version bump.
3
3
  */
4
4
  export { applyUserReadAccess } from '../auth/applyUserReadAccess.js';
5
+ export { createSchemaBuildContext } from '../database/createSchemaBuildContext.js';
6
+ export type { SchemaBuildContext } from '../database/createSchemaBuildContext.js';
5
7
  export { assertClientUploadAccess } from '../uploads/assertClientUploadAccess.js';
6
8
  export { assertClientUploadAllowed, assertClientUploadFileSize, } from '../uploads/assertClientUploadAllowed.js';
7
9
  export { createClientUploadReceipt, verifyClientUploadReceipt, } from '../uploads/clientUploadReceipt.js';
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/exports/internal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,2DAA2D,CAAA;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/exports/internal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AACjF,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,YAAY,EACV,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,2CAA2C,CAAA;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,2DAA2D,CAAA;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Modules exported here are not part of the public API and are subject to change without notice and without a major version bump.
3
3
  */ export { applyUserReadAccess } from '../auth/applyUserReadAccess.js';
4
+ export { createSchemaBuildContext } from '../database/createSchemaBuildContext.js';
4
5
  export { assertClientUploadAccess } from '../uploads/assertClientUploadAccess.js';
5
6
  export { assertClientUploadAllowed, assertClientUploadFileSize } from '../uploads/assertClientUploadAllowed.js';
6
7
  export { createClientUploadReceipt, verifyClientUploadReceipt } from '../uploads/clientUploadReceipt.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/internal.ts"],"sourcesContent":["/**\n * Modules exported here are not part of the public API and are subject to change without notice and without a major version bump.\n */\n\nexport { applyUserReadAccess } from '../auth/applyUserReadAccess.js'\nexport { assertClientUploadAccess } from '../uploads/assertClientUploadAccess.js'\nexport {\n assertClientUploadAllowed,\n assertClientUploadFileSize,\n} from '../uploads/assertClientUploadAllowed.js'\nexport {\n createClientUploadReceipt,\n verifyClientUploadReceipt,\n} from '../uploads/clientUploadReceipt.js'\nexport type {\n ClientUploadReceipt,\n SignedClientUploadReceipt,\n} from '../uploads/clientUploadReceipt.js'\nexport { getExternalFile } from '../uploads/getExternalFile.js'\nexport { isSvgMimeType, isXmlMimeType } from '../uploads/getFileTypeIdentity.js'\nexport { getRangeRequestInfo } from '../uploads/getRangeRequestInfo.js'\nexport { getSafeFileName } from '../uploads/getSafeFilename.js'\nexport { parseRangeHeader } from '../uploads/parseRangeHeader.js'\nexport { UPLOAD_CONTENT_SECURITY_POLICY } from '../uploads/uploadContentSecurityPolicy.js'\nexport { getEntityPermissions } from '../utilities/getEntityPermissions/getEntityPermissions.js'\nexport { sanitizePermissions } from '../utilities/sanitizePermissions.js'\n"],"names":["applyUserReadAccess","assertClientUploadAccess","assertClientUploadAllowed","assertClientUploadFileSize","createClientUploadReceipt","verifyClientUploadReceipt","getExternalFile","isSvgMimeType","isXmlMimeType","getRangeRequestInfo","getSafeFileName","parseRangeHeader","UPLOAD_CONTENT_SECURITY_POLICY","getEntityPermissions","sanitizePermissions"],"mappings":"AAAA;;CAEC,GAED,SAASA,mBAAmB,QAAQ,iCAAgC;AACpE,SAASC,wBAAwB,QAAQ,yCAAwC;AACjF,SACEC,yBAAyB,EACzBC,0BAA0B,QACrB,0CAAyC;AAChD,SACEC,yBAAyB,EACzBC,yBAAyB,QACpB,oCAAmC;AAK1C,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,aAAa,EAAEC,aAAa,QAAQ,oCAAmC;AAChF,SAASC,mBAAmB,QAAQ,oCAAmC;AACvE,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,gBAAgB,QAAQ,iCAAgC;AACjE,SAASC,8BAA8B,QAAQ,4CAA2C;AAC1F,SAASC,oBAAoB,QAAQ,4DAA2D;AAChG,SAASC,mBAAmB,QAAQ,sCAAqC"}
1
+ {"version":3,"sources":["../../src/exports/internal.ts"],"sourcesContent":["/**\n * Modules exported here are not part of the public API and are subject to change without notice and without a major version bump.\n */\n\nexport { applyUserReadAccess } from '../auth/applyUserReadAccess.js'\nexport { createSchemaBuildContext } from '../database/createSchemaBuildContext.js'\nexport type { SchemaBuildContext } from '../database/createSchemaBuildContext.js'\nexport { assertClientUploadAccess } from '../uploads/assertClientUploadAccess.js'\nexport {\n assertClientUploadAllowed,\n assertClientUploadFileSize,\n} from '../uploads/assertClientUploadAllowed.js'\nexport {\n createClientUploadReceipt,\n verifyClientUploadReceipt,\n} from '../uploads/clientUploadReceipt.js'\nexport type {\n ClientUploadReceipt,\n SignedClientUploadReceipt,\n} from '../uploads/clientUploadReceipt.js'\nexport { getExternalFile } from '../uploads/getExternalFile.js'\nexport { isSvgMimeType, isXmlMimeType } from '../uploads/getFileTypeIdentity.js'\nexport { getRangeRequestInfo } from '../uploads/getRangeRequestInfo.js'\nexport { getSafeFileName } from '../uploads/getSafeFilename.js'\nexport { parseRangeHeader } from '../uploads/parseRangeHeader.js'\nexport { UPLOAD_CONTENT_SECURITY_POLICY } from '../uploads/uploadContentSecurityPolicy.js'\nexport { getEntityPermissions } from '../utilities/getEntityPermissions/getEntityPermissions.js'\nexport { sanitizePermissions } from '../utilities/sanitizePermissions.js'\n"],"names":["applyUserReadAccess","createSchemaBuildContext","assertClientUploadAccess","assertClientUploadAllowed","assertClientUploadFileSize","createClientUploadReceipt","verifyClientUploadReceipt","getExternalFile","isSvgMimeType","isXmlMimeType","getRangeRequestInfo","getSafeFileName","parseRangeHeader","UPLOAD_CONTENT_SECURITY_POLICY","getEntityPermissions","sanitizePermissions"],"mappings":"AAAA;;CAEC,GAED,SAASA,mBAAmB,QAAQ,iCAAgC;AACpE,SAASC,wBAAwB,QAAQ,0CAAyC;AAElF,SAASC,wBAAwB,QAAQ,yCAAwC;AACjF,SACEC,yBAAyB,EACzBC,0BAA0B,QACrB,0CAAyC;AAChD,SACEC,yBAAyB,EACzBC,yBAAyB,QACpB,oCAAmC;AAK1C,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,aAAa,EAAEC,aAAa,QAAQ,oCAAmC;AAChF,SAASC,mBAAmB,QAAQ,oCAAmC;AACvE,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,gBAAgB,QAAQ,iCAAgC;AACjE,SAASC,8BAA8B,QAAQ,4CAA2C;AAC1F,SAASC,oBAAoB,QAAQ,4DAA2D;AAChG,SAASC,mBAAmB,QAAQ,sCAAqC"}
@@ -1 +1 @@
1
- {"version":3,"file":"findVersionByID.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/findVersionByID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAA;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAY/D,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,qBAAqB,CAAA;IACnC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnD,eAAO,MAAM,wBAAwB,GAAU,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC,cACnE,SAAS,KACd,OAAO,CAAC,CAAC,CA4IX,CAAA"}
1
+ {"version":3,"file":"findVersionByID.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/findVersionByID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAA;AAE7E,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAY/D,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,qBAAqB,CAAA;IACnC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnD,eAAO,MAAM,wBAAwB,GAAU,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC,cACnE,SAAS,KACd,OAAO,CAAC,CAAC,CA+IX,CAAA"}
@@ -22,6 +22,10 @@ export const findVersionByIDOperation = async (args)=>{
22
22
  if (accessResults === false) {
23
23
  return null;
24
24
  }
25
+ const isValidID = typeof id === 'string' && id.length > 0 || typeof id === 'number' && Number.isFinite(id);
26
+ if (!isValidID) {
27
+ throw new NotFound(req.t);
28
+ }
25
29
  const hasWhereAccess = typeof accessResults === 'object';
26
30
  const select = sanitizeSelect({
27
31
  fields: buildVersionGlobalFields(payload.config, globalConfig, true),
@@ -46,9 +50,6 @@ export const findVersionByIDOperation = async (args)=>{
46
50
  // /////////////////////////////////////
47
51
  // Find by ID
48
52
  // /////////////////////////////////////
49
- if (!findGlobalVersionsArgs.where?.and?.[0]?.id) {
50
- throw new NotFound(req.t);
51
- }
52
53
  const { docs: results } = await payload.db.findGlobalVersions(findGlobalVersionsArgs);
53
54
  if (!results || results?.length === 0) {
54
55
  if (!disableErrors) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/globals/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../collections/operations/local/find.js'\nimport type { FindGlobalVersionsArgs } from '../../database/types.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionGlobalFields } from '../../versions/buildGlobalFields.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\n\nexport type Arguments = {\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n globalConfig: SanitizedGlobalConfig\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <T extends TypeWithVersion<T> = any>(\n args: Arguments,\n): Promise<T> => {\n const {\n id,\n currentDepth,\n depth,\n disableErrors,\n globalConfig,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess({ id, disableErrors, req }, globalConfig.access.readVersions)\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 const select = sanitizeSelect({\n fields: buildVersionGlobalFields(payload.config, globalConfig, true),\n forceSelect: getQueryDraftsSelect({ select: globalConfig.forceSelect }),\n select: incomingSelect,\n versions: true,\n })\n\n const findGlobalVersionsArgs: FindGlobalVersionsArgs = {\n global: globalConfig.slug,\n limit: 1,\n locale: locale!,\n req,\n select,\n where: combineQueries({ id: { equals: id } }, accessResults),\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n if (!findGlobalVersionsArgs.where?.and?.[0]?.id) {\n throw new NotFound(req.t)\n }\n\n const { docs: results } = await payload.db.findGlobalVersions(findGlobalVersionsArgs)\n if (!results || results?.length === 0) {\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 // Clone the result - it may have come back memoized\n let result: any = deepCopyObjectSimple(results[0])\n\n if (!result.version) {\n result.version = {}\n }\n\n // Patch globalType onto version doc\n result.version.globalType = globalConfig.slug\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeRead?.length) {\n for (const hook of globalConfig.hooks.beforeRead) {\n result =\n (await hook({\n context: req.context,\n doc: result.version,\n global: globalConfig,\n overrideAccess,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: null,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: globalConfig,\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 - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result.version =\n (await hook({\n context: req.context,\n doc: result.version,\n global: globalConfig,\n overrideAccess,\n query: findGlobalVersionsArgs.where,\n req,\n })) || result.version\n }\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","combineQueries","Forbidden","NotFound","afterRead","deepCopyObjectSimple","killTransaction","sanitizeSelect","buildVersionGlobalFields","getQueryDraftsSelect","findVersionByIDOperation","args","id","currentDepth","depth","disableErrors","globalConfig","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","accessResults","access","readVersions","hasWhereAccess","fields","config","forceSelect","versions","findGlobalVersionsArgs","global","slug","limit","where","equals","and","t","docs","results","db","findGlobalVersions","length","result","version","globalType","hooks","beforeRead","hook","context","doc","collection","draft","undefined","query","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/globals/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../collections/operations/local/find.js'\nimport type { FindGlobalVersionsArgs } from '../../database/types.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionGlobalFields } from '../../versions/buildGlobalFields.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\n\nexport type Arguments = {\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n globalConfig: SanitizedGlobalConfig\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <T extends TypeWithVersion<T> = any>(\n args: Arguments,\n): Promise<T> => {\n const {\n id,\n currentDepth,\n depth,\n disableErrors,\n globalConfig,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n } = args\n\n try {\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess({ id, disableErrors, req }, globalConfig.access.readVersions)\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 isValidID =\n (typeof id === 'string' && id.length > 0) || (typeof id === 'number' && Number.isFinite(id))\n\n if (!isValidID) {\n throw new NotFound(req.t)\n }\n\n const hasWhereAccess = typeof accessResults === 'object'\n\n const select = sanitizeSelect({\n fields: buildVersionGlobalFields(payload.config, globalConfig, true),\n forceSelect: getQueryDraftsSelect({ select: globalConfig.forceSelect }),\n select: incomingSelect,\n versions: true,\n })\n\n const findGlobalVersionsArgs: FindGlobalVersionsArgs = {\n global: globalConfig.slug,\n limit: 1,\n locale: locale!,\n req,\n select,\n where: combineQueries({ id: { equals: id } }, accessResults),\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n const { docs: results } = await payload.db.findGlobalVersions(findGlobalVersionsArgs)\n if (!results || results?.length === 0) {\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 // Clone the result - it may have come back memoized\n let result: any = deepCopyObjectSimple(results[0])\n\n if (!result.version) {\n result.version = {}\n }\n\n // Patch globalType onto version doc\n result.version.globalType = globalConfig.slug\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeRead?.length) {\n for (const hook of globalConfig.hooks.beforeRead) {\n result =\n (await hook({\n context: req.context,\n doc: result.version,\n global: globalConfig,\n overrideAccess,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: null,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: globalConfig,\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 - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result.version =\n (await hook({\n context: req.context,\n doc: result.version,\n global: globalConfig,\n overrideAccess,\n query: findGlobalVersionsArgs.where,\n req,\n })) || result.version\n }\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","combineQueries","Forbidden","NotFound","afterRead","deepCopyObjectSimple","killTransaction","sanitizeSelect","buildVersionGlobalFields","getQueryDraftsSelect","findVersionByIDOperation","args","id","currentDepth","depth","disableErrors","globalConfig","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","accessResults","access","readVersions","isValidID","length","Number","isFinite","t","hasWhereAccess","fields","config","forceSelect","versions","findGlobalVersionsArgs","global","slug","limit","where","equals","docs","results","db","findGlobalVersions","result","version","globalType","hooks","beforeRead","hook","context","doc","collection","draft","undefined","query","error"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateJob.d.ts","sourceRoot":"","sources":["../../../src/queues/utilities/updateJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAKvE,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAA;AAEpD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,4BAKxD;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,IAAI,EACJ,KAAK,EACL,kBAAkB,EAClB,KAAK,EAAE,QAAQ,EACf,GAAG,EACH,SAAS,EACT,IAAI,EACJ,KAAK,EAAE,QAAQ,GAChB,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAiErC"}
1
+ {"version":3,"file":"updateJob.d.ts","sourceRoot":"","sources":["../../../src/queues/utilities/updateJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAU,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAKvE,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,KAAK,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAA;AAEpD;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,4BAKxD;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,IAAI,EACJ,KAAK,EACL,kBAAkB,EAClB,KAAK,EAAE,QAAQ,EACf,GAAG,EACH,SAAS,EACT,IAAI,EACJ,KAAK,EAAE,QAAQ,GAChB,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CA4ErC"}
@@ -20,6 +20,21 @@ import { getCurrentDate } from './getCurrentDate.js';
20
20
  }
21
21
  } : whereArg;
22
22
  if (depth || req.payload.config?.jobs?.runHooks) {
23
+ if (id && data.log && '$push' in data.log) {
24
+ const job = await req.payload.findByID({
25
+ id,
26
+ collection: jobsCollectionSlug,
27
+ depth: 0,
28
+ req
29
+ });
30
+ data = {
31
+ ...data,
32
+ log: [
33
+ ...job.log ?? [],
34
+ data.log.$push
35
+ ]
36
+ };
37
+ }
23
38
  const result = await req.payload.update({
24
39
  id,
25
40
  collection: jobsCollectionSlug,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/queues/utilities/updateJob.ts"],"sourcesContent":["import type { ManyOptions } from '../../collections/operations/local/update.js'\nimport type { UpdateJobsArgs } from '../../database/types.js'\nimport type { Job } from '../../index.js'\nimport type { PayloadRequest, Sort, Where } from '../../types/index.js'\n\nimport { jobAfterRead, jobsCollectionSlug } from '../config/collection.js'\nimport { getCurrentDate } from './getCurrentDate.js'\n\ntype BaseArgs = {\n data: Partial<Job>\n depth?: number\n disableTransaction?: boolean\n limit?: number\n req: PayloadRequest\n returning?: boolean\n}\n\ntype ArgsByID = {\n id: number | string\n limit?: never\n sort?: never\n where?: never\n}\n\ntype ArgsWhere = {\n id?: never\n limit?: number\n sort?: Sort\n where: Where\n}\n\ntype RunJobsArgs = (ArgsByID | ArgsWhere) & BaseArgs\n\n/**\n * Convenience method for updateJobs by id\n */\nexport async function updateJob(args: ArgsByID & BaseArgs) {\n const result = await updateJobs(args)\n if (result) {\n return result[0]\n }\n}\n\n/**\n * Helper for updating jobs in the most performant way possible.\n * Handles deciding whether it can used direct db methods or not, and if so,\n * manually runs the afterRead hook that populates the `taskStatus` property.\n */\nexport async function updateJobs({\n id,\n data,\n depth,\n disableTransaction,\n limit: limitArg,\n req,\n returning,\n sort,\n where: whereArg,\n}: RunJobsArgs): Promise<Job[] | null> {\n const limit = id ? 1 : limitArg\n const where = id ? { id: { equals: id } } : whereArg\n\n if (depth || req.payload.config?.jobs?.runHooks) {\n const result = await req.payload.update({\n id,\n collection: jobsCollectionSlug,\n data,\n depth,\n disableTransaction,\n limit,\n req,\n where,\n } as ManyOptions<any, any>)\n if (returning === false || !result) {\n return null\n }\n return result.docs as Job[]\n }\n\n const jobReq = {\n transactionID:\n req.payload.db.name !== 'mongoose'\n ? ((await req.payload.db.beginTransaction()) as string)\n : undefined,\n }\n\n if (typeof data.updatedAt === 'undefined') {\n // Ensure updatedAt date is always updated\n data.updatedAt = getCurrentDate().toISOString()\n }\n\n const args: UpdateJobsArgs = id\n ? {\n id,\n data,\n req: jobReq,\n returning,\n }\n : {\n data,\n limit,\n req: jobReq,\n returning,\n sort,\n where: where as Where,\n }\n\n const updatedJobs: Job[] | null = await req.payload.db.updateJobs(args)\n\n if (req.payload.db.name !== 'mongoose' && jobReq.transactionID) {\n await req.payload.db.commitTransaction(jobReq.transactionID)\n }\n\n if (returning === false || !updatedJobs?.length) {\n return null\n }\n\n return updatedJobs.map((updatedJob) => {\n return jobAfterRead({\n config: req.payload.config,\n doc: updatedJob,\n })\n })\n}\n"],"names":["jobAfterRead","jobsCollectionSlug","getCurrentDate","updateJob","args","result","updateJobs","id","data","depth","disableTransaction","limit","limitArg","req","returning","sort","where","whereArg","equals","payload","config","jobs","runHooks","update","collection","docs","jobReq","transactionID","db","name","beginTransaction","undefined","updatedAt","toISOString","updatedJobs","commitTransaction","length","map","updatedJob","doc"],"mappings":"AAKA,SAASA,YAAY,EAAEC,kBAAkB,QAAQ,0BAAyB;AAC1E,SAASC,cAAc,QAAQ,sBAAqB;AA2BpD;;CAEC,GACD,OAAO,eAAeC,UAAUC,IAAyB;IACvD,MAAMC,SAAS,MAAMC,WAAWF;IAChC,IAAIC,QAAQ;QACV,OAAOA,MAAM,CAAC,EAAE;IAClB;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAeC,WAAW,EAC/BC,EAAE,EACFC,IAAI,EACJC,KAAK,EACLC,kBAAkB,EAClBC,OAAOC,QAAQ,EACfC,GAAG,EACHC,SAAS,EACTC,IAAI,EACJC,OAAOC,QAAQ,EACH;IACZ,MAAMN,QAAQJ,KAAK,IAAIK;IACvB,MAAMI,QAAQT,KAAK;QAAEA,IAAI;YAAEW,QAAQX;QAAG;IAAE,IAAIU;IAE5C,IAAIR,SAASI,IAAIM,OAAO,CAACC,MAAM,EAAEC,MAAMC,UAAU;QAC/C,MAAMjB,SAAS,MAAMQ,IAAIM,OAAO,CAACI,MAAM,CAAC;YACtChB;YACAiB,YAAYvB;YACZO;YACAC;YACAC;YACAC;YACAE;YACAG;QACF;QACA,IAAIF,cAAc,SAAS,CAACT,QAAQ;YAClC,OAAO;QACT;QACA,OAAOA,OAAOoB,IAAI;IACpB;IAEA,MAAMC,SAAS;QACbC,eACEd,IAAIM,OAAO,CAACS,EAAE,CAACC,IAAI,KAAK,aAClB,MAAMhB,IAAIM,OAAO,CAACS,EAAE,CAACE,gBAAgB,KACvCC;IACR;IAEA,IAAI,OAAOvB,KAAKwB,SAAS,KAAK,aAAa;QACzC,0CAA0C;QAC1CxB,KAAKwB,SAAS,GAAG9B,iBAAiB+B,WAAW;IAC/C;IAEA,MAAM7B,OAAuBG,KACzB;QACEA;QACAC;QACAK,KAAKa;QACLZ;IACF,IACA;QACEN;QACAG;QACAE,KAAKa;QACLZ;QACAC;QACAC,OAAOA;IACT;IAEJ,MAAMkB,cAA4B,MAAMrB,IAAIM,OAAO,CAACS,EAAE,CAACtB,UAAU,CAACF;IAElE,IAAIS,IAAIM,OAAO,CAACS,EAAE,CAACC,IAAI,KAAK,cAAcH,OAAOC,aAAa,EAAE;QAC9D,MAAMd,IAAIM,OAAO,CAACS,EAAE,CAACO,iBAAiB,CAACT,OAAOC,aAAa;IAC7D;IAEA,IAAIb,cAAc,SAAS,CAACoB,aAAaE,QAAQ;QAC/C,OAAO;IACT;IAEA,OAAOF,YAAYG,GAAG,CAAC,CAACC;QACtB,OAAOtC,aAAa;YAClBoB,QAAQP,IAAIM,OAAO,CAACC,MAAM;YAC1BmB,KAAKD;QACP;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/queues/utilities/updateJob.ts"],"sourcesContent":["import type { ManyOptions } from '../../collections/operations/local/update.js'\nimport type { UpdateJobsArgs } from '../../database/types.js'\nimport type { Job, JobLog } from '../../index.js'\nimport type { PayloadRequest, Sort, Where } from '../../types/index.js'\n\nimport { jobAfterRead, jobsCollectionSlug } from '../config/collection.js'\nimport { getCurrentDate } from './getCurrentDate.js'\n\ntype BaseArgs = {\n data: Partial<Job>\n depth?: number\n disableTransaction?: boolean\n limit?: number\n req: PayloadRequest\n returning?: boolean\n}\n\ntype ArgsByID = {\n id: number | string\n limit?: never\n sort?: never\n where?: never\n}\n\ntype ArgsWhere = {\n id?: never\n limit?: number\n sort?: Sort\n where: Where\n}\n\ntype RunJobsArgs = (ArgsByID | ArgsWhere) & BaseArgs\n\n/**\n * Convenience method for updateJobs by id\n */\nexport async function updateJob(args: ArgsByID & BaseArgs) {\n const result = await updateJobs(args)\n if (result) {\n return result[0]\n }\n}\n\n/**\n * Helper for updating jobs in the most performant way possible.\n * Handles deciding whether it can used direct db methods or not, and if so,\n * manually runs the afterRead hook that populates the `taskStatus` property.\n */\nexport async function updateJobs({\n id,\n data,\n depth,\n disableTransaction,\n limit: limitArg,\n req,\n returning,\n sort,\n where: whereArg,\n}: RunJobsArgs): Promise<Job[] | null> {\n const limit = id ? 1 : limitArg\n const where = id ? { id: { equals: id } } : whereArg\n\n if (depth || req.payload.config?.jobs?.runHooks) {\n if (id && data.log && '$push' in data.log) {\n const job = await req.payload.findByID({\n id,\n collection: jobsCollectionSlug,\n depth: 0,\n req,\n })\n\n data = { ...data, log: [...(job.log ?? []), data.log.$push as JobLog] }\n }\n\n const result = await req.payload.update({\n id,\n collection: jobsCollectionSlug,\n data,\n depth,\n disableTransaction,\n limit,\n req,\n where,\n } as ManyOptions<any, any>)\n if (returning === false || !result) {\n return null\n }\n return result.docs as Job[]\n }\n\n const jobReq = {\n transactionID:\n req.payload.db.name !== 'mongoose'\n ? ((await req.payload.db.beginTransaction()) as string)\n : undefined,\n }\n\n if (typeof data.updatedAt === 'undefined') {\n // Ensure updatedAt date is always updated\n data.updatedAt = getCurrentDate().toISOString()\n }\n\n const args: UpdateJobsArgs = id\n ? {\n id,\n data,\n req: jobReq,\n returning,\n }\n : {\n data,\n limit,\n req: jobReq,\n returning,\n sort,\n where: where as Where,\n }\n\n const updatedJobs: Job[] | null = await req.payload.db.updateJobs(args)\n\n if (req.payload.db.name !== 'mongoose' && jobReq.transactionID) {\n await req.payload.db.commitTransaction(jobReq.transactionID)\n }\n\n if (returning === false || !updatedJobs?.length) {\n return null\n }\n\n return updatedJobs.map((updatedJob) => {\n return jobAfterRead({\n config: req.payload.config,\n doc: updatedJob,\n })\n })\n}\n"],"names":["jobAfterRead","jobsCollectionSlug","getCurrentDate","updateJob","args","result","updateJobs","id","data","depth","disableTransaction","limit","limitArg","req","returning","sort","where","whereArg","equals","payload","config","jobs","runHooks","log","job","findByID","collection","$push","update","docs","jobReq","transactionID","db","name","beginTransaction","undefined","updatedAt","toISOString","updatedJobs","commitTransaction","length","map","updatedJob","doc"],"mappings":"AAKA,SAASA,YAAY,EAAEC,kBAAkB,QAAQ,0BAAyB;AAC1E,SAASC,cAAc,QAAQ,sBAAqB;AA2BpD;;CAEC,GACD,OAAO,eAAeC,UAAUC,IAAyB;IACvD,MAAMC,SAAS,MAAMC,WAAWF;IAChC,IAAIC,QAAQ;QACV,OAAOA,MAAM,CAAC,EAAE;IAClB;AACF;AAEA;;;;CAIC,GACD,OAAO,eAAeC,WAAW,EAC/BC,EAAE,EACFC,IAAI,EACJC,KAAK,EACLC,kBAAkB,EAClBC,OAAOC,QAAQ,EACfC,GAAG,EACHC,SAAS,EACTC,IAAI,EACJC,OAAOC,QAAQ,EACH;IACZ,MAAMN,QAAQJ,KAAK,IAAIK;IACvB,MAAMI,QAAQT,KAAK;QAAEA,IAAI;YAAEW,QAAQX;QAAG;IAAE,IAAIU;IAE5C,IAAIR,SAASI,IAAIM,OAAO,CAACC,MAAM,EAAEC,MAAMC,UAAU;QAC/C,IAAIf,MAAMC,KAAKe,GAAG,IAAI,WAAWf,KAAKe,GAAG,EAAE;YACzC,MAAMC,MAAM,MAAMX,IAAIM,OAAO,CAACM,QAAQ,CAAC;gBACrClB;gBACAmB,YAAYzB;gBACZQ,OAAO;gBACPI;YACF;YAEAL,OAAO;gBAAE,GAAGA,IAAI;gBAAEe,KAAK;uBAAKC,IAAID,GAAG,IAAI,EAAE;oBAAGf,KAAKe,GAAG,CAACI,KAAK;iBAAW;YAAC;QACxE;QAEA,MAAMtB,SAAS,MAAMQ,IAAIM,OAAO,CAACS,MAAM,CAAC;YACtCrB;YACAmB,YAAYzB;YACZO;YACAC;YACAC;YACAC;YACAE;YACAG;QACF;QACA,IAAIF,cAAc,SAAS,CAACT,QAAQ;YAClC,OAAO;QACT;QACA,OAAOA,OAAOwB,IAAI;IACpB;IAEA,MAAMC,SAAS;QACbC,eACElB,IAAIM,OAAO,CAACa,EAAE,CAACC,IAAI,KAAK,aAClB,MAAMpB,IAAIM,OAAO,CAACa,EAAE,CAACE,gBAAgB,KACvCC;IACR;IAEA,IAAI,OAAO3B,KAAK4B,SAAS,KAAK,aAAa;QACzC,0CAA0C;QAC1C5B,KAAK4B,SAAS,GAAGlC,iBAAiBmC,WAAW;IAC/C;IAEA,MAAMjC,OAAuBG,KACzB;QACEA;QACAC;QACAK,KAAKiB;QACLhB;IACF,IACA;QACEN;QACAG;QACAE,KAAKiB;QACLhB;QACAC;QACAC,OAAOA;IACT;IAEJ,MAAMsB,cAA4B,MAAMzB,IAAIM,OAAO,CAACa,EAAE,CAAC1B,UAAU,CAACF;IAElE,IAAIS,IAAIM,OAAO,CAACa,EAAE,CAACC,IAAI,KAAK,cAAcH,OAAOC,aAAa,EAAE;QAC9D,MAAMlB,IAAIM,OAAO,CAACa,EAAE,CAACO,iBAAiB,CAACT,OAAOC,aAAa;IAC7D;IAEA,IAAIjB,cAAc,SAAS,CAACwB,aAAaE,QAAQ;QAC/C,OAAO;IACT;IAEA,OAAOF,YAAYG,GAAG,CAAC,CAACC;QACtB,OAAO1C,aAAa;YAClBoB,QAAQP,IAAIM,OAAO,CAACC,MAAM;YAC1BuB,KAAKD;QACP;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"getNextJsHMRURL.d.ts","sourceRoot":"","sources":["../../src/utilities/getNextJsHMRURL.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,MAYlC,CAAA"}
1
+ {"version":3,"file":"getNextJsHMRURL.d.ts","sourceRoot":"","sources":["../../src/utilities/getNextJsHMRURL.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,MAelC,CAAA"}
@@ -13,8 +13,10 @@ const firstModernHMRPathVersion = '16.3.0';
13
13
  const port = process.env.PORT || '3000';
14
14
  const hasHTTPS = process.env.USE_HTTPS === 'true' || process.argv.includes('--experimental-https');
15
15
  const protocol = hasHTTPS ? 'wss' : 'ws';
16
- // The __NEXT_ASSET_PREFIX env variable is set for both assetPrefix and basePath (tested in Next.js 15.1.6)
17
- const prefix = process.env.__NEXT_ASSET_PREFIX ?? '';
16
+ /**
17
+ * Next.js only inlines __NEXT_ASSET_PREFIX into bundled code. In dev, withPayload keeps `payload`
18
+ * external, so fall back to NEXT_BASE_PATH, which withPayload sets on process.env at runtime.
19
+ */ const prefix = process.env.__NEXT_ASSET_PREFIX || process.env.NEXT_BASE_PATH || '';
18
20
  return `${protocol}://localhost:${port}${prefix}${getHMRPath()}`;
19
21
  };
20
22
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getNextJsHMRURL.ts"],"sourcesContent":["import { compareVersions, parseVersion } from './dependencies/versionUtils.js'\nimport { getNextVersion } from './getNextVersion.js'\n\n/** Next.js serves the dev HMR WebSocket on this path from 16.3 onwards. */\nconst modernHMRPath = '/_next/hmr'\n\n/** Next.js served the dev HMR WebSocket on this path before 16.3. */\nconst legacyHMRPath = '/_next/webpack-hmr'\n\nconst firstModernHMRPathVersion = '16.3.0'\n\n/**\n * Builds the URL of the Next.js dev HMR WebSocket, on the path served by the\n * installed Next.js version. `PAYLOAD_HMR_URL_OVERRIDE` is used verbatim.\n */\nexport const getNextJsHMRURL = (): string => {\n if (process.env.PAYLOAD_HMR_URL_OVERRIDE) {\n return process.env.PAYLOAD_HMR_URL_OVERRIDE\n }\n\n const port = process.env.PORT || '3000'\n const hasHTTPS = process.env.USE_HTTPS === 'true' || process.argv.includes('--experimental-https')\n const protocol = hasHTTPS ? 'wss' : 'ws'\n // The __NEXT_ASSET_PREFIX env variable is set for both assetPrefix and basePath (tested in Next.js 15.1.6)\n const prefix = process.env.__NEXT_ASSET_PREFIX ?? ''\n\n return `${protocol}://localhost:${port}${prefix}${getHMRPath()}`\n}\n\n/**\n * Pre-release identifiers are ignored, so that a `16.3.0-canary` build maps to the 16.3 path.\n * An unreadable version uses the current path, as Payload being unable to resolve Next.js\n * normally means it is not running under Next.js, where this strategy does not apply.\n */\nconst getHMRPath = (): string => {\n const nextVersion = getNextVersion()\n\n if (!nextVersion) {\n return modernHMRPath\n }\n\n const mainVersion = parseVersion(nextVersion).parts.join('.')\n\n return compareVersions(mainVersion, firstModernHMRPathVersion) === 'lower'\n ? legacyHMRPath\n : modernHMRPath\n}\n"],"names":["compareVersions","parseVersion","getNextVersion","modernHMRPath","legacyHMRPath","firstModernHMRPathVersion","getNextJsHMRURL","process","env","PAYLOAD_HMR_URL_OVERRIDE","port","PORT","hasHTTPS","USE_HTTPS","argv","includes","protocol","prefix","__NEXT_ASSET_PREFIX","getHMRPath","nextVersion","mainVersion","parts","join"],"mappings":"AAAA,SAASA,eAAe,EAAEC,YAAY,QAAQ,iCAAgC;AAC9E,SAASC,cAAc,QAAQ,sBAAqB;AAEpD,yEAAyE,GACzE,MAAMC,gBAAgB;AAEtB,mEAAmE,GACnE,MAAMC,gBAAgB;AAEtB,MAAMC,4BAA4B;AAElC;;;CAGC,GACD,OAAO,MAAMC,kBAAkB;IAC7B,IAAIC,QAAQC,GAAG,CAACC,wBAAwB,EAAE;QACxC,OAAOF,QAAQC,GAAG,CAACC,wBAAwB;IAC7C;IAEA,MAAMC,OAAOH,QAAQC,GAAG,CAACG,IAAI,IAAI;IACjC,MAAMC,WAAWL,QAAQC,GAAG,CAACK,SAAS,KAAK,UAAUN,QAAQO,IAAI,CAACC,QAAQ,CAAC;IAC3E,MAAMC,WAAWJ,WAAW,QAAQ;IACpC,2GAA2G;IAC3G,MAAMK,SAASV,QAAQC,GAAG,CAACU,mBAAmB,IAAI;IAElD,OAAO,GAAGF,SAAS,aAAa,EAAEN,OAAOO,SAASE,cAAc;AAClE,EAAC;AAED;;;;CAIC,GACD,MAAMA,aAAa;IACjB,MAAMC,cAAclB;IAEpB,IAAI,CAACkB,aAAa;QAChB,OAAOjB;IACT;IAEA,MAAMkB,cAAcpB,aAAamB,aAAaE,KAAK,CAACC,IAAI,CAAC;IAEzD,OAAOvB,gBAAgBqB,aAAahB,+BAA+B,UAC/DD,gBACAD;AACN"}
1
+ {"version":3,"sources":["../../src/utilities/getNextJsHMRURL.ts"],"sourcesContent":["import { compareVersions, parseVersion } from './dependencies/versionUtils.js'\nimport { getNextVersion } from './getNextVersion.js'\n\n/** Next.js serves the dev HMR WebSocket on this path from 16.3 onwards. */\nconst modernHMRPath = '/_next/hmr'\n\n/** Next.js served the dev HMR WebSocket on this path before 16.3. */\nconst legacyHMRPath = '/_next/webpack-hmr'\n\nconst firstModernHMRPathVersion = '16.3.0'\n\n/**\n * Builds the URL of the Next.js dev HMR WebSocket, on the path served by the\n * installed Next.js version. `PAYLOAD_HMR_URL_OVERRIDE` is used verbatim.\n */\nexport const getNextJsHMRURL = (): string => {\n if (process.env.PAYLOAD_HMR_URL_OVERRIDE) {\n return process.env.PAYLOAD_HMR_URL_OVERRIDE\n }\n\n const port = process.env.PORT || '3000'\n const hasHTTPS = process.env.USE_HTTPS === 'true' || process.argv.includes('--experimental-https')\n const protocol = hasHTTPS ? 'wss' : 'ws'\n /**\n * Next.js only inlines __NEXT_ASSET_PREFIX into bundled code. In dev, withPayload keeps `payload`\n * external, so fall back to NEXT_BASE_PATH, which withPayload sets on process.env at runtime.\n */\n const prefix = process.env.__NEXT_ASSET_PREFIX || process.env.NEXT_BASE_PATH || ''\n\n return `${protocol}://localhost:${port}${prefix}${getHMRPath()}`\n}\n\n/**\n * Pre-release identifiers are ignored, so that a `16.3.0-canary` build maps to the 16.3 path.\n * An unreadable version uses the current path, as Payload being unable to resolve Next.js\n * normally means it is not running under Next.js, where this strategy does not apply.\n */\nconst getHMRPath = (): string => {\n const nextVersion = getNextVersion()\n\n if (!nextVersion) {\n return modernHMRPath\n }\n\n const mainVersion = parseVersion(nextVersion).parts.join('.')\n\n return compareVersions(mainVersion, firstModernHMRPathVersion) === 'lower'\n ? legacyHMRPath\n : modernHMRPath\n}\n"],"names":["compareVersions","parseVersion","getNextVersion","modernHMRPath","legacyHMRPath","firstModernHMRPathVersion","getNextJsHMRURL","process","env","PAYLOAD_HMR_URL_OVERRIDE","port","PORT","hasHTTPS","USE_HTTPS","argv","includes","protocol","prefix","__NEXT_ASSET_PREFIX","NEXT_BASE_PATH","getHMRPath","nextVersion","mainVersion","parts","join"],"mappings":"AAAA,SAASA,eAAe,EAAEC,YAAY,QAAQ,iCAAgC;AAC9E,SAASC,cAAc,QAAQ,sBAAqB;AAEpD,yEAAyE,GACzE,MAAMC,gBAAgB;AAEtB,mEAAmE,GACnE,MAAMC,gBAAgB;AAEtB,MAAMC,4BAA4B;AAElC;;;CAGC,GACD,OAAO,MAAMC,kBAAkB;IAC7B,IAAIC,QAAQC,GAAG,CAACC,wBAAwB,EAAE;QACxC,OAAOF,QAAQC,GAAG,CAACC,wBAAwB;IAC7C;IAEA,MAAMC,OAAOH,QAAQC,GAAG,CAACG,IAAI,IAAI;IACjC,MAAMC,WAAWL,QAAQC,GAAG,CAACK,SAAS,KAAK,UAAUN,QAAQO,IAAI,CAACC,QAAQ,CAAC;IAC3E,MAAMC,WAAWJ,WAAW,QAAQ;IACpC;;;GAGC,GACD,MAAMK,SAASV,QAAQC,GAAG,CAACU,mBAAmB,IAAIX,QAAQC,GAAG,CAACW,cAAc,IAAI;IAEhF,OAAO,GAAGH,SAAS,aAAa,EAAEN,OAAOO,SAASG,cAAc;AAClE,EAAC;AAED;;;;CAIC,GACD,MAAMA,aAAa;IACjB,MAAMC,cAAcnB;IAEpB,IAAI,CAACmB,aAAa;QAChB,OAAOlB;IACT;IAEA,MAAMmB,cAAcrB,aAAaoB,aAAaE,KAAK,CAACC,IAAI,CAAC;IAEzD,OAAOxB,gBAAgBsB,aAAajB,+BAA+B,UAC/DD,gBACAD;AACN"}
@@ -11,6 +11,8 @@ describe('getNextJsHMRURL', ()=>{
11
11
  vi.mocked(getNextVersion).mockReturnValue('16.3.0');
12
12
  vi.stubEnv('PAYLOAD_HMR_URL_OVERRIDE', undefined);
13
13
  vi.stubEnv('PORT', '3000');
14
+ vi.stubEnv('__NEXT_ASSET_PREFIX', undefined);
15
+ vi.stubEnv('NEXT_BASE_PATH', undefined);
14
16
  });
15
17
  afterEach(()=>{
16
18
  vi.unstubAllEnvs();
@@ -55,6 +57,15 @@ describe('getNextJsHMRURL', ()=>{
55
57
  vi.stubEnv('__NEXT_ASSET_PREFIX', '/base');
56
58
  expect(getNextJsHMRURL()).toBe('ws://localhost:3000/base/_next/hmr');
57
59
  });
60
+ it('should prefix the HMR path with the basePath when no assetPrefix is available', ()=>{
61
+ vi.stubEnv('NEXT_BASE_PATH', '/cms');
62
+ expect(getNextJsHMRURL()).toBe('ws://localhost:3000/cms/_next/hmr');
63
+ });
64
+ it('should prefer the assetPrefix over the basePath', ()=>{
65
+ vi.stubEnv('__NEXT_ASSET_PREFIX', '/assets');
66
+ vi.stubEnv('NEXT_BASE_PATH', '/cms');
67
+ expect(getNextJsHMRURL()).toBe('ws://localhost:3000/assets/_next/hmr');
68
+ });
58
69
  });
59
70
 
60
71
  //# sourceMappingURL=getNextJsHMRURL.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getNextJsHMRURL.spec.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nvi.mock('./getNextVersion.js', () => ({ getNextVersion: vi.fn() }))\n\nconst { getNextVersion } = await import('./getNextVersion.js')\nconst { getNextJsHMRURL } = await import('./getNextJsHMRURL.js')\n\nconst modernURL = 'ws://localhost:3000/_next/hmr'\nconst legacyURL = 'ws://localhost:3000/_next/webpack-hmr'\n\ndescribe('getNextJsHMRURL', () => {\n beforeEach(() => {\n vi.mocked(getNextVersion).mockReturnValue('16.3.0')\n vi.stubEnv('PAYLOAD_HMR_URL_OVERRIDE', undefined)\n vi.stubEnv('PORT', '3000')\n })\n\n afterEach(() => {\n vi.unstubAllEnvs()\n })\n\n it('should use the current HMR path on Next.js 16.3', () => {\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the current HMR path on Next.js versions above 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('17.0.1')\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the legacy HMR path on Next.js below 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.2.7')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should use the legacy HMR path on a Next.js 15 install', () => {\n vi.mocked(getNextVersion).mockReturnValue('15.5.0')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should ignore pre-release identifiers when choosing the path', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.3.0-canary.12')\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the legacy HMR path on a pre-release below 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.2.0-canary.5')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should use the current HMR path when the Next.js version is unknown', () => {\n vi.mocked(getNextVersion).mockReturnValue(undefined)\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use PAYLOAD_HMR_URL_OVERRIDE whatever the version', () => {\n vi.mocked(getNextVersion).mockReturnValue(undefined)\n vi.stubEnv('PAYLOAD_HMR_URL_OVERRIDE', 'ws://localhost:4000/custom-hmr')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:4000/custom-hmr')\n })\n\n it('should use the wss protocol when HTTPS is enabled', () => {\n vi.stubEnv('USE_HTTPS', 'true')\n\n expect(getNextJsHMRURL()).toBe('wss://localhost:3000/_next/hmr')\n })\n\n it('should include the Next.js asset prefix', () => {\n vi.stubEnv('__NEXT_ASSET_PREFIX', '/base')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:3000/base/_next/hmr')\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","it","vi","mock","getNextVersion","fn","getNextJsHMRURL","modernURL","legacyURL","mocked","mockReturnValue","stubEnv","undefined","unstubAllEnvs","toBe"],"mappings":"AAAA,SAASA,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAExEA,GAAGC,IAAI,CAAC,uBAAuB,IAAO,CAAA;QAAEC,gBAAgBF,GAAGG,EAAE;IAAG,CAAA;AAEhE,MAAM,EAAED,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;AACxC,MAAM,EAAEE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC;AAEzC,MAAMC,YAAY;AAClB,MAAMC,YAAY;AAElBT,SAAS,mBAAmB;IAC1BD,WAAW;QACTI,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAC1CR,GAAGS,OAAO,CAAC,4BAA4BC;QACvCV,GAAGS,OAAO,CAAC,QAAQ;IACrB;IAEAd,UAAU;QACRK,GAAGW,aAAa;IAClB;IAEAZ,GAAG,mDAAmD;QACpDD,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,kEAAkE;QACnEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,wDAAwD;QACzDC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,0DAA0D;QAC3DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,gEAAgE;QACjEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,8DAA8D;QAC/DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,uEAAuE;QACxEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAACE;QAE1CZ,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,4DAA4D;QAC7DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAACE;QAC1CV,GAAGS,OAAO,CAAC,4BAA4B;QAEvCX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,qDAAqD;QACtDC,GAAGS,OAAO,CAAC,aAAa;QAExBX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,2CAA2C;QAC5CC,GAAGS,OAAO,CAAC,uBAAuB;QAElCX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/getNextJsHMRURL.spec.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nvi.mock('./getNextVersion.js', () => ({ getNextVersion: vi.fn() }))\n\nconst { getNextVersion } = await import('./getNextVersion.js')\nconst { getNextJsHMRURL } = await import('./getNextJsHMRURL.js')\n\nconst modernURL = 'ws://localhost:3000/_next/hmr'\nconst legacyURL = 'ws://localhost:3000/_next/webpack-hmr'\n\ndescribe('getNextJsHMRURL', () => {\n beforeEach(() => {\n vi.mocked(getNextVersion).mockReturnValue('16.3.0')\n vi.stubEnv('PAYLOAD_HMR_URL_OVERRIDE', undefined)\n vi.stubEnv('PORT', '3000')\n vi.stubEnv('__NEXT_ASSET_PREFIX', undefined)\n vi.stubEnv('NEXT_BASE_PATH', undefined)\n })\n\n afterEach(() => {\n vi.unstubAllEnvs()\n })\n\n it('should use the current HMR path on Next.js 16.3', () => {\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the current HMR path on Next.js versions above 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('17.0.1')\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the legacy HMR path on Next.js below 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.2.7')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should use the legacy HMR path on a Next.js 15 install', () => {\n vi.mocked(getNextVersion).mockReturnValue('15.5.0')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should ignore pre-release identifiers when choosing the path', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.3.0-canary.12')\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use the legacy HMR path on a pre-release below 16.3', () => {\n vi.mocked(getNextVersion).mockReturnValue('16.2.0-canary.5')\n\n expect(getNextJsHMRURL()).toBe(legacyURL)\n })\n\n it('should use the current HMR path when the Next.js version is unknown', () => {\n vi.mocked(getNextVersion).mockReturnValue(undefined)\n\n expect(getNextJsHMRURL()).toBe(modernURL)\n })\n\n it('should use PAYLOAD_HMR_URL_OVERRIDE whatever the version', () => {\n vi.mocked(getNextVersion).mockReturnValue(undefined)\n vi.stubEnv('PAYLOAD_HMR_URL_OVERRIDE', 'ws://localhost:4000/custom-hmr')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:4000/custom-hmr')\n })\n\n it('should use the wss protocol when HTTPS is enabled', () => {\n vi.stubEnv('USE_HTTPS', 'true')\n\n expect(getNextJsHMRURL()).toBe('wss://localhost:3000/_next/hmr')\n })\n\n it('should include the Next.js asset prefix', () => {\n vi.stubEnv('__NEXT_ASSET_PREFIX', '/base')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:3000/base/_next/hmr')\n })\n\n it('should prefix the HMR path with the basePath when no assetPrefix is available', () => {\n vi.stubEnv('NEXT_BASE_PATH', '/cms')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:3000/cms/_next/hmr')\n })\n\n it('should prefer the assetPrefix over the basePath', () => {\n vi.stubEnv('__NEXT_ASSET_PREFIX', '/assets')\n vi.stubEnv('NEXT_BASE_PATH', '/cms')\n\n expect(getNextJsHMRURL()).toBe('ws://localhost:3000/assets/_next/hmr')\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","it","vi","mock","getNextVersion","fn","getNextJsHMRURL","modernURL","legacyURL","mocked","mockReturnValue","stubEnv","undefined","unstubAllEnvs","toBe"],"mappings":"AAAA,SAASA,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAQ;AAExEA,GAAGC,IAAI,CAAC,uBAAuB,IAAO,CAAA;QAAEC,gBAAgBF,GAAGG,EAAE;IAAG,CAAA;AAEhE,MAAM,EAAED,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;AACxC,MAAM,EAAEE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC;AAEzC,MAAMC,YAAY;AAClB,MAAMC,YAAY;AAElBT,SAAS,mBAAmB;IAC1BD,WAAW;QACTI,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAC1CR,GAAGS,OAAO,CAAC,4BAA4BC;QACvCV,GAAGS,OAAO,CAAC,QAAQ;QACnBT,GAAGS,OAAO,CAAC,uBAAuBC;QAClCV,GAAGS,OAAO,CAAC,kBAAkBC;IAC/B;IAEAf,UAAU;QACRK,GAAGW,aAAa;IAClB;IAEAZ,GAAG,mDAAmD;QACpDD,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,kEAAkE;QACnEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,wDAAwD;QACzDC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,0DAA0D;QAC3DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,gEAAgE;QACjEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,8DAA8D;QAC/DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAAC;QAE1CV,OAAOM,mBAAmBQ,IAAI,CAACN;IACjC;IAEAP,GAAG,uEAAuE;QACxEC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAACE;QAE1CZ,OAAOM,mBAAmBQ,IAAI,CAACP;IACjC;IAEAN,GAAG,4DAA4D;QAC7DC,GAAGO,MAAM,CAACL,gBAAgBM,eAAe,CAACE;QAC1CV,GAAGS,OAAO,CAAC,4BAA4B;QAEvCX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,qDAAqD;QACtDC,GAAGS,OAAO,CAAC,aAAa;QAExBX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,2CAA2C;QAC5CC,GAAGS,OAAO,CAAC,uBAAuB;QAElCX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,iFAAiF;QAClFC,GAAGS,OAAO,CAAC,kBAAkB;QAE7BX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;IAEAb,GAAG,mDAAmD;QACpDC,GAAGS,OAAO,CAAC,uBAAuB;QAClCT,GAAGS,OAAO,CAAC,kBAAkB;QAE7BX,OAAOM,mBAAmBQ,IAAI,CAAC;IACjC;AACF"}
@@ -0,0 +1,26 @@
1
+ /** @type {'development' | 'production'} */
2
+ let environmentCondition
3
+
4
+ /** @param {'development' | 'production'} condition */
5
+ export function initialize(condition) {
6
+ environmentCondition = condition
7
+ }
8
+
9
+ /** @type {import('node:module').ResolveHook} */
10
+ export const resolve = (specifier, context, nextResolve) => {
11
+ if (
12
+ (specifier === 'lexical' ||
13
+ specifier.startsWith('lexical/') ||
14
+ specifier.startsWith('@lexical/')) &&
15
+ !context.conditions.includes('development') &&
16
+ !context.conditions.includes('production')
17
+ ) {
18
+ // Preserve explicit conditions and leave every other package's resolution unchanged.
19
+ return nextResolve(specifier, {
20
+ ...context,
21
+ conditions: [...context.conditions, environmentCondition],
22
+ })
23
+ }
24
+
25
+ return nextResolve(specifier, context)
26
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.90.2",
3
+ "version": "3.91.0-internal.07e4582",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -82,7 +82,8 @@
82
82
  },
83
83
  "files": [
84
84
  "dist",
85
- "bin.js"
85
+ "bin.js",
86
+ "lexicalLoader.mjs"
86
87
  ],
87
88
  "dependencies": {
88
89
  "@next/env": "^15.1.5",
@@ -112,11 +113,11 @@
112
113
  "sanitize-filename": "1.6.3",
113
114
  "sax": "1.6.1",
114
115
  "ts-essentials": "10.0.3",
115
- "tsx": "4.22.4",
116
+ "tsx": "4.23.15",
116
117
  "undici": "7.29.0",
117
118
  "uuid": "13.0.2",
118
119
  "ws": "^8.16.0",
119
- "@payloadcms/translations": "3.90.2"
120
+ "@payloadcms/translations": "3.91.0-internal.07e4582"
120
121
  },
121
122
  "devDependencies": {
122
123
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",