payload 3.16.0 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +14 -3
- package/dist/bin/index.js.map +1 -1
- package/dist/bin/migrate.d.ts +1 -0
- package/dist/bin/migrate.d.ts.map +1 -1
- package/dist/bin/migrate.js +1 -1
- package/dist/bin/migrate.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +1 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/operations/update.d.ts +1 -0
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +24 -201
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +19 -242
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/collections/operations/utilities/update.d.ts +41 -0
- package/dist/collections/operations/utilities/update.d.ts.map +1 -0
- package/dist/collections/operations/utilities/update.js +276 -0
- package/dist/collections/operations/utilities/update.js.map +1 -0
- package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js +3 -3
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/uploads/types.d.ts +6 -0
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts +2 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +8 -8
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/routeError.js +1 -1
- package/dist/utilities/routeError.js.map +1 -1
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +3 -0
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/schedule/types.d.ts +2 -2
- package/dist/versions/schedule/types.d.ts.map +1 -1
- package/dist/versions/schedule/types.js.map +1 -1
- package/package.json +2 -2
package/dist/bin/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,GAAG,qBAgIf,CAAA"}
|
package/dist/bin/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Cron } from 'croner';
|
|
1
|
+
/* eslint-disable no-console */ import { Cron } from 'croner';
|
|
2
2
|
import minimist from 'minimist';
|
|
3
3
|
import { pathToFileURL } from 'node:url';
|
|
4
4
|
import path from 'path';
|
|
@@ -8,7 +8,17 @@ import { generateImportMap } from './generateImportMap/index.js';
|
|
|
8
8
|
import { generateTypes } from './generateTypes.js';
|
|
9
9
|
import { info } from './info.js';
|
|
10
10
|
import { loadEnv } from './loadEnv.js';
|
|
11
|
-
import { migrate } from './migrate.js';
|
|
11
|
+
import { migrate, availableCommands as migrateCommands } from './migrate.js';
|
|
12
|
+
// Note: this does not account for any user bin scripts
|
|
13
|
+
const availableScripts = [
|
|
14
|
+
'generate:db-schema',
|
|
15
|
+
'generate:importmap',
|
|
16
|
+
'generate:types',
|
|
17
|
+
'info',
|
|
18
|
+
'jobs:run',
|
|
19
|
+
'run',
|
|
20
|
+
...migrateCommands
|
|
21
|
+
];
|
|
12
22
|
export const bin = async ()=>{
|
|
13
23
|
loadEnv();
|
|
14
24
|
const args = minimist(process.argv.slice(2));
|
|
@@ -117,7 +127,8 @@ export const bin = async ()=>{
|
|
|
117
127
|
});
|
|
118
128
|
process.exit(0);
|
|
119
129
|
}
|
|
120
|
-
console.error(`Unknown
|
|
130
|
+
console.error(script ? `Unknown command: "${script}"` : 'Please provide a command to run');
|
|
131
|
+
console.log(`\nAvailable commands:\n${availableScripts.map((c)=>` - ${c}`).join('\n')}`);
|
|
121
132
|
process.exit(1);
|
|
122
133
|
};
|
|
123
134
|
|
package/dist/bin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/index.ts"],"sourcesContent":["
|
|
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 type { BinScript } from '../config/types.js'\n\nimport { findConfig } from '../config/find.js'\nimport payload, { getPayload } 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 'run',\n ...migrateCommands,\n] as const\n\nexport const bin = async () => {\n loadEnv()\n\n const args = minimist(process.argv.slice(2))\n const script = (typeof args._[0] === 'string' ? args._[0] : '').toLowerCase()\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 === script)\n : false\n\n if (userBinScript) {\n try {\n const script: BinScript = await import(pathToFileURL(userBinScript.scriptPath).toString())\n await script(config)\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 return migrate({ config, parsedArgs: args }).then(() => process.exit(0))\n }\n\n if (script === 'generate:types') {\n return generateTypes(config)\n }\n\n if (script === 'generate:importmap') {\n return generateImportMap(config)\n }\n\n if (script === 'jobs:run') {\n const payload = await getPayload({ config })\n const limit = args.limit ? parseInt(args.limit, 10) : undefined\n const queue = args.queue ? args.queue : undefined\n\n if (args.cron) {\n new Cron(args.cron, async () => {\n await payload.jobs.run({\n limit,\n queue,\n })\n })\n\n process.stdin.resume() // Keep the process alive\n\n return\n } else {\n await payload.jobs.run({\n limit,\n queue,\n })\n\n await payload.db.destroy() // close database connections after running jobs so process can exit cleanly\n\n return\n }\n }\n\n if (script === 'generate:db-schema') {\n // Barebones instance to access database adapter, without connecting to the DB\n await payload.init({\n config,\n disableDBConnect: true,\n disableOnInit: true,\n })\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 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 process.exit(0)\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","payload","getPayload","generateImportMap","generateTypes","info","loadEnv","migrate","availableCommands","migrateCommands","availableScripts","bin","args","process","argv","slice","script","_","toLowerCase","scriptPath","console","error","exit","absoluteScriptPath","resolve","cwd","originalArgv","toString","configPath","configPromise","config","default","userBinScript","Array","isArray","find","key","err","log","startsWith","parsedArgs","then","limit","parseInt","undefined","queue","cron","jobs","run","stdin","resume","db","destroy","init","disableDBConnect","disableOnInit","generateSchema","logger","msg","packageName","prettify","map","c","join"],"mappings":"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"}
|
package/dist/bin/migrate.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/bin/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/bin/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAczD,eAAO,MAAM,iBAAiB,UAQ7B,CAAA;AAID,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,OAAO,2BAAkC,IAAI,KAAG,OAAO,CAAC,IAAI,CA2FxE,CAAA"}
|
package/dist/bin/migrate.js
CHANGED
|
@@ -7,7 +7,7 @@ import { prettySyncLoggerDestination } from '../utilities/logger.js';
|
|
|
7
7
|
loggerDestination: prettySyncLoggerDestination,
|
|
8
8
|
loggerOptions: {}
|
|
9
9
|
};
|
|
10
|
-
const availableCommands = [
|
|
10
|
+
export const availableCommands = [
|
|
11
11
|
'migrate',
|
|
12
12
|
'migrate:create',
|
|
13
13
|
'migrate:down',
|
package/dist/bin/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/migrate.ts"],"sourcesContent":["import type { ParsedArgs } from 'minimist'\n\nimport type { SanitizedConfig } from '../config/types.js'\n\nimport payload from '../index.js'\nimport { prettySyncLoggerDestination } from '../utilities/logger.js'\n\n/**\n * The default logger's options did not allow for forcing sync logging\n * Using these options, to force both pretty print and sync logging\n */\nconst prettySyncLogger = {\n loggerDestination: prettySyncLoggerDestination,\n loggerOptions: {},\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../src/bin/migrate.ts"],"sourcesContent":["import type { ParsedArgs } from 'minimist'\n\nimport type { SanitizedConfig } from '../config/types.js'\n\nimport payload from '../index.js'\nimport { prettySyncLoggerDestination } from '../utilities/logger.js'\n\n/**\n * The default logger's options did not allow for forcing sync logging\n * Using these options, to force both pretty print and sync logging\n */\nconst prettySyncLogger = {\n loggerDestination: prettySyncLoggerDestination,\n loggerOptions: {},\n}\n\nexport const availableCommands = [\n 'migrate',\n 'migrate:create',\n 'migrate:down',\n 'migrate:refresh',\n 'migrate:reset',\n 'migrate:status',\n 'migration:fresh',\n]\n\nconst availableCommandsMsg = `Available commands: ${availableCommands.join(', ')}`\n\ntype Args = {\n config: SanitizedConfig\n parsedArgs: ParsedArgs\n}\n\nexport const migrate = async ({ config, parsedArgs }: Args): Promise<void> => {\n const { _: args, file, forceAcceptWarning: forceAcceptFromProps, help } = parsedArgs\n\n const formattedArgs = Object.keys(parsedArgs)\n .map((key) => {\n const formattedKey = key.replace(/^[-_]+/, '')\n if (!formattedKey) {\n return null\n }\n\n return formattedKey\n .split('-')\n .map((word, index) =>\n index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1),\n )\n .join('')\n })\n .filter(Boolean)\n\n const forceAcceptWarning = forceAcceptFromProps || formattedArgs.includes('forceAcceptWarning')\n const skipEmpty = formattedArgs.includes('skipEmpty')\n\n if (help) {\n // eslint-disable-next-line no-console\n console.log(`\\n\\n${availableCommandsMsg}\\n`) // Avoid having to init payload to get the logger\n process.exit(0)\n }\n\n process.env.PAYLOAD_MIGRATING = 'true'\n\n // Barebones instance to access database adapter\n await payload.init({\n config,\n disableOnInit: true,\n ...prettySyncLogger,\n })\n\n const adapter = payload.db\n\n if (!adapter) {\n throw new Error('No database adapter found')\n }\n\n if (!args.length) {\n payload.logger.error({\n msg: `No migration command provided. ${availableCommandsMsg}`,\n })\n process.exit(1)\n }\n\n switch (args[0]) {\n case 'migrate':\n await adapter.migrate()\n break\n case 'migrate:create':\n try {\n await adapter.createMigration({\n file,\n forceAcceptWarning,\n migrationName: args[1],\n payload,\n skipEmpty,\n })\n } catch (err) {\n throw new Error(`Error creating migration: ${err.message}`)\n }\n break\n case 'migrate:down':\n await adapter.migrateDown()\n break\n case 'migrate:fresh':\n await adapter.migrateFresh({ forceAcceptWarning })\n break\n case 'migrate:refresh':\n await adapter.migrateRefresh()\n break\n case 'migrate:reset':\n await adapter.migrateReset()\n break\n case 'migrate:status':\n await adapter.migrateStatus()\n break\n\n default:\n payload.logger.error({\n msg: `Unknown migration command: ${args[0]}. ${availableCommandsMsg}`,\n })\n process.exit(1)\n }\n\n payload.logger.info('Done.')\n}\n"],"names":["payload","prettySyncLoggerDestination","prettySyncLogger","loggerDestination","loggerOptions","availableCommands","availableCommandsMsg","join","migrate","config","parsedArgs","_","args","file","forceAcceptWarning","forceAcceptFromProps","help","formattedArgs","Object","keys","map","key","formattedKey","replace","split","word","index","toLowerCase","charAt","toUpperCase","slice","filter","Boolean","includes","skipEmpty","console","log","process","exit","env","PAYLOAD_MIGRATING","init","disableOnInit","adapter","db","Error","length","logger","error","msg","createMigration","migrationName","err","message","migrateDown","migrateFresh","migrateRefresh","migrateReset","migrateStatus","info"],"mappings":"AAIA,OAAOA,aAAa,cAAa;AACjC,SAASC,2BAA2B,QAAQ,yBAAwB;AAEpE;;;CAGC,GACD,MAAMC,mBAAmB;IACvBC,mBAAmBF;IACnBG,eAAe,CAAC;AAClB;AAEA,OAAO,MAAMC,oBAAoB;IAC/B;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,MAAMC,uBAAuB,CAAC,oBAAoB,EAAED,kBAAkBE,IAAI,CAAC,OAAO;AAOlF,OAAO,MAAMC,UAAU,OAAO,EAAEC,MAAM,EAAEC,UAAU,EAAQ;IACxD,MAAM,EAAEC,GAAGC,IAAI,EAAEC,IAAI,EAAEC,oBAAoBC,oBAAoB,EAAEC,IAAI,EAAE,GAAGN;IAE1E,MAAMO,gBAAgBC,OAAOC,IAAI,CAACT,YAC/BU,GAAG,CAAC,CAACC;QACJ,MAAMC,eAAeD,IAAIE,OAAO,CAAC,UAAU;QAC3C,IAAI,CAACD,cAAc;YACjB,OAAO;QACT;QAEA,OAAOA,aACJE,KAAK,CAAC,KACNJ,GAAG,CAAC,CAACK,MAAMC,QACVA,UAAU,IAAID,KAAKE,WAAW,KAAKF,KAAKG,MAAM,CAAC,GAAGC,WAAW,KAAKJ,KAAKK,KAAK,CAAC,IAE9EvB,IAAI,CAAC;IACV,GACCwB,MAAM,CAACC;IAEV,MAAMlB,qBAAqBC,wBAAwBE,cAAcgB,QAAQ,CAAC;IAC1E,MAAMC,YAAYjB,cAAcgB,QAAQ,CAAC;IAEzC,IAAIjB,MAAM;QACR,sCAAsC;QACtCmB,QAAQC,GAAG,CAAC,CAAC,IAAI,EAAE9B,qBAAqB,EAAE,CAAC,EAAE,iDAAiD;;QAC9F+B,QAAQC,IAAI,CAAC;IACf;IAEAD,QAAQE,GAAG,CAACC,iBAAiB,GAAG;IAEhC,gDAAgD;IAChD,MAAMxC,QAAQyC,IAAI,CAAC;QACjBhC;QACAiC,eAAe;QACf,GAAGxC,gBAAgB;IACrB;IAEA,MAAMyC,UAAU3C,QAAQ4C,EAAE;IAE1B,IAAI,CAACD,SAAS;QACZ,MAAM,IAAIE,MAAM;IAClB;IAEA,IAAI,CAACjC,KAAKkC,MAAM,EAAE;QAChB9C,QAAQ+C,MAAM,CAACC,KAAK,CAAC;YACnBC,KAAK,CAAC,+BAA+B,EAAE3C,sBAAsB;QAC/D;QACA+B,QAAQC,IAAI,CAAC;IACf;IAEA,OAAQ1B,IAAI,CAAC,EAAE;QACb,KAAK;YACH,MAAM+B,QAAQnC,OAAO;YACrB;QACF,KAAK;YACH,IAAI;gBACF,MAAMmC,QAAQO,eAAe,CAAC;oBAC5BrC;oBACAC;oBACAqC,eAAevC,IAAI,CAAC,EAAE;oBACtBZ;oBACAkC;gBACF;YACF,EAAE,OAAOkB,KAAK;gBACZ,MAAM,IAAIP,MAAM,CAAC,0BAA0B,EAAEO,IAAIC,OAAO,EAAE;YAC5D;YACA;QACF,KAAK;YACH,MAAMV,QAAQW,WAAW;YACzB;QACF,KAAK;YACH,MAAMX,QAAQY,YAAY,CAAC;gBAAEzC;YAAmB;YAChD;QACF,KAAK;YACH,MAAM6B,QAAQa,cAAc;YAC5B;QACF,KAAK;YACH,MAAMb,QAAQc,YAAY;YAC1B;QACF,KAAK;YACH,MAAMd,QAAQe,aAAa;YAC3B;QAEF;YACE1D,QAAQ+C,MAAM,CAACC,KAAK,CAAC;gBACnBC,KAAK,CAAC,2BAA2B,EAAErC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAEN,sBAAsB;YACvE;YACA+B,QAAQC,IAAI,CAAC;IACjB;IAEAtC,QAAQ+C,MAAM,CAACY,IAAI,CAAC;AACtB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAkB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAkB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,CAAC,yBAAyB,CAyMnC,CAAA"}
|
|
@@ -126,6 +126,7 @@ export const sanitizeCollection = async (config, collection, /**
|
|
|
126
126
|
}
|
|
127
127
|
// sanitize fields for reserved names
|
|
128
128
|
sanitizeUploadFields(sanitized.fields, sanitized);
|
|
129
|
+
sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true;
|
|
129
130
|
sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true;
|
|
130
131
|
sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug;
|
|
131
132
|
sanitized.admin.useAsTitle = sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id' ? sanitized.admin.useAsTitle : 'filename';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = (config.collections || []).reduce(\n (acc, c) => {\n acc.push(c.slug)\n return acc\n },\n [collection.slug],\n )\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","defaultCollectionEndpoints","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","sanitized","validRelationships","collections","reduce","acc","c","push","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","endpoint","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = (config.collections || []).reduce(\n (acc, c) => {\n acc.push(c.slug)\n return acc\n },\n [collection.slug],\n )\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","defaultCollectionEndpoints","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","sanitized","validRelationships","collections","reduce","acc","c","push","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","endpoint","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"AAIA,SAASA,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SAASC,cAAc,QAAQ,kCAAiC;AAChE,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,OAAOC,qBAAqB,kCAAiC;AAC7D,SAASC,mBAAmB,QAAQ,iCAAgC;AACpE,SAASC,4BAA4B,QAAQ,+BAA8B;AAC3E,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,YAAY,QAAQ,kCAAiC;AAC9D,OAAOC,uBAAuB,+BAA8B;AAC5D,SAASC,eAAe,QAAQ,6BAA4B;AAC5D,SAASC,0BAA0B,QAAQ,wBAAuB;AAClE,SAASC,YAAY,EAAEC,QAAQ,EAAEC,yBAAyB,QAAQ,gBAAe;AACjF,SAASC,kBAAkB,EAAEC,oBAAoB,QAAQ,0BAAyB;AAClF,SAASC,kBAAkB,QAAQ,kBAAiB;AAEpD,OAAO,MAAMC,qBAAqB,OAChCC,QACAC,YACA;;;GAGC,GACDC;IAEA,oCAAoC;IACpC,iCAAiC;IACjC,oCAAoC;IAEpC,MAAMC,YAA8BhB,6BAA6BO,UAAUO;IAE3E,oCAAoC;IACpC,kBAAkB;IAClB,oCAAoC;IAEpC,MAAMG,qBAAqB,AAACJ,CAAAA,OAAOK,WAAW,IAAI,EAAE,AAAD,EAAGC,MAAM,CAC1D,CAACC,KAAKC;QACJD,IAAIE,IAAI,CAACD,EAAEE,IAAI;QACf,OAAOH;IACT,GACA;QAACN,WAAWS,IAAI;KAAC;IAEnB,MAAMC,QAAwB,CAAC;IAC/BR,UAAUS,MAAM,GAAG,MAAM7B,eAAe;QACtC8B,kBAAkBV;QAClBH;QACAY,QAAQT,UAAUS,MAAM;QACxBE,UAAU;QACVH;QACAI,mBAAmB;QACnBb;QACAE;IACF;IAEA,IAAID,UAAUa,SAAS,KAAK,OAAO;QACjC,IAAI,CAACb,UAAUa,SAAS,EAAE;YACxBb,UAAUa,SAAS,GAAG,EAAE;QAC1B;QAEA,KAAK,MAAMC,YAAYzB,2BAA4B;YACjDW,UAAUa,SAAS,CAACP,IAAI,CAACQ;QAC3B;IACF;IAEA,IAAId,UAAUe,UAAU,KAAK,OAAO;QAClC,+CAA+C;QAC/C,IAAIC,eAA+B;QACnC,IAAIC,eAA+B;QACnCjB,UAAUS,MAAM,CAACS,IAAI,CAAC,CAACC;YACrB,IAAItC,iBAAiBsC,QAAQ;gBAC3B,IAAIA,MAAMC,IAAI,KAAK,aAAa;oBAC9BJ,eAAe;gBACjB;gBACA,IAAIG,MAAMC,IAAI,KAAK,aAAa;oBAC9BH,eAAe;gBACjB;YACF;YACA,OAAOA,gBAAgBD;QACzB;QACA,IAAI,CAACA,cAAc;YACjBhB,UAAUS,MAAM,CAACH,IAAI,CAAC;gBACpBc,MAAM;gBACNC,MAAM;gBACNC,OAAO;oBACLC,iBAAiB;oBACjBC,QAAQ;gBACV;gBACAC,OAAO;gBACPC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACtB;QACF;QACA,IAAI,CAACV,cAAc;YACjBjB,UAAUS,MAAM,CAACH,IAAI,CAAC;gBACpBc,MAAM;gBACNE,OAAO;oBACLC,iBAAiB;oBACjBC,QAAQ;gBACV;gBACA,8KAA8K;gBAC9KH,MAAM;gBACNI,OAAO;gBACPC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;YACtB;QACF;IACF;IAEA3B,UAAU4B,MAAM,GAAG5B,UAAU4B,MAAM,IAAI1C,aAAac,UAAUO,IAAI;IAElE,IAAIP,UAAU6B,QAAQ,EAAE;QACtB,IAAI7B,UAAU6B,QAAQ,KAAK,MAAM;YAC/B7B,UAAU6B,QAAQ,GAAG;gBAAEC,QAAQ;gBAAOC,WAAW;YAAI;QACvD;QAEA,IAAI/B,UAAUe,UAAU,KAAK,OAAO;YAClC,MAAM,IAAIpC,mBAAmBmB;QAC/B;QAEAE,UAAU6B,QAAQ,CAACE,SAAS,GAC1B,OAAO/B,UAAU6B,QAAQ,CAACE,SAAS,KAAK,WAAW/B,UAAU6B,QAAQ,CAACE,SAAS,GAAG;QAEpF,IAAI/B,UAAU6B,QAAQ,CAACC,MAAM,EAAE;YAC7B,IAAI9B,UAAU6B,QAAQ,CAACC,MAAM,KAAK,MAAM;gBACtC9B,UAAU6B,QAAQ,CAACC,MAAM,GAAG;oBAC1BE,UAAU;oBACVC,UAAU;gBACZ;YACF;YAEA,IAAIjC,UAAU6B,QAAQ,CAACC,MAAM,CAACE,QAAQ,KAAK,MAAM;gBAC/ChC,UAAU6B,QAAQ,CAACC,MAAM,CAACE,QAAQ,GAAG;oBACnCE,UAAU9C,gBAAgB+C,gBAAgB;gBAC5C;YACF;YAEA,IAAInC,UAAU6B,QAAQ,CAACC,MAAM,CAACG,QAAQ,KAAKG,WAAW;gBACpDpC,UAAU6B,QAAQ,CAACC,MAAM,CAACG,QAAQ,GAAG;YACvC;YAEAjC,UAAUS,MAAM,GAAG3B,gBAAgBkB,UAAUS,MAAM,EAAEtB;QACvD;IACF;IAEA,IAAIa,UAAUqC,MAAM,EAAE;QACpB,IAAIrC,UAAUqC,MAAM,KAAK,MAAM;YAC7BrC,UAAUqC,MAAM,GAAG,CAAC;QACtB;QAEA,qCAAqC;QACrC3C,qBAAqBM,UAAUS,MAAM,EAAET;QAEvCA,UAAUqC,MAAM,CAACC,SAAS,GAAGtC,UAAUqC,MAAM,EAAEC,aAAa;QAC5DtC,UAAUqC,MAAM,CAACE,UAAU,GAAGvC,UAAUqC,MAAM,EAAEE,cAAc;QAC9DvC,UAAUqC,MAAM,CAACG,SAAS,GAAGxC,UAAUqC,MAAM,CAACG,SAAS,IAAIxC,UAAUO,IAAI;QACzEP,UAAUsB,KAAK,CAACmB,UAAU,GACxBzC,UAAUsB,KAAK,EAAEmB,cAAczC,UAAUsB,KAAK,CAACmB,UAAU,KAAK,OAC1DzC,UAAUsB,KAAK,CAACmB,UAAU,GAC1B;QAEN,MAAMC,eAAe3D,oBAAoB;YACvCe,YAAYE;YACZH;QACF;QAEAG,UAAUS,MAAM,GAAG3B,gBAAgBkB,UAAUS,MAAM,EAAEiC;IACvD;IAEA,IAAI1C,UAAU2C,IAAI,EAAE;QAClB,qCAAqC;QACrClD,mBAAmBO,UAAUS,MAAM,EAAET;QAErCA,UAAU2C,IAAI,GAAG3D,6BACfM,cACA,OAAOU,UAAU2C,IAAI,KAAK,WAAW3C,UAAU2C,IAAI,GAAG,CAAC;QAGzD,IAAI,CAAC3C,UAAU2C,IAAI,CAACC,oBAAoB,IAAI5C,UAAU2C,IAAI,CAACE,MAAM,KAAK,MAAM;YAC1E7C,UAAU2C,IAAI,CAACE,MAAM,GAAG,CAAC;QAC3B;QAEA,4DAA4D;QAC5D7C,UAAU8C,gBAAgB,GAAG9C,UAAU8C,gBAAgB,IAAI;QAE3D,IAAI,CAAC9C,UAAU2C,IAAI,CAACI,UAAU,EAAE;YAC9B/C,UAAU2C,IAAI,CAACI,UAAU,GAAG,EAAE;QAChC;QAEA,IAAI/C,UAAU2C,IAAI,CAACK,iBAAiB,EAAE;YACpC,IAAIhD,UAAU2C,IAAI,CAACK,iBAAiB,KAAK,MAAM;gBAC7ChD,UAAU2C,IAAI,CAACK,iBAAiB,GAAGxD;YACrC,OAAO;gBACL,MAAMyD,gCAAgC;oBACpC,GAAGzD,yBAAyB;oBAC5B,GAAGQ,UAAU2C,IAAI,CAACK,iBAAiB;gBACrC;gBAEA,4DAA4D;gBAC5D,IAAIC,8BAA8BC,eAAe,KAAK,OAAO;oBAC3DD,8BAA8BE,eAAe,GAAG;gBAClD;gBACAnD,UAAU2C,IAAI,CAACK,iBAAiB,GAAGC;YACrC;QACF,OAAO;YACLjD,UAAU2C,IAAI,CAACK,iBAAiB,GAAG;QACrC;QAEA,IAAI,CAAClD,YAAYwB,OAAOmB,YAAY;YAClCzC,UAAUsB,KAAK,CAACmB,UAAU,GAAGzC,UAAU2C,IAAI,CAACK,iBAAiB,GAAG,aAAa;QAC/E;QAEAhD,UAAUS,MAAM,GAAG3B,gBAAgBkB,UAAUS,MAAM,EAAE/B,kBAAkBsB,UAAU2C,IAAI;IACvF;IAEA,IAAI7C,YAAYwB,OAAO8B,YAAYC,QAAQC,QAAQ;QACjDtD,UAAUsB,KAAK,CAAC8B,UAAU,CAACC,MAAM,GAAGvD,WAAWwB,KAAK,CAAC8B,UAAU,CAACC,MAAM;IACxE;IAEA1D,mBAAmBK;IAEnB,MAAMuD,kBAAkBvD;IAExBuD,gBAAgB/C,KAAK,GAAGA;IAExB+C,gBAAgBC,eAAe,GAAGvE,iBAAiB;QAAEwB,QAAQ8C,gBAAgB9C,MAAM;IAAC;IAEpF,OAAO8C;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EACV,mBAAmB,EACnB,UAAU,EAEV,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EACV,mBAAmB,EACnB,UAAU,EAEV,8BAA8B,EAC9B,wBAAwB,EACzB,MAAM,oBAAoB,CAAA;AAgB3B,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,cAAc,IAAI;IACpD,UAAU,EAAE,UAAU,CAAA;IACtB,IAAI,EAAE,WAAW,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,KAAK,SAAS,cAAc,EAC5B,OAAO,SAAS,wBAAwB,CAAC,KAAK,CAAC,gBAEjC,SAAS,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAwM7C,CAAA"}
|
|
@@ -1,24 +1,16 @@
|
|
|
1
1
|
import httpStatus from 'http-status';
|
|
2
|
-
import { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js';
|
|
3
2
|
import executeAccess from '../../auth/executeAccess.js';
|
|
4
3
|
import { combineQueries } from '../../database/combineQueries.js';
|
|
5
4
|
import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js';
|
|
6
5
|
import { APIError } from '../../errors/index.js';
|
|
7
|
-
import { afterChange } from '../../fields/hooks/afterChange/index.js';
|
|
8
|
-
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
9
|
-
import { beforeChange } from '../../fields/hooks/beforeChange/index.js';
|
|
10
|
-
import { beforeValidate } from '../../fields/hooks/beforeValidate/index.js';
|
|
11
|
-
import { deleteAssociatedFiles } from '../../uploads/deleteAssociatedFiles.js';
|
|
12
6
|
import { generateFileData } from '../../uploads/generateFileData.js';
|
|
13
7
|
import { unlinkTempFiles } from '../../uploads/unlinkTempFiles.js';
|
|
14
|
-
import { uploadFiles } from '../../uploads/uploadFiles.js';
|
|
15
|
-
import { checkDocumentLockStatus } from '../../utilities/checkDocumentLockStatus.js';
|
|
16
8
|
import { commitTransaction } from '../../utilities/commitTransaction.js';
|
|
17
9
|
import { initTransaction } from '../../utilities/initTransaction.js';
|
|
18
10
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
19
11
|
import { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js';
|
|
20
12
|
import { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js';
|
|
21
|
-
import {
|
|
13
|
+
import { updateDocument } from './utilities/update.js';
|
|
22
14
|
import { buildAfterOperation } from './utils.js';
|
|
23
15
|
export const updateOperation = async (incomingArgs)=>{
|
|
24
16
|
let args = incomingArgs;
|
|
@@ -37,7 +29,7 @@ export const updateOperation = async (incomingArgs)=>{
|
|
|
37
29
|
req: args.req
|
|
38
30
|
}) || args;
|
|
39
31
|
}, Promise.resolve());
|
|
40
|
-
const { collection: { config: collectionConfig }, collection, depth, draft: draftArg = false, limit = 0, overrideAccess, overrideLock, overwriteExistingFiles = false, populate, req: { fallbackLocale, locale, payload: { config }, payload }, req, select, showHiddenFields, where } = args;
|
|
32
|
+
const { collection: { config: collectionConfig }, collection, depth, draft: draftArg = false, limit = 0, overrideAccess, overrideLock, overwriteExistingFiles = false, populate, publishSpecificLocale, req: { fallbackLocale, locale, payload: { config }, payload }, req, select, showHiddenFields, where } = args;
|
|
41
33
|
if (!where) {
|
|
42
34
|
throw new APIError("Missing 'where' query of documents to update.", httpStatus.BAD_REQUEST);
|
|
43
35
|
}
|
|
@@ -95,7 +87,7 @@ export const updateOperation = async (incomingArgs)=>{
|
|
|
95
87
|
// /////////////////////////////////////
|
|
96
88
|
// Generate data for all files and sizes
|
|
97
89
|
// /////////////////////////////////////
|
|
98
|
-
const { data
|
|
90
|
+
const { data, files: filesToUpload } = await generateFileData({
|
|
99
91
|
collection,
|
|
100
92
|
config,
|
|
101
93
|
data: bulkUpdateData,
|
|
@@ -105,209 +97,35 @@ export const updateOperation = async (incomingArgs)=>{
|
|
|
105
97
|
throwOnMissingFile: false
|
|
106
98
|
});
|
|
107
99
|
const errors = [];
|
|
108
|
-
const promises = docs.map(async (
|
|
109
|
-
const { id } =
|
|
110
|
-
let data = {
|
|
111
|
-
...newFileData,
|
|
112
|
-
...bulkUpdateData
|
|
113
|
-
};
|
|
100
|
+
const promises = docs.map(async (docWithLocales)=>{
|
|
101
|
+
const { id } = docWithLocales;
|
|
114
102
|
try {
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
await
|
|
103
|
+
// ///////////////////////////////////////////////
|
|
104
|
+
// Update document, runs all document level hooks
|
|
105
|
+
// ///////////////////////////////////////////////
|
|
106
|
+
const updatedDoc = await updateDocument({
|
|
119
107
|
id,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
overrideLock,
|
|
123
|
-
req
|
|
124
|
-
});
|
|
125
|
-
const originalDoc = await afterRead({
|
|
126
|
-
collection: collectionConfig,
|
|
127
|
-
context: req.context,
|
|
128
|
-
depth: 0,
|
|
129
|
-
doc,
|
|
130
|
-
draft: draftArg,
|
|
131
|
-
fallbackLocale,
|
|
132
|
-
global: null,
|
|
133
|
-
locale,
|
|
134
|
-
overrideAccess: true,
|
|
135
|
-
req,
|
|
136
|
-
showHiddenFields: true
|
|
137
|
-
});
|
|
138
|
-
await deleteAssociatedFiles({
|
|
108
|
+
accessResults: accessResult,
|
|
109
|
+
autosave: false,
|
|
139
110
|
collectionConfig,
|
|
140
111
|
config,
|
|
141
|
-
doc,
|
|
142
|
-
files: filesToUpload,
|
|
143
|
-
overrideDelete: false,
|
|
144
|
-
req
|
|
145
|
-
});
|
|
146
|
-
if (args.collection.config.auth) {
|
|
147
|
-
ensureUsernameOrEmail({
|
|
148
|
-
authOptions: args.collection.config.auth,
|
|
149
|
-
collectionSlug: args.collection.config.slug,
|
|
150
|
-
data: args.data,
|
|
151
|
-
operation: 'update',
|
|
152
|
-
originalDoc,
|
|
153
|
-
req: args.req
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
// /////////////////////////////////////
|
|
157
|
-
// beforeValidate - Fields
|
|
158
|
-
// /////////////////////////////////////
|
|
159
|
-
data = await beforeValidate({
|
|
160
|
-
id,
|
|
161
|
-
collection: collectionConfig,
|
|
162
|
-
context: req.context,
|
|
163
|
-
data,
|
|
164
|
-
doc: originalDoc,
|
|
165
|
-
global: null,
|
|
166
|
-
operation: 'update',
|
|
167
|
-
overrideAccess,
|
|
168
|
-
req
|
|
169
|
-
});
|
|
170
|
-
// /////////////////////////////////////
|
|
171
|
-
// beforeValidate - Collection
|
|
172
|
-
// /////////////////////////////////////
|
|
173
|
-
await collectionConfig.hooks.beforeValidate.reduce(async (priorHook, hook)=>{
|
|
174
|
-
await priorHook;
|
|
175
|
-
data = await hook({
|
|
176
|
-
collection: collectionConfig,
|
|
177
|
-
context: req.context,
|
|
178
|
-
data,
|
|
179
|
-
operation: 'update',
|
|
180
|
-
originalDoc,
|
|
181
|
-
req
|
|
182
|
-
}) || data;
|
|
183
|
-
}, Promise.resolve());
|
|
184
|
-
// /////////////////////////////////////
|
|
185
|
-
// Write files to local storage
|
|
186
|
-
// /////////////////////////////////////
|
|
187
|
-
if (!collectionConfig.upload.disableLocalStorage) {
|
|
188
|
-
await uploadFiles(payload, filesToUpload, req);
|
|
189
|
-
}
|
|
190
|
-
// /////////////////////////////////////
|
|
191
|
-
// beforeChange - Collection
|
|
192
|
-
// /////////////////////////////////////
|
|
193
|
-
await collectionConfig.hooks.beforeChange.reduce(async (priorHook, hook)=>{
|
|
194
|
-
await priorHook;
|
|
195
|
-
data = await hook({
|
|
196
|
-
collection: collectionConfig,
|
|
197
|
-
context: req.context,
|
|
198
|
-
data,
|
|
199
|
-
operation: 'update',
|
|
200
|
-
originalDoc,
|
|
201
|
-
req
|
|
202
|
-
}) || data;
|
|
203
|
-
}, Promise.resolve());
|
|
204
|
-
// /////////////////////////////////////
|
|
205
|
-
// beforeChange - Fields
|
|
206
|
-
// /////////////////////////////////////
|
|
207
|
-
let result = await beforeChange({
|
|
208
|
-
id,
|
|
209
|
-
collection: collectionConfig,
|
|
210
|
-
context: req.context,
|
|
211
112
|
data,
|
|
212
|
-
doc: originalDoc,
|
|
213
|
-
docWithLocales: doc,
|
|
214
|
-
global: null,
|
|
215
|
-
operation: 'update',
|
|
216
|
-
req,
|
|
217
|
-
skipValidation: shouldSaveDraft && collectionConfig.versions.drafts && !collectionConfig.versions.drafts.validate && data._status !== 'published'
|
|
218
|
-
});
|
|
219
|
-
// /////////////////////////////////////
|
|
220
|
-
// Update
|
|
221
|
-
// /////////////////////////////////////
|
|
222
|
-
if (!shouldSaveDraft || data._status === 'published') {
|
|
223
|
-
result = await req.payload.db.updateOne({
|
|
224
|
-
id,
|
|
225
|
-
collection: collectionConfig.slug,
|
|
226
|
-
data: result,
|
|
227
|
-
locale,
|
|
228
|
-
req,
|
|
229
|
-
select
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
// /////////////////////////////////////
|
|
233
|
-
// Create version
|
|
234
|
-
// /////////////////////////////////////
|
|
235
|
-
if (collectionConfig.versions) {
|
|
236
|
-
result = await saveVersion({
|
|
237
|
-
id,
|
|
238
|
-
collection: collectionConfig,
|
|
239
|
-
docWithLocales: result,
|
|
240
|
-
payload,
|
|
241
|
-
req,
|
|
242
|
-
select
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
// /////////////////////////////////////
|
|
246
|
-
// afterRead - Fields
|
|
247
|
-
// /////////////////////////////////////
|
|
248
|
-
result = await afterRead({
|
|
249
|
-
collection: collectionConfig,
|
|
250
|
-
context: req.context,
|
|
251
113
|
depth,
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
fallbackLocale
|
|
255
|
-
|
|
114
|
+
docWithLocales,
|
|
115
|
+
draftArg,
|
|
116
|
+
fallbackLocale,
|
|
117
|
+
filesToUpload,
|
|
256
118
|
locale,
|
|
257
119
|
overrideAccess,
|
|
120
|
+
overrideLock,
|
|
121
|
+
payload,
|
|
258
122
|
populate,
|
|
123
|
+
publishSpecificLocale,
|
|
259
124
|
req,
|
|
260
125
|
select,
|
|
261
126
|
showHiddenFields
|
|
262
127
|
});
|
|
263
|
-
|
|
264
|
-
// afterRead - Collection
|
|
265
|
-
// /////////////////////////////////////
|
|
266
|
-
await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{
|
|
267
|
-
await priorHook;
|
|
268
|
-
result = await hook({
|
|
269
|
-
collection: collectionConfig,
|
|
270
|
-
context: req.context,
|
|
271
|
-
doc: result,
|
|
272
|
-
req
|
|
273
|
-
}) || result;
|
|
274
|
-
}, Promise.resolve());
|
|
275
|
-
// /////////////////////////////////////
|
|
276
|
-
// afterChange - Fields
|
|
277
|
-
// /////////////////////////////////////
|
|
278
|
-
result = await afterChange({
|
|
279
|
-
collection: collectionConfig,
|
|
280
|
-
context: req.context,
|
|
281
|
-
data,
|
|
282
|
-
doc: result,
|
|
283
|
-
global: null,
|
|
284
|
-
operation: 'update',
|
|
285
|
-
previousDoc: originalDoc,
|
|
286
|
-
req
|
|
287
|
-
});
|
|
288
|
-
// /////////////////////////////////////
|
|
289
|
-
// afterChange - Collection
|
|
290
|
-
// /////////////////////////////////////
|
|
291
|
-
await collectionConfig.hooks.afterChange.reduce(async (priorHook, hook)=>{
|
|
292
|
-
await priorHook;
|
|
293
|
-
result = await hook({
|
|
294
|
-
collection: collectionConfig,
|
|
295
|
-
context: req.context,
|
|
296
|
-
doc: result,
|
|
297
|
-
operation: 'update',
|
|
298
|
-
previousDoc: originalDoc,
|
|
299
|
-
req
|
|
300
|
-
}) || result;
|
|
301
|
-
}, Promise.resolve());
|
|
302
|
-
await unlinkTempFiles({
|
|
303
|
-
collectionConfig,
|
|
304
|
-
config,
|
|
305
|
-
req
|
|
306
|
-
});
|
|
307
|
-
// /////////////////////////////////////
|
|
308
|
-
// Return results
|
|
309
|
-
// /////////////////////////////////////
|
|
310
|
-
return result;
|
|
128
|
+
return updatedDoc;
|
|
311
129
|
} catch (error) {
|
|
312
130
|
errors.push({
|
|
313
131
|
id,
|
|
@@ -316,6 +134,11 @@ export const updateOperation = async (incomingArgs)=>{
|
|
|
316
134
|
}
|
|
317
135
|
return null;
|
|
318
136
|
});
|
|
137
|
+
await unlinkTempFiles({
|
|
138
|
+
collectionConfig,
|
|
139
|
+
config,
|
|
140
|
+
req
|
|
141
|
+
});
|
|
319
142
|
const awaitedDocs = await Promise.all(promises);
|
|
320
143
|
let result = {
|
|
321
144
|
docs: awaitedDocs.filter(Boolean),
|