diff --git a/server/config/type.js b/server/config/type.js index c768e49..0ae0a53 100644 --- a/server/config/type.js +++ b/server/config/type.js @@ -109,7 +109,10 @@ const ConfigType = class ConfigType { if (softImport && !force) return false; // Format JSON fields. - configContent = sanitizeConfig(configContent); + configContent = sanitizeConfig({ + config: configContent, + configName, + }); const query = { ...configContent }; this.jsonFields.map((field) => query[field] = JSON.stringify(configContent[field])); @@ -120,8 +123,8 @@ const ConfigType = class ConfigType { // Delete/create relations. await Promise.all(this.relations.map(async ({ queryString, relationName, parentName, relationSortFields }) => { const relationQueryApi = strapi.query(queryString); - existingConfig = sanitizeConfig(existingConfig, relationName, relationSortFields); - configContent = sanitizeConfig(configContent, relationName, relationSortFields); + existingConfig = sanitizeConfig({ config: existingConfig, configName, relation: relationName, relationSortFields }); + configContent = sanitizeConfig({ config: configContent, configName, relation: relationName, relationSortFields }); const configToAdd = difference(configContent[relationName], existingConfig[relationName], relationSortFields); const configToDelete = difference(existingConfig[relationName], configContent[relationName], relationSortFields); @@ -201,7 +204,7 @@ const ConfigType = class ConfigType { }); const configs = {}; - await Promise.all(Object.values(AllConfig).map(async (config) => { + await Promise.all(Object.entries(AllConfig).map(async ([configName, config]) => { const combinedUid = getCombinedUid(this.uidKeys, config); const combinedUidWhereFilter = getCombinedUidWhereFilter(this.uidKeys, config); @@ -214,13 +217,13 @@ const ConfigType = class ConfigType { const shouldExclude = !isEmpty(strapi.config.get('plugin::config-sync.excludedConfig').filter((option) => `${this.configPrefix}.${combinedUid}`.startsWith(option))); if (shouldExclude) return; - const formattedConfig = { ...sanitizeConfig(config) }; + const formattedConfig = { ...sanitizeConfig({ config, configName }) }; await Promise.all(this.relations.map(async ({ queryString, relationName, relationSortFields, parentName }) => { const relations = await noLimit(strapi.query(queryString), { where: { [parentName]: combinedUidWhereFilter }, }); - relations.map((relation) => sanitizeConfig(relation)); + relations.map((relation) => sanitizeConfig({ config: relation, configName: relationName })); relationSortFields.map((sortField) => { relations.sort(dynamicSort(sortField)); }); diff --git a/server/utils/index.js b/server/utils/index.js index b4e8e66..32bf815 100644 --- a/server/utils/index.js +++ b/server/utils/index.js @@ -46,7 +46,12 @@ const dynamicSort = (property) => { }; }; -const sanitizeConfig = (config, relation, relationSortFields) => { +const sanitizeConfig = ({ + config, + relation, + relationSortFields, + configName, +}) => { delete config._id; delete config.id; delete config.updatedAt; @@ -76,6 +81,26 @@ const sanitizeConfig = (config, relation, relationSortFields) => { config[relation] = formattedRelations; } + // We recursively sanitize the config to remove environment specific data. + // Except for the plugin_content_manager_configuration. + // This is because that stores the "edit the view" data which includes only configuration, not content. + if (configName && !configName.startsWith('plugin_content_manager_configuration_')) { + const recursiveSanitizeConfig = (recursivedSanitizedConfig) => { + delete recursivedSanitizedConfig._id; + delete recursivedSanitizedConfig.id; + delete recursivedSanitizedConfig.updatedAt; + delete recursivedSanitizedConfig.createdAt; + + Object.keys(recursivedSanitizedConfig).map((key, index) => { + if (recursivedSanitizedConfig[key] && typeof recursivedSanitizedConfig[key] === "object") { + recursiveSanitizeConfig(recursivedSanitizedConfig[key]); + } + }); + }; + + recursiveSanitizeConfig(config); + } + return config; };