@strapi/core 5.44.0 → 5.45.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,eAAe,CAAC;AAiF1D,wBAA8B,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,iBAqD5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/loaders/plugins/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,eAAe,CAAC;AA2F1D,wBAA8B,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,iBAqD5D"}
@@ -55,20 +55,30 @@ const applyUserExtension = async (plugins)=>{
55
55
  for (const pluginName of Object.keys(plugins)){
56
56
  const plugin = plugins[pluginName];
57
57
  // first: load json schema
58
- for (const ctName of Object.keys(plugin.contentTypes)){
58
+ const extendedContentTypes = fp.get([
59
+ pluginName,
60
+ 'content-types'
61
+ ], extendedSchemas) ?? {};
62
+ for (const ctName of Object.keys(extendedContentTypes)){
59
63
  const extendedSchema = fp.get([
60
- pluginName,
61
- 'content-types',
62
64
  ctName,
63
65
  'schema'
64
- ], extendedSchemas);
65
- if (extendedSchema) {
66
+ ], extendedContentTypes);
67
+ if (!extendedSchema) {
68
+ continue;
69
+ }
70
+ if (!plugin.contentTypes[ctName]) {
71
+ plugin.contentTypes[ctName] = {
72
+ schema: extendedSchema
73
+ };
74
+ } else {
66
75
  plugin.contentTypes[ctName].schema = {
67
76
  ...plugin.contentTypes[ctName].schema,
68
77
  ...extendedSchema
69
78
  };
70
79
  }
71
80
  }
81
+ formatContentTypes(pluginName, plugin.contentTypes);
72
82
  // second: execute strapi-server extension
73
83
  const strapiServer = fp.get([
74
84
  pluginName,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport * as resolve from 'resolve.exports';\n\nimport { env } from '@strapi/utils';\nimport type { Core, Plugin, Struct } from '@strapi/types';\nimport { loadConfigFile } from '../../utils/load-config-file';\nimport { loadFiles } from '../../utils/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\nimport { getGlobalId } from '../../domain/content-type';\n\ninterface Plugins {\n [key: string]: Plugin.LoadedPlugin;\n}\n\nconst defaultPlugin = {\n bootstrap() {},\n destroy() {},\n register() {},\n config: {\n default: {},\n validator() {},\n },\n routes: [],\n controllers: {},\n services: {},\n policies: {},\n middlewares: {},\n contentTypes: {},\n};\n\nconst applyUserExtension = async (plugins: Plugins) => {\n const extensionsDir = strapi.dirs.dist.extensions;\n if (!(await fse.pathExists(extensionsDir))) {\n return;\n }\n\n const extendedSchemas = await loadFiles(extensionsDir, '**/content-types/**/schema.json');\n const strapiServers = await loadFiles(extensionsDir, '**/strapi-server.js');\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n // first: load json schema\n for (const ctName of Object.keys(plugin.contentTypes)) {\n const extendedSchema = get([pluginName, 'content-types', ctName, 'schema'], extendedSchemas);\n if (extendedSchema) {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n // second: execute strapi-server extension\n const strapiServer = get([pluginName, 'strapi-server'], strapiServers);\n if (strapiServer) {\n plugins[pluginName] = await strapiServer(plugin);\n }\n }\n};\n\nconst applyUserConfig = async (plugins: Plugins) => {\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig);\n const defaultConfig =\n typeof plugin.config.default === 'function'\n ? plugin.config.default({ env })\n : plugin.config.default;\n\n const config = defaultsDeep(defaultConfig, userPluginConfig);\n try {\n plugin.config.validator(config);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error regarding ${pluginName} config: ${e.message}`);\n }\n\n throw e;\n }\n plugin.config = config;\n }\n};\n\nexport default async function loadPlugins(strapi: Core.Strapi) {\n const plugins: Plugins = {};\n\n const enabledPlugins = await getEnabledPlugins(strapi);\n\n strapi.config.set('enabledPlugins', enabledPlugins);\n\n for (const pluginName of Object.keys(enabledPlugins)) {\n const enabledPlugin = enabledPlugins[pluginName];\n\n let serverEntrypointPath;\n let resolvedExport = './strapi-server.js';\n\n try {\n resolvedExport = (\n resolve.exports(enabledPlugin.packageInfo, 'strapi-server', {\n require: true,\n }) ?? './strapi-server.js'\n ).toString();\n } catch (e) {\n // no export map or missing strapi-server export => fallback to default\n }\n\n try {\n serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport);\n } catch (e) {\n throw new Error(\n `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`\n );\n }\n\n // only load plugins with a server entrypoint\n if (!(await fse.pathExists(serverEntrypointPath))) {\n continue;\n }\n\n const pluginServer = loadConfigFile(serverEntrypointPath);\n plugins[pluginName] = {\n ...defaultPlugin,\n ...pluginServer,\n contentTypes: formatContentTypes(pluginName, pluginServer.contentTypes ?? {}),\n config: defaults(defaultPlugin.config, pluginServer.config),\n routes: pluginServer.routes ?? defaultPlugin.routes,\n };\n }\n\n // TODO: validate plugin format\n await applyUserConfig(plugins);\n await applyUserExtension(plugins);\n\n for (const pluginName of Object.keys(plugins)) {\n strapi.get('plugins').add(pluginName, plugins[pluginName]);\n }\n}\n\nconst formatContentTypes = (\n pluginName: string,\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>\n) => {\n Object.values(contentTypes).forEach((definition) => {\n const { schema } = definition;\n\n Object.assign(schema, {\n plugin: pluginName,\n collectionName:\n schema.collectionName || `${pluginName}_${schema.info.singularName}`.toLowerCase(),\n globalId: getGlobalId(schema, pluginName),\n });\n });\n\n return contentTypes;\n};\n"],"names":["defaultPlugin","bootstrap","destroy","register","config","default","validator","routes","controllers","services","policies","middlewares","contentTypes","applyUserExtension","plugins","extensionsDir","strapi","dirs","dist","extensions","fse","pathExists","extendedSchemas","loadFiles","strapiServers","pluginName","Object","keys","plugin","ctName","extendedSchema","get","schema","strapiServer","applyUserConfig","userPluginsConfig","getUserPluginsConfig","userPluginConfig","getOr","defaultConfig","env","defaultsDeep","e","Error","message","loadPlugins","enabledPlugins","getEnabledPlugins","set","enabledPlugin","serverEntrypointPath","resolvedExport","resolve","exports","packageInfo","require","toString","join","pathToPlugin","pluginServer","loadConfigFile","formatContentTypes","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport * as resolve from 'resolve.exports';\n\nimport { env } from '@strapi/utils';\nimport type { Core, Plugin, Struct } from '@strapi/types';\nimport { loadConfigFile } from '../../utils/load-config-file';\nimport { loadFiles } from '../../utils/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\nimport { getGlobalId } from '../../domain/content-type';\n\ninterface Plugins {\n [key: string]: Plugin.LoadedPlugin;\n}\n\nconst defaultPlugin = {\n bootstrap() {},\n destroy() {},\n register() {},\n config: {\n default: {},\n validator() {},\n },\n routes: [],\n controllers: {},\n services: {},\n policies: {},\n middlewares: {},\n contentTypes: {},\n};\n\nconst applyUserExtension = async (plugins: Plugins) => {\n const extensionsDir = strapi.dirs.dist.extensions;\n if (!(await fse.pathExists(extensionsDir))) {\n return;\n }\n\n const extendedSchemas = await loadFiles(extensionsDir, '**/content-types/**/schema.json');\n const strapiServers = await loadFiles(extensionsDir, '**/strapi-server.js');\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n // first: load json schema\n const extendedContentTypes = get([pluginName, 'content-types'], extendedSchemas) ?? {};\n for (const ctName of Object.keys(extendedContentTypes)) {\n const extendedSchema = get([ctName, 'schema'], extendedContentTypes);\n if (!extendedSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (!plugin.contentTypes[ctName]) {\n plugin.contentTypes[ctName] = { schema: extendedSchema };\n } else {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n\n formatContentTypes(pluginName, plugin.contentTypes);\n // second: execute strapi-server extension\n const strapiServer = get([pluginName, 'strapi-server'], strapiServers);\n if (strapiServer) {\n plugins[pluginName] = await strapiServer(plugin);\n }\n }\n};\n\nconst applyUserConfig = async (plugins: Plugins) => {\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig);\n const defaultConfig =\n typeof plugin.config.default === 'function'\n ? plugin.config.default({ env })\n : plugin.config.default;\n\n const config = defaultsDeep(defaultConfig, userPluginConfig);\n try {\n plugin.config.validator(config);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error regarding ${pluginName} config: ${e.message}`);\n }\n\n throw e;\n }\n plugin.config = config;\n }\n};\n\nexport default async function loadPlugins(strapi: Core.Strapi) {\n const plugins: Plugins = {};\n\n const enabledPlugins = await getEnabledPlugins(strapi);\n\n strapi.config.set('enabledPlugins', enabledPlugins);\n\n for (const pluginName of Object.keys(enabledPlugins)) {\n const enabledPlugin = enabledPlugins[pluginName];\n\n let serverEntrypointPath;\n let resolvedExport = './strapi-server.js';\n\n try {\n resolvedExport = (\n resolve.exports(enabledPlugin.packageInfo, 'strapi-server', {\n require: true,\n }) ?? './strapi-server.js'\n ).toString();\n } catch (e) {\n // no export map or missing strapi-server export => fallback to default\n }\n\n try {\n serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport);\n } catch (e) {\n throw new Error(\n `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`\n );\n }\n\n // only load plugins with a server entrypoint\n if (!(await fse.pathExists(serverEntrypointPath))) {\n continue;\n }\n\n const pluginServer = loadConfigFile(serverEntrypointPath);\n plugins[pluginName] = {\n ...defaultPlugin,\n ...pluginServer,\n contentTypes: formatContentTypes(pluginName, pluginServer.contentTypes ?? {}),\n config: defaults(defaultPlugin.config, pluginServer.config),\n routes: pluginServer.routes ?? defaultPlugin.routes,\n };\n }\n\n // TODO: validate plugin format\n await applyUserConfig(plugins);\n await applyUserExtension(plugins);\n\n for (const pluginName of Object.keys(plugins)) {\n strapi.get('plugins').add(pluginName, plugins[pluginName]);\n }\n}\n\nconst formatContentTypes = (\n pluginName: string,\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>\n) => {\n Object.values(contentTypes).forEach((definition) => {\n const { schema } = definition;\n\n Object.assign(schema, {\n plugin: pluginName,\n collectionName:\n schema.collectionName || `${pluginName}_${schema.info.singularName}`.toLowerCase(),\n globalId: getGlobalId(schema, pluginName),\n });\n });\n\n return contentTypes;\n};\n"],"names":["defaultPlugin","bootstrap","destroy","register","config","default","validator","routes","controllers","services","policies","middlewares","contentTypes","applyUserExtension","plugins","extensionsDir","strapi","dirs","dist","extensions","fse","pathExists","extendedSchemas","loadFiles","strapiServers","pluginName","Object","keys","plugin","extendedContentTypes","get","ctName","extendedSchema","schema","formatContentTypes","strapiServer","applyUserConfig","userPluginsConfig","getUserPluginsConfig","userPluginConfig","getOr","defaultConfig","env","defaultsDeep","e","Error","message","loadPlugins","enabledPlugins","getEnabledPlugins","set","enabledPlugin","serverEntrypointPath","resolvedExport","resolve","exports","packageInfo","require","toString","join","pathToPlugin","pluginServer","loadConfigFile","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAMA,aAAAA,GAAgB;IACpBC,SAAAA,CAAAA,GAAAA,CAAa,CAAA;IACbC,OAAAA,CAAAA,GAAAA,CAAW,CAAA;IACXC,QAAAA,CAAAA,GAAAA,CAAY,CAAA;IACZC,MAAAA,EAAQ;AACNC,QAAAA,OAAAA,EAAS,EAAC;QACVC,SAAAA,CAAAA,GAAAA,CAAa;AACf,KAAA;AACAC,IAAAA,MAAAA,EAAQ,EAAE;AACVC,IAAAA,WAAAA,EAAa,EAAC;AACdC,IAAAA,QAAAA,EAAU,EAAC;AACXC,IAAAA,QAAAA,EAAU,EAAC;AACXC,IAAAA,WAAAA,EAAa,EAAC;AACdC,IAAAA,YAAAA,EAAc;AAChB,CAAA;AAEA,MAAMC,qBAAqB,OAAOC,OAAAA,GAAAA;AAChC,IAAA,MAAMC,gBAAgBC,MAAAA,CAAOC,IAAI,CAACC,IAAI,CAACC,UAAU;AACjD,IAAA,IAAI,CAAE,MAAMC,GAAAA,CAAIC,UAAU,CAACN,aAAAA,CAAAA,EAAiB;AAC1C,QAAA;AACF,IAAA;IAEA,MAAMO,eAAAA,GAAkB,MAAMC,mBAAAA,CAAUR,aAAAA,EAAe,iCAAA,CAAA;IACvD,MAAMS,aAAAA,GAAgB,MAAMD,mBAAAA,CAAUR,aAAAA,EAAe,qBAAA,CAAA;AAErD,IAAA,KAAK,MAAMU,UAAAA,IAAcC,MAAAA,CAAOC,IAAI,CAACb,OAAAA,CAAAA,CAAU;QAC7C,MAAMc,MAAAA,GAASd,OAAO,CAACW,UAAAA,CAAW;;AAElC,QAAA,MAAMI,uBAAuBC,MAAAA,CAAI;AAACL,YAAAA,UAAAA;AAAY,YAAA;AAAgB,SAAA,EAAEH,oBAAoB,EAAC;AACrF,QAAA,KAAK,MAAMS,MAAAA,IAAUL,MAAAA,CAAOC,IAAI,CAACE,oBAAAA,CAAAA,CAAuB;AACtD,YAAA,MAAMG,iBAAiBF,MAAAA,CAAI;AAACC,gBAAAA,MAAAA;AAAQ,gBAAA;aAAS,EAAEF,oBAAAA,CAAAA;AAC/C,YAAA,IAAI,CAACG,cAAAA,EAAgB;AAEnB,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,CAACJ,MAAAA,CAAOhB,YAAY,CAACmB,OAAO,EAAE;gBAChCH,MAAAA,CAAOhB,YAAY,CAACmB,MAAAA,CAAO,GAAG;oBAAEE,MAAAA,EAAQD;AAAe,iBAAA;YACzD,CAAA,MAAO;AACLJ,gBAAAA,MAAAA,CAAOhB,YAAY,CAACmB,MAAAA,CAAO,CAACE,MAAM,GAAG;AACnC,oBAAA,GAAGL,MAAAA,CAAOhB,YAAY,CAACmB,MAAAA,CAAO,CAACE,MAAM;AACrC,oBAAA,GAAGD;AACL,iBAAA;AACF,YAAA;AACF,QAAA;QAEAE,kBAAAA,CAAmBT,UAAAA,EAAYG,OAAOhB,YAAY,CAAA;;AAElD,QAAA,MAAMuB,eAAeL,MAAAA,CAAI;AAACL,YAAAA,UAAAA;AAAY,YAAA;SAAgB,EAAED,aAAAA,CAAAA;AACxD,QAAA,IAAIW,YAAAA,EAAc;AAChBrB,YAAAA,OAAO,CAACW,UAAAA,CAAW,GAAG,MAAMU,YAAAA,CAAaP,MAAAA,CAAAA;AAC3C,QAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMQ,kBAAkB,OAAOtB,OAAAA,GAAAA;AAC7B,IAAA,MAAMuB,oBAAoB,MAAMC,yCAAAA,EAAAA;AAEhC,IAAA,KAAK,MAAMb,UAAAA,IAAcC,MAAAA,CAAOC,IAAI,CAACb,OAAAA,CAAAA,CAAU;QAC7C,MAAMc,MAAAA,GAASd,OAAO,CAACW,UAAAA,CAAW;QAClC,MAAMc,gBAAAA,GAAmBC,SAAM,EAAC,EAAG,GAAGf,UAAAA,CAAW,OAAO,CAAC,EAAEY,iBAAAA,CAAAA;AAC3D,QAAA,MAAMI,aAAAA,GACJ,OAAOb,MAAAA,CAAOxB,MAAM,CAACC,OAAO,KAAK,UAAA,GAC7BuB,MAAAA,CAAOxB,MAAM,CAACC,OAAO,CAAC;AAAEqC,iBAAAA;SAAI,CAAA,GAC5Bd,MAAAA,CAAOxB,MAAM,CAACC,OAAO;QAE3B,MAAMD,MAAAA,GAASuC,gBAAaF,aAAAA,EAAeF,gBAAAA,CAAAA;QAC3C,IAAI;YACFX,MAAAA,CAAOxB,MAAM,CAACE,SAAS,CAACF,MAAAA,CAAAA;AAC1B,QAAA,CAAA,CAAE,OAAOwC,CAAAA,EAAG;AACV,YAAA,IAAIA,aAAaC,KAAAA,EAAO;gBACtB,MAAM,IAAIA,KAAAA,CAAM,CAAC,gBAAgB,EAAEpB,WAAW,SAAS,EAAEmB,CAAAA,CAAEE,OAAO,CAAA,CAAE,CAAA;AACtE,YAAA;YAEA,MAAMF,CAAAA;AACR,QAAA;AACAhB,QAAAA,MAAAA,CAAOxB,MAAM,GAAGA,MAAAA;AAClB,IAAA;AACF,CAAA;AAEe,eAAe2C,YAAY/B,OAAmB,EAAA;AAC3D,IAAA,MAAMF,UAAmB,EAAC;IAE1B,MAAMkC,cAAAA,GAAiB,MAAMC,mCAAAA,CAAkBjC,OAAAA,CAAAA;AAE/CA,IAAAA,OAAAA,CAAOZ,MAAM,CAAC8C,GAAG,CAAC,gBAAA,EAAkBF,cAAAA,CAAAA;AAEpC,IAAA,KAAK,MAAMvB,UAAAA,IAAcC,MAAAA,CAAOC,IAAI,CAACqB,cAAAA,CAAAA,CAAiB;QACpD,MAAMG,aAAAA,GAAgBH,cAAc,CAACvB,UAAAA,CAAW;QAEhD,IAAI2B,oBAAAA;AACJ,QAAA,IAAIC,cAAAA,GAAiB,oBAAA;QAErB,IAAI;YACFA,cAAAA,GACEC,CAAAA,kBAAAA,CAAQC,OAAO,CAACJ,aAAAA,CAAcK,WAAW,EAAE,eAAA,EAAiB;gBAC1DC,OAAAA,EAAS;aACX,CAAA,IAAM,oBAAmB,EACzBC,QAAQ,EAAA;AACZ,QAAA,CAAA,CAAE,OAAOd,CAAAA,EAAG;;AAEZ,QAAA;QAEA,IAAI;YACFQ,oBAAAA,GAAuBO,SAAAA,CAAKR,aAAAA,CAAcS,YAAY,EAAEP,cAAAA,CAAAA;AAC1D,QAAA,CAAA,CAAE,OAAOT,CAAAA,EAAG;YACV,MAAM,IAAIC,KAAAA,CACR,CAAC,yBAAyB,EAAEpB,WAAW,SAAS,EAAEA,UAAAA,CAAW,gFAAgF,CAAC,CAAA;AAElJ,QAAA;;AAGA,QAAA,IAAI,CAAE,MAAML,GAAAA,CAAIC,UAAU,CAAC+B,oBAAAA,CAAAA,EAAwB;AACjD,YAAA;AACF,QAAA;AAEA,QAAA,MAAMS,eAAeC,6BAAAA,CAAeV,oBAAAA,CAAAA;QACpCtC,OAAO,CAACW,WAAW,GAAG;AACpB,YAAA,GAAGzB,aAAa;AAChB,YAAA,GAAG6D,YAAY;AACfjD,YAAAA,YAAAA,EAAcsB,kBAAAA,CAAmBT,UAAAA,EAAYoC,YAAAA,CAAajD,YAAY,IAAI,EAAC,CAAA;AAC3ER,YAAAA,MAAAA,EAAQ2D,WAAAA,CAAS/D,aAAAA,CAAcI,MAAM,EAAEyD,aAAazD,MAAM,CAAA;AAC1DG,YAAAA,MAAAA,EAAQsD,YAAAA,CAAatD,MAAM,IAAIP,aAAAA,CAAcO;AAC/C,SAAA;AACF,IAAA;;AAGA,IAAA,MAAM6B,eAAAA,CAAgBtB,OAAAA,CAAAA;AACtB,IAAA,MAAMD,kBAAAA,CAAmBC,OAAAA,CAAAA;AAEzB,IAAA,KAAK,MAAMW,UAAAA,IAAcC,MAAAA,CAAOC,IAAI,CAACb,OAAAA,CAAAA,CAAU;QAC7CE,OAAAA,CAAOc,GAAG,CAAC,SAAA,CAAA,CAAWkC,GAAG,CAACvC,UAAAA,EAAYX,OAAO,CAACW,UAAAA,CAAW,CAAA;AAC3D,IAAA;AACF;AAEA,MAAMS,kBAAAA,GAAqB,CACzBT,UAAAA,EACAb,YAAAA,GAAAA;AAEAc,IAAAA,MAAAA,CAAOuC,MAAM,CAACrD,YAAAA,CAAAA,CAAcsD,OAAO,CAAC,CAACC,UAAAA,GAAAA;QACnC,MAAM,EAAElC,MAAM,EAAE,GAAGkC,UAAAA;QAEnBzC,MAAAA,CAAO0C,MAAM,CAACnC,MAAAA,EAAQ;YACpBL,MAAAA,EAAQH,UAAAA;AACR4C,YAAAA,cAAAA,EACEpC,MAAAA,CAAOoC,cAAc,IAAI,CAAA,EAAG5C,UAAAA,CAAW,CAAC,EAAEQ,MAAAA,CAAOqC,IAAI,CAACC,YAAY,CAAA,CAAE,CAACC,WAAW,EAAA;AAClFC,YAAAA,QAAAA,EAAUC,kBAAYzC,MAAAA,EAAQR,UAAAA;AAChC,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOb,YAAAA;AACT,CAAA;;;;"}
@@ -34,20 +34,30 @@ const applyUserExtension = async (plugins)=>{
34
34
  for (const pluginName of Object.keys(plugins)){
35
35
  const plugin = plugins[pluginName];
36
36
  // first: load json schema
37
- for (const ctName of Object.keys(plugin.contentTypes)){
37
+ const extendedContentTypes = get([
38
+ pluginName,
39
+ 'content-types'
40
+ ], extendedSchemas) ?? {};
41
+ for (const ctName of Object.keys(extendedContentTypes)){
38
42
  const extendedSchema = get([
39
- pluginName,
40
- 'content-types',
41
43
  ctName,
42
44
  'schema'
43
- ], extendedSchemas);
44
- if (extendedSchema) {
45
+ ], extendedContentTypes);
46
+ if (!extendedSchema) {
47
+ continue;
48
+ }
49
+ if (!plugin.contentTypes[ctName]) {
50
+ plugin.contentTypes[ctName] = {
51
+ schema: extendedSchema
52
+ };
53
+ } else {
45
54
  plugin.contentTypes[ctName].schema = {
46
55
  ...plugin.contentTypes[ctName].schema,
47
56
  ...extendedSchema
48
57
  };
49
58
  }
50
59
  }
60
+ formatContentTypes(pluginName, plugin.contentTypes);
51
61
  // second: execute strapi-server extension
52
62
  const strapiServer = get([
53
63
  pluginName,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport * as resolve from 'resolve.exports';\n\nimport { env } from '@strapi/utils';\nimport type { Core, Plugin, Struct } from '@strapi/types';\nimport { loadConfigFile } from '../../utils/load-config-file';\nimport { loadFiles } from '../../utils/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\nimport { getGlobalId } from '../../domain/content-type';\n\ninterface Plugins {\n [key: string]: Plugin.LoadedPlugin;\n}\n\nconst defaultPlugin = {\n bootstrap() {},\n destroy() {},\n register() {},\n config: {\n default: {},\n validator() {},\n },\n routes: [],\n controllers: {},\n services: {},\n policies: {},\n middlewares: {},\n contentTypes: {},\n};\n\nconst applyUserExtension = async (plugins: Plugins) => {\n const extensionsDir = strapi.dirs.dist.extensions;\n if (!(await fse.pathExists(extensionsDir))) {\n return;\n }\n\n const extendedSchemas = await loadFiles(extensionsDir, '**/content-types/**/schema.json');\n const strapiServers = await loadFiles(extensionsDir, '**/strapi-server.js');\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n // first: load json schema\n for (const ctName of Object.keys(plugin.contentTypes)) {\n const extendedSchema = get([pluginName, 'content-types', ctName, 'schema'], extendedSchemas);\n if (extendedSchema) {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n // second: execute strapi-server extension\n const strapiServer = get([pluginName, 'strapi-server'], strapiServers);\n if (strapiServer) {\n plugins[pluginName] = await strapiServer(plugin);\n }\n }\n};\n\nconst applyUserConfig = async (plugins: Plugins) => {\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig);\n const defaultConfig =\n typeof plugin.config.default === 'function'\n ? plugin.config.default({ env })\n : plugin.config.default;\n\n const config = defaultsDeep(defaultConfig, userPluginConfig);\n try {\n plugin.config.validator(config);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error regarding ${pluginName} config: ${e.message}`);\n }\n\n throw e;\n }\n plugin.config = config;\n }\n};\n\nexport default async function loadPlugins(strapi: Core.Strapi) {\n const plugins: Plugins = {};\n\n const enabledPlugins = await getEnabledPlugins(strapi);\n\n strapi.config.set('enabledPlugins', enabledPlugins);\n\n for (const pluginName of Object.keys(enabledPlugins)) {\n const enabledPlugin = enabledPlugins[pluginName];\n\n let serverEntrypointPath;\n let resolvedExport = './strapi-server.js';\n\n try {\n resolvedExport = (\n resolve.exports(enabledPlugin.packageInfo, 'strapi-server', {\n require: true,\n }) ?? './strapi-server.js'\n ).toString();\n } catch (e) {\n // no export map or missing strapi-server export => fallback to default\n }\n\n try {\n serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport);\n } catch (e) {\n throw new Error(\n `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`\n );\n }\n\n // only load plugins with a server entrypoint\n if (!(await fse.pathExists(serverEntrypointPath))) {\n continue;\n }\n\n const pluginServer = loadConfigFile(serverEntrypointPath);\n plugins[pluginName] = {\n ...defaultPlugin,\n ...pluginServer,\n contentTypes: formatContentTypes(pluginName, pluginServer.contentTypes ?? {}),\n config: defaults(defaultPlugin.config, pluginServer.config),\n routes: pluginServer.routes ?? defaultPlugin.routes,\n };\n }\n\n // TODO: validate plugin format\n await applyUserConfig(plugins);\n await applyUserExtension(plugins);\n\n for (const pluginName of Object.keys(plugins)) {\n strapi.get('plugins').add(pluginName, plugins[pluginName]);\n }\n}\n\nconst formatContentTypes = (\n pluginName: string,\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>\n) => {\n Object.values(contentTypes).forEach((definition) => {\n const { schema } = definition;\n\n Object.assign(schema, {\n plugin: pluginName,\n collectionName:\n schema.collectionName || `${pluginName}_${schema.info.singularName}`.toLowerCase(),\n globalId: getGlobalId(schema, pluginName),\n });\n });\n\n return contentTypes;\n};\n"],"names":["defaultPlugin","bootstrap","destroy","register","config","default","validator","routes","controllers","services","policies","middlewares","contentTypes","applyUserExtension","plugins","extensionsDir","strapi","dirs","dist","extensions","fse","pathExists","extendedSchemas","loadFiles","strapiServers","pluginName","Object","keys","plugin","ctName","extendedSchema","get","schema","strapiServer","applyUserConfig","userPluginsConfig","getUserPluginsConfig","userPluginConfig","getOr","defaultConfig","env","defaultsDeep","e","Error","message","loadPlugins","enabledPlugins","getEnabledPlugins","set","enabledPlugin","serverEntrypointPath","resolvedExport","resolve","exports","packageInfo","require","toString","join","pathToPlugin","pluginServer","loadConfigFile","formatContentTypes","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/loaders/plugins/index.ts"],"sourcesContent":["import { join } from 'path';\nimport fse from 'fs-extra';\nimport { defaultsDeep, defaults, getOr, get } from 'lodash/fp';\nimport * as resolve from 'resolve.exports';\n\nimport { env } from '@strapi/utils';\nimport type { Core, Plugin, Struct } from '@strapi/types';\nimport { loadConfigFile } from '../../utils/load-config-file';\nimport { loadFiles } from '../../utils/load-files';\nimport { getEnabledPlugins } from './get-enabled-plugins';\nimport { getUserPluginsConfig } from './get-user-plugins-config';\nimport { getGlobalId } from '../../domain/content-type';\n\ninterface Plugins {\n [key: string]: Plugin.LoadedPlugin;\n}\n\nconst defaultPlugin = {\n bootstrap() {},\n destroy() {},\n register() {},\n config: {\n default: {},\n validator() {},\n },\n routes: [],\n controllers: {},\n services: {},\n policies: {},\n middlewares: {},\n contentTypes: {},\n};\n\nconst applyUserExtension = async (plugins: Plugins) => {\n const extensionsDir = strapi.dirs.dist.extensions;\n if (!(await fse.pathExists(extensionsDir))) {\n return;\n }\n\n const extendedSchemas = await loadFiles(extensionsDir, '**/content-types/**/schema.json');\n const strapiServers = await loadFiles(extensionsDir, '**/strapi-server.js');\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n // first: load json schema\n const extendedContentTypes = get([pluginName, 'content-types'], extendedSchemas) ?? {};\n for (const ctName of Object.keys(extendedContentTypes)) {\n const extendedSchema = get([ctName, 'schema'], extendedContentTypes);\n if (!extendedSchema) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (!plugin.contentTypes[ctName]) {\n plugin.contentTypes[ctName] = { schema: extendedSchema };\n } else {\n plugin.contentTypes[ctName].schema = {\n ...plugin.contentTypes[ctName].schema,\n ...extendedSchema,\n };\n }\n }\n\n formatContentTypes(pluginName, plugin.contentTypes);\n // second: execute strapi-server extension\n const strapiServer = get([pluginName, 'strapi-server'], strapiServers);\n if (strapiServer) {\n plugins[pluginName] = await strapiServer(plugin);\n }\n }\n};\n\nconst applyUserConfig = async (plugins: Plugins) => {\n const userPluginsConfig = await getUserPluginsConfig();\n\n for (const pluginName of Object.keys(plugins)) {\n const plugin = plugins[pluginName];\n const userPluginConfig = getOr({}, `${pluginName}.config`, userPluginsConfig);\n const defaultConfig =\n typeof plugin.config.default === 'function'\n ? plugin.config.default({ env })\n : plugin.config.default;\n\n const config = defaultsDeep(defaultConfig, userPluginConfig);\n try {\n plugin.config.validator(config);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error regarding ${pluginName} config: ${e.message}`);\n }\n\n throw e;\n }\n plugin.config = config;\n }\n};\n\nexport default async function loadPlugins(strapi: Core.Strapi) {\n const plugins: Plugins = {};\n\n const enabledPlugins = await getEnabledPlugins(strapi);\n\n strapi.config.set('enabledPlugins', enabledPlugins);\n\n for (const pluginName of Object.keys(enabledPlugins)) {\n const enabledPlugin = enabledPlugins[pluginName];\n\n let serverEntrypointPath;\n let resolvedExport = './strapi-server.js';\n\n try {\n resolvedExport = (\n resolve.exports(enabledPlugin.packageInfo, 'strapi-server', {\n require: true,\n }) ?? './strapi-server.js'\n ).toString();\n } catch (e) {\n // no export map or missing strapi-server export => fallback to default\n }\n\n try {\n serverEntrypointPath = join(enabledPlugin.pathToPlugin, resolvedExport);\n } catch (e) {\n throw new Error(\n `Error loading the plugin ${pluginName} because ${pluginName} is not installed. Please either install the plugin or remove its configuration.`\n );\n }\n\n // only load plugins with a server entrypoint\n if (!(await fse.pathExists(serverEntrypointPath))) {\n continue;\n }\n\n const pluginServer = loadConfigFile(serverEntrypointPath);\n plugins[pluginName] = {\n ...defaultPlugin,\n ...pluginServer,\n contentTypes: formatContentTypes(pluginName, pluginServer.contentTypes ?? {}),\n config: defaults(defaultPlugin.config, pluginServer.config),\n routes: pluginServer.routes ?? defaultPlugin.routes,\n };\n }\n\n // TODO: validate plugin format\n await applyUserConfig(plugins);\n await applyUserExtension(plugins);\n\n for (const pluginName of Object.keys(plugins)) {\n strapi.get('plugins').add(pluginName, plugins[pluginName]);\n }\n}\n\nconst formatContentTypes = (\n pluginName: string,\n contentTypes: Record<string, { schema: Struct.ContentTypeSchema }>\n) => {\n Object.values(contentTypes).forEach((definition) => {\n const { schema } = definition;\n\n Object.assign(schema, {\n plugin: pluginName,\n collectionName:\n schema.collectionName || `${pluginName}_${schema.info.singularName}`.toLowerCase(),\n globalId: getGlobalId(schema, pluginName),\n });\n });\n\n return contentTypes;\n};\n"],"names":["defaultPlugin","bootstrap","destroy","register","config","default","validator","routes","controllers","services","policies","middlewares","contentTypes","applyUserExtension","plugins","extensionsDir","strapi","dirs","dist","extensions","fse","pathExists","extendedSchemas","loadFiles","strapiServers","pluginName","Object","keys","plugin","extendedContentTypes","get","ctName","extendedSchema","schema","formatContentTypes","strapiServer","applyUserConfig","userPluginsConfig","getUserPluginsConfig","userPluginConfig","getOr","defaultConfig","env","defaultsDeep","e","Error","message","loadPlugins","enabledPlugins","getEnabledPlugins","set","enabledPlugin","serverEntrypointPath","resolvedExport","resolve","exports","packageInfo","require","toString","join","pathToPlugin","pluginServer","loadConfigFile","defaults","add","values","forEach","definition","assign","collectionName","info","singularName","toLowerCase","globalId","getGlobalId"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/core";
6
- var version = "5.44.0";
6
+ var version = "5.45.0";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -62,14 +62,14 @@ var dependencies = {
62
62
  "@koa/cors": "5.0.0",
63
63
  "@koa/router": "12.0.2",
64
64
  "@paralleldrive/cuid2": "2.2.2",
65
- "@strapi/admin": "5.44.0",
66
- "@strapi/database": "5.44.0",
67
- "@strapi/generators": "5.44.0",
68
- "@strapi/logger": "5.44.0",
69
- "@strapi/permissions": "5.44.0",
70
- "@strapi/types": "5.44.0",
71
- "@strapi/typescript-utils": "5.44.0",
72
- "@strapi/utils": "5.44.0",
65
+ "@strapi/admin": "5.45.0",
66
+ "@strapi/database": "5.45.0",
67
+ "@strapi/generators": "5.45.0",
68
+ "@strapi/logger": "5.45.0",
69
+ "@strapi/permissions": "5.45.0",
70
+ "@strapi/types": "5.45.0",
71
+ "@strapi/typescript-utils": "5.45.0",
72
+ "@strapi/utils": "5.45.0",
73
73
  "@vercel/stega": "0.1.2",
74
74
  bcryptjs: "2.4.3",
75
75
  boxen: "5.1.2",
@@ -136,11 +136,11 @@ var devDependencies = {
136
136
  "@types/node": "24.10.0",
137
137
  "@types/node-schedule": "2.1.7",
138
138
  "@types/statuses": "2.0.1",
139
- "eslint-config-custom": "5.44.0",
139
+ "eslint-config-custom": "5.45.0",
140
140
  supertest: "7.2.2",
141
- tsconfig: "5.44.0",
141
+ tsconfig: "5.45.0",
142
142
  vitest: "catalog:",
143
- "vitest-config": "5.44.0"
143
+ "vitest-config": "5.45.0"
144
144
  };
145
145
  var engines = {
146
146
  node: ">=20.0.0 <=24.x.x",
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/core";
2
- var version = "5.44.0";
2
+ var version = "5.45.0";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -58,14 +58,14 @@ var dependencies = {
58
58
  "@koa/cors": "5.0.0",
59
59
  "@koa/router": "12.0.2",
60
60
  "@paralleldrive/cuid2": "2.2.2",
61
- "@strapi/admin": "5.44.0",
62
- "@strapi/database": "5.44.0",
63
- "@strapi/generators": "5.44.0",
64
- "@strapi/logger": "5.44.0",
65
- "@strapi/permissions": "5.44.0",
66
- "@strapi/types": "5.44.0",
67
- "@strapi/typescript-utils": "5.44.0",
68
- "@strapi/utils": "5.44.0",
61
+ "@strapi/admin": "5.45.0",
62
+ "@strapi/database": "5.45.0",
63
+ "@strapi/generators": "5.45.0",
64
+ "@strapi/logger": "5.45.0",
65
+ "@strapi/permissions": "5.45.0",
66
+ "@strapi/types": "5.45.0",
67
+ "@strapi/typescript-utils": "5.45.0",
68
+ "@strapi/utils": "5.45.0",
69
69
  "@vercel/stega": "0.1.2",
70
70
  bcryptjs: "2.4.3",
71
71
  boxen: "5.1.2",
@@ -132,11 +132,11 @@ var devDependencies = {
132
132
  "@types/node": "24.10.0",
133
133
  "@types/node-schedule": "2.1.7",
134
134
  "@types/statuses": "2.0.1",
135
- "eslint-config-custom": "5.44.0",
135
+ "eslint-config-custom": "5.45.0",
136
136
  supertest: "7.2.2",
137
- tsconfig: "5.44.0",
137
+ tsconfig: "5.45.0",
138
138
  vitest: "catalog:",
139
- "vitest-config": "5.44.0"
139
+ "vitest-config": "5.45.0"
140
140
  };
141
141
  var engines = {
142
142
  node: ">=20.0.0 <=24.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAgJnC,QAAA,MAAM,kBAAkB,+CA/GD,GAAG,KAAK,GAAG,8BA+GW,CAAC;AAC9C,QAAA,MAAM,8BAA8B,kPAAiC,CAAC;AAEtE,OAAO,EACL,kBAAkB,IAAI,WAAW,EACjC,8BAA8B,IAAI,uBAAuB,GAC1D,CAAC"}
1
+ {"version":3,"file":"map-relation.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAqJnC,QAAA,MAAM,kBAAkB,+CApHD,GAAG,KAAK,GAAG,8BAoHW,CAAC;AAC9C,QAAA,MAAM,8BAA8B,kPAAiC,CAAC;AAEtE,OAAO,EACL,kBAAkB,IAAI,WAAW,EACjC,8BAA8B,IAAI,uBAAuB,GAC1D,CAAC"}
@@ -119,6 +119,10 @@ const toArray = (value)=>{
119
119
  if (attribute.useJoinTable === false) {
120
120
  return;
121
121
  }
122
+ // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
123
+ if (attribute.relation === 'morphToOne') {
124
+ return;
125
+ }
122
126
  return visitor(options, utils);
123
127
  }, options, data);
124
128
  };
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.js","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
1
+ {"version":3,"file":"map-relation.js","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
@@ -117,6 +117,10 @@ const toArray = (value)=>{
117
117
  if (attribute.useJoinTable === false) {
118
118
  return;
119
119
  }
120
+ // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
121
+ if (attribute.relation === 'morphToOne') {
122
+ return;
123
+ }
120
124
  return visitor(options, utils);
121
125
  }, options, data);
122
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.mjs","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
1
+ {"version":3,"file":"map-relation.mjs","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/utils/populate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,OAAO;IACf;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAKD,eAAO,MAAM,eAAe,QAAS,IAAI,MAAM,SAAQ,OAAO,QAkE7D,CAAC"}
1
+ {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/utils/populate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC,UAAU,OAAO;IACf;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAKD,eAAO,MAAM,eAAe,QAAS,IAAI,MAAM,SAAQ,OAAO,QA2D7D,CAAC"}
@@ -14,16 +14,10 @@ const getDeepPopulate = (uid, opts = {})=>{
14
14
  switch(attribute.type){
15
15
  case 'relation':
16
16
  {
17
- // TODO: Support polymorphic relations
18
- const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
19
- if (isMorphRelation) {
20
- break;
21
- }
22
17
  if ('unstable_virtual' in attribute && attribute.unstable_virtual) {
23
18
  break;
24
19
  }
25
- // Include all non-morph relations (including visible: false) so publish / discardDraft /
26
- // clone preserve links—same idea as content-manager getPopulateForRelation for invisible attrs.
20
+ // Include all relations except the onces not managed by the DB layer.
27
21
  acc[attributeName] = {
28
22
  select: opts.relationalFields
29
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../src/services/document-service/utils/populate.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\ninterface Options {\n /**\n * Fields to select when populating relations\n */\n relationalFields?: string[];\n}\n\nconst deepPopulateCache = new Map<string, any>();\n\n// We want to build a populate object based on the schema\nexport const getDeepPopulate = (uid: UID.Schema, opts: Options = {}) => {\n const cacheKey = `${uid}::${JSON.stringify(opts)}`;\n const cached = deepPopulateCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n\n const result = attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if ('unstable_virtual' in attribute && attribute.unstable_virtual) {\n // skip relations not managed by the DB layer\n break;\n }\n\n // Include all non-morph relations (including visible: false) so publish / discardDraft /\n // clone preserve links—same idea as content-manager getPopulateForRelation for invisible attrs.\n acc[attributeName] = { select: opts.relationalFields };\n\n break;\n }\n\n case 'media': {\n // We populate all media fields for completeness of webhook responses\n // see https://github.com/strapi/strapi/issues/21546\n acc[attributeName] = { select: ['*'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component, opts);\n acc[attributeName] = { populate };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = { populate: getDeepPopulate(componentUID, opts) };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n\n deepPopulateCache.set(cacheKey, result);\n return result;\n};\n"],"names":["deepPopulateCache","Map","getDeepPopulate","uid","opts","cacheKey","JSON","stringify","cached","get","model","strapi","getModel","attributes","Object","entries","result","reduce","acc","attributeName","attribute","type","isMorphRelation","relation","toLowerCase","startsWith","unstable_virtual","select","relationalFields","populate","component","populatedComponents","components","componentUID","on","set"],"mappings":";;AASA,MAAMA,oBAAoB,IAAIC,GAAAA,EAAAA;AAE9B;MACaC,eAAAA,GAAkB,CAACC,GAAAA,EAAiBC,IAAAA,GAAgB,EAAE,GAAA;IACjE,MAAMC,QAAAA,GAAW,GAAGF,GAAAA,CAAI,EAAE,EAAEG,IAAAA,CAAKC,SAAS,CAACH,IAAAA,CAAAA,CAAAA,CAAO;IAClD,MAAMI,MAAAA,GAASR,iBAAAA,CAAkBS,GAAG,CAACJ,QAAAA,CAAAA;AACrC,IAAA,IAAIG,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACT,GAAAA,CAAAA;AAC9B,IAAA,MAAMU,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACL,MAAMG,UAAU,CAAA;IAElD,MAAMG,MAAAA,GAASH,WAAWI,MAAM,CAAC,CAACC,GAAAA,EAAU,CAACC,eAAeC,SAAAA,CAAU,GAAA;AACpE,QAAA,OAAQA,UAAUC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;;AAEf,oBAAA,MAAMC,kBAAkBF,SAAAA,CAAUG,QAAQ,CAACC,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AACpE,oBAAA,IAAIH,eAAAA,EAAiB;AACnB,wBAAA;AACF,oBAAA;AAEA,oBAAA,IAAI,kBAAA,IAAsBF,SAAAA,IAAaA,SAAAA,CAAUM,gBAAgB,EAAE;AAEjE,wBAAA;AACF,oBAAA;;;oBAIAR,GAAG,CAACC,cAAc,GAAG;AAAEQ,wBAAAA,MAAAA,EAAQvB,KAAKwB;AAAiB,qBAAA;AAErD,oBAAA;AACF,gBAAA;YAEA,KAAK,OAAA;AAAS,gBAAA;;;oBAGZV,GAAG,CAACC,cAAc,GAAG;wBAAEQ,MAAAA,EAAQ;AAAC,4BAAA;AAAI;AAAC,qBAAA;AACrC,oBAAA;AACF,gBAAA;YAEA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAME,QAAAA,GAAW3B,eAAAA,CAAgBkB,SAAAA,CAAUU,SAAS,EAAE1B,IAAAA,CAAAA;oBACtDc,GAAG,CAACC,cAAc,GAAG;AAAEU,wBAAAA;AAAS,qBAAA;AAChC,oBAAA;AACF,gBAAA;YAEA,KAAK,aAAA;AAAe,gBAAA;;AAElB,oBAAA,MAAME,mBAAAA,GAAuBX,CAAAA,SAAAA,CAAUY,UAAU,IAAI,EAAC,EAAGf,MAAM,CAC7D,CAACC,GAAAA,EAAUe,YAAAA,GAAAA;wBACTf,GAAG,CAACe,aAAa,GAAG;AAAEJ,4BAAAA,QAAAA,EAAU3B,gBAAgB+B,YAAAA,EAAc7B,IAAAA;AAAM,yBAAA;wBACpE,OAAOc,GAAAA;AACT,oBAAA,CAAA,EACA,EAAC,CAAA;oBAGHA,GAAG,CAACC,cAAc,GAAG;wBAAEe,EAAAA,EAAIH;AAAoB,qBAAA;AAC/C,oBAAA;AACF,gBAAA;AAGF;QAEA,OAAOb,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJlB,iBAAAA,CAAkBmC,GAAG,CAAC9B,QAAAA,EAAUW,MAAAA,CAAAA;IAChC,OAAOA,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../src/services/document-service/utils/populate.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\ninterface Options {\n /**\n * Fields to select when populating relations\n */\n relationalFields?: string[];\n}\n\nconst deepPopulateCache = new Map<string, any>();\n\n// We want to build a populate object based on the schema\nexport const getDeepPopulate = (uid: UID.Schema, opts: Options = {}) => {\n const cacheKey = `${uid}::${JSON.stringify(opts)}`;\n const cached = deepPopulateCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n\n const result = attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n if ('unstable_virtual' in attribute && attribute.unstable_virtual) {\n // skip relations not managed by the DB layer\n break;\n }\n\n // Include all relations except the onces not managed by the DB layer.\n acc[attributeName] = { select: opts.relationalFields };\n\n break;\n }\n\n case 'media': {\n // We populate all media fields for completeness of webhook responses\n // see https://github.com/strapi/strapi/issues/21546\n acc[attributeName] = { select: ['*'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component, opts);\n acc[attributeName] = { populate };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = { populate: getDeepPopulate(componentUID, opts) };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n\n deepPopulateCache.set(cacheKey, result);\n return result;\n};\n"],"names":["deepPopulateCache","Map","getDeepPopulate","uid","opts","cacheKey","JSON","stringify","cached","get","model","strapi","getModel","attributes","Object","entries","result","reduce","acc","attributeName","attribute","type","unstable_virtual","select","relationalFields","populate","component","populatedComponents","components","componentUID","on","set"],"mappings":";;AASA,MAAMA,oBAAoB,IAAIC,GAAAA,EAAAA;AAE9B;MACaC,eAAAA,GAAkB,CAACC,GAAAA,EAAiBC,IAAAA,GAAgB,EAAE,GAAA;IACjE,MAAMC,QAAAA,GAAW,GAAGF,GAAAA,CAAI,EAAE,EAAEG,IAAAA,CAAKC,SAAS,CAACH,IAAAA,CAAAA,CAAAA,CAAO;IAClD,MAAMI,MAAAA,GAASR,iBAAAA,CAAkBS,GAAG,CAACJ,QAAAA,CAAAA;AACrC,IAAA,IAAIG,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACT,GAAAA,CAAAA;AAC9B,IAAA,MAAMU,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACL,MAAMG,UAAU,CAAA;IAElD,MAAMG,MAAAA,GAASH,WAAWI,MAAM,CAAC,CAACC,GAAAA,EAAU,CAACC,eAAeC,SAAAA,CAAU,GAAA;AACpE,QAAA,OAAQA,UAAUC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,kBAAA,IAAsBD,SAAAA,IAAaA,SAAAA,CAAUE,gBAAgB,EAAE;AAEjE,wBAAA;AACF,oBAAA;;oBAGAJ,GAAG,CAACC,cAAc,GAAG;AAAEI,wBAAAA,MAAAA,EAAQnB,KAAKoB;AAAiB,qBAAA;AAErD,oBAAA;AACF,gBAAA;YAEA,KAAK,OAAA;AAAS,gBAAA;;;oBAGZN,GAAG,CAACC,cAAc,GAAG;wBAAEI,MAAAA,EAAQ;AAAC,4BAAA;AAAI;AAAC,qBAAA;AACrC,oBAAA;AACF,gBAAA;YAEA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAME,QAAAA,GAAWvB,eAAAA,CAAgBkB,SAAAA,CAAUM,SAAS,EAAEtB,IAAAA,CAAAA;oBACtDc,GAAG,CAACC,cAAc,GAAG;AAAEM,wBAAAA;AAAS,qBAAA;AAChC,oBAAA;AACF,gBAAA;YAEA,KAAK,aAAA;AAAe,gBAAA;;AAElB,oBAAA,MAAME,mBAAAA,GAAuBP,CAAAA,SAAAA,CAAUQ,UAAU,IAAI,EAAC,EAAGX,MAAM,CAC7D,CAACC,GAAAA,EAAUW,YAAAA,GAAAA;wBACTX,GAAG,CAACW,aAAa,GAAG;AAAEJ,4BAAAA,QAAAA,EAAUvB,gBAAgB2B,YAAAA,EAAczB,IAAAA;AAAM,yBAAA;wBACpE,OAAOc,GAAAA;AACT,oBAAA,CAAA,EACA,EAAC,CAAA;oBAGHA,GAAG,CAACC,cAAc,GAAG;wBAAEW,EAAAA,EAAIH;AAAoB,qBAAA;AAC/C,oBAAA;AACF,gBAAA;AAGF;QAEA,OAAOT,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJlB,iBAAAA,CAAkB+B,GAAG,CAAC1B,QAAAA,EAAUW,MAAAA,CAAAA;IAChC,OAAOA,MAAAA;AACT;;;;"}
@@ -12,16 +12,10 @@ const getDeepPopulate = (uid, opts = {})=>{
12
12
  switch(attribute.type){
13
13
  case 'relation':
14
14
  {
15
- // TODO: Support polymorphic relations
16
- const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');
17
- if (isMorphRelation) {
18
- break;
19
- }
20
15
  if ('unstable_virtual' in attribute && attribute.unstable_virtual) {
21
16
  break;
22
17
  }
23
- // Include all non-morph relations (including visible: false) so publish / discardDraft /
24
- // clone preserve links—same idea as content-manager getPopulateForRelation for invisible attrs.
18
+ // Include all relations except the onces not managed by the DB layer.
25
19
  acc[attributeName] = {
26
20
  select: opts.relationalFields
27
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"populate.mjs","sources":["../../../../src/services/document-service/utils/populate.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\ninterface Options {\n /**\n * Fields to select when populating relations\n */\n relationalFields?: string[];\n}\n\nconst deepPopulateCache = new Map<string, any>();\n\n// We want to build a populate object based on the schema\nexport const getDeepPopulate = (uid: UID.Schema, opts: Options = {}) => {\n const cacheKey = `${uid}::${JSON.stringify(opts)}`;\n const cached = deepPopulateCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n\n const result = attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n // TODO: Support polymorphic relations\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n if (isMorphRelation) {\n break;\n }\n\n if ('unstable_virtual' in attribute && attribute.unstable_virtual) {\n // skip relations not managed by the DB layer\n break;\n }\n\n // Include all non-morph relations (including visible: false) so publish / discardDraft /\n // clone preserve links—same idea as content-manager getPopulateForRelation for invisible attrs.\n acc[attributeName] = { select: opts.relationalFields };\n\n break;\n }\n\n case 'media': {\n // We populate all media fields for completeness of webhook responses\n // see https://github.com/strapi/strapi/issues/21546\n acc[attributeName] = { select: ['*'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component, opts);\n acc[attributeName] = { populate };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = { populate: getDeepPopulate(componentUID, opts) };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n\n deepPopulateCache.set(cacheKey, result);\n return result;\n};\n"],"names":["deepPopulateCache","Map","getDeepPopulate","uid","opts","cacheKey","JSON","stringify","cached","get","model","strapi","getModel","attributes","Object","entries","result","reduce","acc","attributeName","attribute","type","isMorphRelation","relation","toLowerCase","startsWith","unstable_virtual","select","relationalFields","populate","component","populatedComponents","components","componentUID","on","set"],"mappings":"AASA,MAAMA,oBAAoB,IAAIC,GAAAA,EAAAA;AAE9B;MACaC,eAAAA,GAAkB,CAACC,GAAAA,EAAiBC,IAAAA,GAAgB,EAAE,GAAA;IACjE,MAAMC,QAAAA,GAAW,GAAGF,GAAAA,CAAI,EAAE,EAAEG,IAAAA,CAAKC,SAAS,CAACH,IAAAA,CAAAA,CAAAA,CAAO;IAClD,MAAMI,MAAAA,GAASR,iBAAAA,CAAkBS,GAAG,CAACJ,QAAAA,CAAAA;AACrC,IAAA,IAAIG,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACT,GAAAA,CAAAA;AAC9B,IAAA,MAAMU,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACL,MAAMG,UAAU,CAAA;IAElD,MAAMG,MAAAA,GAASH,WAAWI,MAAM,CAAC,CAACC,GAAAA,EAAU,CAACC,eAAeC,SAAAA,CAAU,GAAA;AACpE,QAAA,OAAQA,UAAUC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;;AAEf,oBAAA,MAAMC,kBAAkBF,SAAAA,CAAUG,QAAQ,CAACC,WAAW,EAAA,CAAGC,UAAU,CAAC,OAAA,CAAA;AACpE,oBAAA,IAAIH,eAAAA,EAAiB;AACnB,wBAAA;AACF,oBAAA;AAEA,oBAAA,IAAI,kBAAA,IAAsBF,SAAAA,IAAaA,SAAAA,CAAUM,gBAAgB,EAAE;AAEjE,wBAAA;AACF,oBAAA;;;oBAIAR,GAAG,CAACC,cAAc,GAAG;AAAEQ,wBAAAA,MAAAA,EAAQvB,KAAKwB;AAAiB,qBAAA;AAErD,oBAAA;AACF,gBAAA;YAEA,KAAK,OAAA;AAAS,gBAAA;;;oBAGZV,GAAG,CAACC,cAAc,GAAG;wBAAEQ,MAAAA,EAAQ;AAAC,4BAAA;AAAI;AAAC,qBAAA;AACrC,oBAAA;AACF,gBAAA;YAEA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAME,QAAAA,GAAW3B,eAAAA,CAAgBkB,SAAAA,CAAUU,SAAS,EAAE1B,IAAAA,CAAAA;oBACtDc,GAAG,CAACC,cAAc,GAAG;AAAEU,wBAAAA;AAAS,qBAAA;AAChC,oBAAA;AACF,gBAAA;YAEA,KAAK,aAAA;AAAe,gBAAA;;AAElB,oBAAA,MAAME,mBAAAA,GAAuBX,CAAAA,SAAAA,CAAUY,UAAU,IAAI,EAAC,EAAGf,MAAM,CAC7D,CAACC,GAAAA,EAAUe,YAAAA,GAAAA;wBACTf,GAAG,CAACe,aAAa,GAAG;AAAEJ,4BAAAA,QAAAA,EAAU3B,gBAAgB+B,YAAAA,EAAc7B,IAAAA;AAAM,yBAAA;wBACpE,OAAOc,GAAAA;AACT,oBAAA,CAAA,EACA,EAAC,CAAA;oBAGHA,GAAG,CAACC,cAAc,GAAG;wBAAEe,EAAAA,EAAIH;AAAoB,qBAAA;AAC/C,oBAAA;AACF,gBAAA;AAGF;QAEA,OAAOb,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJlB,iBAAAA,CAAkBmC,GAAG,CAAC9B,QAAAA,EAAUW,MAAAA,CAAAA;IAChC,OAAOA,MAAAA;AACT;;;;"}
1
+ {"version":3,"file":"populate.mjs","sources":["../../../../src/services/document-service/utils/populate.ts"],"sourcesContent":["import type { UID } from '@strapi/types';\n\ninterface Options {\n /**\n * Fields to select when populating relations\n */\n relationalFields?: string[];\n}\n\nconst deepPopulateCache = new Map<string, any>();\n\n// We want to build a populate object based on the schema\nexport const getDeepPopulate = (uid: UID.Schema, opts: Options = {}) => {\n const cacheKey = `${uid}::${JSON.stringify(opts)}`;\n const cached = deepPopulateCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const model = strapi.getModel(uid);\n const attributes = Object.entries(model.attributes);\n\n const result = attributes.reduce((acc: any, [attributeName, attribute]) => {\n switch (attribute.type) {\n case 'relation': {\n if ('unstable_virtual' in attribute && attribute.unstable_virtual) {\n // skip relations not managed by the DB layer\n break;\n }\n\n // Include all relations except the onces not managed by the DB layer.\n acc[attributeName] = { select: opts.relationalFields };\n\n break;\n }\n\n case 'media': {\n // We populate all media fields for completeness of webhook responses\n // see https://github.com/strapi/strapi/issues/21546\n acc[attributeName] = { select: ['*'] };\n break;\n }\n\n case 'component': {\n const populate = getDeepPopulate(attribute.component, opts);\n acc[attributeName] = { populate };\n break;\n }\n\n case 'dynamiczone': {\n // Use fragments to populate the dynamic zone components\n const populatedComponents = (attribute.components || []).reduce(\n (acc: any, componentUID: UID.Component) => {\n acc[componentUID] = { populate: getDeepPopulate(componentUID, opts) };\n return acc;\n },\n {}\n );\n\n acc[attributeName] = { on: populatedComponents };\n break;\n }\n default:\n break;\n }\n\n return acc;\n }, {});\n\n deepPopulateCache.set(cacheKey, result);\n return result;\n};\n"],"names":["deepPopulateCache","Map","getDeepPopulate","uid","opts","cacheKey","JSON","stringify","cached","get","model","strapi","getModel","attributes","Object","entries","result","reduce","acc","attributeName","attribute","type","unstable_virtual","select","relationalFields","populate","component","populatedComponents","components","componentUID","on","set"],"mappings":"AASA,MAAMA,oBAAoB,IAAIC,GAAAA,EAAAA;AAE9B;MACaC,eAAAA,GAAkB,CAACC,GAAAA,EAAiBC,IAAAA,GAAgB,EAAE,GAAA;IACjE,MAAMC,QAAAA,GAAW,GAAGF,GAAAA,CAAI,EAAE,EAAEG,IAAAA,CAAKC,SAAS,CAACH,IAAAA,CAAAA,CAAAA,CAAO;IAClD,MAAMI,MAAAA,GAASR,iBAAAA,CAAkBS,GAAG,CAACJ,QAAAA,CAAAA;AACrC,IAAA,IAAIG,MAAAA,EAAQ;QACV,OAAOA,MAAAA;AACT,IAAA;IAEA,MAAME,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAACT,GAAAA,CAAAA;AAC9B,IAAA,MAAMU,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACL,MAAMG,UAAU,CAAA;IAElD,MAAMG,MAAAA,GAASH,WAAWI,MAAM,CAAC,CAACC,GAAAA,EAAU,CAACC,eAAeC,SAAAA,CAAU,GAAA;AACpE,QAAA,OAAQA,UAAUC,IAAI;YACpB,KAAK,UAAA;AAAY,gBAAA;AACf,oBAAA,IAAI,kBAAA,IAAsBD,SAAAA,IAAaA,SAAAA,CAAUE,gBAAgB,EAAE;AAEjE,wBAAA;AACF,oBAAA;;oBAGAJ,GAAG,CAACC,cAAc,GAAG;AAAEI,wBAAAA,MAAAA,EAAQnB,KAAKoB;AAAiB,qBAAA;AAErD,oBAAA;AACF,gBAAA;YAEA,KAAK,OAAA;AAAS,gBAAA;;;oBAGZN,GAAG,CAACC,cAAc,GAAG;wBAAEI,MAAAA,EAAQ;AAAC,4BAAA;AAAI;AAAC,qBAAA;AACrC,oBAAA;AACF,gBAAA;YAEA,KAAK,WAAA;AAAa,gBAAA;AAChB,oBAAA,MAAME,QAAAA,GAAWvB,eAAAA,CAAgBkB,SAAAA,CAAUM,SAAS,EAAEtB,IAAAA,CAAAA;oBACtDc,GAAG,CAACC,cAAc,GAAG;AAAEM,wBAAAA;AAAS,qBAAA;AAChC,oBAAA;AACF,gBAAA;YAEA,KAAK,aAAA;AAAe,gBAAA;;AAElB,oBAAA,MAAME,mBAAAA,GAAuBP,CAAAA,SAAAA,CAAUQ,UAAU,IAAI,EAAC,EAAGX,MAAM,CAC7D,CAACC,GAAAA,EAAUW,YAAAA,GAAAA;wBACTX,GAAG,CAACW,aAAa,GAAG;AAAEJ,4BAAAA,QAAAA,EAAUvB,gBAAgB2B,YAAAA,EAAczB,IAAAA;AAAM,yBAAA;wBACpE,OAAOc,GAAAA;AACT,oBAAA,CAAA,EACA,EAAC,CAAA;oBAGHA,GAAG,CAACC,cAAc,GAAG;wBAAEW,EAAAA,EAAIH;AAAoB,qBAAA;AAC/C,oBAAA;AACF,gBAAA;AAGF;QAEA,OAAOT,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJlB,iBAAAA,CAAkB+B,GAAG,CAAC1B,QAAAA,EAAUW,MAAAA,CAAAA;IAChC,OAAOA,MAAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "5.44.0",
3
+ "version": "5.45.0",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -59,14 +59,14 @@
59
59
  "@koa/cors": "5.0.0",
60
60
  "@koa/router": "12.0.2",
61
61
  "@paralleldrive/cuid2": "2.2.2",
62
- "@strapi/admin": "5.44.0",
63
- "@strapi/database": "5.44.0",
64
- "@strapi/generators": "5.44.0",
65
- "@strapi/logger": "5.44.0",
66
- "@strapi/permissions": "5.44.0",
67
- "@strapi/types": "5.44.0",
68
- "@strapi/typescript-utils": "5.44.0",
69
- "@strapi/utils": "5.44.0",
62
+ "@strapi/admin": "5.45.0",
63
+ "@strapi/database": "5.45.0",
64
+ "@strapi/generators": "5.45.0",
65
+ "@strapi/logger": "5.45.0",
66
+ "@strapi/permissions": "5.45.0",
67
+ "@strapi/types": "5.45.0",
68
+ "@strapi/typescript-utils": "5.45.0",
69
+ "@strapi/utils": "5.45.0",
70
70
  "@vercel/stega": "0.1.2",
71
71
  "bcryptjs": "2.4.3",
72
72
  "boxen": "5.1.2",
@@ -133,11 +133,11 @@
133
133
  "@types/node": "24.10.0",
134
134
  "@types/node-schedule": "2.1.7",
135
135
  "@types/statuses": "2.0.1",
136
- "eslint-config-custom": "5.44.0",
136
+ "eslint-config-custom": "5.45.0",
137
137
  "supertest": "7.2.2",
138
- "tsconfig": "5.44.0",
138
+ "tsconfig": "5.45.0",
139
139
  "vitest": "catalog:",
140
- "vitest-config": "5.44.0"
140
+ "vitest-config": "5.45.0"
141
141
  },
142
142
  "engines": {
143
143
  "node": ">=20.0.0 <=24.x.x",