Name

sn_theme_builder.ThemeRepository

Description

No description available

Script

var ThemeRepository = Class.create();
ThemeRepository.getScopeErrorMessage = function(scopeDisplayValue) {
  return gs.getMessage('This view is read-only. To edit, change your application scope to {0}.', scopeDisplayValue);
};
ThemeRepository.addDomainQueryToGR = function(gr) {
  gr.addQuery(Constants.SYS_DOMAIN_COLUMN_FIELD, ThemeRepository.getDomainId());
};
ThemeRepository.getQueryAfterAddingDomainToQueryArray = function(queryArray) {
  return queryArray.concat(['^sys_domain=', ThemeRepository.getDomainId()]).join(Constants.EMPTY_STR);
};
ThemeRepository.getDomainId = function() {
  return gs.getSession().getCurrentDomainID() || Constants.GLOBAL_DOMAIN_ID;
};
ThemeRepository.getScopeId = function() {
  return gs.getSession().getCurrentApplicationId() || 'global';
};
ThemeRepository.isScopeSame = function(recordScopeId, userScopeId) {
  return recordScopeId === userScopeId;
}
ThemeRepository.isStyleObjectNil = function(parsedStyle) {
  return gs.nil(parsedStyle) || gs.nil(parsedStyle.properties) || gs.nil(parsedStyle.base);
};
ThemeRepository._appendRGB = function(rgbVal) {
  return ['rgb(', rgbVal, ')'].join(Constants.EMPTY_STR);
};
ThemeRepository.initializeGR = function(table, fields) {
  var gr = new GlideRecord(table);
  gr.initialize();
  Object.keys(fields).forEach(function(key) {
      gr.setValue(key, fields[key]);
  });
  return gr;
};
ThemeRepository.getGR = function(table, query) {
  var gr = new GlideRecordSecure(table);
  gr.addEncodedQuery(query);
  gr.query();
  if (gr.next()) {
      return gr;
  }
  return null;
};
ThemeRepository.createGR = function(table, fields) {
  var gr = ThemeRepository.initializeGR(table, fields);
  if (gr.canCreate()) {
      gr.insert();
      return gr;
  }
  return null;
};
ThemeRepository.getUniqueValueAfterInsert = function(table, fields) {
  return ThemeRepository.initializeGR(table, fields).insert();
};
ThemeRepository.getUniqueNameForDuplicateTheme = function(table, name) {
  var nameStr = name + ' Copy';
  var count = 0;
  var arrayLength = nameStr.split(' ').length;
  var themeGR = new GlideRecord(table);
  themeGR.addQuery('name', 'CONTAINS', nameStr);
  themeGR.query();
  while (themeGR.next()) {
      var nameGR = themeGR.getValue('name');
      var nameGRArray = nameGR.split(' ');
      var grArrLength = nameGRArray.length;
      if (nameGR === nameStr && count <= 2) {
          count = 2;
      } else {
          if (arrayLength + 1 === grArrLength &&
              count <= parseInt(nameGRArray[grArrLength - 1])) {
              count = parseInt(nameGRArray[grArrLength - 1]) + 1;
          }
      }
  }
  if (count === 0) return nameStr;
  else return nameStr + ' ' + (count);
};
ThemeRepository.getUniqueNameForDuplicateGroup = function(name) {
      var nameStr = name + ' Copy';
      var count = 0;
      var arrayLength = nameStr.split(' ').length;
      var customizationGR = new GlideRecordSecure(Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME);
      customizationGR.query();
      while (customizationGR.next()) {
          var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
          var groupName = customizationObj['groupName'];
          var nameGRArray = groupName.split(' ');
          var grArrLength = nameGRArray.length;
          if (groupName === nameStr && count <= 2) {
              count = 2;
          } else {
              if (arrayLength + 1 === grArrLength &&
                  count <= parseInt(nameGRArray[grArrLength - 1])) {
                  count = parseInt(nameGRArray[grArrLength - 1]) + 1;
              }
          }
      }
      if (count === 0) return nameStr;
      else return nameStr + ' ' + (count);
  },
  ThemeRepository.getUniqueNameForDuplicateVariant = function(name, styleType) {
      if (styleType !== Constants.STYLE_VARIANT_TYPE) return name;
      var nameStr = name + ' Copy';
      var count = 0;
      var arrayLength = nameStr.split(' ').length;
      var styleGr = new GlideRecord(Constants.SYS_UX_STYLE_TABLE_NAME);
      styleGr.addQuery('name', 'CONTAINS', nameStr);
      styleGr.query();
      while (styleGr.next()) {
          var nameGR = styleGr.getValue('name');
          var nameGRArray = nameGR.split(' ');
          var grArrLength = nameGRArray.length;
          if (nameGR === nameStr && count <= 2) {
              count = 2;
          } else {
              if (arrayLength + 1 === grArrLength &&
                  count <= parseInt(nameGRArray[grArrLength - 1])) {
                  count = parseInt(nameGRArray[grArrLength - 1]) + 1;
              }
          }
      }
      if (count === 0) return nameStr;
      else return nameStr + ' ' + (count);
  };
