@payloadcms/plugin-mcp 3.78.0-internal-debug.f663370 → 3.78.0-internal.5219978
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/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/getMcpHandler.d.ts.map +1 -1
- package/dist/mcp/getMcpHandler.js +8 -2
- package/dist/mcp/getMcpHandler.js.map +1 -1
- package/dist/mcp/helpers/config.d.ts +1 -9
- package/dist/mcp/helpers/config.d.ts.map +1 -1
- package/dist/mcp/helpers/config.js +0 -62
- package/dist/mcp/helpers/config.js.map +1 -1
- package/dist/mcp/helpers/fields.d.ts +6 -25
- package/dist/mcp/helpers/fields.d.ts.map +1 -1
- package/dist/mcp/helpers/fields.js +35 -29
- package/dist/mcp/helpers/fields.js.map +1 -1
- package/dist/mcp/helpers/fileValidation.d.ts +0 -2
- package/dist/mcp/helpers/fileValidation.d.ts.map +1 -1
- package/dist/mcp/helpers/fileValidation.js +44 -82
- package/dist/mcp/helpers/fileValidation.js.map +1 -1
- package/dist/mcp/tools/collection/create.d.ts.map +1 -1
- package/dist/mcp/tools/collection/create.js +2 -25
- package/dist/mcp/tools/collection/create.js.map +1 -1
- package/dist/mcp/tools/collection/delete.d.ts.map +1 -1
- package/dist/mcp/tools/collection/delete.js +1 -12
- package/dist/mcp/tools/collection/delete.js.map +1 -1
- package/dist/mcp/tools/config/update.d.ts +1 -1
- package/dist/mcp/tools/config/update.d.ts.map +1 -1
- package/dist/mcp/tools/config/update.js +3 -3
- package/dist/mcp/tools/config/update.js.map +1 -1
- package/dist/mcp/tools/global/update.d.ts.map +1 -1
- package/dist/mcp/tools/global/update.js +3 -0
- package/dist/mcp/tools/global/update.js.map +1 -1
- package/dist/mcp/tools/job/create.d.ts.map +1 -1
- package/dist/mcp/tools/job/create.js +3 -6
- package/dist/mcp/tools/job/create.js.map +1 -1
- package/dist/mcp/tools/job/run.d.ts +1 -1
- package/dist/mcp/tools/job/run.d.ts.map +1 -1
- package/dist/mcp/tools/job/run.js +5 -26
- package/dist/mcp/tools/job/run.js.map +1 -1
- package/dist/mcp/tools/job/update.d.ts.map +1 -1
- package/dist/mcp/tools/job/update.js +10 -38
- package/dist/mcp/tools/job/update.js.map +1 -1
- package/dist/mcp/tools/resource/create.d.ts.map +1 -1
- package/dist/mcp/tools/resource/create.js +3 -0
- package/dist/mcp/tools/resource/create.js.map +1 -1
- package/dist/mcp/tools/resource/update.d.ts.map +1 -1
- package/dist/mcp/tools/resource/update.js +3 -0
- package/dist/mcp/tools/resource/update.js.map +1 -1
- package/dist/mcp/tools/schemas.d.ts +2 -5
- package/dist/mcp/tools/schemas.d.ts.map +1 -1
- package/dist/mcp/tools/schemas.js +0 -1
- package/dist/mcp/tools/schemas.js.map +1 -1
- package/dist/utils/getVirtualFieldNames.d.ts +14 -0
- package/dist/utils/getVirtualFieldNames.d.ts.map +1 -0
- package/dist/utils/getVirtualFieldNames.js +35 -0
- package/dist/utils/getVirtualFieldNames.js.map +1 -0
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +1 -1
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +1 -2
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +1 -1
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +7 -0
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +1 -0
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +20 -0
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +1 -0
- package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +5 -0
- package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +1 -1
- package/dist/utils/schemaConversion/sanitizeJsonSchema.js +38 -0
- package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +0 -1
- package/src/mcp/getMcpHandler.ts +22 -2
- package/src/mcp/helpers/config.ts +1 -114
- package/src/mcp/helpers/fields.ts +46 -50
- package/src/mcp/helpers/fileValidation.ts +38 -93
- package/src/mcp/tools/collection/create.ts +2 -30
- package/src/mcp/tools/collection/delete.ts +1 -19
- package/src/mcp/tools/config/update.ts +0 -4
- package/src/mcp/tools/global/update.ts +8 -0
- package/src/mcp/tools/job/create.ts +5 -11
- package/src/mcp/tools/job/run.ts +14 -38
- package/src/mcp/tools/job/update.ts +29 -77
- package/src/mcp/tools/resource/create.ts +7 -0
- package/src/mcp/tools/resource/update.ts +7 -0
- package/src/mcp/tools/schemas.ts +0 -1
- package/src/utils/getVirtualFieldNames.ts +53 -0
- package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +1 -3
- package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +27 -0
- package/src/utils/schemaConversion/sanitizeJsonSchema.ts +41 -0
- package/dist/mcp/helpers/conversion.d.ts +0 -2
- package/dist/mcp/helpers/conversion.d.ts.map +0 -1
- package/dist/mcp/helpers/conversion.js +0 -5
- package/dist/mcp/helpers/conversion.js.map +0 -1
- package/dist/mcp/helpers/validation.d.ts +0 -9
- package/dist/mcp/helpers/validation.d.ts.map +0 -1
- package/dist/mcp/helpers/validation.js +0 -22
- package/dist/mcp/helpers/validation.js.map +0 -1
- package/src/mcp/helpers/conversion.ts +0 -3
- package/src/mcp/helpers/validation.ts +0 -32
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export type { MCPAccessSettings };
|
|
|
10
10
|
* The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.
|
|
11
11
|
*
|
|
12
12
|
* @param pluginOptions - The options for the MCP plugin.
|
|
13
|
-
* @experimental This plugin is experimental and may change in the future.
|
|
14
13
|
*/
|
|
15
14
|
export declare const mcpPlugin: (pluginOptions: PluginMCPServerConfig) => (config: Config) => Config;
|
|
16
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAK1E,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;CACF;AAID,YAAY,EAAE,iBAAiB,EAAE,CAAA;AACjC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAK1E,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;CACF;AAID,YAAY,EAAE,iBAAiB,EAAE,CAAA;AACjC;;;;GAIG;AACH,eAAO,MAAM,SAAS,kBACJ,qBAAqB,cAC5B,MAAM,KAAG,MAmFjB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,6 @@ import { defaults } from './defaults.js';
|
|
|
5
5
|
* The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.
|
|
6
6
|
*
|
|
7
7
|
* @param pluginOptions - The options for the MCP plugin.
|
|
8
|
-
* @experimental This plugin is experimental and may change in the future.
|
|
9
8
|
*/ export const mcpPlugin = (pluginOptions)=>(config)=>{
|
|
10
9
|
if (!config.collections) {
|
|
11
10
|
config.collections = [];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from './types.js'\n\nimport { createAPIKeysCollection } from './collections/createApiKeysCollection.js'\nimport { initializeMCPHandler } from './endpoints/mcp.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n}\n\nimport { defaults } from './defaults.js'\n\nexport type { MCPAccessSettings }\n/**\n * The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.\n *\n * @param pluginOptions - The options for the MCP plugin.\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from './types.js'\n\nimport { createAPIKeysCollection } from './collections/createApiKeysCollection.js'\nimport { initializeMCPHandler } from './endpoints/mcp.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n}\n\nimport { defaults } from './defaults.js'\n\nexport type { MCPAccessSettings }\n/**\n * The MCP Plugin for Payload. This plugin allows you to add MCP capabilities to your Payload project.\n *\n * @param pluginOptions - The options for the MCP plugin.\n */\nexport const mcpPlugin =\n (pluginOptions: PluginMCPServerConfig) =>\n (config: Config): Config => {\n if (!config.collections) {\n config.collections = []\n }\n\n // Collections\n const collections = pluginOptions.collections || {}\n // Globals\n const globals = pluginOptions.globals || {}\n // Extract custom tools for the global config\n const customTools =\n pluginOptions.mcp?.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n })) || []\n\n // User Collection\n pluginOptions.userCollection =\n pluginOptions.userCollection ?? config?.admin?.user ?? defaults.userCollection\n\n const experimentalTools = pluginOptions?.experimental?.tools || {}\n\n /**\n * API Keys\n * --------\n * High resolution control over MCP capabilities is crucial when using Payload with LLMs.\n *\n * This API Keys collection has ways for admins to create API keys and allow or disallow the MCP capabilities.\n * This is useful when Admins want to allow or disallow the use of the MCP capabilities in real time.\n * For example:\n * - If a collection has all of its capabilities enabled, admins can allow or disallow the create, update, delete, and find capabilities on that collection.\n * - If a collection only has the find capability enabled, admins can only allow or disallow the find capability on that collection.\n * - If a global has all of its capabilities enabled, admins can allow or disallow the find and update capabilities on that global.\n * - If a custom tool has gone haywire, admins can disallow that tool.\n *\n */\n const apiKeyCollection = createAPIKeysCollection(\n collections,\n globals,\n customTools,\n experimentalTools,\n pluginOptions,\n )\n if (pluginOptions.overrideApiKeyCollection) {\n config.collections.push(pluginOptions.overrideApiKeyCollection(apiKeyCollection))\n } else {\n config.collections.push(apiKeyCollection)\n }\n\n /**\n * If the plugin is disabled, we still want to keep added collections/fields so the database schema is consistent which is important for migrations.\n * If your plugin heavily modifies the database schema, you may want to remove this property.\n */\n if (pluginOptions.disabled) {\n return config\n }\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n /**\n * This is the primary MCP Server Endpoint.\n * Payload will automatically add the /api prefix to the path, so the full path is `/api/mcp`\n * NOTE: This is only transport method until we add full support for SSE which will be another endpoint at `/api/sse`\n */\n config.endpoints.push({\n handler: initializeMCPHandler(pluginOptions),\n method: 'post',\n path: '/mcp',\n })\n\n /**\n * The GET response is always: {\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32000,\"message\":\"Method not allowed.\"},\"id\":null} -- even with an API key\n * This is expected behavior and MCP clients should always use the POST endpoint.\n */\n config.endpoints.push({\n handler: initializeMCPHandler(pluginOptions),\n method: 'get',\n path: '/mcp',\n })\n\n return config\n }\n"],"names":["createAPIKeysCollection","initializeMCPHandler","defaults","mcpPlugin","pluginOptions","config","collections","globals","customTools","mcp","tools","map","tool","name","description","userCollection","admin","user","experimentalTools","experimental","apiKeyCollection","overrideApiKeyCollection","push","disabled","endpoints","handler","method","path"],"mappings":"AAIA,SAASA,uBAAuB,QAAQ,2CAA0C;AAClF,SAASC,oBAAoB,QAAQ,qBAAoB;AAQzD,SAASC,QAAQ,QAAQ,gBAAe;AAGxC;;;;CAIC,GACD,OAAO,MAAMC,YACX,CAACC,gBACD,CAACC;QACC,IAAI,CAACA,OAAOC,WAAW,EAAE;YACvBD,OAAOC,WAAW,GAAG,EAAE;QACzB;QAEA,cAAc;QACd,MAAMA,cAAcF,cAAcE,WAAW,IAAI,CAAC;QAClD,UAAU;QACV,MAAMC,UAAUH,cAAcG,OAAO,IAAI,CAAC;QAC1C,6CAA6C;QAC7C,MAAMC,cACJJ,cAAcK,GAAG,EAAEC,OAAOC,IAAI,CAACC,OAAU,CAAA;gBACvCC,MAAMD,KAAKC,IAAI;gBACfC,aAAaF,KAAKE,WAAW;YAC/B,CAAA,MAAO,EAAE;QAEX,kBAAkB;QAClBV,cAAcW,cAAc,GAC1BX,cAAcW,cAAc,IAAIV,QAAQW,OAAOC,QAAQf,SAASa,cAAc;QAEhF,MAAMG,oBAAoBd,eAAee,cAAcT,SAAS,CAAC;QAEjE;;;;;;;;;;;;;KAaC,GACD,MAAMU,mBAAmBpB,wBACvBM,aACAC,SACAC,aACAU,mBACAd;QAEF,IAAIA,cAAciB,wBAAwB,EAAE;YAC1ChB,OAAOC,WAAW,CAACgB,IAAI,CAAClB,cAAciB,wBAAwB,CAACD;QACjE,OAAO;YACLf,OAAOC,WAAW,CAACgB,IAAI,CAACF;QAC1B;QAEA;;;KAGC,GACD,IAAIhB,cAAcmB,QAAQ,EAAE;YAC1B,OAAOlB;QACT;QAEA,IAAI,CAACA,OAAOmB,SAAS,EAAE;YACrBnB,OAAOmB,SAAS,GAAG,EAAE;QACvB;QAEA;;;;KAIC,GACDnB,OAAOmB,SAAS,CAACF,IAAI,CAAC;YACpBG,SAASxB,qBAAqBG;YAC9BsB,QAAQ;YACRC,MAAM;QACR;QAEA;;;KAGC,GACDtB,OAAOmB,SAAS,CAACF,IAAI,CAAC;YACpBG,SAASxB,qBAAqBG;YAC9BsB,QAAQ;YACRC,MAAM;QACR;QAEA,OAAOtB;IACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMcpHandler.d.ts","sourceRoot":"","sources":["../../src/mcp/getMcpHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,cAAc,EAAkB,MAAM,SAAS,CAAA;AAE3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"getMcpHandler.d.ts","sourceRoot":"","sources":["../../src/mcp/getMcpHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,cAAc,EAAkB,MAAM,SAAS,CAAA;AAE3F,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAuC3E,eAAO,MAAM,aAAa,kBACT,qBAAqB,qBACjB,iBAAiB,OAC/B,cAAc,4CA6epB,CAAA"}
|
|
@@ -3,6 +3,8 @@ import { join } from 'path';
|
|
|
3
3
|
import { APIError, configToJSONSchema } from 'payload';
|
|
4
4
|
import { toCamelCase } from '../utils/camelCase.js';
|
|
5
5
|
import { getEnabledSlugs } from '../utils/getEnabledSlugs.js';
|
|
6
|
+
import { getCollectionVirtualFieldNames, getGlobalVirtualFieldNames } from '../utils/getVirtualFieldNames.js';
|
|
7
|
+
import { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.js';
|
|
6
8
|
import { registerTool } from './registerTool.js';
|
|
7
9
|
// Tools
|
|
8
10
|
import { findGlobalTool } from './tools/global/find.js';
|
|
@@ -68,7 +70,9 @@ export const getMCPHandler = (pluginOptions, mcpAccessSettings, req)=>{
|
|
|
68
70
|
// Collection Operation Tools
|
|
69
71
|
enabledCollectionSlugs.forEach((enabledCollectionSlug)=>{
|
|
70
72
|
try {
|
|
71
|
-
const
|
|
73
|
+
const rawSchema = configSchema.definitions?.[enabledCollectionSlug];
|
|
74
|
+
const virtualFieldNames = getCollectionVirtualFieldNames(payload.config, enabledCollectionSlug);
|
|
75
|
+
const schema = removeVirtualFieldsFromSchema(JSON.parse(JSON.stringify(rawSchema)), virtualFieldNames);
|
|
72
76
|
const toolCapabilities = mcpAccessSettings?.[`${toCamelCase(enabledCollectionSlug)}`];
|
|
73
77
|
const allowCreate = toolCapabilities?.create;
|
|
74
78
|
const allowUpdate = toolCapabilities?.update;
|
|
@@ -94,7 +98,9 @@ export const getMCPHandler = (pluginOptions, mcpAccessSettings, req)=>{
|
|
|
94
98
|
const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global');
|
|
95
99
|
enabledGlobalSlugs.forEach((enabledGlobalSlug)=>{
|
|
96
100
|
try {
|
|
97
|
-
const
|
|
101
|
+
const rawSchema = configSchema.definitions?.[enabledGlobalSlug];
|
|
102
|
+
const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, enabledGlobalSlug);
|
|
103
|
+
const schema = removeVirtualFieldsFromSchema(JSON.parse(JSON.stringify(rawSchema)), virtualFieldNames);
|
|
98
104
|
const toolCapabilities = mcpAccessSettings?.[`${toCamelCase(enabledGlobalSlug)}`];
|
|
99
105
|
const allowFind = toolCapabilities?.['find'];
|
|
100
106
|
const allowUpdate = toolCapabilities?.['update'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/getMcpHandler.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport { createMcpHandler } from 'mcp-handler'\nimport { join } from 'path'\nimport { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { toCamelCase } from '../utils/camelCase.js'\nimport { getEnabledSlugs } from '../utils/getEnabledSlugs.js'\nimport { registerTool } from './registerTool.js'\n\n// Tools\nimport { findGlobalTool } from './tools/global/find.js'\nimport { updateGlobalTool } from './tools/global/update.js'\nimport { createResourceTool } from './tools/resource/create.js'\nimport { deleteResourceTool } from './tools/resource/delete.js'\nimport { findResourceTool } from './tools/resource/find.js'\nimport { updateResourceTool } from './tools/resource/update.js'\n\n// Experimental Tools\n/**\n * @experimental This tools are experimental and may change or be removed in the future.\n */\nimport { authTool } from './tools/auth/auth.js'\nimport { forgotPasswordTool } from './tools/auth/forgotPassword.js'\nimport { loginTool } from './tools/auth/login.js'\nimport { resetPasswordTool } from './tools/auth/resetPassword.js'\nimport { unlockTool } from './tools/auth/unlock.js'\nimport { verifyTool } from './tools/auth/verify.js'\nimport { createCollectionTool } from './tools/collection/create.js'\nimport { deleteCollectionTool } from './tools/collection/delete.js'\nimport { findCollectionTool } from './tools/collection/find.js'\nimport { updateCollectionTool } from './tools/collection/update.js'\nimport { findConfigTool } from './tools/config/find.js'\nimport { updateConfigTool } from './tools/config/update.js'\nimport { createJobTool } from './tools/job/create.js'\nimport { runJobTool } from './tools/job/run.js'\nimport { updateJobTool } from './tools/job/update.js'\n\nexport const getMCPHandler = (\n pluginOptions: PluginMCPServerConfig,\n mcpAccessSettings: MCPAccessSettings,\n req: PayloadRequest,\n) => {\n const { payload } = req\n const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n)\n\n // Handler wrapper that injects req before the _extra argument\n const wrapHandler = (handler: (...args: any[]) => any) => {\n return async (...args: any[]) => {\n const _extra = args[args.length - 1]\n const handlerArgs = args.slice(0, -1)\n return await handler(...handlerArgs, req, _extra)\n }\n }\n\n const payloadToolHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['tools']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadPromptHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['prompts']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadResourceHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['resources']>[number]['handler'],\n ) => wrapHandler(handler)\n\n // User\n const user = mcpAccessSettings.user\n\n // MCP Server and Handler Options\n const MCPOptions = pluginOptions.mcp || {}\n const customMCPTools = MCPOptions.tools || []\n const customMCPPrompts = MCPOptions.prompts || []\n const customMCPResources = MCPOptions.resources || []\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const serverOptions = MCPOptions.serverOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n // Experimental MCP Tool Requirements\n const isDevelopment = process.env.NODE_ENV === 'development'\n const experimentalTools: NonNullable<PluginMCPServerConfig['experimental']>['tools'] =\n pluginOptions?.experimental?.tools || {}\n const collectionsPluginConfig = pluginOptions.collections || {}\n const globalsPluginConfig = pluginOptions.globals || {}\n const collectionsDirPath =\n experimentalTools && experimentalTools.collections?.collectionsDirPath\n ? experimentalTools.collections.collectionsDirPath\n : join(process.cwd(), 'src/collections')\n const configFilePath =\n experimentalTools && experimentalTools.config?.configFilePath\n ? experimentalTools.config.configFilePath\n : join(process.cwd(), 'src/payload.config.ts')\n const jobsDirPath =\n experimentalTools && experimentalTools.jobs?.jobsDirPath\n ? experimentalTools.jobs.jobsDirPath\n : join(process.cwd(), 'src/jobs')\n\n try {\n return createMcpHandler(\n (server) => {\n // Get enabled collections\n const enabledCollectionSlugs = getEnabledSlugs(collectionsPluginConfig, 'collection')\n\n // Collection Operation Tools\n enabledCollectionSlugs.forEach((enabledCollectionSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledCollectionSlug)}`\n ] as Record<string, unknown>\n const allowCreate: boolean | undefined = toolCapabilities?.create as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.update as boolean\n const allowFind: boolean | undefined = toolCapabilities?.find as boolean\n const allowDelete: boolean | undefined = toolCapabilities?.delete as boolean\n\n if (allowCreate) {\n registerTool(\n allowCreate,\n `Create ${enabledCollectionSlug}`,\n () =>\n createResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledCollectionSlug}`,\n () =>\n updateResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledCollectionSlug}`,\n () =>\n findResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowDelete) {\n registerTool(\n allowDelete,\n `Delete ${enabledCollectionSlug}`,\n () =>\n deleteResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for collection ${enabledCollectionSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Global Operation Tools\n const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global')\n\n enabledGlobalSlugs.forEach((enabledGlobalSlug) => {\n try {\n const schema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledGlobalSlug)}`\n ] as Record<string, unknown>\n const allowFind: boolean | undefined = toolCapabilities?.['find'] as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.['update'] as boolean\n\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledGlobalSlug}`,\n () =>\n findGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledGlobalSlug}`,\n () =>\n updateGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for global ${enabledGlobalSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Custom tools\n customMCPTools.forEach((tool) => {\n const camelCasedToolName = toCamelCase(tool.name)\n const isToolEnabled = mcpAccessSettings['payload-mcp-tool']?.[camelCasedToolName] ?? false\n\n registerTool(\n isToolEnabled,\n tool.name,\n () =>\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.parameters,\n },\n payloadToolHandler(tool.handler),\n ),\n payload,\n useVerboseLogs,\n )\n })\n\n // Custom prompts\n customMCPPrompts.forEach((prompt) => {\n const camelCasedPromptName = toCamelCase(prompt.name)\n const isPromptEnabled =\n mcpAccessSettings['payload-mcp-prompt']?.[camelCasedPromptName] ?? false\n\n if (isPromptEnabled) {\n server.registerPrompt(\n prompt.name,\n {\n argsSchema: prompt.argsSchema,\n description: prompt.description,\n title: prompt.title,\n },\n payloadPromptHandler(prompt.handler),\n )\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Prompt: ${prompt.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Prompt: ${prompt.title} Skipped.`)\n }\n })\n\n // Custom resources\n customMCPResources.forEach((resource) => {\n const camelCasedResourceName = toCamelCase(resource.name)\n const isResourceEnabled =\n mcpAccessSettings['payload-mcp-resource']?.[camelCasedResourceName] ?? false\n\n if (isResourceEnabled) {\n server.registerResource(\n resource.name,\n // @ts-expect-error - Overload type is not working however -- ResourceTemplate OR String is a valid type\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n payloadResourceHandler(resource.handler),\n )\n\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Resource: ${resource.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Resource: ${resource.title} Skipped.`)\n }\n })\n\n // Experimental - Collection Schema Modfication Tools\n if (\n mcpAccessSettings.collections?.create &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.create,\n 'Create Collection',\n () =>\n createCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n if (\n mcpAccessSettings.collections?.delete &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.delete,\n 'Delete Collection',\n () =>\n deleteCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.find &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.find,\n 'Find Collection',\n () => findCollectionTool(server, req, useVerboseLogs, collectionsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.update &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.update,\n 'Update Collection',\n () =>\n updateCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Payload Config Modification Tools\n if (mcpAccessSettings.config?.find && experimentalTools.config?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.config.find,\n 'Find Config',\n () => findConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.config?.update &&\n experimentalTools.config?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.config.update,\n 'Update Config',\n () => updateConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Job Modification Tools\n if (mcpAccessSettings.jobs?.create && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.create,\n 'Create Job',\n () => createJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.update && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.update,\n 'Update Job',\n () => updateJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.run && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.run,\n 'Run Job',\n () => runJobTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Auth Modification Tools\n if (mcpAccessSettings.auth?.auth && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.auth,\n 'Auth',\n () => authTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.login && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.login,\n 'Login',\n () => loginTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.verify && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.verify,\n 'Verify',\n () => verifyTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.resetPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.resetPassword,\n 'Reset Password',\n () => resetPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.forgotPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.forgotPassword,\n 'Forgot Password',\n () => forgotPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.unlock && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.unlock,\n 'Unlock',\n () => unlockTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] 🚀 MCP Server Ready.')\n }\n },\n {\n serverInfo: serverOptions.serverInfo,\n },\n {\n basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',\n disableSse: MCPHandlerOptions.disableSse ?? true,\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n onEvent: MCPHandlerOptions.onEvent,\n redisUrl: MCPHandlerOptions.redisUrl,\n verboseLogs: useVerboseLogs,\n },\n )\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n}\n"],"names":["createMcpHandler","join","APIError","configToJSONSchema","toCamelCase","getEnabledSlugs","registerTool","findGlobalTool","updateGlobalTool","createResourceTool","deleteResourceTool","findResourceTool","updateResourceTool","authTool","forgotPasswordTool","loginTool","resetPasswordTool","unlockTool","verifyTool","createCollectionTool","deleteCollectionTool","findCollectionTool","updateCollectionTool","findConfigTool","updateConfigTool","createJobTool","runJobTool","updateJobTool","getMCPHandler","pluginOptions","mcpAccessSettings","req","payload","configSchema","config","db","defaultIDType","i18n","wrapHandler","handler","args","_extra","length","handlerArgs","slice","payloadToolHandler","payloadPromptHandler","payloadResourceHandler","user","MCPOptions","mcp","customMCPTools","tools","customMCPPrompts","prompts","customMCPResources","resources","MCPHandlerOptions","handlerOptions","serverOptions","useVerboseLogs","verboseLogs","isDevelopment","process","env","NODE_ENV","experimentalTools","experimental","collectionsPluginConfig","collections","globalsPluginConfig","globals","collectionsDirPath","cwd","configFilePath","jobsDirPath","jobs","server","enabledCollectionSlugs","forEach","enabledCollectionSlug","schema","definitions","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","inputSchema","parameters","prompt","camelCasedPromptName","isPromptEnabled","registerPrompt","argsSchema","title","logger","info","resource","camelCasedResourceName","isResourceEnabled","registerResource","uri","mimeType","enabled","run","auth","login","verify","resetPassword","forgotPassword","unlock","serverInfo","basePath","routes","api","disableSse","maxDuration","onEvent","redisUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/getMcpHandler.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport { createMcpHandler } from 'mcp-handler'\nimport { join } from 'path'\nimport { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'\n\nimport type { MCPAccessSettings, PluginMCPServerConfig } from '../types.js'\n\nimport { toCamelCase } from '../utils/camelCase.js'\nimport { getEnabledSlugs } from '../utils/getEnabledSlugs.js'\nimport {\n getCollectionVirtualFieldNames,\n getGlobalVirtualFieldNames,\n} from '../utils/getVirtualFieldNames.js'\nimport { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.js'\nimport { registerTool } from './registerTool.js'\n\n// Tools\nimport { findGlobalTool } from './tools/global/find.js'\nimport { updateGlobalTool } from './tools/global/update.js'\nimport { createResourceTool } from './tools/resource/create.js'\nimport { deleteResourceTool } from './tools/resource/delete.js'\nimport { findResourceTool } from './tools/resource/find.js'\nimport { updateResourceTool } from './tools/resource/update.js'\n\n// Experimental Tools\n/**\n * @experimental This tools are experimental and may change or be removed in the future.\n */\nimport { authTool } from './tools/auth/auth.js'\nimport { forgotPasswordTool } from './tools/auth/forgotPassword.js'\nimport { loginTool } from './tools/auth/login.js'\nimport { resetPasswordTool } from './tools/auth/resetPassword.js'\nimport { unlockTool } from './tools/auth/unlock.js'\nimport { verifyTool } from './tools/auth/verify.js'\nimport { createCollectionTool } from './tools/collection/create.js'\nimport { deleteCollectionTool } from './tools/collection/delete.js'\nimport { findCollectionTool } from './tools/collection/find.js'\nimport { updateCollectionTool } from './tools/collection/update.js'\nimport { findConfigTool } from './tools/config/find.js'\nimport { updateConfigTool } from './tools/config/update.js'\nimport { createJobTool } from './tools/job/create.js'\nimport { runJobTool } from './tools/job/run.js'\nimport { updateJobTool } from './tools/job/update.js'\n\nexport const getMCPHandler = (\n pluginOptions: PluginMCPServerConfig,\n mcpAccessSettings: MCPAccessSettings,\n req: PayloadRequest,\n) => {\n const { payload } = req\n const configSchema = configToJSONSchema(payload.config, payload.db.defaultIDType, req.i18n)\n\n // Handler wrapper that injects req before the _extra argument\n const wrapHandler = (handler: (...args: any[]) => any) => {\n return async (...args: any[]) => {\n const _extra = args[args.length - 1]\n const handlerArgs = args.slice(0, -1)\n return await handler(...handlerArgs, req, _extra)\n }\n }\n\n const payloadToolHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['tools']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadPromptHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['prompts']>[number]['handler'],\n ) => wrapHandler(handler)\n\n const payloadResourceHandler = (\n handler: NonNullable<NonNullable<PluginMCPServerConfig['mcp']>['resources']>[number]['handler'],\n ) => wrapHandler(handler)\n\n // User\n const user = mcpAccessSettings.user\n\n // MCP Server and Handler Options\n const MCPOptions = pluginOptions.mcp || {}\n const customMCPTools = MCPOptions.tools || []\n const customMCPPrompts = MCPOptions.prompts || []\n const customMCPResources = MCPOptions.resources || []\n const MCPHandlerOptions = MCPOptions.handlerOptions || {}\n const serverOptions = MCPOptions.serverOptions || {}\n const useVerboseLogs = MCPHandlerOptions.verboseLogs ?? false\n\n // Experimental MCP Tool Requirements\n const isDevelopment = process.env.NODE_ENV === 'development'\n const experimentalTools: NonNullable<PluginMCPServerConfig['experimental']>['tools'] =\n pluginOptions?.experimental?.tools || {}\n const collectionsPluginConfig = pluginOptions.collections || {}\n const globalsPluginConfig = pluginOptions.globals || {}\n const collectionsDirPath =\n experimentalTools && experimentalTools.collections?.collectionsDirPath\n ? experimentalTools.collections.collectionsDirPath\n : join(process.cwd(), 'src/collections')\n const configFilePath =\n experimentalTools && experimentalTools.config?.configFilePath\n ? experimentalTools.config.configFilePath\n : join(process.cwd(), 'src/payload.config.ts')\n const jobsDirPath =\n experimentalTools && experimentalTools.jobs?.jobsDirPath\n ? experimentalTools.jobs.jobsDirPath\n : join(process.cwd(), 'src/jobs')\n\n try {\n return createMcpHandler(\n (server) => {\n // Get enabled collections\n const enabledCollectionSlugs = getEnabledSlugs(collectionsPluginConfig, 'collection')\n\n // Collection Operation Tools\n enabledCollectionSlugs.forEach((enabledCollectionSlug) => {\n try {\n const rawSchema = configSchema.definitions?.[enabledCollectionSlug] as JSONSchema4\n\n const virtualFieldNames = getCollectionVirtualFieldNames(\n payload.config,\n enabledCollectionSlug,\n )\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledCollectionSlug)}`\n ] as Record<string, unknown>\n const allowCreate: boolean | undefined = toolCapabilities?.create as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.update as boolean\n const allowFind: boolean | undefined = toolCapabilities?.find as boolean\n const allowDelete: boolean | undefined = toolCapabilities?.delete as boolean\n\n if (allowCreate) {\n registerTool(\n allowCreate,\n `Create ${enabledCollectionSlug}`,\n () =>\n createResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledCollectionSlug}`,\n () =>\n updateResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledCollectionSlug}`,\n () =>\n findResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowDelete) {\n registerTool(\n allowDelete,\n `Delete ${enabledCollectionSlug}`,\n () =>\n deleteResourceTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledCollectionSlug,\n collectionsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for collection ${enabledCollectionSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Global Operation Tools\n const enabledGlobalSlugs = getEnabledSlugs(globalsPluginConfig, 'global')\n\n enabledGlobalSlugs.forEach((enabledGlobalSlug) => {\n try {\n const rawSchema = configSchema.definitions?.[enabledGlobalSlug] as JSONSchema4\n\n const virtualFieldNames = getGlobalVirtualFieldNames(payload.config, enabledGlobalSlug)\n const schema = removeVirtualFieldsFromSchema(\n JSON.parse(JSON.stringify(rawSchema)) as JSONSchema4,\n virtualFieldNames,\n )\n\n const toolCapabilities = mcpAccessSettings?.[\n `${toCamelCase(enabledGlobalSlug)}`\n ] as Record<string, unknown>\n const allowFind: boolean | undefined = toolCapabilities?.['find'] as boolean\n const allowUpdate: boolean | undefined = toolCapabilities?.['update'] as boolean\n\n if (allowFind) {\n registerTool(\n allowFind,\n `Find ${enabledGlobalSlug}`,\n () =>\n findGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n ),\n payload,\n useVerboseLogs,\n )\n }\n if (allowUpdate) {\n registerTool(\n allowUpdate,\n `Update ${enabledGlobalSlug}`,\n () =>\n updateGlobalTool(\n server,\n req,\n user,\n useVerboseLogs,\n enabledGlobalSlug,\n globalsPluginConfig,\n schema,\n ),\n payload,\n useVerboseLogs,\n )\n }\n } catch (error) {\n throw new APIError(\n `Error registering tools for global ${enabledGlobalSlug}: ${String(error)}`,\n 500,\n )\n }\n })\n\n // Custom tools\n customMCPTools.forEach((tool) => {\n const camelCasedToolName = toCamelCase(tool.name)\n const isToolEnabled = mcpAccessSettings['payload-mcp-tool']?.[camelCasedToolName] ?? false\n\n registerTool(\n isToolEnabled,\n tool.name,\n () =>\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.parameters,\n },\n payloadToolHandler(tool.handler),\n ),\n payload,\n useVerboseLogs,\n )\n })\n\n // Custom prompts\n customMCPPrompts.forEach((prompt) => {\n const camelCasedPromptName = toCamelCase(prompt.name)\n const isPromptEnabled =\n mcpAccessSettings['payload-mcp-prompt']?.[camelCasedPromptName] ?? false\n\n if (isPromptEnabled) {\n server.registerPrompt(\n prompt.name,\n {\n argsSchema: prompt.argsSchema,\n description: prompt.description,\n title: prompt.title,\n },\n payloadPromptHandler(prompt.handler),\n )\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Prompt: ${prompt.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Prompt: ${prompt.title} Skipped.`)\n }\n })\n\n // Custom resources\n customMCPResources.forEach((resource) => {\n const camelCasedResourceName = toCamelCase(resource.name)\n const isResourceEnabled =\n mcpAccessSettings['payload-mcp-resource']?.[camelCasedResourceName] ?? false\n\n if (isResourceEnabled) {\n server.registerResource(\n resource.name,\n // @ts-expect-error - Overload type is not working however -- ResourceTemplate OR String is a valid type\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n payloadResourceHandler(resource.handler),\n )\n\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Resource: ${resource.title} Registered.`)\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Resource: ${resource.title} Skipped.`)\n }\n })\n\n // Experimental - Collection Schema Modfication Tools\n if (\n mcpAccessSettings.collections?.create &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.create,\n 'Create Collection',\n () =>\n createCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n if (\n mcpAccessSettings.collections?.delete &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.delete,\n 'Delete Collection',\n () =>\n deleteCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.find &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.find,\n 'Find Collection',\n () => findCollectionTool(server, req, useVerboseLogs, collectionsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.collections?.update &&\n experimentalTools.collections?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.collections.update,\n 'Update Collection',\n () =>\n updateCollectionTool(server, req, useVerboseLogs, collectionsDirPath, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Payload Config Modification Tools\n if (mcpAccessSettings.config?.find && experimentalTools.config?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.config.find,\n 'Find Config',\n () => findConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (\n mcpAccessSettings.config?.update &&\n experimentalTools.config?.enabled &&\n isDevelopment\n ) {\n registerTool(\n mcpAccessSettings.config.update,\n 'Update Config',\n () => updateConfigTool(server, req, useVerboseLogs, configFilePath),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Job Modification Tools\n if (mcpAccessSettings.jobs?.create && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.create,\n 'Create Job',\n () => createJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.update && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.update,\n 'Update Job',\n () => updateJobTool(server, req, useVerboseLogs, jobsDirPath),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.jobs?.run && experimentalTools.jobs?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.jobs.run,\n 'Run Job',\n () => runJobTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n // Experimental - Auth Modification Tools\n if (mcpAccessSettings.auth?.auth && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.auth,\n 'Auth',\n () => authTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.login && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.login,\n 'Login',\n () => loginTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.verify && experimentalTools.auth?.enabled && isDevelopment) {\n registerTool(\n mcpAccessSettings.auth.verify,\n 'Verify',\n () => verifyTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.resetPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.resetPassword,\n 'Reset Password',\n () => resetPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.forgotPassword && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.forgotPassword,\n 'Forgot Password',\n () => forgotPasswordTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (mcpAccessSettings.auth?.unlock && experimentalTools.auth?.enabled) {\n registerTool(\n mcpAccessSettings.auth.unlock,\n 'Unlock',\n () => unlockTool(server, req, useVerboseLogs),\n payload,\n useVerboseLogs,\n )\n }\n\n if (useVerboseLogs) {\n payload.logger.info('[payload-mcp] 🚀 MCP Server Ready.')\n }\n },\n {\n serverInfo: serverOptions.serverInfo,\n },\n {\n basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',\n disableSse: MCPHandlerOptions.disableSse ?? true,\n maxDuration: MCPHandlerOptions.maxDuration || 60,\n onEvent: MCPHandlerOptions.onEvent,\n redisUrl: MCPHandlerOptions.redisUrl,\n verboseLogs: useVerboseLogs,\n },\n )\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n}\n"],"names":["createMcpHandler","join","APIError","configToJSONSchema","toCamelCase","getEnabledSlugs","getCollectionVirtualFieldNames","getGlobalVirtualFieldNames","removeVirtualFieldsFromSchema","registerTool","findGlobalTool","updateGlobalTool","createResourceTool","deleteResourceTool","findResourceTool","updateResourceTool","authTool","forgotPasswordTool","loginTool","resetPasswordTool","unlockTool","verifyTool","createCollectionTool","deleteCollectionTool","findCollectionTool","updateCollectionTool","findConfigTool","updateConfigTool","createJobTool","runJobTool","updateJobTool","getMCPHandler","pluginOptions","mcpAccessSettings","req","payload","configSchema","config","db","defaultIDType","i18n","wrapHandler","handler","args","_extra","length","handlerArgs","slice","payloadToolHandler","payloadPromptHandler","payloadResourceHandler","user","MCPOptions","mcp","customMCPTools","tools","customMCPPrompts","prompts","customMCPResources","resources","MCPHandlerOptions","handlerOptions","serverOptions","useVerboseLogs","verboseLogs","isDevelopment","process","env","NODE_ENV","experimentalTools","experimental","collectionsPluginConfig","collections","globalsPluginConfig","globals","collectionsDirPath","cwd","configFilePath","jobsDirPath","jobs","server","enabledCollectionSlugs","forEach","enabledCollectionSlug","rawSchema","definitions","virtualFieldNames","schema","JSON","parse","stringify","toolCapabilities","allowCreate","create","allowUpdate","update","allowFind","find","allowDelete","delete","error","String","enabledGlobalSlugs","enabledGlobalSlug","tool","camelCasedToolName","name","isToolEnabled","description","inputSchema","parameters","prompt","camelCasedPromptName","isPromptEnabled","registerPrompt","argsSchema","title","logger","info","resource","camelCasedResourceName","isResourceEnabled","registerResource","uri","mimeType","enabled","run","auth","login","verify","resetPassword","forgotPassword","unlock","serverInfo","basePath","routes","api","disableSse","maxDuration","onEvent","redisUrl"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AdminConfig,
|
|
1
|
+
import type { AdminConfig, DatabaseConfig, PluginUpdates } from '../../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Adds a collection to the payload.config.ts file
|
|
4
4
|
*/
|
|
@@ -19,12 +19,4 @@ export declare function updateDatabaseConfig(content: string, databaseConfig: Da
|
|
|
19
19
|
* Updates plugins configuration in payload.config.ts
|
|
20
20
|
*/
|
|
21
21
|
export declare function updatePluginsConfig(content: string, pluginUpdates: PluginUpdates): string;
|
|
22
|
-
/**
|
|
23
|
-
* Updates general configuration options in payload.config.ts
|
|
24
|
-
*/
|
|
25
|
-
export declare function updateGeneralConfig(content: string, generalConfig: GeneralConfig): string;
|
|
26
|
-
/**
|
|
27
|
-
* Updates collection-level configuration in a collection file
|
|
28
|
-
*/
|
|
29
|
-
export declare function updateCollectionConfig(content: string, updates: CollectionConfigUpdates, collectionName: string): string;
|
|
30
22
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEhF;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAwCrF;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAgC1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAoDnF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,CAkB5F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CA6CzF"}
|
|
@@ -149,67 +149,5 @@
|
|
|
149
149
|
}
|
|
150
150
|
return content;
|
|
151
151
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Updates general configuration options in payload.config.ts
|
|
154
|
-
*/ export function updateGeneralConfig(content, generalConfig) {
|
|
155
|
-
// Update various general configuration options
|
|
156
|
-
Object.entries(generalConfig).forEach(([key, value])=>{
|
|
157
|
-
if (value !== undefined && value !== null) {
|
|
158
|
-
const configRegex = new RegExp(`${key}:\\s*[^,}]*`, 'g');
|
|
159
|
-
if (content.match(configRegex)) {
|
|
160
|
-
if (typeof value === 'string') {
|
|
161
|
-
content = content.replace(configRegex, `${key}: '${value}'`);
|
|
162
|
-
} else if (typeof value === 'boolean') {
|
|
163
|
-
content = content.replace(configRegex, `${key}: ${value}`);
|
|
164
|
-
} else if (typeof value === 'object') {
|
|
165
|
-
content = content.replace(configRegex, `${key}: ${JSON.stringify(value, null, 2)}`);
|
|
166
|
-
}
|
|
167
|
-
} else {
|
|
168
|
-
// Add new config option
|
|
169
|
-
const configValue = typeof value === 'string' ? `'${value}'` : typeof value === 'object' ? JSON.stringify(value, null, 2) : value;
|
|
170
|
-
content = content.replace(/export default buildConfig\(\{/, `export default buildConfig({\n ${key}: ${configValue},`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
return content;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Updates collection-level configuration in a collection file
|
|
178
|
-
*/ export function updateCollectionConfig(content, updates, collectionName) {
|
|
179
|
-
let updatedContent = content;
|
|
180
|
-
if (updates.slug) {
|
|
181
|
-
updatedContent = updatedContent.replace(/slug:\s*'[^']*'/, `slug: '${updates.slug}'`);
|
|
182
|
-
}
|
|
183
|
-
if (updates.access) {
|
|
184
|
-
const accessRegex = /access:\s*\{[^}]*\}/;
|
|
185
|
-
if (updatedContent.match(accessRegex)) {
|
|
186
|
-
// Update existing access config
|
|
187
|
-
Object.entries(updates.access).forEach(([key, value])=>{
|
|
188
|
-
if (value !== undefined) {
|
|
189
|
-
updatedContent = updatedContent.replace(new RegExp(`${key}:\\s*[^,}]*`), `${key}: ${value}`);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
} else {
|
|
193
|
-
// Add access config
|
|
194
|
-
const accessConfig = Object.entries(updates.access).filter(([, value])=>value !== undefined).map(([key, value])=>` ${key}: ${value}`).join(',\n');
|
|
195
|
-
updatedContent = updatedContent.replace(/slug:\s*'[^']*',/, `slug: '${collectionName}',\n access: {\n${accessConfig}\n },`);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (updates.timestamps !== undefined) {
|
|
199
|
-
if (updatedContent.includes('timestamps:')) {
|
|
200
|
-
updatedContent = updatedContent.replace(/timestamps:[^,}]*/, `timestamps: ${updates.timestamps}`);
|
|
201
|
-
} else {
|
|
202
|
-
updatedContent = updatedContent.replace(/fields:\s*\[/, `timestamps: ${updates.timestamps},\n fields: [`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (updates.versioning !== undefined) {
|
|
206
|
-
if (updatedContent.includes('versioning:')) {
|
|
207
|
-
updatedContent = updatedContent.replace(/versioning:[^,}]*/, `versioning: ${updates.versioning}`);
|
|
208
|
-
} else {
|
|
209
|
-
updatedContent = updatedContent.replace(/fields:\s*\[/, `versioning: ${updates.versioning},\n fields: [`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return updatedContent;
|
|
213
|
-
}
|
|
214
152
|
|
|
215
153
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mcp/helpers/config.ts"],"sourcesContent":["import type {\n AdminConfig,\n CollectionConfigUpdates,\n DatabaseConfig,\n GeneralConfig,\n PluginUpdates,\n} from '../../types.js'\n\n/**\n * Adds a collection to the payload.config.ts file\n */\nexport function addCollectionToConfig(content: string, collectionName: string): string {\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n\n // Add import statement\n const importRegex = /import.*from\\s*['\"]\\.\\/collections\\/.*['\"]/g\n const importMatches = content.match(importRegex)\n\n if (importMatches && importMatches.length > 0) {\n const lastImport = importMatches[importMatches.length - 1]\n const newImport = `import { ${capitalizedName} } from './collections/${capitalizedName}'`\n\n // Check if import already exists\n if (lastImport && !content.includes(newImport)) {\n content = content.replace(lastImport, `${lastImport}\\n${newImport}`)\n }\n } else {\n // Add import after existing imports\n const importInsertPoint = content.indexOf(\"import sharp from 'sharp'\")\n if (importInsertPoint !== -1) {\n const lineEnd = content.indexOf('\\n', importInsertPoint)\n const newImport = `import { ${capitalizedName} } from './collections/${capitalizedName}'`\n content = content.slice(0, lineEnd + 1) + newImport + '\\n' + content.slice(lineEnd + 1)\n }\n }\n\n // Add to collections array\n const collectionsRegex = /collections:\\s*\\[([\\s\\S]*?)\\]/\n const collectionsMatch = content.match(collectionsRegex)\n\n if (collectionsMatch && collectionsMatch[1]) {\n const collectionsContent = collectionsMatch[1].trim()\n if (!collectionsContent.includes(capitalizedName)) {\n const newCollections = collectionsContent\n ? `${collectionsContent}, ${capitalizedName}`\n : capitalizedName\n content = content.replace(collectionsRegex, `collections: [${newCollections}]`)\n }\n }\n\n return content\n}\n\n/**\n * Removes a collection from the payload.config.ts file\n */\nexport function removeCollectionFromConfig(content: string, collectionName: string): string {\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n\n // Remove import statement\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${capitalizedName}\\\\s*}\\\\s*from\\\\s*['\"]\\\\./collections/${capitalizedName}['\"]\\\\s*\\\\n?`,\n 'g',\n )\n content = content.replace(importRegex, '')\n\n // Remove from collections array\n const collectionsRegex = /collections:\\s*\\[([\\s\\S]*?)\\]/\n const collectionsMatch = content.match(collectionsRegex)\n\n if (collectionsMatch && collectionsMatch[1]) {\n let collectionsContent = collectionsMatch[1]\n\n // Remove the collection name and clean up commas\n collectionsContent = collectionsContent.replace(\n new RegExp(`\\\\s*,?\\\\s*${capitalizedName}\\\\s*,?`, 'g'),\n '',\n )\n collectionsContent = collectionsContent.replace(/,\\s*,/g, ',') // Remove double commas\n collectionsContent = collectionsContent.replace(/^\\s*,|,\\s*$/g, '') // Remove leading/trailing commas\n\n content = content.replace(collectionsRegex, `collections: [${collectionsContent}]`)\n }\n\n // Clean up any double newlines from removed imports\n content = content.replace(/\\n{3,}/g, '\\n\\n')\n\n return content\n}\n\n/**\n * Updates admin configuration in payload.config.ts\n */\nexport function updateAdminConfig(content: string, adminConfig: AdminConfig): string {\n const adminRegex = /admin:\\s*\\{([^}]*)\\}/\n const adminMatch = content.match(adminRegex)\n\n if (adminMatch && adminMatch[1]) {\n let adminContent = adminMatch[1]\n\n // Update specific admin properties\n if (adminConfig.user) {\n if (adminContent.includes('user:')) {\n adminContent = adminContent.replace(/user:[^,}]*/, `user: ${adminConfig.user}.slug`)\n } else {\n adminContent = `\\n user: ${adminConfig.user}.slug,${adminContent}`\n }\n }\n\n if (adminConfig.meta) {\n const metaConfig = Object.entries(adminConfig.meta)\n .map(([key, value]) => ` ${key}: '${value}'`)\n .join(',\\n')\n\n if (adminContent.includes('meta:')) {\n adminContent = adminContent.replace(/meta:\\s*\\{[^}]*\\}/, `meta: {\\n${metaConfig}\\n }`)\n } else {\n adminContent = `${adminContent}\\n meta: {\\n${metaConfig}\\n },`\n }\n }\n\n content = content.replace(adminRegex, `admin: {${adminContent}\\n }`)\n } else {\n // Add admin config if it doesn't exist\n const adminConfigEntries = []\n\n if (adminConfig.user) {\n adminConfigEntries.push(` user: ${adminConfig.user}.slug`)\n }\n\n if (adminConfig.meta) {\n const metaConfig = Object.entries(adminConfig.meta)\n .map(([key, value]) => ` ${key}: '${value}'`)\n .join(',\\n')\n adminConfigEntries.push(` meta: {\\n${metaConfig}\\n }`)\n }\n\n const adminConfigString = `admin: {\\n${adminConfigEntries.join(',\\n')}\\n },`\n content = content.replace(\n /export default buildConfig\\(\\{/,\n `export default buildConfig({\\n ${adminConfigString}`,\n )\n }\n\n return content\n}\n\n/**\n * Updates database configuration in payload.config.ts\n */\nexport function updateDatabaseConfig(content: string, databaseConfig: DatabaseConfig): string {\n if (databaseConfig.type === 'mongodb') {\n // Update to MongoDB adapter\n const dbRegex = /db:[^,}]*(?:,|\\})/\n const mongoImportRegex = /import.*mongooseAdapter.*from.*@payloadcms\\/db-mongodb.*/\n\n if (!content.match(mongoImportRegex)) {\n content = content.replace(\n /(import.*from.*payload.*\\n)/,\n `$1import { mongooseAdapter } from '@payloadcms/db-mongodb'\\n`,\n )\n }\n\n const dbConfig = `db: mongooseAdapter({\\n url: process.env.DATABASE_URL || '${databaseConfig.url || ''}',\\n })`\n content = content.replace(dbRegex, `${dbConfig},`)\n }\n\n return content\n}\n\n/**\n * Updates plugins configuration in payload.config.ts\n */\nexport function updatePluginsConfig(content: string, pluginUpdates: PluginUpdates): string {\n // Add plugin imports\n if (pluginUpdates.add) {\n pluginUpdates.add.forEach((pluginImport: string) => {\n if (!content.includes(pluginImport)) {\n content = content.replace(/(import.*from.*payload.*\\n)/, `$1${pluginImport}\\n`)\n }\n })\n }\n\n // Handle plugins array\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/\n const pluginsMatch = content.match(pluginsRegex)\n\n if (pluginsMatch && pluginsMatch[1]) {\n let pluginsContent = pluginsMatch[1]\n\n // Remove plugins\n if (pluginUpdates.remove) {\n pluginUpdates.remove.forEach((pluginName: string) => {\n const pluginRegex = new RegExp(`\\\\s*${pluginName}\\\\(\\\\)\\\\s*,?`, 'g')\n pluginsContent = pluginsContent.replace(pluginRegex, '')\n })\n }\n\n // Add plugins\n if (pluginUpdates.add) {\n pluginUpdates.add.forEach((pluginImport: string) => {\n // This will match: import { PluginName } from '...';\n const match = pluginImport.match(/import\\s*\\{\\s*(\\w+)\\s*\\}/)\n if (match && match[1]) {\n const pluginName = match[1]\n if (!pluginsContent.includes(`${pluginName}(`)) {\n pluginsContent = pluginsContent.trim()\n ? `${pluginsContent}\\n ${pluginName}(),`\n : `\\n ${pluginName}(),`\n }\n }\n })\n }\n\n content = content.replace(pluginsRegex, `plugins: [${pluginsContent}\\n ]`)\n }\n\n return content\n}\n\n/**\n * Updates general configuration options in payload.config.ts\n */\nexport function updateGeneralConfig(content: string, generalConfig: GeneralConfig): string {\n // Update various general configuration options\n Object.entries(generalConfig).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n const configRegex = new RegExp(`${key}:\\\\s*[^,}]*`, 'g')\n\n if (content.match(configRegex)) {\n if (typeof value === 'string') {\n content = content.replace(configRegex, `${key}: '${value}'`)\n } else if (typeof value === 'boolean') {\n content = content.replace(configRegex, `${key}: ${value}`)\n } else if (typeof value === 'object') {\n content = content.replace(configRegex, `${key}: ${JSON.stringify(value, null, 2)}`)\n }\n } else {\n // Add new config option\n const configValue =\n typeof value === 'string'\n ? `'${value}'`\n : typeof value === 'object'\n ? JSON.stringify(value, null, 2)\n : value\n content = content.replace(\n /export default buildConfig\\(\\{/,\n `export default buildConfig({\\n ${key}: ${configValue},`,\n )\n }\n }\n })\n\n return content\n}\n\n/**\n * Updates collection-level configuration in a collection file\n */\nexport function updateCollectionConfig(\n content: string,\n updates: CollectionConfigUpdates,\n collectionName: string,\n): string {\n let updatedContent = content\n\n if (updates.slug) {\n updatedContent = updatedContent.replace(/slug:\\s*'[^']*'/, `slug: '${updates.slug}'`)\n }\n\n if (updates.access) {\n const accessRegex = /access:\\s*\\{[^}]*\\}/\n if (updatedContent.match(accessRegex)) {\n // Update existing access config\n Object.entries(updates.access).forEach(([key, value]) => {\n if (value !== undefined) {\n updatedContent = updatedContent.replace(\n new RegExp(`${key}:\\\\s*[^,}]*`),\n `${key}: ${value}`,\n )\n }\n })\n } else {\n // Add access config\n const accessConfig = Object.entries(updates.access)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(',\\n')\n\n updatedContent = updatedContent.replace(\n /slug:\\s*'[^']*',/,\n `slug: '${collectionName}',\\n access: {\\n${accessConfig}\\n },`,\n )\n }\n }\n\n if (updates.timestamps !== undefined) {\n if (updatedContent.includes('timestamps:')) {\n updatedContent = updatedContent.replace(\n /timestamps:[^,}]*/,\n `timestamps: ${updates.timestamps}`,\n )\n } else {\n updatedContent = updatedContent.replace(\n /fields:\\s*\\[/,\n `timestamps: ${updates.timestamps},\\n fields: [`,\n )\n }\n }\n\n if (updates.versioning !== undefined) {\n if (updatedContent.includes('versioning:')) {\n updatedContent = updatedContent.replace(\n /versioning:[^,}]*/,\n `versioning: ${updates.versioning}`,\n )\n } else {\n updatedContent = updatedContent.replace(\n /fields:\\s*\\[/,\n `versioning: ${updates.versioning},\\n fields: [`,\n )\n }\n }\n\n return updatedContent\n}\n"],"names":["addCollectionToConfig","content","collectionName","capitalizedName","charAt","toUpperCase","slice","importRegex","importMatches","match","length","lastImport","newImport","includes","replace","importInsertPoint","indexOf","lineEnd","collectionsRegex","collectionsMatch","collectionsContent","trim","newCollections","removeCollectionFromConfig","RegExp","updateAdminConfig","adminConfig","adminRegex","adminMatch","adminContent","user","meta","metaConfig","Object","entries","map","key","value","join","adminConfigEntries","push","adminConfigString","updateDatabaseConfig","databaseConfig","type","dbRegex","mongoImportRegex","dbConfig","url","updatePluginsConfig","pluginUpdates","add","forEach","pluginImport","pluginsRegex","pluginsMatch","pluginsContent","remove","pluginName","pluginRegex","updateGeneralConfig","generalConfig","undefined","configRegex","JSON","stringify","configValue","updateCollectionConfig","updates","updatedContent","slug","access","accessRegex","accessConfig","filter","timestamps","versioning"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mcp/helpers/config.ts"],"sourcesContent":["import type { AdminConfig, DatabaseConfig, PluginUpdates } from '../../types.js'\n\n/**\n * Adds a collection to the payload.config.ts file\n */\nexport function addCollectionToConfig(content: string, collectionName: string): string {\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n\n // Add import statement\n const importRegex = /import.*from\\s*['\"]\\.\\/collections\\/.*['\"]/g\n const importMatches = content.match(importRegex)\n\n if (importMatches && importMatches.length > 0) {\n const lastImport = importMatches[importMatches.length - 1]\n const newImport = `import { ${capitalizedName} } from './collections/${capitalizedName}'`\n\n // Check if import already exists\n if (lastImport && !content.includes(newImport)) {\n content = content.replace(lastImport, `${lastImport}\\n${newImport}`)\n }\n } else {\n // Add import after existing imports\n const importInsertPoint = content.indexOf(\"import sharp from 'sharp'\")\n if (importInsertPoint !== -1) {\n const lineEnd = content.indexOf('\\n', importInsertPoint)\n const newImport = `import { ${capitalizedName} } from './collections/${capitalizedName}'`\n content = content.slice(0, lineEnd + 1) + newImport + '\\n' + content.slice(lineEnd + 1)\n }\n }\n\n // Add to collections array\n const collectionsRegex = /collections:\\s*\\[([\\s\\S]*?)\\]/\n const collectionsMatch = content.match(collectionsRegex)\n\n if (collectionsMatch && collectionsMatch[1]) {\n const collectionsContent = collectionsMatch[1].trim()\n if (!collectionsContent.includes(capitalizedName)) {\n const newCollections = collectionsContent\n ? `${collectionsContent}, ${capitalizedName}`\n : capitalizedName\n content = content.replace(collectionsRegex, `collections: [${newCollections}]`)\n }\n }\n\n return content\n}\n\n/**\n * Removes a collection from the payload.config.ts file\n */\nexport function removeCollectionFromConfig(content: string, collectionName: string): string {\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n\n // Remove import statement\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${capitalizedName}\\\\s*}\\\\s*from\\\\s*['\"]\\\\./collections/${capitalizedName}['\"]\\\\s*\\\\n?`,\n 'g',\n )\n content = content.replace(importRegex, '')\n\n // Remove from collections array\n const collectionsRegex = /collections:\\s*\\[([\\s\\S]*?)\\]/\n const collectionsMatch = content.match(collectionsRegex)\n\n if (collectionsMatch && collectionsMatch[1]) {\n let collectionsContent = collectionsMatch[1]\n\n // Remove the collection name and clean up commas\n collectionsContent = collectionsContent.replace(\n new RegExp(`\\\\s*,?\\\\s*${capitalizedName}\\\\s*,?`, 'g'),\n '',\n )\n collectionsContent = collectionsContent.replace(/,\\s*,/g, ',') // Remove double commas\n collectionsContent = collectionsContent.replace(/^\\s*,|,\\s*$/g, '') // Remove leading/trailing commas\n\n content = content.replace(collectionsRegex, `collections: [${collectionsContent}]`)\n }\n\n // Clean up any double newlines from removed imports\n content = content.replace(/\\n{3,}/g, '\\n\\n')\n\n return content\n}\n\n/**\n * Updates admin configuration in payload.config.ts\n */\nexport function updateAdminConfig(content: string, adminConfig: AdminConfig): string {\n const adminRegex = /admin:\\s*\\{([^}]*)\\}/\n const adminMatch = content.match(adminRegex)\n\n if (adminMatch && adminMatch[1]) {\n let adminContent = adminMatch[1]\n\n // Update specific admin properties\n if (adminConfig.user) {\n if (adminContent.includes('user:')) {\n adminContent = adminContent.replace(/user:[^,}]*/, `user: ${adminConfig.user}.slug`)\n } else {\n adminContent = `\\n user: ${adminConfig.user}.slug,${adminContent}`\n }\n }\n\n if (adminConfig.meta) {\n const metaConfig = Object.entries(adminConfig.meta)\n .map(([key, value]) => ` ${key}: '${value}'`)\n .join(',\\n')\n\n if (adminContent.includes('meta:')) {\n adminContent = adminContent.replace(/meta:\\s*\\{[^}]*\\}/, `meta: {\\n${metaConfig}\\n }`)\n } else {\n adminContent = `${adminContent}\\n meta: {\\n${metaConfig}\\n },`\n }\n }\n\n content = content.replace(adminRegex, `admin: {${adminContent}\\n }`)\n } else {\n // Add admin config if it doesn't exist\n const adminConfigEntries = []\n\n if (adminConfig.user) {\n adminConfigEntries.push(` user: ${adminConfig.user}.slug`)\n }\n\n if (adminConfig.meta) {\n const metaConfig = Object.entries(adminConfig.meta)\n .map(([key, value]) => ` ${key}: '${value}'`)\n .join(',\\n')\n adminConfigEntries.push(` meta: {\\n${metaConfig}\\n }`)\n }\n\n const adminConfigString = `admin: {\\n${adminConfigEntries.join(',\\n')}\\n },`\n content = content.replace(\n /export default buildConfig\\(\\{/,\n `export default buildConfig({\\n ${adminConfigString}`,\n )\n }\n\n return content\n}\n\n/**\n * Updates database configuration in payload.config.ts\n */\nexport function updateDatabaseConfig(content: string, databaseConfig: DatabaseConfig): string {\n if (databaseConfig.type === 'mongodb') {\n // Update to MongoDB adapter\n const dbRegex = /db:[^,}]*(?:,|\\})/\n const mongoImportRegex = /import.*mongooseAdapter.*from.*@payloadcms\\/db-mongodb.*/\n\n if (!content.match(mongoImportRegex)) {\n content = content.replace(\n /(import.*from.*payload.*\\n)/,\n `$1import { mongooseAdapter } from '@payloadcms/db-mongodb'\\n`,\n )\n }\n\n const dbConfig = `db: mongooseAdapter({\\n url: process.env.DATABASE_URL || '${databaseConfig.url || ''}',\\n })`\n content = content.replace(dbRegex, `${dbConfig},`)\n }\n\n return content\n}\n\n/**\n * Updates plugins configuration in payload.config.ts\n */\nexport function updatePluginsConfig(content: string, pluginUpdates: PluginUpdates): string {\n // Add plugin imports\n if (pluginUpdates.add) {\n pluginUpdates.add.forEach((pluginImport: string) => {\n if (!content.includes(pluginImport)) {\n content = content.replace(/(import.*from.*payload.*\\n)/, `$1${pluginImport}\\n`)\n }\n })\n }\n\n // Handle plugins array\n const pluginsRegex = /plugins:\\s*\\[([\\s\\S]*?)\\]/\n const pluginsMatch = content.match(pluginsRegex)\n\n if (pluginsMatch && pluginsMatch[1]) {\n let pluginsContent = pluginsMatch[1]\n\n // Remove plugins\n if (pluginUpdates.remove) {\n pluginUpdates.remove.forEach((pluginName: string) => {\n const pluginRegex = new RegExp(`\\\\s*${pluginName}\\\\(\\\\)\\\\s*,?`, 'g')\n pluginsContent = pluginsContent.replace(pluginRegex, '')\n })\n }\n\n // Add plugins\n if (pluginUpdates.add) {\n pluginUpdates.add.forEach((pluginImport: string) => {\n // This will match: import { PluginName } from '...';\n const match = pluginImport.match(/import\\s*\\{\\s*(\\w+)\\s*\\}/)\n if (match && match[1]) {\n const pluginName = match[1]\n if (!pluginsContent.includes(`${pluginName}(`)) {\n pluginsContent = pluginsContent.trim()\n ? `${pluginsContent}\\n ${pluginName}(),`\n : `\\n ${pluginName}(),`\n }\n }\n })\n }\n\n content = content.replace(pluginsRegex, `plugins: [${pluginsContent}\\n ]`)\n }\n\n return content\n}\n"],"names":["addCollectionToConfig","content","collectionName","capitalizedName","charAt","toUpperCase","slice","importRegex","importMatches","match","length","lastImport","newImport","includes","replace","importInsertPoint","indexOf","lineEnd","collectionsRegex","collectionsMatch","collectionsContent","trim","newCollections","removeCollectionFromConfig","RegExp","updateAdminConfig","adminConfig","adminRegex","adminMatch","adminContent","user","meta","metaConfig","Object","entries","map","key","value","join","adminConfigEntries","push","adminConfigString","updateDatabaseConfig","databaseConfig","type","dbRegex","mongoImportRegex","dbConfig","url","updatePluginsConfig","pluginUpdates","add","forEach","pluginImport","pluginsRegex","pluginsMatch","pluginsContent","remove","pluginName","pluginRegex"],"mappings":"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"}
|
|
@@ -1,27 +1,9 @@
|
|
|
1
|
-
type FieldDefinition
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}[];
|
|
8
|
-
position?: 'main' | 'sidebar';
|
|
9
|
-
required?: boolean;
|
|
10
|
-
type: string;
|
|
11
|
-
};
|
|
12
|
-
type FieldModification = {
|
|
13
|
-
changes: {
|
|
14
|
-
description?: string;
|
|
15
|
-
options?: {
|
|
16
|
-
label: string;
|
|
17
|
-
value: string;
|
|
18
|
-
}[];
|
|
19
|
-
position?: 'main' | 'sidebar';
|
|
20
|
-
required?: boolean;
|
|
21
|
-
type?: string;
|
|
22
|
-
};
|
|
23
|
-
fieldName: string;
|
|
24
|
-
};
|
|
1
|
+
import type { FieldDefinition, FieldModification } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates the TypeScript source string for a single field definition block.
|
|
4
|
+
* Used when writing collection files to disk.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateFieldDefinitionString(field: FieldDefinition): string;
|
|
25
7
|
/**
|
|
26
8
|
* Adds new fields to a collection file content
|
|
27
9
|
*/
|
|
@@ -34,5 +16,4 @@ export declare function removeFieldsFromCollection(content: string, fieldNames:
|
|
|
34
16
|
* Modifies existing fields in a collection file content
|
|
35
17
|
*/
|
|
36
18
|
export declare function modifyFieldsInCollection(content: string, modifications: FieldModification[]): string;
|
|
37
|
-
export {};
|
|
38
19
|
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/fields.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAWxE;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAiC5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,CAqB3F;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBxF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,iBAAiB,EAAE,GACjC,MAAM,CAiDR"}
|
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
/** Escapes a value for safe embedding inside a single-quoted TypeScript string literal. */ function escapeSingleQuotedString(value) {
|
|
2
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\r/g, '\\r').replace(/\n/g, '\\n');
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Generates the TypeScript source string for a single field definition block.
|
|
6
|
+
* Used when writing collection files to disk.
|
|
7
|
+
*/ export function generateFieldDefinitionString(field) {
|
|
8
|
+
const lines = [];
|
|
9
|
+
lines.push(` {`);
|
|
10
|
+
lines.push(` name: '${escapeSingleQuotedString(field.name)}',`);
|
|
11
|
+
lines.push(` type: '${escapeSingleQuotedString(field.type)}',`);
|
|
12
|
+
if (field.required) {
|
|
13
|
+
lines.push(` required: true,`);
|
|
14
|
+
}
|
|
15
|
+
if (field.description || field.position) {
|
|
16
|
+
lines.push(` admin: {`);
|
|
17
|
+
if (field.description) {
|
|
18
|
+
lines.push(` description: '${escapeSingleQuotedString(field.description)}',`);
|
|
19
|
+
}
|
|
20
|
+
if (field.position) {
|
|
21
|
+
lines.push(` position: '${escapeSingleQuotedString(field.position)}',`);
|
|
22
|
+
}
|
|
23
|
+
lines.push(` },`);
|
|
24
|
+
}
|
|
25
|
+
if (field.options && field.type === 'select') {
|
|
26
|
+
lines.push(` options: [`);
|
|
27
|
+
field.options.forEach((option)=>{
|
|
28
|
+
lines.push(` { label: '${escapeSingleQuotedString(option.label)}', value: '${escapeSingleQuotedString(option.value)}' },`);
|
|
29
|
+
});
|
|
30
|
+
lines.push(` ],`);
|
|
31
|
+
}
|
|
32
|
+
lines.push(` },`);
|
|
33
|
+
return lines.join('\n');
|
|
34
|
+
}
|
|
1
35
|
/**
|
|
2
36
|
* Adds new fields to a collection file content
|
|
3
37
|
*/ export function addFieldsToCollection(content, newFields) {
|
|
@@ -7,35 +41,7 @@
|
|
|
7
41
|
if (!match) {
|
|
8
42
|
throw new Error('Could not find fields array in collection file');
|
|
9
43
|
}
|
|
10
|
-
|
|
11
|
-
const newFieldDefinitions = newFields.map((field)=>{
|
|
12
|
-
const fieldConfig = [];
|
|
13
|
-
fieldConfig.push(` {`);
|
|
14
|
-
fieldConfig.push(` name: '${field.name}',`);
|
|
15
|
-
fieldConfig.push(` type: '${field.type}',`);
|
|
16
|
-
if (field.required) {
|
|
17
|
-
fieldConfig.push(` required: true,`);
|
|
18
|
-
}
|
|
19
|
-
if (field.description || field.position) {
|
|
20
|
-
fieldConfig.push(` admin: {`);
|
|
21
|
-
if (field.description) {
|
|
22
|
-
fieldConfig.push(` description: '${field.description}',`);
|
|
23
|
-
}
|
|
24
|
-
if (field.position) {
|
|
25
|
-
fieldConfig.push(` position: '${field.position}',`);
|
|
26
|
-
}
|
|
27
|
-
fieldConfig.push(` },`);
|
|
28
|
-
}
|
|
29
|
-
if (field.options && field.type === 'select') {
|
|
30
|
-
fieldConfig.push(` options: [`);
|
|
31
|
-
field.options.forEach((option)=>{
|
|
32
|
-
fieldConfig.push(` { label: '${option.label}', value: '${option.value}' },`);
|
|
33
|
-
});
|
|
34
|
-
fieldConfig.push(` ],`);
|
|
35
|
-
}
|
|
36
|
-
fieldConfig.push(` },`);
|
|
37
|
-
return fieldConfig.join('\n');
|
|
38
|
-
}).join('\n');
|
|
44
|
+
const newFieldDefinitions = newFields.map(generateFieldDefinitionString).join('\n');
|
|
39
45
|
// Add new fields before the closing bracket
|
|
40
46
|
const existingFields = match[1] || '';
|
|
41
47
|
const hasTrailingComma = existingFields.trim().endsWith(',');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mcp/helpers/fields.ts"],"sourcesContent":["type FieldDefinition
|
|
1
|
+
{"version":3,"sources":["../../../src/mcp/helpers/fields.ts"],"sourcesContent":["import type { FieldDefinition, FieldModification } from '../../types.js'\n\n/** Escapes a value for safe embedding inside a single-quoted TypeScript string literal. */\nfunction escapeSingleQuotedString(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n')\n}\n\n/**\n * Generates the TypeScript source string for a single field definition block.\n * Used when writing collection files to disk.\n */\nexport function generateFieldDefinitionString(field: FieldDefinition): string {\n const lines: string[] = []\n lines.push(` {`)\n lines.push(` name: '${escapeSingleQuotedString(field.name)}',`)\n lines.push(` type: '${escapeSingleQuotedString(field.type)}',`)\n\n if (field.required) {\n lines.push(` required: true,`)\n }\n\n if (field.description || field.position) {\n lines.push(` admin: {`)\n if (field.description) {\n lines.push(` description: '${escapeSingleQuotedString(field.description)}',`)\n }\n if (field.position) {\n lines.push(` position: '${escapeSingleQuotedString(field.position)}',`)\n }\n lines.push(` },`)\n }\n\n if (field.options && field.type === 'select') {\n lines.push(` options: [`)\n field.options.forEach((option) => {\n lines.push(\n ` { label: '${escapeSingleQuotedString(option.label)}', value: '${escapeSingleQuotedString(option.value)}' },`,\n )\n })\n lines.push(` ],`)\n }\n\n lines.push(` },`)\n return lines.join('\\n')\n}\n\n/**\n * Adds new fields to a collection file content\n */\nexport function addFieldsToCollection(content: string, newFields: FieldDefinition[]): string {\n // Find the fields array closing bracket\n const fieldsRegex = /fields:\\s*\\[([\\s\\S]*?)\\]\\s*(?:,\\s*)?\\}/\n const match = content.match(fieldsRegex)\n\n if (!match) {\n throw new Error('Could not find fields array in collection file')\n }\n\n const newFieldDefinitions = newFields.map(generateFieldDefinitionString).join('\\n')\n\n // Add new fields before the closing bracket\n const existingFields = match[1] || ''\n const hasTrailingComma = existingFields.trim().endsWith(',')\n const separator = hasTrailingComma ? '\\n' : ',\\n'\n\n return content.replace(\n fieldsRegex,\n `fields: [${existingFields}${separator}${newFieldDefinitions}\\n ],\n}`,\n )\n}\n\n/**\n * Removes fields from a collection file content\n */\nexport function removeFieldsFromCollection(content: string, fieldNames: string[]): string {\n let updatedContent = content\n\n fieldNames.forEach((fieldName) => {\n // Create regex to match the field definition\n const fieldRegex = new RegExp(\n `\\\\s*{[^}]*name:\\\\s*['\"]${fieldName}['\"][^}]*}[^}]*(?:},?|,?\\\\s*})`,\n 'gs',\n )\n updatedContent = updatedContent.replace(fieldRegex, '')\n })\n\n // Clean up any double commas or trailing commas\n updatedContent = updatedContent.replace(/,\\s*,/g, ',')\n updatedContent = updatedContent.replace(/,\\s*\\]/g, '\\n ]')\n\n return updatedContent\n}\n\n/**\n * Modifies existing fields in a collection file content\n */\nexport function modifyFieldsInCollection(\n content: string,\n modifications: FieldModification[],\n): string {\n let updatedContent = content\n\n modifications.forEach((mod) => {\n const { changes, fieldName } = mod\n\n // Find the field definition\n const fieldRegex = new RegExp(`({[^}]*name:\\\\s*['\"]${fieldName}['\"][^}]*})`, 'gs')\n const fieldMatch = updatedContent.match(fieldRegex)\n\n if (fieldMatch) {\n let fieldDef = fieldMatch[0]\n\n // Apply changes\n if (changes.type) {\n fieldDef = fieldDef.replace(/type:\\s*'[^']*'/, `type: '${changes.type}'`)\n }\n\n if (changes.required !== undefined) {\n if (fieldDef.includes('required:')) {\n fieldDef = fieldDef.replace(/required:[^,]*/, `required: ${changes.required}`)\n } else {\n fieldDef = fieldDef.replace(\n /type:\\s*'[^']*',/,\n `type: '${changes.type}',\\n required: ${changes.required},`,\n )\n }\n }\n\n if (changes.description) {\n const adminRegex = /admin:\\s*\\{[^}]*\\}/\n if (fieldDef.match(adminRegex)) {\n fieldDef = fieldDef.replace(\n /description:\\s*'[^']*'/,\n `description: '${changes.description}'`,\n )\n } else {\n fieldDef = fieldDef.replace(\n /\\},?\\s*$/,\n `,\\n admin: {\\n description: '${changes.description}',\\n },\\n }`,\n )\n }\n }\n\n updatedContent = updatedContent.replace(fieldRegex, fieldDef)\n }\n })\n\n return updatedContent\n}\n"],"names":["escapeSingleQuotedString","value","replace","generateFieldDefinitionString","field","lines","push","name","type","required","description","position","options","forEach","option","label","join","addFieldsToCollection","content","newFields","fieldsRegex","match","Error","newFieldDefinitions","map","existingFields","hasTrailingComma","trim","endsWith","separator","removeFieldsFromCollection","fieldNames","updatedContent","fieldName","fieldRegex","RegExp","modifyFieldsInCollection","modifications","mod","changes","fieldMatch","fieldDef","undefined","includes","adminRegex"],"mappings":"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"}
|