ThemeRepository.updateGR = function(table, query, fields) {
  var gr = new GlideRecordSecure(table);
  gr.addEncodedQuery(query);
  gr.query();
  if (gr.next()) {
      Object.keys(fields).forEach(function(key) {
          gr.setValue(key, fields[key]);
      });
      if (gr.update()) {
          return gr;
      }
  }
  return null;
};
ThemeRepository.isThemeCreatedByTB = function(themeId) {
  var customizationGR = ThemeRepository.getCustomizationGR(themeId);
  if (!customizationGR) {
      return false;
  }
  return true;
};
ThemeRepository.getThemeDescription = function(gr) {
  return gr[Constants.DESCRIPTION_COLUMN_FIELD][Constants.VALUE];
};
ThemeRepository.getScope = function(gr) {
  return {
      id: gr[Constants.SYS_SCOPE_COLUMN_FIELD][Constants.VALUE],
      label: gr[Constants.SYS_SCOPE_COLUMN_FIELD][Constants.DISPLAY_VALUE]
  };
};
ThemeRepository.getDomain = function(gr) {
  var domainObj = {};
  if (gs.nil(gr)) {
      return domainObj;
  }
  try {
      domainObj.id = gr[Constants.SYS_DOMAIN_COLUMN_FIELD] && gr[Constants.SYS_DOMAIN_COLUMN_FIELD][Constants.VALUE];
      domainObj.label = gr[Constants.SYS_DOMAIN_COLUMN_FIELD] && gr[Constants.SYS_DOMAIN_COLUMN_FIELD][Constants.DISPLAY_VALUE];
      domainObj.path = gr[Constants.SYS_DOMAIN_PATH] && gr[Constants.SYS_DOMAIN_PATH][Constants.VALUE];
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while accessing the domain details:' + e.toString());
  }
  return domainObj;
};
ThemeRepository.updatePrimaryColorInJSONObj = function(jsonObj, primaryColor) {
  jsonObj.base[Constants.PRIMARY_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.base[Constants.SURFACE_BRAND_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.base[Constants.SELECTION_PRIMARY_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.base[Constants.CHROME_BRAND_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.base[Constants.CHROME_DIVIDER_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.base[Constants.INTERACTIVE_COLOR_HOOK_NAME] = primaryColor;
  jsonObj.properties[Constants.BRAND_PRIMARY_COLOR_HOOK_NAME] = primaryColor;
};
ThemeRepository.updateSecondaryColorInJSONObj = function(jsonObj, secondaryColor) {
  jsonObj.base[Constants.SECONDARY_COLOR_HOOK_NAME] = secondaryColor;
  jsonObj.base[Constants.SELECTION_SECONDARY_COLOR_HOOK_NAME] = secondaryColor;
  jsonObj.base[Constants.SURFACE_BRAND_COLOR_HOOK_NAME] = secondaryColor;
  jsonObj.properties[Constants.BRAND_SECONDARY_COLOR_HOOK_NAME] = secondaryColor;
};
ThemeRepository.updateNeutralColorInJSONObj = function(jsonObj, neutralColor) {
  jsonObj.base[Constants.NEUTRAL_COLOR_HOOK_NAME] = neutralColor;
  jsonObj.base[Constants.SECONDARY_NAV_BRAND_COLOR_HOOK_NAME] = neutralColor;
  jsonObj.base[Constants.SECONDARY_NAV_DIVIDER_COLOR_HOOK_NAME] = neutralColor;
  jsonObj.properties[Constants.BRAND_NEUTRAL_COLOR_HOOK_NAME] = neutralColor;
};
ThemeRepository.getInitialColors = function() {
  var styleObj = JSON.parse(JSON.stringify(Constants.INITIAL.colors));
  ThemeRepository.updatePrimaryColorInJSONObj(styleObj, Constants.PRIMARY_COLOR_RGB_DEFAULT);
  ThemeRepository.updateSecondaryColorInJSONObj(styleObj, Constants.SECONDARY_COLOR_RGB_DEFAULT);
  ThemeRepository.updateNeutralColorInJSONObj(styleObj, Constants.NEUTRAL_COLOR_RGB_DEFAULT);
  return JSON.stringify(styleObj);
};
ThemeRepository.validateNameInput = function(name) {
  if (gs.nil(name)) {
      return false;
  }
  var trimmedName = name.trim();
  var length = trimmedName.length;
  return length >= Constants.MINLENGTH && length < Constants.MAXLENGTH;
};

ThemeRepository.transformCustomizationObjToStr = function(sourceObj) {
  var destinationObj = {
      colors: [],
      typography: [],
      feedback: [],
      groupName: '',
      variants: [],
  };

  var sourceColors = sourceObj.colors;
  var destinationColors = destinationObj.colors;
  var sourceVariants = sourceObj.variants;
  var destinationVariants = destinationObj.variants;
  if (!gs.nil(sourceObj.groupName))
      destinationObj.groupName = sourceObj.groupName;

  ThemeRepository.transformColorsToArray(sourceColors, destinationColors);
  if (sourceVariants) {
      Object.keys(sourceVariants).forEach(function(variantId) {
          var variantObj = {};
          var sourceVariantObj = sourceVariants[variantId];
          variantObj.id = variantId;
          variantObj.colors = [];
          if (sourceVariantObj.colors)
              ThemeRepository.transformColorsToArray(sourceVariantObj.colors, variantObj.colors);
          destinationVariants.push(variantObj);
      });
  }
  var sourceTypography = sourceObj.typography;
  var destinationTypography = destinationObj.typography;
  if (sourceTypography.customizedNames) {
      Object.keys(sourceTypography.customizedNames).forEach(function(id) {
          destinationTypography.push(ThemeRepository.getEntityObject(id, sourceTypography.customizedNames[id], Constants.CUSTOMIZED_NAME));
      });
  }
  var sourceFeedback = sourceObj.feedback;
  var destinationFeedback = destinationObj.feedback;
  if (sourceFeedback) {
      Object.keys(sourceFeedback).forEach(function(id) {
          destinationFeedback.push(ThemeRepository.getEntityObject(id, sourceFeedback[id], Constants.FEEDBACK));
      });
  }
  // Extend this logic to other types, such as imagery, shape, and theme.
  if (destinationColors.length === 0) {
      delete destinationObj.colors;
  }
  if (destinationVariants.length === 0) {
      delete destinationObj.variants;
  }
  if (destinationTypography.length === 0) {
      delete destinationObj.typography;
  }
  if (destinationFeedback.length === 0) {
      delete destinationObj.destinationFeedback;
  }
  return Object.keys(destinationObj).length === 0 ? Constants.EMPTY_STR : JSON.stringify(destinationObj);
};
ThemeRepository.getAppliedThemeCustomization = function(themeId) {
  var syspropGR = new GlideRecord('sys_properties');
  syspropGR.addQuery('name=glide.ui.polaris.theme.custom');
  syspropGR.query();
  if (syspropGR.next()) {
      if (syspropGR.value == themeId)
          return {
              id: 'applied',
              value: themeId,
              type: 'applied_theme'
          }
  }
};
ThemeRepository.transformCustomizationStrToObject = function(sourceStr) {
  var destinationObj = {
      colors: {
          customizedNames: {},
          contrastRatioViolations: {},
          overrides: {},
          isSecondaryColorUpdated: false
      },
      typography: {
          customizedNames: {}
      },
      feedback: {},
      groupName: '',
      variants: {}
  };
  if (gs.nil(sourceStr)) {
      return destinationObj;
  }
  var sourceObj = JSON.parse(sourceStr);
  var sourceColors = sourceObj.colors;
  if (!gs.nil(sourceObj.groupName))
      destinationObj.groupName = sourceObj.groupName;
  if (sourceColors && Array.isArray(sourceColors)) {
      var destinationColors = destinationObj.colors;
      sourceColors.forEach(function(obj) {
          switch (obj.type) {
              case Constants.CUSTOMIZED_NAME:
                  destinationColors.customizedNames[obj.id] = obj.value;
                  break;
              case Constants.CONTRAST_RATIO_VIOLATED:
                  destinationColors.contrastRatioViolations[obj.id] = obj.value;
                  break;
              case Constants.COLOR_HOOK_OVERRIDDEN:
                  destinationColors.overrides[obj.id] = obj.value;
                  break;
              case Constants.SECONDARY_COLOR_UPDATED:
                  destinationColors.isSecondaryColorUpdated = obj.value;
                  break;
          }
      });
  }
  var sourceVariants = sourceObj.variants;
  if (sourceVariants && Array.isArray(sourceVariants)) {
      var destinationVariants = destinationObj.variants;
      sourceVariants.forEach(function(sourceVariant) {
          var variantColors = sourceVariant.colors;
          var variantId = sourceVariant.id;
          destinationVariants[variantId] = {
              colors: {
                  customizedNames: {},
                  contrastRatioViolations: {},
                  overrides: {},
                  isSecondaryColorUpdated: false
              }
          };
          variantColors.forEach(function(variantColor) {
              switch (variantColor.type) {
                  case Constants.CUSTOMIZED_NAME:
                      destinationVariants[variantId].colors.customizedNames[variantColor.id] = variantColor.value;
                      break;
                  case Constants.CONTRAST_RATIO_VIOLATED:
                      destinationVariants[variantId].colors.contrastRatioViolations[variantColor.id] = variantColor.value;
                      break;
                  case Constants.COLOR_HOOK_OVERRIDDEN:
                      destinationVariants[variantId].colors.overrides[variantColor.id] = variantColor.value;
                      break;

                  case Constants.SECONDARY_COLOR_UPDATED:
                      destinationVariants[variantId].colors.isSecondaryColorUpdated = variantColor.value;
                      break;
              }
          });
      });
  }
  var sourceTypography = sourceObj.typography;
  if (sourceTypography && Array.isArray(sourceTypography)) {
      var destinationTypography = destinationObj.typography;
      sourceTypography.forEach(function(obj) {
          switch (obj.type) {
              case Constants.CUSTOMIZED_NAME:
                  destinationTypography.customizedNames[obj.id] = obj.value;
                  break;
          }
      });
  }
  var sourceFeedback = sourceObj.feedback;
  if (sourceFeedback && Array.isArray(sourceFeedback)) {
      var destinationFeedback = destinationObj.feedback;
      sourceFeedback.forEach(function(obj) {
          switch (obj.type) {
              case Constants.FEEDBACK:
                  destinationFeedback[obj.id] = obj.value;
                  break;
          }
      });
  }
  //Extend this logic to other types, such as imagery, shape, and theme.
  return destinationObj;
};
ThemeRepository.getEntityObject = function(id, value, type) {
  return {
      id: id,
      value: value,
      type: type
  };
};
ThemeRepository.validateRGB = function(colorRGB) {
  var rgbArray = colorRGB.split(Constants.COMMA);
  var length = rgbArray.length;
  if (!length === 3) {
      return false;
  }
  for (var i = 0; i < length; i++) {
      try {
          var value = parseInt(rgbArray[i]);
          if (!(value >= Constants.MINVAL && value <= Constants.MAXVALUE)) {
              return false;
          }
      } catch (er) {
          return false;
      }
  }
  return true;
};
ThemeRepository.validateAdditionalColorsInput = function(additional) {
  if (additional && Array.isArray(additional)) {
      for (var i = 0; i < additional.length; i++) {
          if (!ThemeRepository.validateRGB(additional[i])) {
              return false;
          }
      }
  }
  return true;
};
ThemeRepository.validateColorsInput = function(primary, secondary, neutral) {
  if (primary) {
      if (!ThemeRepository.validateRGB(primary)) {
          return false;
      }
  }
  if (secondary) {
      if (!ThemeRepository.validateRGB(secondary)) {
          return false;
      }
  }
  if (neutral) {
      if (!ThemeRepository.validateRGB(neutral)) {
          return false;
      }
  }
  return true;
};
ThemeRepository.getFileNameAndExtension = function(fileName) {
  if (!fileName) return null;
  var extMatch = fileName.match(Constants.FILE_EXTENSION_REGEX);
  if (!extMatch) return null;
  return {
      fileName: extMatch[1],
      extension: extMatch[2]
  };
};
ThemeRepository.uploadFile = function(record, fileName, fileType, file) {
  return new GlideSysAttachment().writeBase64(record, fileName, fileType, file);
};
ThemeRepository.deleteFile = function(table, id) {
  var attachmentGR = new GlideRecord(Constants.SYS_ATTACHEMENT_TABLE_NAME);
  attachmentGR.addQuery(Constants.TABLE_NAME_COLUMN_FIELD, table);
  attachmentGR.addQuery(Constants.TABLE_ID_COLUMN_FIELD, id);
  attachmentGR.query();
  if (attachmentGR.next()) {
      new GlideSysAttachment().deleteAttachment(attachmentGR.sys_id);
      return true;
  }
  return false;
};
ThemeRepository.getTBCreatedThemeIds = function() {
  var themeIds = [];
  var customizationGR = new GlideRecordSecure(Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME);
  customizationGR.addActiveQuery();
  ThemeRepository.addDomainQueryToGR(customizationGR);
  customizationGR.query();
  while (customizationGR.next()) {
      themeIds.push(customizationGR.getValue(Constants.THEME_COLUMN_FIELD));
  }
  return themeIds;
};
ThemeRepository.getCustomizationGR = function(themeId) {
  var customizationGR = new GlideRecordSecure(Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME);
  customizationGR.setLimit(1);
  customizationGR.addActiveQuery();
  if (themeId) {
      customizationGR.addQuery(Constants.THEME_COLUMN_FIELD, themeId);
  }
  ThemeRepository.addDomainQueryToGR(customizationGR);
  customizationGR.query();
  if (customizationGR.next()) {
      return customizationGR;
  }
  return null;
};
ThemeRepository.getTheme = function(themeId) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      if (!ThemeRepository.isThemeCreatedByTB(themeId) && !ThemeRepository.isThemeReadOnly(themeId)) {
          logObject.message = gs.getMessage('You need to get permission to view this theme. Contact your system administrator for permission.');
          return logObject;
      }
      var themeGR = new GlideRecordSecure(Constants.SYS_UX_THEME_TABLE_NAME);
      themeGR.setLimit(1);
      themeGR.addActiveQuery();
      themeGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, themeId);
      ThemeRepository.addDomainQueryToGR(themeGR);
      themeGR.query();
      if (themeGR.next()) {
          return themeGR;
      }
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while accessing the theme: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to get your theme. Try it again or contact your system administrator for more help.');
      return logObject;
  }
  return logObject;
};
ThemeRepository.getAllThemes = function(encodedQuery) {
  try {
      var themesGR = new GlideRecordSecure(Constants.SYS_UX_THEME_TABLE_NAME);
      themesGR.addActiveQuery();
      var TBCreatedThemeIds = ThemeRepository.getTBCreatedThemeIds();
      TBCreatedThemeIds = ThemeRepository.getReadOnlyThemeIds().concat(TBCreatedThemeIds);
      themesGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, Constants.IN_OPERATOR, TBCreatedThemeIds);
      ThemeRepository.addDomainQueryToGR(themesGR);
      if (encodedQuery) themesGR.addEncodedQuery(encodedQuery);
      else {
          var sortEncodedQuery = 'ORDERBY';
          var sortByGr = ThemeRepository.getGR(Constants.SYS_USER_PREFERENCE_TABLE_NAME, 'name=' + Constants.USER_PREFERENCE_SORT_BY);
          var sortByDirGr = ThemeRepository.getGR(Constants.SYS_USER_PREFERENCE_TABLE_NAME, 'name=' + Constants.USER_PREFERENCE_SORT_DIRECTION);
          if (!gs.nil(sortByDirGr) && sortByDirGr.getValue(Constants.VALUE) === 'DESC') sortEncodedQuery += 'DESC';
          if (!gs.nil(sortByGr)) {
              sortEncodedQuery += sortByGr.getValue(Constants.VALUE);
              themesGR.addEncodedQuery(sortEncodedQuery);
          }
      }
      themesGR.query();
      return themesGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while accessing the themes: ' + e.toString());
      return [];
  }
};
ThemeRepository.getMobileThemes = function() {
  var mobileThemeGR = new GlideRecordSecure(Constants.SYS_SG_NATIVE_CLIENT_TABLE_NAME);
  mobileThemeGR.query();
  return mobileThemeGR;
};
ThemeRepository.getStyleType = function(styleRecord) {
  try {
      switch (styleRecord.name.value) {
          case Constants.IMAGERY_STYLE_TYPE:
              return Constants.IMAGERY_STYLE_GRAPHQL_TYPE;
          case Constants.TYPOGRAPHY_STYLE_TYPE:
              return Constants.TYPOGRAPHY_STYLE_GRAPHQL_TYPE;
          case Constants.COLORS_STYLE_TYPE:
              return Constants.COLORS_STYLE_GRAPHQL_TYPE;
          case Constants.SHAPE_STYLE_TYPE:
              return Constants.SHAPE_STYLE_GRAPHQL_TYPE;
          default:
              return Constants.UNKNOWN_STYLE_GRAPHQL_TYPE;
      }
  } catch (e) {
      return Constants.UNKNOWN_STYLE_GRAPHQL_TYPE;
  }
};
ThemeRepository.getThemeStyles = function(themeId) {
  var themeStyleIds = [];
  var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
  themeStyleM2M.addQuery(Constants.THEME_COLUMN_FIELD, themeId);
  themeStyleM2M.query();
  while (themeStyleM2M.next()) {
      themeStyleIds.push(themeStyleM2M.getValue(Constants.STYLE_COLUMN_FIELD));
  }
  var stylesGR = new GlideRecordSecure(Constants.SYS_UX_STYLE_TABLE_NAME);
  stylesGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, themeStyleIds);
  stylesGR.query();
  return stylesGR;
};
ThemeRepository.getColors = function(styleStr) {
  var styleObj = JSON.parse(styleStr);
  if (ThemeRepository.isStyleObjectNil(styleObj)) {
      return null;
  }
  var colors = {};
  colors.primary = ThemeRepository._appendRGB(styleObj.properties[Constants.BRAND_PRIMARY_COLOR_HOOK_NAME]);
  colors.secondary = ThemeRepository._appendRGB(styleObj.properties[Constants.BRAND_SECONDARY_COLOR_HOOK_NAME]);
  colors.neutral = ThemeRepository._appendRGB(styleObj.properties[Constants.BRAND_NEUTRAL_COLOR_HOOK_NAME]);
  colors.additional = [];
  var additionalColorsRegex = Constants.ADDITIONAL_COLORS_REFERENCE_REGEX;
  var match = null;
  while ((match = additionalColorsRegex.exec(styleStr)) != null) {
      colors.additional.push(ThemeRepository._appendRGB(styleObj.properties[match[0]]));
  }
  return colors;
};
ThemeRepository.getTypographyStyle = function(styleStr) {
  var typography = {};
  if (gs.nil(styleStr)) {
      return typography;
  }
  var styleObj = JSON.parse(styleStr);
  var fontFamily = styleObj.properties[Constants.NOW_FONT_FAMILY_HOOK_NAME];
  if (fontFamily) {
      typography.value = fontFamily.split(Constants.COMMA)[0];
  }
  return typography;
};
ThemeRepository.getShapeStyle = function(styleStr) {
  var shape = {};
  if (gs.nil(styleStr)) {
      return shape;
  }
  var styleObj = JSON.parse(styleStr);
  shape.value = styleObj.properties[Constants.ACTIONABLE_BORDER_RADIUS_HOOK_NAME];
  return shape;
};
ThemeRepository.isHeaderLogo = function(m2mProperties) {
  if (gs.nil(m2mProperties)) {
      return false;
  }
  return JSON.parse(m2mProperties).position === Constants.IMAGE_LOCATION;
};
ThemeRepository.getLogosStyle = function(styleId) {
  var logos = [];
  var assetIds = [];
  var styleAssetM2M = new GlideRecordSecure(Constants.M2M_STYLE_ASSET_TABLE_NAME);
  styleAssetM2M.addQuery(Constants.STYLE_COLUMN_FIELD, styleId);
  styleAssetM2M.query();
  while (styleAssetM2M.next()) {
      var currLogo = {};
      currLogo.props = styleAssetM2M.getValue(Constants.PROPERTIES_COLUMN_FIELD);
      if (ThemeRepository.isHeaderLogo(currLogo.props)) {
          currLogo.m2mStyleAssetId = styleAssetM2M.getUniqueValue();
          currLogo.assetId = styleAssetM2M.getValue(Constants.ASSET_COLUMN_FIELD);
          logos.push(currLogo);
          assetIds.push(currLogo.assetId);
          break;
      }
  }
  var logosData = {};
  var attachment = new GlideRecordSecure(Constants.SYS_ATTACHEMENT_TABLE_NAME);
  attachment.addQuery(Constants.TABLE_ID_COLUMN_FIELD, assetIds);
  attachment.query();
  var gsAttachment = new GlideSysAttachment();
  while (attachment.next()) {
      logosData[attachment.getValue(Constants.TABLE_ID_COLUMN_FIELD)] = {
          file: gsAttachment.getContentBase64(attachment),
          fileName: attachment.getValue(Constants.FILE_NAME_COLUMN_FIELD),
          fileType: attachment.getValue(Constants.CONTENT_TYPE_COLUMN_FIELD),
          attachmentId: attachment.getUniqueValue()
      };
  }
  return logos.map(function(logo) {
      var logoData = logosData[logo.assetId] || {};
      logo.file = logoData.file;
      logo.fileName = logoData.fileName;
      logo.fileType = logoData.fileType;
      logo.attachmentId = logoData.attachmentId;
      return logo;
  });
};
ThemeRepository.getAllExperiences = function() {
  var experiences = [];
  var adminConfigIds = [];
  var experienceGR = new GlideRecordSecure(Constants.SYS_UX_PAGE_REGISTRY_TABLE_NAME);
  experienceGR.addActiveQuery();
  // pull the children of the unified navigation app shell
  experienceGR.addEncodedQuery(
      'parent_app=c86a62e2c7022010099a308dc7c26022^admin_panel_table=sys_ux_app_config'
  );
  experienceGR.query();
  while (experienceGR.next()) {
      var experience = {
          id: experienceGR.getUniqueValue(),
          title: experienceGR.getValue(Constants.TITLE_COLUMN_FIELD),
          basePath: experienceGR.getValue(Constants.PATH_COLUMN_FIELD),
          adminPanelID: experienceGR.getValue(Constants.ADMIN_PANEL_COLUMN_FIELD)
      };
      adminConfigIds.push(experience.adminPanelID);
      experiences.push(experience);
  }
  var adminConfigGR = new GlideRecordSecure(Constants.SYS_UX_APP_CONFIG_TABLE_NAME);
  adminConfigGR.addActiveQuery();
  adminConfigGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, adminConfigIds);
  adminConfigGR.query();
  var configData = {};
  while (adminConfigGR.next()) {
      configData[adminConfigGR.getUniqueValue()] = adminConfigGR.getValue(Constants.LANDING_PATH_COLUMN_FIELD);
  }
  experiences.forEach(function(experience) {
      experience.uri = [Constants.NOW, experience.basePath, configData[experience.adminPanelID]]
          .join(Constants.FORWARD_SLASH);
      return experience;
  });
  return experiences.filter(function(experience) {
      var appRouteGR = new GlideRecordSecure(Constants.SYS_UX_APP_ROUTE_TABLE_NAME);
      appRouteGR.addQuery(Constants.APP_CONFIG_COLUMN_FIELD, experience.adminPanelID);
      appRouteGR.addQuery(Constants.ROUTE_TYPE_COLUMN_FIELD, configData[experience.adminPanelID]);
      appRouteGR.query();
      return appRouteGR.next();
  });
};
ThemeRepository.deleteTheme = function(deleteThemeInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE,
  };
  try {
      var themeId = deleteThemeInput.id;
      var themeGR = ThemeRepository.getTheme(themeId);
      if (gs.nil(themeGR) || ThemeRepository.isThemeReadOnly(themeId)) {
          logObject.message = gs.getMessage('You need to get permission to delete this theme. Contact your system administrator for permission.');
          return logObject;
      }
      var themeStyleIds = [];
      var imageryStyleId;
      var themeStylesGR = ThemeRepository.getThemeStyles(themeId);
      var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
      themeStyleM2M.addQuery(Constants.THEME_COLUMN_FIELD, themeId);
      themeStyleM2M.query();
      while (themeStylesGR.next()) {
          var styleName = themeStylesGR.getValue(Constants.NAME_COLUMN_FIELD);
          if (styleName === Constants.IMAGERY_STYLE_TYPE)
              imageryStyleId = themeStylesGR.getUniqueValue();
          themeStyleIds.push(themeStylesGR.getUniqueValue());
      }
      var imageryAssetId = '';
      var styleAssetM2M = new GlideRecordSecure(Constants.M2M_STYLE_ASSET_TABLE_NAME);
      styleAssetM2M.addQuery(Constants.STYLE_COLUMN_FIELD, themeStyleIds);
      styleAssetM2M.query();
      while (styleAssetM2M.next()) {
          if (styleAssetM2M.getValue(Constants.STYLE_COLUMN_FIELD) === imageryStyleId)
              imageryAssetId = styleAssetM2M.getValue(Constants.ASSET_COLUMN_FIELD);
      }
      var customizedGR = ThemeRepository.getCustomizationGR(themeId);
      if (!customizedGR.deleteRecord()) {
          if (ThemeRepository.isScopeSame(customizedGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = gs.getMessage('You need to get permission to delete this theme. Contact your system administrator for permission.');
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(customizedGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
      if (imageryAssetId !== '') {
          ThemeRepository.deleteFile(Constants.SYS_UX_THEME_ASSET_TABLE_NAME, imageryAssetId);
          var assetGR = new GlideRecordSecure(Constants.SYS_UX_THEME_ASSET_TABLE_NAME);
          assetGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, imageryAssetId);
          assetGR.query();
          assetGR.deleteMultiple();
      }
      themeStyleM2M.deleteMultiple();
      styleAssetM2M.deleteMultiple();
      themeStylesGR.deleteMultiple();
      themeGR.deleteRecord();
      return {
          value: themeId
      };
  } catch (e) {
      gs.error(
          Constants.THEME_BUILDER_PREFIX +
          'Error while deleting the theme: ' +
          e.toString()
      );
      logObject.message = gs.getMessage('There was an error when trying to delete the theme. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.createDuplicateTheme = function(createDuplicateThemeInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE,
  };
  try {
      var originalThemeId = createDuplicateThemeInput.id;
      var originalThemeGR = ThemeRepository.getTheme(originalThemeId);
      if (gs.nil(originalThemeGR) || ThemeRepository.isThemeReadOnly(originalThemeId)) {
          return logObject;
      }
      var newThemeName = ThemeRepository.getUniqueNameForDuplicateTheme(Constants.SYS_UX_THEME_TABLE_NAME, originalThemeGR.getValue(Constants.NAME_COLUMN_FIELD));
      var duplicateThemeGR = ThemeRepository.createGR(
          Constants.SYS_UX_THEME_TABLE_NAME, {
              name: newThemeName,
              description: originalThemeGR.getValue(Constants.DESCRIPTION_COLUMN_FIELD),
          }
      );
      if (gs.nil(duplicateThemeGR)) {
          logObject.message = gs.getMessage('You need to get permission to duplicate this theme. Contact your system administrator for permission.');
          return logObject;
      }
      var duplicateThemeId = duplicateThemeGR.getUniqueValue();
      var originalStylesGR = ThemeRepository.getThemeStyles(originalThemeId);
      var duplicateStylesMapper = {};
      var originalStyleIdsMapper = {};
      var variantIdMapper = {};
      while (originalStylesGR.next()) {
          var styleName = originalStylesGR.getValue(Constants.NAME_COLUMN_FIELD);
          originalStyleIdsMapper[styleName] =
              originalStylesGR.getUniqueValue();
          var styleId = (duplicateStylesMapper[styleName] =
              ThemeRepository.getUniqueValueAfterInsert(
                  Constants.SYS_UX_STYLE_TABLE_NAME, {
                      name: ThemeRepository.getUniqueNameForDuplicateVariant(originalStylesGR.getValue(Constants.NAME_COLUMN_FIELD), originalStylesGR.getValue(Constants.TYPE_COLUMN_FIELD)),
                      type: originalStylesGR.getValue(Constants.TYPE_COLUMN_FIELD),
                      style: originalStylesGR.getValue(Constants.STYLE_COLUMN_FIELD),
                  }
              ));
          ThemeRepository.getUniqueValueAfterInsert(
              Constants.M2M_THEME_STYLE_TABLE_NAME, {
                  theme: duplicateThemeId,
                  style: styleId,
              }
          );
          var type = originalStylesGR.getValue(Constants.TYPE_COLUMN_FIELD); 
          if (type === 'variant') {
              var oldStyleId = originalStylesGR.getUniqueValue();
              variantIdMapper[oldStyleId] = styleId;
          }
      }
      Constants.UPLOAD_FONTS.forEach(function(font) {
          ThemeRepository.getUniqueValueAfterInsert(
              Constants.M2M_STYLE_ASSET_TABLE_NAME, {
                  style: duplicateStylesMapper[Constants.TYPOGRAPHY_STYLE_TYPE],
                  asset: font.asset,
                  properties: font.properties,
              }
          );
      });
      var originalImageryId = originalStyleIdsMapper[Constants.IMAGERY_STYLE_TYPE];
      var logoStyles = ThemeRepository.getLogosStyle(originalImageryId);
      if (logoStyles && Array.isArray(logoStyles) && logoStyles.length > 0) {
          var logo = logoStyles[0];
          var assetGR = ThemeRepository.createGR(
              Constants.SYS_UX_THEME_ASSET_TABLE_NAME, {
                  name: logo.fileName || Constants.EMPTY_STR,
                  category: Constants.IMAGE_CATEGORY_VALUE,
              }
          );
          if (!gs.nil(logo.file)) {
              ThemeRepository.uploadFile(
                  assetGR,
                  logo.fileName,
                  logo.fileType,
                  logo.file
              );
          }
          ThemeRepository.createGR(Constants.M2M_STYLE_ASSET_TABLE_NAME, {
              properties: logo.props,
              style: duplicateStylesMapper[Constants.IMAGERY_STYLE_TYPE],
              asset: assetGR.getUniqueValue(),
          });
      }
      var customizedDuplicateGR =
          ThemeRepository.getCustomizationGR(originalThemeId);
      var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizedDuplicateGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
      var customizationStr = customizedDuplicateGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD);
      var groupName = customizationObj['groupName'];
      if (!gs.nil(groupName)) {
          var duplicatedGroupName = ThemeRepository.getUniqueNameForDuplicateGroup(groupName);
          customizationObj['groupName'] = duplicatedGroupName;
          customizationStr = ThemeRepository.transformCustomizationObjToStr(customizationObj);
          for (var oldVariantId in variantIdMapper) {
             customizationStr = customizationStr.replace(oldVariantId, variantIdMapper[oldVariantId]);
          }
      }
      ThemeRepository.createGR(
          Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME, {
              name: customizedDuplicateGR.getValue(Constants.NAME_COLUMN_FIELD),
              theme: duplicateThemeId,
              customization: customizationStr,
          }
      );
      return duplicateThemeGR;
  } catch (e) {
      gs.error(
          Constants.THEME_BUILDER_PREFIX +
          'Error while duplicating the theme: ' +
          e.toString()
      );
      logObject.message = gs.getMessage('There was an error when trying to duplicate the theme. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.createVariant = function(createVariantInput) {
  try {
      var name = createVariantInput.name;
      var groupName = createVariantInput.groupName;
      var themeId = createVariantInput.themeId;
      var variantSysId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: name,
          type: Constants.STYLE_VARIANT_TYPE,
          style: ThemeRepository.getInitialColors(),
      });
      ThemeRepository.getUniqueValueAfterInsert(Constants.M2M_THEME_STYLE_TABLE_NAME, {
          theme: themeId,
          style: variantSysId
      });
      var customizationGR = ThemeRepository.getCustomizationGR(themeId);
      var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
      var themeGr = ThemeRepository.getGR(Constants.SYS_UX_THEME_TABLE_NAME, 'sys_id=' + themeId);
      if (!gs.nil(customizationObj) && !gs.nil(groupName)) {
          customizationObj['groupName'] = groupName;
          customizationObj.variants[variantSysId] = {};
          customizationGR.setValue(Constants.CUSTOMIZATION_COLUMN_FIELD, ThemeRepository.transformCustomizationObjToStr(customizationObj));
          customizationGR.update();
      }
      return themeGr;
  } catch (e) {
      gs.error(
          Constants.THEME_BUILDER_PREFIX +
          'Error while duplicating the theme: ' +
          e.toString()
      );
  }
};
ThemeRepository.createTheme = function(createThemeInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var name = createThemeInput.name;
      if (!ThemeRepository.validateNameInput(name)) {
          logObject.message = gs.getMessage('There was an error when adding your theme name. Try adding it again.');
          return logObject;
      }
      var themeGR = ThemeRepository.createGR(Constants.SYS_UX_THEME_TABLE_NAME, {
          name: name,
          description: createThemeInput.description || Constants.EMPTY_STR
      });
      if (gs.nil(themeGR)) {
          logObject.message = gs.getMessage('You need to get permission to create this theme. Contact your system administrator for permission.');
          return logObject;
      }
      var themeId = themeGR.getUniqueValue();
      var initial = Constants.INITIAL;
      var colorsStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: Constants.COLORS_STYLE_TYPE,
          type: Constants.STYLE_CORE_TYPE,
          style: ThemeRepository.getInitialColors()
      });
      var shapeStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: Constants.SHAPE_STYLE_TYPE,
          type: Constants.STYLE_CORE_TYPE,
          style: JSON.stringify(initial.shape)
      });
      var imageStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: Constants.IMAGERY_STYLE_TYPE,
          type: Constants.STYLE_CORE_TYPE,
          style: JSON.stringify(initial.imagery)
      });
      var typographyStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: Constants.TYPOGRAPHY_STYLE_TYPE,
          type: Constants.STYLE_CORE_TYPE,
          style: JSON.stringify(initial.typography)
      });
      var mobileStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
          name: Constants.MOBILE_STYLE_TYPE,
          type: Constants.STYLE_CORE_TYPE,
          style: JSON.stringify(initial.mobile)
      });
      [colorsStyleId, shapeStyleId, imageStyleId, typographyStyleId, mobileStyleId].forEach(function(styleId) {
          ThemeRepository.getUniqueValueAfterInsert(Constants.M2M_THEME_STYLE_TABLE_NAME, {
              theme: themeId,
              style: styleId
          });
      });
      Constants.UPLOAD_FONTS.forEach(function(font) {
          ThemeRepository.getUniqueValueAfterInsert(Constants.M2M_STYLE_ASSET_TABLE_NAME, {
              style: typographyStyleId,
              asset: font.asset,
              properties: font.properties
          });
      });
      ThemeRepository.createGR(Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME, {
          name: name,
          theme: themeId
      });
      return themeGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while creating the theme: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to create your theme. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateTheme = function(updateThemeInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var name = updateThemeInput.name;
      var description = updateThemeInput.description;
      var themeId = updateThemeInput.id;
      if (!ThemeRepository.validateNameInput(name)) {
          logObject.message = gs.getMessage('There was an error when adding your theme name. Try adding it again.');
          return logObject;
      }
      var themeGR = ThemeRepository.getGR(Constants.SYS_UX_THEME_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, themeId]));
      var message = gs.getMessage('You need to get permission to update this theme. Contact your system administrator for permission.');
      if (gs.nil(themeGR)) {
          logObject.message = gmessage;
          return logObject;
      }
      themeGR.setValue(Constants.NAME_COLUMN_FIELD, name);
      themeGR.setValue(Constants.DESCRIPTION_COLUMN_FIELD, description);
      if (!themeGR.update()) {
          if (ThemeRepository.isScopeSame(themeGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = message;
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(themeGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      } else {
          return themeGR;
      }
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the theme: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to update your theme. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateThemeRecordForMobile = function(themeId) {
  try {
      if (themeId) {
          var grThemeStyle = new GlideRecordSecure('m2m_theme_style');
          grThemeStyle.addQuery('theme', themeId);
          grThemeStyle.query();
          var hasMobileStyle = false;
          var grStyle = new GlideRecordSecure('sys_ux_style');
          while (grThemeStyle.next()) {
              var styleId = grThemeStyle.getValue('style');
              grStyle.get(styleId);
              var styleObj = JSON.parse(grStyle.getValue('style'));
              if (styleObj.nativeMobile) {
                  hasMobileStyle = true;
                  break;
              }
          }
          if (!hasMobileStyle) {
              var mobileStyleId = ThemeRepository.getUniqueValueAfterInsert(Constants.SYS_UX_STYLE_TABLE_NAME, {
                  name: Constants.MOBILE_STYLE_TYPE,
                  type: Constants.STYLE_CORE_TYPE,
                  style: JSON.stringify(Constants.INITIAL.mobile)
              });
              ThemeRepository.getUniqueValueAfterInsert(Constants.M2M_THEME_STYLE_TABLE_NAME, {
                  theme: themeId,
                  style: mobileStyleId
              });
          }
      }
      return true;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the mobile theme: ' + e.toString());
      return false;
  }
};
ThemeRepository.getGeneratedColors = function(styleInput) {
  try {
      var styleObj = JSON.parse(styleInput);
      var props = GlideUxTheme.processBaseProperties(styleObj.base, styleObj.isDark, styleObj.colorGenerationVersion);
      return JSON.stringify(props);
  } catch (e) {
      return {};
  }
};
ThemeRepository.getCustomizationObj = function(themeId) {
  var customizationGR = ThemeRepository.getCustomizationGR(themeId);
  if (gs.nil(customizationGR)) {
      return {
          messageType: Constants.ERROR_LOG_TYPE,
          message: gs.getMessage('You need to get permission to view this customization. Contact your system administrator for permission.')
      }
  }
  var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
  var appliedTheme = ThemeRepository.getAppliedThemeCustomization(themeId);
  if (appliedTheme) {
      customizationObj['theme'] = [appliedTheme];
  }
  // Don't send feedback to frontend
  delete customizationObj.feedback;
  return {
      id: customizationGR.getUniqueValue(),
      value: JSON.stringify(customizationObj)
  };
};
ThemeRepository.getCustomization = function(themeId) {
  if (themeId === Constants.POLARIS_THEME_ID) return null;
  var customizationGR = ThemeRepository.getCustomizationGR(themeId);
  var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
  var appliedTheme = ThemeRepository.getAppliedThemeCustomization(themeId);
  if (appliedTheme) {
      customizationObj['theme'] = [appliedTheme];
  }
  // Don't send feedback to frontend
  delete customizationObj.feedback;
  return {
      id: customizationGR.getUniqueValue(),
      value: JSON.stringify(customizationObj)
  };
};
ThemeRepository.updateAdditionalBrandColors = function(updateAdditionalBrandColorsInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var styleId = updateAdditionalBrandColorsInput.id;
      var additional = updateAdditionalBrandColorsInput.additional;
      var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
      themeStyleM2M.addQuery(Constants.STYLE_COLUMN_FIELD, styleId);
      themeStyleM2M.query();
      if (!ThemeRepository.validateAdditionalColorsInput(additional) || !themeStyleM2M.next()) {
          logObject.message = gs.getMessage('There was an error when adding your color. Try adding it again.');
          return logObject;
      }
      var styleGR = ThemeRepository.getGR(Constants.SYS_UX_STYLE_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, styleId]));
      var message = gs.getMessage('You need to get permission to update this color. Contact your system administrator for permission.');
      if (gs.nil(styleGR)) {
          logObject.message = message;
          return logObject;
      }
      var styleStr = styleGR.getValue(Constants.STYLE_COLUMN_FIELD);
      var styleObj = JSON.parse(styleStr);
      if (additional && Array.isArray(additional)) {
          var match = null;
          while ((match = Constants.ADDITIONAL_COLORS_REFERENCE_REGEX.exec(styleStr)) != null) {
              delete styleObj.properties[match[0]];
          }
          additional.forEach(function(color, index) {
              styleObj.properties[Constants.ADDITIONAL_COLORS_REFERENCE_PREFIX + index] = color;
          });
          styleGR.setValue(Constants.STYLE_COLUMN_FIELD, JSON.stringify(styleObj));
          if (!styleGR.update()) {
              if (ThemeRepository.isScopeSame(styleGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                      ThemeRepository.getScopeId())) {
                  logObject.message = message;
              } else {
                  logObject.message = ThemeRepository.getScopeErrorMessage(styleGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
              }
              return logObject;
          }
      }
      return styleGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the additional brand colors: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to update color. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateBrandColors = function(updateBrandColorsInput) {
  try {
      var primary = updateBrandColorsInput.primary;
      var secondary = updateBrandColorsInput.secondary;
      var neutral = updateBrandColorsInput.neutral;
      var additional = updateBrandColorsInput.additional;
      var propertyOverrides = updateBrandColorsInput.propertyOverrides;
      var styleId = updateBrandColorsInput.id;
      var themeId = updateBrandColorsInput.themeId;
      var isSecondaryColorUpdated = updateBrandColorsInput.isSecondaryColorUpdated;
      var isVariant = updateBrandColorsInput.isVariant;
      var logObject = {
          messageType: Constants.ERROR_LOG_TYPE
      };
      var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
      themeStyleM2M.addQuery(Constants.STYLE_COLUMN_FIELD, styleId);
      themeStyleM2M.query();
      if (!ThemeRepository.validateColorsInput(primary, secondary, neutral) || !themeStyleM2M.next()) {
          logObject.message = gs.getMessage('There was an error when adding your color. Try adding it again.');
          return logObject;
      }
      var customizationGR = ThemeRepository.getCustomizationGR(themeId);
      var message = gs.getMessage('You need to get permission to update this color. Contact your system administrator for permission.');
      if (gs.nil(customizationGR)) {
          logObject.message = message;
          return logObject;
      }
      var styleGR = ThemeRepository.getGR(Constants.SYS_UX_STYLE_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, styleId]));
      if (gs.nil(styleGR)) {
          logObject.message = message;
          return logObject;
      }
      var styleStr = styleGR.getValue(Constants.STYLE_COLUMN_FIELD);
      var styleObj = JSON.parse(styleStr);
      if (primary) {
          ThemeRepository.updatePrimaryColorInJSONObj(styleObj, primary);
      }
      if (secondary) {
          ThemeRepository.updateSecondaryColorInJSONObj(styleObj, secondary);
      }
      if (neutral) {
          ThemeRepository.updateNeutralColorInJSONObj(styleObj, neutral);
      }
      if (additional && Array.isArray(additional)) {
          var match = null;
          while ((match = Constants.ADDITIONAL_COLORS_REFERENCE_REGEX.exec(styleStr)) != null) {
              delete styleObj.properties[match[0]];
          }
          additional.forEach(function(color, index) {
              styleObj.properties[Constants.ADDITIONAL_COLORS_REFERENCE_PREFIX + index] = color;
          });
      }
      var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
      var appliedTheme = ThemeRepository.getAppliedThemeCustomization(themeId);
      if (appliedTheme) {
          customizationObj['theme'] = [appliedTheme];
      }

      var customizedColors;
      if (isVariant) {
          customizedColors = customizationObj['variants'][styleId].colors;
      } else {
          customizedColors = customizationObj.colors;
      }

      if (customizedColors) {
          for (var color in customizedColors.overrides) {
              styleObj.base[color] = customizedColors.overrides[color];
          };
      }

      if (propertyOverrides && Array.isArray(propertyOverrides)) {
          propertyOverrides.forEach(function(propertyOverride) {
              styleObj.properties[propertyOverride.id] = propertyOverride.value;
          });
      }
      styleGR.setValue(Constants.STYLE_COLUMN_FIELD, JSON.stringify(styleObj));
      if (!styleGR.update()) {
          if (ThemeRepository.isScopeSame(styleGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = message;
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(styleGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
      // Also update contrast ratio violations
      if (isSecondaryColorUpdated) {
          if (isVariant && customizationObj.variants.hasOwnProperty([styleId])) {
              customizationObj.variants[styleId].colors.isSecondaryColorUpdated = isSecondaryColorUpdated;

          } else {
              if (!customizationObj.colors.isSecondaryColorUpdated) {
                  customizationObj.colors.isSecondaryColorUpdated = isSecondaryColorUpdated;

              }
          }
          customizationGR.setValue(Constants.CUSTOMIZATION_COLUMN_FIELD, ThemeRepository.transformCustomizationObjToStr(customizationObj));
          customizationGR.update();

      }
      return styleGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the brand colors: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to update color. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateStyle = function(styleId, properties, actionType) {
  var styleGR = ThemeRepository.getGR(Constants.SYS_UX_STYLE_TABLE_NAME,
      ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, styleId]));
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
  themeStyleM2M.addQuery(Constants.STYLE_COLUMN_FIELD, styleId);
  themeStyleM2M.query();
  var shapeMessage = gs.getMessage('You need to get permission to update this shape. Contact your system administrator for permission.');
  var typographyMessage = gs.getMessage('You need to get permission to update this typography. Contact your system administrator for permission.');
  if (gs.nil(styleGR) || !themeStyleM2M.next()) {
      switch (actionType) {
          case 'shape':
              logObject.message = shapeMessage;
              break;
          case 'typography':
              logObject.message = typographyMessage;
              break;
      }
      return logObject;
  }
  var styleStr = styleGR.getValue(Constants.STYLE_COLUMN_FIELD);
  var styleObj = JSON.parse(styleStr);
  if (properties && Array.isArray(properties) && properties.length > 0) {
      properties.forEach(function(property) {
          styleObj.properties[property.id] = property.value;
      });
      styleGR.setValue(Constants.STYLE_COLUMN_FIELD, JSON.stringify(styleObj));
      if (!styleGR.update()) {
          if (ThemeRepository.isScopeSame(styleGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              switch (actionType) {
                  case 'shape':
                      logObject.message = shapeMessage;
                      break;
                  case 'typography':
                      logObject.message = typographyMessage;
                      break;
              }
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(styleGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
  }
  return styleGR;
};
ThemeRepository.updateShape = function(updateShapeInput) {
  try {
      return ThemeRepository.updateStyle(updateShapeInput.id, updateShapeInput.properties, 'shape');
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the shape: ' + e.toString());
      return {
          messageType: Constants.ERROR_LOG_TYPE,
          message: gs.getMessage('There was an error when trying to update the shape. Try it again or contact your system administrator for more help.')
      };
  }
};
ThemeRepository.updateTypography = function(updateTypographyInput) {
  try {
      return ThemeRepository.updateStyle(updateTypographyInput.id, updateTypographyInput.properties, 'typography');
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the typography: ' + e.toString());
      return {
          messageType: Constants.ERROR_LOG_TYPE,
          message: gs.getMessage('There was an error when trying to update the typography. Try it again or contact your system administrator for more help.')
      };
  }
};
ThemeRepository.createLogo = function(createLogoInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var styleId = createLogoInput.styleId;
      var file = createLogoInput.file;
      var fileName = createLogoInput.fileName;
      var fileType = createLogoInput.fileType;
      var logoProperties = JSON.stringify({
          position: Constants.IMAGE_LOCATION
      }, null, 2);
      var fileInfo = ThemeRepository.getFileNameAndExtension(fileName);
      if (gs.nil(fileInfo)) {
          logObject.message = gs.getMessage('There was an error when adding your logo. Try adding it again.');
          return logObject;
      }
      var styleGR = ThemeRepository.getGR(Constants.SYS_UX_STYLE_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, styleId]));
      var message = gs.getMessage('You need to get permission to create this logo. Contact your system administrator for permission.');
      if (gs.nil(styleGR)) {
          logObject.message = message;
          return logObject;
      }
      var assetGR = null;
      var createM2MRecord = true;
      var m2mStyleAsset = ThemeRepository.getGR(Constants.M2M_STYLE_ASSET_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.STYLE_QUERY_KEY, styleId]));
      if (m2mStyleAsset) {
          // If logo existed already.
          var assetId = m2mStyleAsset.getValue(Constants.ASSET_COLUMN_FIELD);
          assetGR = ThemeRepository.getGR(Constants.SYS_UX_THEME_ASSET_TABLE_NAME,
              ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, assetId]));
          if (gs.nil(assetGR)) {
              logObject.message = message;
              return logObject;
          }
          assetGR.setValue(Constants.NAME_COLUMN_FIELD, fileInfo.fileName);
          if (!assetGR.update()) {
              if (ThemeRepository.isScopeSame(assetGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                      ThemeRepository.getScopeId())) {
                  logObject.message = message;
              } else {
                  logObject.message = ThemeRepository.getScopeErrorMessage(assetGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
              }
              return logObject;
          }
          ThemeRepository.deleteFile(Constants.SYS_UX_THEME_ASSET_TABLE_NAME, assetId);
          createM2MRecord = false;
      } else {
          assetGR = ThemeRepository.createGR(Constants.SYS_UX_THEME_ASSET_TABLE_NAME, {
              name: fileInfo.fileName,
              category: Constants.IMAGE_CATEGORY_VALUE
          });
          if (gs.nil(assetGR)) {
              logObject.message = message;
              return logObject;
          }
      }
      ThemeRepository.uploadFile(assetGR, fileName, fileType, file);
      if (createM2MRecord) {
          ThemeRepository.createGR(Constants.M2M_STYLE_ASSET_TABLE_NAME, {
              properties: logoProperties,
              style: styleGR.getUniqueValue(),
              asset: assetGR.getUniqueValue()
          });
      }
      return styleGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error creating the logo: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to create your logo. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateLogo = function(updateLogoInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var assetId = updateLogoInput.assetId;
      var file = updateLogoInput.file;
      var fileName = updateLogoInput.fileName;
      var fileType = updateLogoInput.fileType;
      var fileInfo = ThemeRepository.getFileNameAndExtension(fileName);
      if (gs.nil(fileInfo)) {
          logObject.message = gs.getMessage('There was an error when adding your logo. Try adding it again.');
          return logObject;
      }
      var assetGR = ThemeRepository.getGR(Constants.SYS_UX_THEME_ASSET_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, assetId]));
      var message = gs.getMessage('You need to get permission to update this logo. Contact your system administrator for permission.');
      if (gs.nil(assetGR)) {
          logObject.message = message;
          return logObject;
      }
      assetGR.setValue(Constants.NAME_COLUMN_FIELD, fileInfo.fileName);
      if (!assetGR.update()) {
          if (ThemeRepository.isScopeSame(assetGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = message;
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(assetGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
      ThemeRepository.deleteFile(Constants.SYS_UX_THEME_ASSET_TABLE_NAME, assetId);
      return {
          value: ThemeRepository.uploadFile(assetGR, fileName, fileType, file)
      };
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error updating the logo: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to update your logo. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.removeLogo = function(removeLogoInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var m2mStyleAssetId = removeLogoInput.m2mStyleAssetId;
      var m2mStyleAssetGR = ThemeRepository.getGR(Constants.M2M_STYLE_ASSET_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, m2mStyleAssetId]));
      var message = gs.getMessage('You need to get permission to remove this logo. Contact your system administrator for permission.');
      if (gs.nil(m2mStyleAssetGR)) {
          logObject.message = message;
          return logObject;
      }
      var assetId = m2mStyleAssetGR.getValue(Constants.ASSET_COLUMN_FIELD);
      var assetGR = ThemeRepository.getGR(Constants.SYS_UX_THEME_ASSET_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, assetId]));
      if (gs.nil(assetGR)) {
          logObject.message = message;
          return logObject;
      }
      if (!(m2mStyleAssetGR.deleteRecord() && ThemeRepository.deleteFile(Constants.SYS_UX_THEME_ASSET_TABLE_NAME, assetId) &&
              assetGR.deleteRecord())) {
          if (ThemeRepository.isScopeSame(assetGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = gs.getMessage('It looks like someone else already did that. Try refreshing your page to see an updated view.');
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(assetGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
      return {
          value: true
      };
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error removing the logo: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to remove the logo. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.updateColorOverride = function(updateColorOverrideInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE
  };
  try {
      var styleId = updateColorOverrideInput.id;
      var themeId = updateColorOverrideInput.themeId;
      var override = updateColorOverrideInput.override;
      var propertyOverrides = updateColorOverrideInput.propertyOverrides;
      var isVariant = updateColorOverrideInput.isVariant;
      if (!ThemeRepository.validateRGB(override.value)) {
          logObject.message = gs.getMessage('There was an error when adding your color. Try adding it again.');
          return logObject;
      }
      var customizationGR = ThemeRepository.getCustomizationGR(themeId);
      var message = gs.getMessage('You need to get permission to update this color. Contact your system administrator for permission.');
      if (gs.nil(customizationGR)) {
          logObject.message = message;
          return logObject;
      }
      var styleGR = ThemeRepository.getGR(Constants.SYS_UX_STYLE_TABLE_NAME,
          ThemeRepository.getQueryAfterAddingDomainToQueryArray([Constants.SYS_ID_QUERY_KEY, styleId]));
      if (gs.nil(styleGR)) {
          logObject.message = message;
          return logObject;
      }
      var styleStr = styleGR.getValue(Constants.STYLE_COLUMN_FIELD);
      var styleObj = JSON.parse(styleStr);
      styleObj.base[override.id] = override.value;
      if (propertyOverrides && Array.isArray(propertyOverrides)) {
          propertyOverrides.forEach(function(propertyOverride) {
              styleObj.properties[propertyOverride.id] = propertyOverride.value;
          });
      }
      styleGR.setValue(Constants.STYLE_COLUMN_FIELD, JSON.stringify(styleObj));
      if (!styleGR.update()) {
          if (ThemeRepository.isScopeSame(styleGR.getValue(Constants.SYS_SCOPE_COLUMN_FIELD),
                  ThemeRepository.getScopeId())) {
              logObject.message = message;
          } else {
              logObject.message = ThemeRepository.getScopeErrorMessage(styleGR.getDisplayValue(Constants.SYS_SCOPE_COLUMN_FIELD));
          }
          return logObject;
      }
      var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
      var appliedTheme = ThemeRepository.getAppliedThemeCustomization(themeId);
      if (appliedTheme) {
          customizationObj['theme'] = [appliedTheme];
      }
      if (isVariant) {
          if (!customizationObj.variants)
              customizationObj.variants = {};
          if (!customizationObj.variants[styleId]) {
              customizationObj.variants[styleId] = {
                  colors: {
                      overrides: {}
                  }
              };
          }
          customizationObj.variants[styleId].colors.overrides[override.id] = override.value;
      } else {
          customizationObj.colors.overrides[override.id] = override.value;
      }

      customizationGR.setValue(Constants.CUSTOMIZATION_COLUMN_FIELD, ThemeRepository.transformCustomizationObjToStr(customizationObj));
      customizationGR.update();
      return styleGR;
  } catch (e) {
      gs.error(Constants.THEME_BUILDER_PREFIX + 'Error while updating the color overrides: ' + e.toString());
      logObject.message = gs.getMessage('There was an error when trying to update the colors. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.addFeedback = function(feedback) {
  var TRUE = true;
  if (gs.nil(feedback)) {
      return TRUE;
  }
  var customizationGR = new GlideRecordSecure(Constants.SYS_UX_THEME_CUSTOMIZATION_TABLE_NAME);
  customizationGR.setLimit(1);
  customizationGR.addActiveQuery();
  customizationGR.addQuery(Constants.SYS_ID_COLUMN_FIELD, '9745147a53a31110d7bcddeeff7b1231');
  customizationGR.query();
  if (customizationGR.next()) {
      var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
      var count = Object.keys(customizationObj.feedback).length;
      customizationObj.feedback[count + Constants.EMPTY_STR] = feedback;
      customizationGR.setValue(Constants.CUSTOMIZATION_COLUMN_FIELD, ThemeRepository.transformCustomizationObjToStr(customizationObj));
      customizationGR.update();
  }
  return TRUE;
};
ThemeRepository.getThemeResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.THEME_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getCustomizationResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.CUSTOMIZATION_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getColorsStyleResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.COLORS_STYLE_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getShapeStyleResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.SHAPE_STYLE_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getTypographyStyleResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.TYPOGRAPHY_STYLE_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getImageryStyleResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.IMAGERY_STYLE_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getBooleanResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.BOOLEAN_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.getStringResultType = function(resultObject) {
  return gs.nil(resultObject.messageType) ? Constants.STRING_GRAPHQL_TYPE : Constants.LOGGER_GRAPHQL_TYPE;
};
ThemeRepository.isThemeReadOnly = function(themeId) {
  return ThemeRepository.getReadOnlyThemeIds().indexOf(themeId) >= 0;
};
ThemeRepository.getReadOnlyThemeIds = function() {
  return [Constants.POLARIS_THEME_ID, Constants.USWDS_THEME_ID];
};
ThemeRepository.deleteVariant = function(deleteVariantInput) {
  var logObject = {
      messageType: Constants.ERROR_LOG_TYPE,
  };
  try {
      var styleId = deleteVariantInput.id;
      var themeId = deleteVariantInput.themeId;
      var themeGR = ThemeRepository.getTheme(themeId);
      if (gs.nil(themeGR) || ThemeRepository.isThemeReadOnly(themeId)) {
          logObject.message = gs.getMessage('You need to get permission to delete this theme. Contact your system administrator for permission.');
          return logObject;
      }
      var customizationGR = ThemeRepository.getCustomizationGR(themeId);
      if (customizationGR) {
          var customizationObj = ThemeRepository.transformCustomizationStrToObject(customizationGR.getValue(Constants.CUSTOMIZATION_COLUMN_FIELD));
          if (customizationObj.variants) {
              delete customizationObj.variants[styleId];

          }
          var customizationStr = ThemeRepository.transformCustomizationObjToStr(customizationObj);
          customizationGR.setValue(Constants.CUSTOMIZATION_COLUMN_FIELD, customizationStr);
          customizationGR.update();
      }
      var themeStyleM2M = new GlideRecordSecure(Constants.M2M_THEME_STYLE_TABLE_NAME);
      themeStyleM2M.addQuery(Constants.THEME_COLUMN_FIELD, themeId);
      themeStyleM2M.addQuery(Constants.STYLE_COLUMN_FIELD, styleId);
      themeStyleM2M.query();
      if (themeStyleM2M.next()) themeStyleM2M.deleteMultiple();
      var styleGr = new GlideRecordSecure(Constants.SYS_UX_STYLE_TABLE_NAME);
      styleGr.get(styleId);
      if (styleGr.next()) styleGr.deleteRecord();
      return themeGR;
  } catch (e) {
      gs.error(
          Constants.THEME_BUILDER_PREFIX +
          'Error while deleting the variant: ' +
          e.toString()
      );
      logObject.message = gs.getMessage('There was an error when trying to delete the variant. Try it again or contact your system administrator for more help.');
      return logObject;
  }
};
ThemeRepository.transformColorsToArray = function(sourceColors, destinationColors) {

  if (sourceColors.isSecondaryColorUpdated) {
      destinationColors.push(ThemeRepository.getEntityObject(Constants.IS_SECONDARY_COLOR_UPDATED, true, Constants.SECONDARY_COLOR_UPDATED));
  }
  if (sourceColors.customizedNames) {
      Object.keys(sourceColors.customizedNames).forEach(function(id) {
          destinationColors.push(ThemeRepository.getEntityObject(id, sourceColors.customizedNames[id], Constants.CUSTOMIZED_NAME));
      });
  }
  if (sourceColors.contrastRatioViolations) {
      Object.keys(sourceColors.contrastRatioViolations).forEach(function(id) {
          destinationColors.push(ThemeRepository.getEntityObject(id, sourceColors.contrastRatioViolations[id], Constants.CONTRAST_RATIO_VIOLATED));
      });
  }
  if (sourceColors.overrides) {
      Object.keys(sourceColors.overrides).forEach(function(id) {
          destinationColors.push(ThemeRepository.getEntityObject(id, sourceColors.overrides[id], Constants.COLOR_HOOK_OVERRIDDEN));
      });
  }
};
ThemeRepository.prototype = {
  type: 'ThemeRepository'
};

Sys ID

cc3f36aba3e701101e211c0f26fcdaeb

Offical Documentation

Official Docs: