From 4a1ca0fbdf7ec45e073f52fe263a538a0a96cd8e Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Fri, 22 May 2026 14:18:15 +0200 Subject: [PATCH 001/109] Introduction of settings necessary for an MVC Pipeline --- .../Portals/IPortalSettings.cs | 3 + .../Portals/PagePipelineConstants.cs | 30 ++ DNN Platform/Library/Data/DataProvider.cs | 10 +- .../Library/Entities/Modules/ControlInfo.cs | 9 + .../Modules/ModuleControlController.cs | 2 + .../Library/Entities/Modules/ModuleInfo.cs | 5 + .../Portals/IPortalSettingsController.cs | 2 + .../Entities/Portals/PortalSettings.cs | 3 + .../Portals/PortalSettingsController.cs | 16 +- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 25 ++ .../Installer/Writers/ModulePackageWriter.cs | 2 +- .../Library/Services/Upgrade/Upgrade.cs | 13 +- .../SqlDataProvider/10.99.00.SqlDataProvider | 129 +++++++++ .../Controls/ControlFields.jsx | 7 + .../Pages.Web/src/components/More/More.jsx | 34 +++ .../Pages.Web/src/services/pageService.js | 1 + .../src/components/moreSettings/index.jsx | 27 ++ .../Dto/Editors/ModuleControlDto.cs | 11 +- .../Components/Pages/Converters.cs | 262 +++++++++--------- .../Components/Pages/PagesControllerImpl.cs | 4 + .../Services/DTO/PageItem.cs | 17 +- .../Services/DTO/PageSettings.cs | 55 ++-- .../UpdateOtherSettingsRequest.cs | 24 +- .../Services/SiteSettingsController.cs | 2 + .../App_LocalResources/Extensions.resx | 6 + .../Dnn.Pages/App_LocalResources/Pages.resx | 18 ++ .../App_LocalResources/SiteSettings.resx | 18 ++ 27 files changed, 549 insertions(+), 186 deletions(-) create mode 100644 DNN Platform/DotNetNuke.Abstractions/Portals/PagePipelineConstants.cs create mode 100644 DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 7b18617461b..440e677de0b 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -359,5 +359,8 @@ public interface IPortalSettings /// Gets a value indicating whether to display the dropdowns to quickly add a moduel to the page in the edit bar. bool ShowQuickModuleAddMenu { get; } + + /// Gets the pipeline type for the portal. + string PagePipeline { get; } } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/PagePipelineConstants.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/PagePipelineConstants.cs new file mode 100644 index 00000000000..37e51a1f20c --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/PagePipelineConstants.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information +namespace DotNetNuke.Abstractions.Portals +{ + /// + /// Provides constants for the page pipelines used in the DNN platform, + /// such as WebForms and MVC. + /// + public static class PagePipelineConstants + { + /// WebForms. + public const string WebForms = "webforms"; + + /// MVC. + public const string Mvc = "mvc"; + + /// Auto. + public const string Auto = "auto"; + + /// QueryString key. + public const string QueryStringKey = "pipeline"; + + /// QueryString WebForms. + public const string QueryStringWebForms = "webforms"; + + /// QueryString MVC. + public const string QueryStringMvc = "mvc"; + } +} diff --git a/DNN Platform/Library/Data/DataProvider.cs b/DNN Platform/Library/Data/DataProvider.cs index dea87b3dad4..d89957d4e69 100644 --- a/DNN Platform/Library/Data/DataProvider.cs +++ b/DNN Platform/Library/Data/DataProvider.cs @@ -1329,7 +1329,13 @@ public virtual void UpdateModuleDefinition(int moduleDefId, string friendlyName, lastModifiedByUserID); } + [Obsolete("Deprecated in DotNetNuke 10.99.0. Scheduled removal in v12.0.0.")] public virtual int AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string iconFile, int controlType, int viewOrder, string helpUrl, bool supportsPartialRendering, bool supportsPopUps, int createdByUserID) + { + return this.AddModuleControl(moduleDefId, controlKey, controlTitle, controlSrc, null, iconFile, controlType, viewOrder, helpUrl, supportsPartialRendering, supportsPopUps, createdByUserID); + } + + public virtual int AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string mvcControlClass, string iconFile, int controlType, int viewOrder, string helpUrl, bool supportsPartialRendering, bool supportsPopUps, int createdByUserID) { return this.ExecuteScalar( "AddModuleControl", @@ -1337,6 +1343,7 @@ public virtual int AddModuleControl(int moduleDefId, string controlKey, string c this.GetNull(controlKey), this.GetNull(controlTitle), controlSrc, + this.GetNull(mvcControlClass), this.GetNull(iconFile), controlType, this.GetNull(viewOrder), @@ -1356,7 +1363,7 @@ public virtual IDataReader GetModuleControls() return this.ExecuteReader("GetModuleControls"); } - public virtual void UpdateModuleControl(int moduleControlId, int moduleDefId, string controlKey, string controlTitle, string controlSrc, string iconFile, int controlType, int viewOrder, string helpUrl, bool supportsPartialRendering, bool supportsPopUps, int lastModifiedByUserID) + public virtual void UpdateModuleControl(int moduleControlId, int moduleDefId, string controlKey, string controlTitle, string controlSrc, string mvcControlClass, string iconFile, int controlType, int viewOrder, string helpUrl, bool supportsPartialRendering, bool supportsPopUps, int lastModifiedByUserID) { this.ExecuteNonQuery( "UpdateModuleControl", @@ -1365,6 +1372,7 @@ public virtual void UpdateModuleControl(int moduleControlId, int moduleDefId, st this.GetNull(controlKey), this.GetNull(controlTitle), controlSrc, + this.GetNull(mvcControlClass), this.GetNull(iconFile), controlType, this.GetNull(viewOrder), diff --git a/DNN Platform/Library/Entities/Modules/ControlInfo.cs b/DNN Platform/Library/Entities/Modules/ControlInfo.cs index 6f6e3d17c25..d435410a479 100644 --- a/DNN Platform/Library/Entities/Modules/ControlInfo.cs +++ b/DNN Platform/Library/Entities/Modules/ControlInfo.cs @@ -27,6 +27,10 @@ protected ControlInfo() /// A String. public string ControlSrc { get; set; } + /// Gets or sets the Mvc Control Class. + /// A String. + public string MvcControlClass { get; set; } + /// /// Gets or sets a value indicating whether the control support the AJAX /// Update Panel. @@ -42,6 +46,7 @@ protected override void FillInternal(IDataReader dr) base.FillInternal(dr); this.ControlKey = Null.SetNullString(dr["ControlKey"]); this.ControlSrc = Null.SetNullString(dr["ControlSrc"]); + this.MvcControlClass = Null.SetNullString(dr["MvcControlClass"]); this.SupportsPartialRendering = Null.SetNullBoolean(dr["SupportsPartialRendering"]); } @@ -55,6 +60,9 @@ protected void ReadXmlInternal(XmlReader reader) case "controlSrc": this.ControlSrc = reader.ReadElementContentAsString(); break; + case "mvcControlClass": + this.MvcControlClass = reader.ReadElementContentAsString(); + break; case "supportsPartialRendering": string elementvalue = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(elementvalue)) @@ -71,6 +79,7 @@ protected void WriteXmlInternal(XmlWriter writer) // write out properties writer.WriteElementString("controlKey", this.ControlKey); writer.WriteElementString("controlSrc", this.ControlSrc); + writer.WriteElementString("mvcControlClass", this.MvcControlClass); writer.WriteElementString("supportsPartialRendering", this.SupportsPartialRendering.ToString()); } } diff --git a/DNN Platform/Library/Entities/Modules/ModuleControlController.cs b/DNN Platform/Library/Entities/Modules/ModuleControlController.cs index ed36766881d..beefc2d8bc3 100644 --- a/DNN Platform/Library/Entities/Modules/ModuleControlController.cs +++ b/DNN Platform/Library/Entities/Modules/ModuleControlController.cs @@ -110,6 +110,7 @@ public static int SaveModuleControl(ModuleControlInfo moduleControl, bool clearC moduleControl.ControlKey, moduleControl.ControlTitle, moduleControl.ControlSrc, + moduleControl.MvcControlClass, moduleControl.IconFile, (int)moduleControl.ControlType, moduleControl.ViewOrder, @@ -127,6 +128,7 @@ public static int SaveModuleControl(ModuleControlInfo moduleControl, bool clearC moduleControl.ControlKey, moduleControl.ControlTitle, moduleControl.ControlSrc, + moduleControl.MvcControlClass, moduleControl.IconFile, (int)moduleControl.ControlType, moduleControl.ViewOrder, diff --git a/DNN Platform/Library/Entities/Modules/ModuleInfo.cs b/DNN Platform/Library/Entities/Modules/ModuleInfo.cs index 271995d0c2e..04d905ba243 100644 --- a/DNN Platform/Library/Entities/Modules/ModuleInfo.cs +++ b/DNN Platform/Library/Entities/Modules/ModuleInfo.cs @@ -839,6 +839,11 @@ public string GetProperty(string propertyName, string format, CultureInfo format propertyNotFound = false; result = PropertyAccess.FormatString(this.ModuleControl.ControlSrc, format); break; + case "mvcControlClass": + isPublic = false; + propertyNotFound = false; + result = PropertyAccess.FormatString(this.ModuleControl.MvcControlClass, format); + break; case "controltitle": propertyNotFound = false; result = PropertyAccess.FormatString(this.ModuleControl.ControlTitle, format); diff --git a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs index 177f3bda2dd..0f6245f813f 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs @@ -14,6 +14,8 @@ public interface IPortalSettingsController PortalSettings.PortalAliasMapping GetPortalAliasMappingMode(int portalId); + string GetPortalPagePipeline(int portalId); + /// The GetActiveTab method gets the active Tab for the current request. /// The current tab's id. /// The current PortalSettings. diff --git a/DNN Platform/Library/Entities/Portals/PortalSettings.cs b/DNN Platform/Library/Entities/Portals/PortalSettings.cs index 1886fb6ccb9..d09ff030c22 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettings.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettings.cs @@ -554,6 +554,9 @@ public string AddCompatibleHttpHeader /// public bool ShowQuickModuleAddMenu => PortalController.GetPortalSettingAsBoolean("ShowQuickModuleAddMenu", this.PortalId, false); + /// + public string PagePipeline { get; internal set; } + /// Create an instance. /// A new instance. public static IPortalSettings Create() diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs index 8ca8cb228b9..974c4789393 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs @@ -12,6 +12,7 @@ namespace DotNetNuke.Entities.Portals using System.Linq; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Abstractions.Portals; using DotNetNuke.Collections; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; @@ -125,7 +126,18 @@ public virtual PortalSettings.PortalAliasMapping GetPortalAliasMappingMode(int p return aliasMapping; } - /// + /// + public virtual string GetPortalPagePipeline(int portalId) + { + if (PortalController.Instance.GetPortalSettings(portalId).TryGetValue("PagePipeline", out var setting)) + { + return string.IsNullOrEmpty(setting) ? PagePipelineConstants.WebForms : setting; + } + + return PagePipelineConstants.WebForms; + } + + /// public virtual IList GetTabModules(PortalSettings portalSettings) { return portalSettings.ActiveTab.Modules.Cast().Select(m => m).ToList(); @@ -280,7 +292,7 @@ public virtual void LoadPortalSettings(PortalSettings portalSettings) portalSettings.DataConsentDelayMeasurement = setting; setting = settings.GetValueOrDefault("AllowedExtensionsWhitelist", this.hostSettingsService.GetString("DefaultEndUserExtensionWhitelist")); portalSettings.AllowedExtensionsWhitelist = new FileExtensionWhitelist(setting); - + portalSettings.PagePipeline = settings.GetValueOrDefault("PagePipeline", "webforms"); setting = settings.GetValueOrDefault("CspHeaderMode", "OFF"); switch (setting.ToUpperInvariant()) { diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index 72bd06b0763..b09eb0a8e45 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -699,6 +699,27 @@ public string SkinDoctype [JsonIgnore] public bool UseBaseFriendlyUrls { get; set; } + /// Gets a value indicating the pipeline type. + [XmlIgnore] + [JsonIgnore] + public string PagePipeline + { + get + { + string pagePipeline; + if (this.TabSettings.ContainsKey("PagePipeline") && !string.IsNullOrEmpty(this.TabSettings["PagePipeline"].ToString())) + { + pagePipeline = this.TabSettings["PagePipeline"].ToString(); + } + else + { + pagePipeline = string.Empty; + } + + return pagePipeline; + } + } + /// [SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", Justification = "Breaking change")] public string GetProperty(string propertyName, string format, CultureInfo formatProvider, UserInfo accessingUser, Scope currentScope, ref bool propertyNotFound) @@ -855,6 +876,10 @@ public string GetProperty(string propertyName, string format, CultureInfo format propertyNotFound = false; result = PropertyAccess.FormatString(this.SiteMapPriority.ToString(formatProvider), format); break; + case "pagepipeline": + propertyNotFound = false; + result = PropertyAccess.FormatString(this.PagePipeline, format); + break; } if (!isPublic && currentScope != Scope.Debug) diff --git a/DNN Platform/Library/Services/Installer/Writers/ModulePackageWriter.cs b/DNN Platform/Library/Services/Installer/Writers/ModulePackageWriter.cs index 4cef70e114c..925c8cfccd0 100644 --- a/DNN Platform/Library/Services/Installer/Writers/ModulePackageWriter.cs +++ b/DNN Platform/Library/Services/Installer/Writers/ModulePackageWriter.cs @@ -138,7 +138,7 @@ private static void ProcessControls(XPathNavigator controlNav, string moduleFold controlSrc = controlSrc.Replace('\\', '/'); moduleControl.ControlSrc = controlSrc; - + moduleControl.MvcControlClass = Util.ReadElement(controlNav, "mvcControlClass"); moduleControl.IconFile = Util.ReadElement(controlNav, "iconfile"); string controlType = Util.ReadElement(controlNav, "type"); diff --git a/DNN Platform/Library/Services/Upgrade/Upgrade.cs b/DNN Platform/Library/Services/Upgrade/Upgrade.cs index ccabbbc129b..59bf09ab036 100644 --- a/DNN Platform/Library/Services/Upgrade/Upgrade.cs +++ b/DNN Platform/Library/Services/Upgrade/Upgrade.cs @@ -238,13 +238,14 @@ public static TabInfo AddHostPage(string tabName, string description, string tab /// The key for this control in the Definition. /// The title of this control. /// The source of ths control. + /// The mvc control class of ths control. /// The icon file. /// The type of control. /// The vieworder for this module. - public static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string iconFile, SecurityAccessLevel controlType, int viewOrder) + public static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string mvcControlClass, string iconFile, SecurityAccessLevel controlType, int viewOrder) { // Call Overload with HelpUrl = Null.NullString - AddModuleControl(moduleDefId, controlKey, controlTitle, controlSrc, iconFile, controlType, viewOrder, Null.NullString); + AddModuleControl(moduleDefId, controlKey, controlTitle, controlSrc, mvcControlClass, iconFile, controlType, viewOrder, Null.NullString); } /// AddModuleDefinition adds a new Core Module Definition to the system. @@ -2134,16 +2135,17 @@ protected static bool IsLanguageEnabled(int portalid, string code) /// The key for this control in the Definition. /// The title of this control. /// Te source of ths control. + /// The mvc control class. /// The icon file. /// The type of control. /// The vieworder for this module. /// The Help Url. - private static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string iconFile, SecurityAccessLevel controlType, int viewOrder, string helpURL) + private static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string mvcControlClass, string iconFile, SecurityAccessLevel controlType, int viewOrder, string helpURL) { - AddModuleControl(moduleDefId, controlKey, controlTitle, controlSrc, iconFile, controlType, viewOrder, helpURL, false); + AddModuleControl(moduleDefId, controlKey, controlTitle, controlSrc, mvcControlClass, iconFile, controlType, viewOrder, helpURL, false); } - private static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string iconFile, SecurityAccessLevel controlType, int viewOrder, string helpURL, bool supportsPartialRendering) + private static void AddModuleControl(int moduleDefId, string controlKey, string controlTitle, string controlSrc, string mvcControlClass, string iconFile, SecurityAccessLevel controlType, int viewOrder, string helpURL, bool supportsPartialRendering) { DnnInstallLogger.InstallLogInfo(Localization.GetString("LogStart", Localization.GlobalResourceFile) + "AddModuleControl:" + moduleDefId); @@ -2161,6 +2163,7 @@ private static void AddModuleControl(int moduleDefId, string controlKey, string ControlKey = controlKey, ControlTitle = controlTitle, ControlSrc = controlSrc, + MvcControlClass = mvcControlClass, ControlType = controlType, ViewOrder = viewOrder, IconFile = iconFile, diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider new file mode 100644 index 00000000000..19e67ee8441 --- /dev/null +++ b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider @@ -0,0 +1,129 @@ +/************************************************************/ +/* MVC Pipeline */ +/************************************************************/ + +/* Add MvcControlClass Column to ModuleControls Table */ +/*****************************************************/ + +IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME='{objectQualifier}ModuleControls' AND COLUMN_NAME='MvcControlClass') + BEGIN + -- Add new Column + ALTER TABLE {databaseOwner}{objectQualifier}ModuleControls + ADD MvcControlClass [nvarchar] (256) NULL + END +GO + +/* Update AddModuleControl */ +/***************************/ + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{databaseOwner}[{objectQualifier}AddModuleControl]') AND type in (N'P', N'PC')) + DROP PROCEDURE {databaseOwner}[{objectQualifier}AddModuleControl] +GO + +CREATE PROCEDURE {databaseOwner}[{objectQualifier}AddModuleControl] + + @ModuleDefID int, + @ControlKey nvarchar(50), + @ControlTitle nvarchar(50), + @ControlSrc nvarchar(256), + @MvcControlClass nvarchar(256) = null, + @IconFile nvarchar(100), + @ControlType int, + @ViewOrder int, + @HelpUrl nvarchar(200), + @SupportsPartialRendering bit, + @SupportsPopUps bit, + @CreatedByUserID int + +AS + INSERT INTO {databaseOwner}{objectQualifier}ModuleControls ( + ModuleDefID, + ControlKey, + ControlTitle, + ControlSrc, + MvcControlClass, + IconFile, + ControlType, + ViewOrder, + HelpUrl, + SupportsPartialRendering, + SupportsPopUps, + CreatedByUserID, + CreatedOnDate, + LastModifiedByUserID, + LastModifiedOnDate + ) + VALUES ( + @ModuleDefID, + @ControlKey, + @ControlTitle, + @ControlSrc, + @MvcControlClass, + @IconFile, + @ControlType, + @ViewOrder, + @HelpUrl, + @SupportsPartialRendering, + @SupportsPopUps, + @CreatedByUserID, + getdate(), + @CreatedByUserID, + getdate() + ) + + SELECT SCOPE_IDENTITY() +GO + +/* Update UpdateModuleControl */ +/******************************/ + +IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'{databaseOwner}[{objectQualifier}UpdateModuleControl]') AND type in (N'P', N'PC')) + DROP PROCEDURE {databaseOwner}[{objectQualifier}UpdateModuleControl] +GO + +CREATE PROCEDURE {databaseOwner}[{objectQualifier}UpdateModuleControl] + @ModuleControlId int, + @ModuleDefID int, + @ControlKey nvarchar(50), + @ControlTitle nvarchar(50), + @ControlSrc nvarchar(256), + @MvcControlClass nvarchar(256) = null, + @IconFile nvarchar(100), + @ControlType int, + @ViewOrder int, + @HelpUrl nvarchar(200), + @SupportsPartialRendering bit, + @SupportsPopUps bit, + @LastModifiedByUserID int + +AS + UPDATE {databaseOwner}{objectQualifier}ModuleControls + SET + ModuleDefId = @ModuleDefId, + ControlKey = @ControlKey, + ControlTitle = @ControlTitle, + ControlSrc = @ControlSrc, + MvcControlClass = @MvcControlClass, + IconFile = @IconFile, + ControlType = @ControlType, + ViewOrder = ViewOrder, + HelpUrl = @HelpUrl, + SupportsPartialRendering = @SupportsPartialRendering, + SupportsPopUps = @SupportsPopUps, + LastModifiedByUserID = @LastModifiedByUserID, + LastModifiedOnDate = getdate() + WHERE ModuleControlId = @ModuleControlId +GO + +/* Update Terms and privacy */ +/************************************************/ + +UPDATE {databaseOwner}{objectQualifier}ModuleControls + SET + MvcControlClass = 'DotNetNuke.Common.Controls.PrivacyControl, DotNetNuke.Website' + WHERE ControlSrc = 'Admin/Portal/Privacy.ascx' + +UPDATE {databaseOwner}{objectQualifier}ModuleControls + SET + MvcControlClass = 'DotNetNuke.Common.Controls.TermsControl, DotNetNuke.Website' + WHERE ControlSrc = 'Admin/Portal/Terms.ascx' diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx index 6a2e4d5b21a..a5ee6e2a22a 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/src/components/EditExtension/CustomSettings/Module/ModuleDefinitions/ModuleDefinitionRow/Controls/ControlFields.jsx @@ -65,6 +65,13 @@ class ControlFields extends Component { error={props.triedToSave && props.error.source} onSelect={this.onSelect.bind(this, "source")} /> + +
diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx index 5709657e6bb..887976dad17 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx @@ -21,6 +21,19 @@ class More extends Component { onChangeField(key, event.target.value); } + onPagePipelineSelected(option) { + const {onChangeField} = this.props; + onChangeField("pagePipeline", option.value); + } + + getPagePipelineOptions() { + const options = []; + options.push({ value: "", label: Localization.get("Inherited") }); + options.push({ value: "webforms", label: Localization.get("WebForms") }); + options.push({ value: "mvc", label: Localization.get("Mvc") }); + return options; + } + onCacheProviderSelected(option) { this.props.onChangeField("cacheProvider", option.value); if (!this.props.page.cacheProvider && option.value) { @@ -215,7 +228,28 @@ class More extends Component { } + + } +
+ {Localization.get("PipelineSettings")} +
+ + + + + + + +
); } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js b/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js index 4565633c985..08a4ff87418 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/services/pageService.js @@ -93,6 +93,7 @@ const PageService = function () { page.iconFile = null; page.iconFileLarge = null; page.sitemapPriority = 0.5; + page.pagePipeline = ""; return page; }); }; diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/moreSettings/index.jsx b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/moreSettings/index.jsx index 1aa15772014..93bfc4082d2 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/moreSettings/index.jsx +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/src/components/moreSettings/index.jsx @@ -286,6 +286,14 @@ class MoreSettingsPanelBody extends Component { } return options; } + + getPagePipelineOptions() { + const options = []; + options.push({ value: "webforms", label: resx.get("WebForms") }); + options.push({ value: "mvc", label: resx.get("Mvc") }); + options.push({ value: "auto", label: resx.get("Auto") }); + return options; + } onDropDownChange(key, option) { let { state, props } = this; @@ -519,6 +527,25 @@ class MoreSettingsPanelBody extends Component { }
} +
+ {resx.get("PipelineSettings")} +
+ + +
+
+
+ +
+
MVC, } - - /// - /// Gets the portal rendering pipeline configuration from the specified dictionary. - /// - /// The dictionary containing the portal settings. - /// The name of the setting to retrieve. - /// The portal rendering pipeline configuration, or WebForms if not found or invalid. - public static PortalRenderingPipeline GetPortalPipeline(this Dictionary input, string settingName) - { - if (input != null && input.TryGetValue(settingName, out var pipeline)) - { - return string.IsNullOrEmpty(pipeline) ? - PortalRenderingPipeline.WebForms : - Enum.TryParse(pipeline, true, out var result) ? result : PortalRenderingPipeline.WebForms; - } - - return PortalRenderingPipeline.WebForms; - } - - /// - /// Gets the page rendering pipeline configuration from the specified hashtable. - /// - /// The hashtable containing the page settings. - /// The name of the setting to retrieve. - /// The page rendering pipeline configuration, or Inherited if not found or invalid. - public static PageRenderingPipeline GetPagePipeline(this Hashtable input, string settingName) - { - if (input != null && input.ContainsKey(settingName)) - { - var pipeline = Convert.ToString(input[settingName], System.Globalization.CultureInfo.InvariantCulture); - return string.IsNullOrEmpty(pipeline) ? - PageRenderingPipeline.Inherited : - Enum.TryParse(pipeline, true, out var result) ? result : PageRenderingPipeline.Inherited; - } - - return PageRenderingPipeline.Inherited; - } } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index e2d0504c532..48984d065b3 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -6,6 +6,8 @@ namespace DotNetNuke.Abstractions.Portals using System; using System.Diagnostics.CodeAnalysis; + using DotNetNuke.Abstractions.Framework; + /// /// The PortalSettings class encapsulates all of the settings for the Portal, /// as well as the configuration settings required to execute the current tab diff --git a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs index 8720b0b757b..433ecd2f65c 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs @@ -5,7 +5,7 @@ namespace DotNetNuke.Entities.Portals { using System.Collections.Generic; - using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Tabs; diff --git a/DNN Platform/Library/Entities/Portals/PortalSettings.cs b/DNN Platform/Library/Entities/Portals/PortalSettings.cs index 79607c42774..a84c0b8d279 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettings.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettings.cs @@ -9,6 +9,7 @@ namespace DotNetNuke.Entities.Portals using System.Linq; using System.Web; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Abstractions.Portals; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs index 18a2f9c5df8..d58c304c0c0 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs @@ -12,12 +12,13 @@ namespace DotNetNuke.Entities.Portals using System.Linq; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Collections; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Tabs; + using DotNetNuke.Framework; using DotNetNuke.Security; using DotNetNuke.Services.Localization; using DotNetNuke.UI.Skins; @@ -190,13 +191,13 @@ public virtual void LoadPortalSettings(PortalSettings portalSettings) var settings = PortalController.Instance.GetPortalSettings(portalSettings.PortalId); portalSettings.Registration = new RegistrationSettings(settings); - var clientResourcesSettings = new ClientResourceSettings(); + var clientResourcesSettings = new Web.Client.ClientResourceSettings(); bool overridingDefaultSettings = clientResourcesSettings.IsOverridingDefaultSettingsEnabled(portalSettings.PortalId); int crmVersion; if (overridingDefaultSettings) { - int? globalVersion = new ClientResourceSettings().GetVersion(portalSettings.PortalId); + int? globalVersion = new Web.Client.ClientResourceSettings().GetVersion(portalSettings.PortalId); crmVersion = globalVersion ?? default(int); } else diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index e5493517416..d1ee4f2f48d 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -18,7 +18,7 @@ namespace DotNetNuke.Entities.Tabs using System.Xml.Serialization; using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Collections.Internal; using DotNetNuke.Common; using DotNetNuke.Common.Internal; @@ -28,6 +28,7 @@ namespace DotNetNuke.Entities.Tabs using DotNetNuke.Entities.Portals; using DotNetNuke.Entities.Tabs.TabVersions; using DotNetNuke.Entities.Users; + using DotNetNuke.Framework; using DotNetNuke.Security.Permissions; using DotNetNuke.Services.Exceptions; using DotNetNuke.Services.FileSystem; @@ -707,7 +708,7 @@ public PagePipeline.PageRenderingPipeline PagePipeline { get { - return this.TabSettings.GetPagePipeline(DotNetNuke.Abstractions.Portals.PagePipeline.SettingName); + return this.TabSettings.GetPagePipeline(Abstractions.Framework.PagePipeline.SettingName); } } diff --git a/DNN Platform/Library/Framework/PagePipelineExtensions.cs b/DNN Platform/Library/Framework/PagePipelineExtensions.cs new file mode 100644 index 00000000000..549c7a914ba --- /dev/null +++ b/DNN Platform/Library/Framework/PagePipelineExtensions.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Framework +{ + using System; + using System.Collections; + using System.Collections.Generic; + + using DotNetNuke.Abstractions.Framework; + + public static class PagePipelineExtensions + { + /// + /// Gets the portal rendering pipeline configuration from the specified dictionary. + /// + /// The dictionary containing the portal settings. + /// The name of the setting to retrieve. + /// The portal rendering pipeline configuration, or WebForms if not found or invalid. + public static PagePipeline.PortalRenderingPipeline GetPortalPipeline(this Dictionary input, string settingName) + { + if (input != null && input.TryGetValue(settingName, out var pipeline)) + { + return string.IsNullOrEmpty(pipeline) ? + PagePipeline.PortalRenderingPipeline.WebForms : + Enum.TryParse(pipeline, true, out var result) ? result : PagePipeline.PortalRenderingPipeline.WebForms; + } + + return PagePipeline.PortalRenderingPipeline.WebForms; + } + + /// + /// Gets the page rendering pipeline configuration from the specified hashtable. + /// + /// The hashtable containing the page settings. + /// The name of the setting to retrieve. + /// The page rendering pipeline configuration, or Inherited if not found or invalid. + public static PagePipeline.PageRenderingPipeline GetPagePipeline(this Hashtable input, string settingName) + { + if (input != null && input.ContainsKey(settingName)) + { + var pipeline = Convert.ToString(input[settingName], System.Globalization.CultureInfo.InvariantCulture); + return string.IsNullOrEmpty(pipeline) ? + PagePipeline.PageRenderingPipeline.Inherited : + Enum.TryParse(pipeline, true, out var result) ? result : PagePipeline.PageRenderingPipeline.Inherited; + } + + return PagePipeline.PageRenderingPipeline.Inherited; + } + } +} diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 887d3b11cd1..e0b91261fcb 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -1,6 +1,6 @@ { "name": "aperture", - "version": "10.99.0", + "version": "10.3.3", "description": "Default theme for DNN 10.", "main": "src/scripts/main.ts", "author": "DNN Community", diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs index b066b103633..c7815f3552d 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs @@ -14,7 +14,7 @@ namespace Dnn.PersonaBar.Pages.Components using Dnn.PersonaBar.Themes.Components; using Dnn.PersonaBar.Themes.Components.DTO; using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.Entities.Modules; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs index eeaae1af5f5..b7f706c18a4 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs @@ -18,6 +18,7 @@ namespace Dnn.PersonaBar.Pages.Components using Dnn.PersonaBar.Pages.Services.Dto; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Abstractions.Modules; using DotNetNuke.Abstractions.Portals; using DotNetNuke.Abstractions.Security.Permissions; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs index 821c8c189c3..07b7f7d80ab 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs @@ -24,6 +24,7 @@ namespace Dnn.PersonaBar.SiteSettings.Services using Dnn.PersonaBar.SiteSettings.Services.Dto; using DotNetNuke.Abstractions; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Abstractions.Logging; using DotNetNuke.Abstractions.Portals; using DotNetNuke.Abstractions.Security; From 9cbb27c4b8ae10ef4f00979cff47cacd9519ef56 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Sun, 31 May 2026 22:09:30 +0200 Subject: [PATCH 011/109] Make the page pipeline setting a column on the tabs table --- .../Framework/PagePipeline.cs | 6 +- DNN Platform/Library/Data/DataProvider.cs | 5 +- .../Library/Entities/Tabs/TabController.cs | 6 +- DNN Platform/Library/Entities/Tabs/TabInfo.cs | 16 +- .../Website/DotNetNuke.Website.csproj | 4 + .../SqlDataProvider/10.99.00.SqlDataProvider | 188 +++++++++++++++++- .../Pages.Web/src/components/More/More.jsx | 6 +- .../Components/Pages/Converters.cs | 2 +- .../Components/Pages/PagesControllerImpl.cs | 6 +- .../Services/DTO/PageSettings.cs | 2 +- 10 files changed, 213 insertions(+), 28 deletions(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs b/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs index a684a23fbe4..3c08407a885 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs @@ -50,17 +50,17 @@ public enum PageRenderingPipeline /// /// Specifies that the pipeline type should be taken from the portal. /// - Inherited, + Inherited = -1, /// /// Specifies that pages should be rendered using the WebForms pipeline. /// - WebForms, + WebForms = 0, /// /// Specifies that pages should be rendered using the MVC pipeline. /// - MVC, + MVC = 1, } } } diff --git a/DNN Platform/Library/Data/DataProvider.cs b/DNN Platform/Library/Data/DataProvider.cs index 122b5c43457..a5bb921a88c 100644 --- a/DNN Platform/Library/Data/DataProvider.cs +++ b/DNN Platform/Library/Data/DataProvider.cs @@ -889,7 +889,7 @@ public virtual int SaveTabVersionDetail(int tabVersionDetailId, int tabVersionId return this.ExecuteScalar("SaveTabVersionDetail", tabVersionDetailId, tabVersionId, moduleId, moduleVersion, paneName, moduleOrder, action, createdByUserID, modifiedByUserID); } - public virtual void UpdateTab(int tabId, int contentItemId, int portalId, Guid versionGuid, Guid defaultLanguageGuid, Guid localizedVersionGuid, string tabName, bool isVisible, bool disableLink, int parentId, string iconFile, string iconFileLarge, string title, string description, string keyWords, bool isDeleted, string url, string skinSrc, string containerSrc, DateTime startDate, DateTime endDate, int refreshInterval, string pageHeadText, bool isSecure, bool permanentRedirect, float siteMapPriority, int lastModifiedByuserID, string cultureCode, bool isSystem) + public virtual void UpdateTab(int tabId, int contentItemId, int portalId, Guid versionGuid, Guid defaultLanguageGuid, Guid localizedVersionGuid, string tabName, bool isVisible, bool disableLink, int parentId, string iconFile, string iconFileLarge, string title, string description, string keyWords, bool isDeleted, string url, string skinSrc, string containerSrc, DateTime startDate, DateTime endDate, int refreshInterval, string pageHeadText, bool isSecure, bool permanentRedirect, float siteMapPriority, int lastModifiedByuserID, string cultureCode, bool isSystem, int pagePipeline) { this.ExecuteNonQuery( "UpdateTab", @@ -921,7 +921,8 @@ public virtual void UpdateTab(int tabId, int contentItemId, int portalId, Guid v siteMapPriority, lastModifiedByuserID, this.GetNull(cultureCode), - isSystem); + isSystem, + pagePipeline); } public virtual void UpdateTabOrder(int tabId, int tabOrder, int parentId, int lastModifiedByUserID) diff --git a/DNN Platform/Library/Entities/Tabs/TabController.cs b/DNN Platform/Library/Entities/Tabs/TabController.cs index e1ccc65539c..536f243cd04 100644 --- a/DNN Platform/Library/Entities/Tabs/TabController.cs +++ b/DNN Platform/Library/Entities/Tabs/TabController.cs @@ -150,7 +150,8 @@ public static void CopyDesignToChildren(IEventLogger eventLogger, TabInfo parent tab.SiteMapPriority, UserController.Instance.GetCurrentUserInfo().UserID, tab.CultureCode, - tab.IsSystem); + tab.IsSystem, + (int)tab.PagePipeline); UpdateTabVersion(tab.TabID); @@ -2124,7 +2125,8 @@ public void UpdateTab(TabInfo updatedTab) updatedTab.SiteMapPriority, UserController.Instance.GetCurrentUserInfo().UserID, updatedTab.CultureCode, - updatedTab.IsSystem); + updatedTab.IsSystem, + (int)updatedTab.PagePipeline); // Update Tags List terms = updatedTab.Terms; diff --git a/DNN Platform/Library/Entities/Tabs/TabInfo.cs b/DNN Platform/Library/Entities/Tabs/TabInfo.cs index d1ee4f2f48d..95bdc1c9e52 100644 --- a/DNN Platform/Library/Entities/Tabs/TabInfo.cs +++ b/DNN Platform/Library/Entities/Tabs/TabInfo.cs @@ -527,6 +527,10 @@ public CacheLevel Cacheability [XmlElement("localizedVersionGuid")] public Guid LocalizedVersionGuid { get; set; } + /// Gets or sets the rendering pipeline of the page. + [XmlElement("pagepipeline")] + public PagePipeline.PageRenderingPipeline PagePipeline { get; set; } + /// Gets or sets a collection of the modules on this page. /// An of . [XmlIgnore] @@ -701,17 +705,6 @@ public string SkinDoctype [JsonIgnore] public bool UseBaseFriendlyUrls { get; set; } - /// Gets a value indicating the pipeline type. - [XmlIgnore] - [JsonIgnore] - public PagePipeline.PageRenderingPipeline PagePipeline - { - get - { - return this.TabSettings.GetPagePipeline(Abstractions.Framework.PagePipeline.SettingName); - } - } - /// [SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", Justification = "Breaking change")] public string GetProperty(string propertyName, string format, CultureInfo formatProvider, UserInfo accessingUser, Scope currentScope, ref bool propertyNotFound) @@ -1002,6 +995,7 @@ public override void Fill(IDataReader dr) this.BreadCrumbs = null; this.Modules = null; this.IsSystem = Null.SetNullBoolean(dr["IsSystem"]); + this.PagePipeline = (PagePipeline.PageRenderingPipeline)Null.SetNullInteger(dr["PagePipeline"]); } /// Gets the URL for the given . diff --git a/DNN Platform/Website/DotNetNuke.Website.csproj b/DNN Platform/Website/DotNetNuke.Website.csproj index f8e658b25ab..74d879a75fa 100644 --- a/DNN Platform/Website/DotNetNuke.Website.csproj +++ b/DNN Platform/Website/DotNetNuke.Website.csproj @@ -3272,6 +3272,10 @@ + + + + diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider index 19e67ee8441..5719928a896 100644 --- a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider +++ b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.99.00.SqlDataProvider @@ -26,7 +26,7 @@ CREATE PROCEDURE {databaseOwner}[{objectQualifier}AddModuleControl] @ControlKey nvarchar(50), @ControlTitle nvarchar(50), @ControlSrc nvarchar(256), - @MvcControlClass nvarchar(256) = null, + @MvcControlClass nvarchar(256) = null, @IconFile nvarchar(100), @ControlType int, @ViewOrder int, @@ -103,7 +103,7 @@ AS ControlKey = @ControlKey, ControlTitle = @ControlTitle, ControlSrc = @ControlSrc, - MvcControlClass = @MvcControlClass, + MvcControlClass = @MvcControlClass, IconFile = @IconFile, ControlType = @ControlType, ViewOrder = ViewOrder, @@ -127,3 +127,187 @@ UPDATE {databaseOwner}{objectQualifier}ModuleControls SET MvcControlClass = 'DotNetNuke.Common.Controls.TermsControl, DotNetNuke.Website' WHERE ControlSrc = 'Admin/Portal/Terms.ascx' + +/* Add PagePipeline Column to Tabs Table */ +/*****************************************************/ + +IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME='{objectQualifier}Tabs' AND COLUMN_NAME='PagePipeline') + BEGIN + -- Add new Column + ALTER TABLE {databaseOwner}{objectQualifier}Tabs + ADD PagePipeline [int] NULL + END +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +ALTER VIEW {databaseOwner}[{objectQualifier}vw_Tabs] +AS + SELECT + T.TabID, + T.TabOrder, + T.PortalID, + T.TabName, + T.ParentId, + T.[Level], + T.TabPath, + T.UniqueId, + T.VersionGuid, + T.DefaultLanguageGuid, + T.LocalizedVersionGuid, + T.IsVisible, + T.HasBeenPublished, + Case when t.IconFile LIKE 'fileid=%' + then (SELECT IsNull(Folder, '') + [FileName] FROM {databaseOwner}[{objectQualifier}vw_Files] + WHERE fileid = CAST(SUBSTRING(t.IconFile, 8, 10) AS Int)) + else Coalesce(t.IconFile,'') + end as IconFile + , + Case when t.IconFileLarge LIKE 'fileid=%' + then (SELECT IsNull(Folder, '') + [FileName] FROM {databaseOwner}[{objectQualifier}vw_Files] + WHERE fileid = CAST(SUBSTRING(t.IconFileLarge, 8, 10) AS Int)) + else Coalesce(t.IconFileLarge,'') + end as IconFileLarge + ,T.DisableLink, + T.Title, + T.Description, + T.KeyWords, + T.IsDeleted, + T.SkinSrc, + T.ContainerSrc, + T.StartDate, + T.EndDate, + T.Url, + CASE WHEN {databaseOwner}{objectQualifier}HasChildTab(T.TabID) = 1 THEN 'true' ELSE 'false' END AS HasChildren, + T.RefreshInterval, + T.PageHeadText, + T.IsSecure, + T.PermanentRedirect, + T.SiteMapPriority, + CI.ContentItemID, + CI.[Content], + CI.ContentTypeID, + CI.ModuleID, + CI.ContentKey, + CI.Indexed, + CI.StateID, + T.CultureCode, + T.CreatedByUserID, + T.CreatedOnDate, + T.LastModifiedByUserID, + T.LastModifiedOnDate, + T.IsSystem, + T.PagePipeline + FROM {databaseOwner}[{objectQualifier}Tabs] AS T + LEFT JOIN {databaseOwner}[{objectQualifier}ContentItems] AS CI ON T.ContentItemID = CI.ContentItemID +GO + +IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'{databaseOwner}[{objectQualifier}UpdateTab]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1) +BEGIN + DROP PROCEDURE {databaseOwner} [{objectQualifier}UpdateTab] +END +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +CREATE PROCEDURE {databaseOwner}[{objectQualifier}UpdateTab] + @TabId Int, + @ContentItemID Int, + @PortalId Int, + @VersionGuid UniqueIdentifier, + @DefaultLanguageGuid UniqueIdentifier, + @LocalizedVersionGuid UniqueIdentifier, + @TabName nVarChar(200), + @IsVisible Bit, + @DisableLink Bit, + @ParentId Int, + @IconFile nVarChar(255), + @IconFileLarge nVarChar(255), + @Title nVarChar(200), + @Description nVarChar(500), + @KeyWords nVarChar(500), + @IsDeleted Bit, + @Url nVarChar(255), + @SkinSrc nVarChar(200), + @ContainerSrc nVarChar(200), + @StartDate DateTime, + @EndDate DateTime, + @RefreshInterval Int, + @PageHeadText nVarChar(max), + @IsSecure Bit, + @PermanentRedirect Bit, + @SiteMapPriority Float, + @LastModifiedByUserID Int, + @CultureCode nVarChar( 10), + @IsSystem Bit, + @PagePipeline Int +AS +BEGIN + DECLARE @OldParentId Int + SET @OldParentId = (SELECT ParentId FROM {databaseOwner}[{objectQualifier}Tabs] WHERE TabID = @TabId) + + DECLARE @TabOrder Int + SET @TabOrder = (SELECT TabOrder FROM {databaseOwner}[{objectQualifier}Tabs] WHERE TabID = @TabId) + + -- Get New TabOrder + DECLARE @NewTabOrder Int + SET @NewTabOrder = (SELECT MAX(TabOrder) FROM {databaseOwner}[{objectQualifier}Tabs] WHERE (ParentId = @ParentId OR (ParentId IS NULL AND @ParentId IS NULL))) + IF @NewTabOrder IS NULL + SET @NewTabOrder = 1 + ELSE + SET @NewTabOrder = @NewTabOrder + 2 + + UPDATE {databaseOwner}[{objectQualifier}Tabs] + SET + ContentItemID = @ContentItemID, + PortalId = @PortalId, + VersionGuid = @VersionGuid, + DefaultLanguageGuid = @DefaultLanguageGuid, + LocalizedVersionGuid = @LocalizedVersionGuid, + TabName = @TabName, + IsVisible = @IsVisible, + DisableLink = @DisableLink, + ParentId = @ParentId, + IconFile = @IconFile, + IconFileLarge = @IconFileLarge, + Title = @Title, + Description = @Description, + KeyWords = @KeyWords, + IsDeleted = @IsDeleted, + Url = @Url, + SkinSrc = @SkinSrc, + ContainerSrc = @ContainerSrc, + StartDate = @StartDate, + EndDate = @EndDate, + RefreshInterval = @RefreshInterval, + PageHeadText = @PageHeadText, + IsSecure = @IsSecure, + PermanentRedirect = @PermanentRedirect, + SiteMapPriority = @SiteMapPriority, + LastModifiedByUserID = @LastModifiedByUserID, + LastModifiedOnDate = getdate(), + CultureCode = @CultureCode, + IsSystem = @IsSystem, + PagePipeline = @PagePipeline + WHERE TabId = @TabId; + + IF (@OldParentId <> @ParentId) BEGIN + -- update TabOrder of Tabs with same original Parent + UPDATE {databaseOwner}[{objectQualifier}Tabs] + SET TabOrder = TabOrder - 2 + WHERE (ParentId = @OldParentId) + AND TabOrder > @TabOrder + + -- Update Tab with new TabOrder + UPDATE {databaseOwner}[{objectQualifier}Tabs] + SET TabOrder = @NewTabOrder + WHERE TabID = @TabId + END /* IF */ + + EXEC {databaseOwner}{objectQualifier}BuildTabLevelAndPath @TabId, 1 +END /* Procedure */ +GO diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx index c678fac5a5b..59cce2882fd 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/src/components/More/More.jsx @@ -28,9 +28,9 @@ class More extends Component { getPagePipelineOptions() { const options = []; - options.push({ value: "0", label: Localization.get("Inherited") }); - options.push({ value: "1", label: Localization.get("WebForms") }); - options.push({ value: "2", label: Localization.get("Mvc") }); + options.push({ value: -1, label: Localization.get("Inherited") }); + options.push({ value: 0, label: Localization.get("WebForms") }); + options.push({ value: 1, label: Localization.get("Mvc") }); return options; } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs index c7815f3552d..6871ec7d7f0 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/Converters.cs @@ -140,7 +140,7 @@ public static T ConvertToPageSettings(TabInfo tab) ParentId = tab.ParentId, IsSpecial = TabController.IsSpecialTab(tab.TabID, PortalSettings.Current), PagePermissions = SecurityService.Instance.GetPagePermissions(tab), - PagePipeline = (string)tab.TabSettings[PagePipeline.SettingName], + PagePipeline = (int)tab.PagePipeline, }; } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs index b7f706c18a4..6d09f94cf65 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/PagesControllerImpl.cs @@ -866,7 +866,7 @@ public PageSettings GetPageSettings(int pageId, PortalSettings requestPortalSett page.IsWorkflowCompleted = isWorkflowCompleted; page.IsWorkflowOnDraft = isWorkflowOnDraft; page.PublishStatus = tab.HasBeenPublished && isWorkflowCompleted ? "Published" : "Draft"; - page.PagePipeline = ((int)tab.PagePipeline).ToString(System.Globalization.CultureInfo.InvariantCulture); + page.PagePipeline = (int)tab.PagePipeline; return page; } @@ -1036,7 +1036,7 @@ public virtual PageSettings GetDefaultSettings(int pageId = 0) pageSettings.EnabledVersioning = tabVersionSettings.IsVersioningEnabled(portalSettings.PortalId); pageSettings.WorkflowEnabled = tabWorkflowSettings.IsWorkflowEnabled(portalSettings.PortalId); pageSettings.WorkflowId = tabWorkflowSettings.GetDefaultTabWorkflowId(portalSettings.PortalId); - pageSettings.PagePipeline = string.Empty; + pageSettings.PagePipeline = Null.NullInteger; return pageSettings; } @@ -1363,7 +1363,7 @@ protected virtual void UpdateTabInfoFromPageSettings(TabInfo tab, PageSettings p tab.IconFileLarge = null; } - tab.TabSettings[PagePipeline.SettingName] = pageSettings.PagePipeline; + tab.PagePipeline = (PagePipeline.PageRenderingPipeline)pageSettings.PagePipeline; } [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/PageSettings.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/PageSettings.cs index 1b8a9f6dbb4..41738b71f55 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/PageSettings.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/DTO/PageSettings.cs @@ -224,6 +224,6 @@ public class PageSettings public string PublishStatus { get; set; } [DataMember(Name = "pagePipeline")] - public string PagePipeline { get; set; } + public int PagePipeline { get; set; } } } From 9004c9ca1d865e2d7ae81265404589387f900761 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 4 Jun 2026 11:20:18 +0200 Subject: [PATCH 012/109] Increase version of IPortalSettings interface --- .../Common/Controllers/JwtController.cs | 4 +- .../INavigationManager.cs | 8 ++-- .../Logging/IEventLogger.cs | 12 +++--- .../Portals/IPortalSettings.cs | 3 -- .../Portals/IPortalSettingsV2.cs | 19 ++++++++++ .../Prompt/IConsoleCommand.cs | 2 +- .../Api/Auth/ApiTokens/ApiTokenController.cs | 2 +- .../InternalServices/FileUploadController.cs | 4 +- .../DotNetNuke.Web/Prompt/ListServices.cs | 2 +- .../UI/WebControls/DnnFileUpload.cs | 2 +- .../MobileRedirect/MobileRedirectModule.cs | 2 +- .../OutputCaching/OutputCacheModule.cs | 2 +- .../UrlRewrite/DNNFriendlyUrlProvider.cs | 2 +- DNN Platform/Library/Common/Globals.cs | 14 +++---- .../Library/Common/Internal/GlobalsImpl.cs | 4 +- .../Library/Common/NavigationManager.cs | 8 ++-- .../Library/Common/Utilities/UrlUtils.cs | 18 ++++++--- .../Content/Workflow/WorkflowSecurity.cs | 4 +- .../Entities/Modules/Prompt/AddModule.cs | 2 +- .../Entities/Modules/Prompt/ListModules.cs | 2 +- .../Extensions/IPortalSettingsExtensions.cs | 4 +- .../Entities/Portals/IPortalController.cs | 2 +- .../Entities/Portals/PortalController.cs | 2 +- .../Entities/Portals/PortalSettings.cs | 38 +++++++++---------- .../Urls/AdvancedFriendlyUrlProvider.cs | 2 +- .../Entities/Urls/BasicFriendlyUrlProvider.cs | 4 +- .../Entities/Urls/FriendlyUrlController.cs | 4 +- .../Entities/Urls/FriendlyUrlProviderBase.cs | 2 +- .../Entities/Urls/RewriteController.cs | 4 +- .../Users/Profile/ProfilePropertyAccess.cs | 6 +-- .../Library/Entities/Users/UserController.cs | 2 +- .../JavaScriptLibraries/JavaScript.cs | 16 ++++---- .../Library/Obsolete/EventLogController.cs | 24 ++++++------ DNN Platform/Library/Prompt/ConsoleCommand.cs | 4 +- .../Library/Security/PortalSecurity.cs | 16 ++++---- .../Library/Security/Roles/RoleController.cs | 10 ++--- .../Library/Services/FileSystem/FileInfo.cs | 2 +- .../Library/Services/FileSystem/FolderInfo.cs | 2 +- .../Installer/Packages/PackageController.cs | 2 +- .../Localization/Internal/LocalizationImpl.cs | 4 +- .../Services/Localization/Localization.cs | 20 +++++----- .../Localization/LocalizationProvider.cs | 2 +- .../Log/EventLog/EventLogController.cs | 12 +++--- .../Log/EventLog/IEventLogController.cs | 10 ++--- .../Services/Mail/SendTokenizedBulkEmail.cs | 2 +- .../Controllers/UserResultController.cs | 2 +- .../Services/Sitemap/CoreSitemapProvider.cs | 2 +- .../Services/Sitemap/SitemapBuilder.cs | 6 +-- .../Scheduler/CoreMessagingScheduler.cs | 2 +- .../Url/FriendlyUrl/FriendlyUrlProvider.cs | 4 +- .../Library/UI/Containers/ActionManager.cs | 2 +- .../Services/SubscriptionsController.cs | 2 +- DNN Platform/Modules/DDRMenu/MenuBase.cs | 6 +-- .../DNNConnect.CKE/Browser/Browser.aspx.cs | 6 +-- .../DNNConnect.CKE/CKEditorOptions.ascx.cs | 6 +-- .../DNNConnect.CKE/Options.aspx.cs | 8 ++-- .../DNNConnect.CKE/Utilities/SettingsUtil.cs | 8 ++-- .../DNNConnect.CKE/Utilities/Utility.cs | 10 ++--- .../Common/NavigationManagerTests.cs | 4 +- .../AdminLogs/AdminLogsController.cs | 2 +- .../Components/Pages/BulkPagesController.cs | 2 +- .../Security/Checks/CheckUserProfilePage.cs | 4 +- .../Components/Security/SecurityController.cs | 2 +- .../Components/Sites/SitesController.cs | 2 +- .../Components/Users/Dto/UserBasicDto.cs | 2 +- .../Controllers/TabsController.cs | 2 +- .../Checks/CheckUserProfilePageTests.cs | 4 +- 67 files changed, 212 insertions(+), 188 deletions(-) create mode 100644 DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs diff --git a/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs b/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs index ea18e9ec363..34064e306d5 100644 --- a/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs +++ b/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs @@ -164,7 +164,7 @@ public LoginResultData LoginUser(HttpRequestMessage request, LoginData loginData } var obsoletePortalSettings = PortalSettings.Current; - IPortalSettings portalSettings = obsoletePortalSettings; + IPortalSettingsV2 portalSettings = obsoletePortalSettings; if (portalSettings == null) { Logger.Trace("portalSettings = null"); @@ -533,7 +533,7 @@ private LoginResultData UpdateToken(string renewalToken, PersistedToken persiste persistedToken.TokenExpiry = expiry; var obsoletePortalSettings = PortalSettings.Current; - IPortalSettings portalSettings = obsoletePortalSettings; + IPortalSettingsV2 portalSettings = obsoletePortalSettings; IPortalAliasInfo portalAlias = obsoletePortalSettings.PortalAlias; var secret = ObtainSecret(persistedToken.TokenId, portalSettings.GUID, userInfo.Membership.LastPasswordChangeDate); var accessToken = CreateJwtToken(secret, portalAlias.HttpAlias, persistedToken, userInfo.Roles); diff --git a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs index 8bf5981a165..06240060a2f 100644 --- a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs +++ b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs @@ -53,7 +53,7 @@ public interface INavigationManager /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, IPortalSettings settings, string controlKey, params string[] additionalParameters); + string NavigateURL(int tabID, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -62,7 +62,7 @@ public interface INavigationManager /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -72,7 +72,7 @@ public interface INavigationManager /// The language code. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -83,6 +83,6 @@ public interface INavigationManager /// The page name to pass. /// Any additional parameters. /// Formatted url. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, string pageName, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, string pageName, params string[] additionalParameters); } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs b/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs index d3892445f68..2a2b2339035 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs @@ -23,7 +23,7 @@ public interface IEventLogger /// The portal settings. /// The user id. /// The log type. - void AddLog(string name, string value, IPortalSettings portalSettings, int userID, EventLogType logType); + void AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, EventLogType logType); /// Adds an Event Log. /// The log property name. @@ -31,7 +31,7 @@ public interface IEventLogger /// The portal settings. /// The user id. /// The log type. - void AddLog(string name, string value, IPortalSettings portalSettings, int userID, string logType); + void AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, string logType); /// Adds an Event Log. /// The properties of the log. @@ -39,13 +39,13 @@ public interface IEventLogger /// The user id. /// The log type key. /// The bypass buffering. - void AddLog(ILogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); + void AddLog(ILogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering); /// Adds an Event Log. /// The portal settings. /// The user id. /// The log type. - void AddLog(IPortalSettings portalSettings, int userID, EventLogType logType); + void AddLog(IPortalSettingsV2 portalSettings, int userID, EventLogType logType); /// Adds an Event Log. /// The business object. @@ -53,7 +53,7 @@ public interface IEventLogger /// The user id. /// The user name. /// The log type. - void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogType logType); + void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogType logType); /// Adds an Event Log. /// The business object. @@ -61,7 +61,7 @@ public interface IEventLogger /// The user id. /// The user name. /// The log type. - void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType); + void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType); /// Adds an Event Log. /// The log info. diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 48984d065b3..2da449d9001 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -361,8 +361,5 @@ public interface IPortalSettings /// Gets a value indicating whether to display the dropdowns to quickly add a moduel to the page in the edit bar. bool ShowQuickModuleAddMenu { get; } - - /// Gets the pipeline type for the portal. - PagePipeline.PortalRenderingPipeline PagePipeline { get; } } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs new file mode 100644 index 00000000000..ceead420b83 --- /dev/null +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Abstractions.Portals +{ + using DotNetNuke.Abstractions.Framework; + + /// + /// The PortalSettings class encapsulates all of the settings for the Portal, + /// as well as the configuration settings required to execute the current tab + /// view within the portal. + /// + public interface IPortalSettingsV2 : IPortalSettings + { + /// Gets the pipeline type for the portal. + PagePipeline.PortalRenderingPipeline PagePipeline { get; } + } +} diff --git a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs index 8cce25bc5f6..a06de09090a 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs @@ -25,7 +25,7 @@ public interface IConsoleCommand /// PortalSettings for the portal we're operating under or if PortalId is specified, that portal. /// Current user. /// Current page/tab. - void Initialize(string[] args, Portals.IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId); + void Initialize(string[] args, Portals.IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId); /// The main method of the command which executes it. /// A class used by the client to display results. diff --git a/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs b/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs index ecc0752254c..c2fcee37b41 100644 --- a/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs +++ b/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs @@ -63,7 +63,7 @@ public ApiTokenController(IApiTokenRepository apiTokenRepository, IEventLogger e /// public string SchemeType => "ApiToken"; - private static Abstractions.Portals.IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static Abstractions.Portals.IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); /// public (ApiToken Token, UserInfo User) ValidateToken(HttpRequestMessage request) diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs index 06cece5d667..07e08e23455 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs @@ -170,7 +170,7 @@ public Task PostFile() var provider = new MultipartMemoryStreamProvider(); // local references for use in closure - IPortalSettings portalSettings = this.PortalSettings; + IPortalSettingsV2 portalSettings = this.PortalSettings; var currentSynchronizationContext = SynchronizationContext.Current; var userInfo = this.UserInfo; var task = request.Content.ReadAsMultipartAsync(provider) @@ -435,7 +435,7 @@ private static SavedFileDTO SaveFile( IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, - IPortalSettings portalSettings, + IPortalSettingsV2 portalSettings, UserInfo userInfo, string folder, string filter, diff --git a/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs index 059ec1fa912..1ae1d38274d 100644 --- a/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs +++ b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs @@ -21,7 +21,7 @@ public class ListServices : ConsoleCommand public override string LocalResourceFile => Constants.DefaultPromptResourceFile; /// - public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); if (!userInfo.IsSuperUser) diff --git a/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs b/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs index ee6ced9498a..8968908ff22 100644 --- a/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs +++ b/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs @@ -130,7 +130,7 @@ protected override void OnPreRender(EventArgs e) this.RegisterStartupScript(); } - private static void RegisterClientScript(IClientResourceController clientResourceController, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string skin) + private static void RegisterClientScript(IClientResourceController clientResourceController, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string skin) { DnnDropDownList.RegisterClientScript(clientResourceController, skin); diff --git a/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs b/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs index 6b1ca759504..969c1d64771 100644 --- a/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs +++ b/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs @@ -114,7 +114,7 @@ public void OnBeginRequest(object s, EventArgs e) app.Response.Redirect(redirectUrl); } - private bool IsRedirectAllowed(string url, HttpApplication app, IPortalSettings portalSettings) + private bool IsRedirectAllowed(string url, HttpApplication app, IPortalSettingsV2 portalSettings) { var urlAction = new UrlAction(app.Request); urlAction.SetRedirectAllowed(url, new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, portalSettings.PortalId)); diff --git a/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs b/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs index ab7e663a4aa..6d28c298e69 100644 --- a/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs +++ b/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs @@ -88,7 +88,7 @@ private void OnResolveRequestCache(object sender, EventArgs e) } int portalId = portalSettings.PortalId; - string locale = Localization.GetPageLocale((IPortalSettings)portalSettings).Name; + string locale = Localization.GetPageLocale((IPortalSettingsV2)portalSettings).Name; IncludeExcludeType includeExclude = IncludeExcludeType.ExcludeByDefault; if (tabSettings["CacheIncludeExclude"] != null && !string.IsNullOrEmpty(tabSettings["CacheIncludeExclude"].ToString())) diff --git a/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs b/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs index 9859fd8cc15..65ff58a4c8e 100644 --- a/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs +++ b/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs @@ -73,7 +73,7 @@ public DNNFriendlyUrlProvider() public override string FriendlyUrl(TabInfo tab, string path, string pageName) => this.providerInstance.FriendlyUrl(tab, path, pageName); /// - public override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) => this.providerInstance.FriendlyUrl(tab, path, pageName, settings); + public override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) => this.providerInstance.FriendlyUrl(tab, path, pageName, settings); /// public override string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias) => this.providerInstance.FriendlyUrl(tab, path, pageName, portalAlias); diff --git a/DNN Platform/Library/Common/Globals.cs b/DNN Platform/Library/Common/Globals.cs index a58dc8af5f7..60f15ef630b 100644 --- a/DNN Platform/Library/Common/Globals.cs +++ b/DNN Platform/Library/Common/Globals.cs @@ -2344,7 +2344,7 @@ public static string FriendlyUrl(TabInfo tab, string path, string pageName) [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public static partial string FriendlyUrl(TabInfo tab, string path, PortalSettings settings) { - return FriendlyUrl(tab, path, (IPortalSettings)settings); + return FriendlyUrl(tab, path, (IPortalSettingsV2)settings); } /// Generates the correctly formatted friendly URL. @@ -2355,7 +2355,7 @@ public static partial string FriendlyUrl(TabInfo tab, string path, PortalSetting /// The path to format. /// The portal settings. /// The formatted (friendly) URL. - public static string FriendlyUrl(TabInfo tab, string path, IPortalSettings settings) + public static string FriendlyUrl(TabInfo tab, string path, IPortalSettingsV2 settings) { return FriendlyUrl(tab, path, glbDefaultPage, settings); } @@ -2373,7 +2373,7 @@ public static string FriendlyUrl(TabInfo tab, string path, IPortalSettings setti [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public static partial string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); + return FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); } /// Generates the correctly formatted friendly URL. @@ -2386,7 +2386,7 @@ public static partial string FriendlyUrl(TabInfo tab, string path, string pageNa /// The page to include in the URL. /// The portal settings. /// The formatted (friendly) url. - public static string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) + public static string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) { return FriendlyUrlProvider.Instance().FriendlyUrl(tab, path, pageName, settings); } @@ -2553,7 +2553,7 @@ public static string LoginURL(string returnUrl, bool overrideSetting) [DnnDeprecated(9, 8, 1, "Use the overload that takes IPortalSettings instead")] public static partial string LoginURL(string returnUrl, bool overrideSetting, PortalSettings portalSettings) { - return LoginURL(returnUrl, overrideSetting, (IPortalSettings)portalSettings); + return LoginURL(returnUrl, overrideSetting, (IPortalSettingsV2)portalSettings); } /// Gets the login URL. @@ -2561,7 +2561,7 @@ public static partial string LoginURL(string returnUrl, bool overrideSetting, Po /// if set to , show the login control on the current page, even if there is a login page defined for the site. /// The Portal Settings. /// Formatted URL. - public static string LoginURL(string returnUrl, bool overrideSetting, IPortalSettings portalSettings) + public static string LoginURL(string returnUrl, bool overrideSetting, IPortalSettingsV2 portalSettings) { string loginUrl; var currentTabId = TabController.CurrentPage.TabID; @@ -3573,7 +3573,7 @@ public static partial string PreventSQLInjection(string strSQL) /// if set to [is super tab]. /// The settings. /// return the tab's culture code, if ths tab doesn't exist, it will return current culture name. - internal static string GetCultureCode(int tabId, bool isSuperTab, IPortalSettings settings) + internal static string GetCultureCode(int tabId, bool isSuperTab, IPortalSettingsV2 settings) { string cultureCode = Null.NullString; if (settings != null) diff --git a/DNN Platform/Library/Common/Internal/GlobalsImpl.cs b/DNN Platform/Library/Common/Internal/GlobalsImpl.cs index 5804b8fa314..5d48f84b246 100644 --- a/DNN Platform/Library/Common/Internal/GlobalsImpl.cs +++ b/DNN Platform/Library/Common/Internal/GlobalsImpl.cs @@ -282,13 +282,13 @@ public string FriendlyUrl(TabInfo tab, string path, string pageName) /// public string FriendlyUrl(TabInfo tab, string path, PortalSettings settings) { - return Globals.FriendlyUrl(tab, path, (IPortalSettings)settings); + return Globals.FriendlyUrl(tab, path, (IPortalSettingsV2)settings); } /// public string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return Globals.FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); + return Globals.FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); } /// diff --git a/DNN Platform/Library/Common/NavigationManager.cs b/DNN Platform/Library/Common/NavigationManager.cs index 5f795d435f1..c1b665d825a 100644 --- a/DNN Platform/Library/Common/NavigationManager.cs +++ b/DNN Platform/Library/Common/NavigationManager.cs @@ -111,7 +111,7 @@ public string NavigateURL(int tabID, string controlKey, params string[] addition /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, IPortalSettings settings, string controlKey, params string[] additionalParameters) + public string NavigateURL(int tabID, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters) { var isSuperTab = Globals.IsHostTab(tabID); return this.NavigateURL(tabID, isSuperTab, settings, controlKey, additionalParameters); @@ -124,7 +124,7 @@ public string NavigateURL(int tabID, IPortalSettings settings, string controlKey /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters) { var cultureCode = Globals.GetCultureCode(tabID, isSuperTab, settings); return this.NavigateURL(tabID, isSuperTab, settings, controlKey, cultureCode, additionalParameters); @@ -138,7 +138,7 @@ public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, /// The language code. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, params string[] additionalParameters) { return this.NavigateURL(tabID, isSuperTab, settings, controlKey, language, Globals.glbDefaultPage, additionalParameters); } @@ -152,7 +152,7 @@ public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, /// The page name to pass to . /// Any additional parameters. /// Formatted url. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, string pageName, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, string pageName, params string[] additionalParameters) { var url = tabID == Null.NullInteger ? Globals.ApplicationURL() : Globals.ApplicationURL(tabID); if (!string.IsNullOrEmpty(controlKey)) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 6f2f07340b5..622a2cdb82b 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -56,18 +56,22 @@ public static string DecodeParameter(string value) return Encoding.UTF8.GetString(arrBytes); } - /// Decrypts an encrypted value generated via . Decrypted using the current portal's . +#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved + /// Decrypts an encrypted value generated via . Decrypted using the current portal's . /// The encrypted value. /// The decrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] +#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved public static partial string DecryptParameter(string value) => DecryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); - /// Decrypts an encrypted value generated via . Decrypted using the current portal's . +#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved + /// Decrypts an encrypted value generated via . Decrypted using the current portal's . /// The cryptography provider. /// The encrypted value. /// The decrypted value. public static string DecryptParameter(ICryptographyProvider cryptographyProvider, string value) +#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved => DecryptParameter(cryptographyProvider, value, PortalController.Instance.GetCurrentSettings().GUID.ToString()); /// Decrypts an encrypted value generated via . @@ -108,18 +112,22 @@ public static string EncodeParameter(string value) return toEncode.ToString(); } - /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . +#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved + /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . /// The value to encrypt. /// The encrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] +#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved public static partial string EncryptParameter(string value) => EncryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); - /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . +#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved + /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . /// The cryptography provider. /// The value to encrypt. /// The encrypted value. public static string EncryptParameter(ICryptographyProvider cryptographyProvider, string value) +#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved => EncryptParameter(cryptographyProvider, value, PortalController.Instance.GetCurrentSettings().GUID.ToString()); /// Encrypt a parameter for placing in a URL. @@ -556,7 +564,7 @@ public static void Handle404Exception(HttpResponse response, PortalSettings port /// Redirect current response to 404 error page or output 404 content if error page not defined. /// The response. /// The portal settings. - public static void Handle404Exception(HttpResponseBase response, IPortalSettings portalSetting) + public static void Handle404Exception(HttpResponseBase response, IPortalSettingsV2 portalSetting) { if (portalSetting?.ErrorPage404 > Null.NullInteger) { diff --git a/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs b/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs index 05f86d258fe..2af5f436b42 100644 --- a/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs +++ b/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs @@ -41,10 +41,10 @@ public WorkflowSecurity() /// [SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", Justification = "Breaking change")] public bool HasStateReviewerPermission(PortalSettings settings, UserInfo user, int stateId) - => this.HasStateReviewerPermission((IPortalSettings)settings, user, stateId); + => this.HasStateReviewerPermission((IPortalSettingsV2)settings, user, stateId); /// - public bool HasStateReviewerPermission(IPortalSettings settings, UserInfo user, int stateId) + public bool HasStateReviewerPermission(IPortalSettingsV2 settings, UserInfo user, int stateId) { var permissions = this.statePermissionsRepository.GetWorkflowStatePermissionByState(stateId); diff --git a/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs b/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs index 847f921a954..51e15d9b371 100644 --- a/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs +++ b/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs @@ -42,7 +42,7 @@ public class AddModule : ConsoleCommand public string ModuleTitle { get; set; } // title for the new module. defaults to friendly name /// - public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); this.ParseParameters(this); diff --git a/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs b/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs index 55bfbc372b8..1ca6288e8c2 100644 --- a/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs +++ b/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs @@ -40,7 +40,7 @@ public class ListModules : ConsoleCommand public bool? Deleted { get; set; } /// - public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); this.ParseParameters(this); diff --git a/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs b/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs index 9518c2fd467..4e5e2fc18e1 100644 --- a/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs +++ b/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs @@ -7,7 +7,7 @@ namespace DotNetNuke.Entities.Portals.Extensions using DotNetNuke.Abstractions.Portals; /// - /// Extends the interface. + /// Extends the interface. /// public static class IPortalSettingsExtensions { @@ -16,7 +16,7 @@ public static class IPortalSettingsExtensions /// /// The portal settings to the the styles from. /// . - public static IPortalStyles GetStyles(this IPortalSettings portalSettings) + public static IPortalStyles GetStyles(this IPortalSettingsV2 portalSettings) { var repo = new PortalStylesRepository(); return repo.GetSettings(portalSettings.PortalId); diff --git a/DNN Platform/Library/Entities/Portals/IPortalController.cs b/DNN Platform/Library/Entities/Portals/IPortalController.cs index aa50d25cd91..d20b6046e90 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalController.cs @@ -102,7 +102,7 @@ public interface IPortalController /// Gets the current portal settings. /// portal settings. - IPortalSettings GetCurrentSettings(); + IPortalSettingsV2 GetCurrentSettings(); /// Gets information of a portal. /// ID of the portal. diff --git a/DNN Platform/Library/Entities/Portals/PortalController.cs b/DNN Platform/Library/Entities/Portals/PortalController.cs index bbab9980100..bf651d62250 100644 --- a/DNN Platform/Library/Entities/Portals/PortalController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalController.cs @@ -53,7 +53,7 @@ namespace DotNetNuke.Entities.Portals using Microsoft.Extensions.DependencyInjection; - using IAbPortalSettings = DotNetNuke.Abstractions.Portals.IPortalSettings; + using IAbPortalSettings = DotNetNuke.Abstractions.Portals.IPortalSettingsV2; using ICryptographyProvider = DotNetNuke.Abstractions.Security.ICryptographyProvider; /// PortalController provides business layer of portal. diff --git a/DNN Platform/Library/Entities/Portals/PortalSettings.cs b/DNN Platform/Library/Entities/Portals/PortalSettings.cs index a84c0b8d279..021d1048cb0 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettings.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettings.cs @@ -25,7 +25,7 @@ namespace DotNetNuke.Entities.Portals /// view within the portal. /// [Serializable] - public partial class PortalSettings : BaseEntityInfo, IPropertyAccess, IPortalSettings + public partial class PortalSettings : BaseEntityInfo, IPropertyAccess, IPortalSettingsV2 { /// Initializes a new instance of the class. public PortalSettings() @@ -558,44 +558,44 @@ public string AddCompatibleHttpHeader /// public PagePipeline.PortalRenderingPipeline PagePipeline { get; internal set; } - /// Create an instance. - /// A new instance. - public static IPortalSettings Create() + /// Create an instance. + /// A new instance. + public static IPortalSettingsV2 Create() => new PortalSettings(); - /// Create an instance. + /// Create an instance. /// A portal controller. /// The portal ID. - /// A new instance. - public static IPortalSettings Create(IPortalController portalController, int portalId) + /// A new instance. + public static IPortalSettingsV2 Create(IPortalController portalController, int portalId) => new PortalSettings(Null.NullInteger, portalController.GetPortal(portalId)); - /// Create an instance. + /// Create an instance. /// A portal controller. /// The active tab ID. /// The portal ID. - /// A new instance. - public static IPortalSettings Create(IPortalController portalController, int tabId, int portalId) + /// A new instance. + public static IPortalSettingsV2 Create(IPortalController portalController, int tabId, int portalId) => new PortalSettings(tabId, portalController.GetPortal(portalId)); - /// Create an instance. + /// Create an instance. /// The active tab ID. /// The portal alias. - /// A new instance. - public static IPortalSettings Create(int tabId, IPortalAliasInfo portalAlias) + /// A new instance. + public static IPortalSettingsV2 Create(int tabId, IPortalAliasInfo portalAlias) => portalAlias is PortalAliasInfo alias ? new PortalSettings(tabId, alias) : new PortalSettings(tabId, portalAlias.PortalId); - /// Create an instance. + /// Create an instance. /// The portal info. - /// A new instance. - public static IPortalSettings Create(IPortalInfo portal) + /// A new instance. + public static IPortalSettingsV2 Create(IPortalInfo portal) => portal is PortalInfo portalInfo ? new PortalSettings(portalInfo) : new PortalSettings(Null.NullInteger, portal.PortalId); - /// Create an instance. + /// Create an instance. /// The tab ID. /// The portal info. - /// A new instance. - public static IPortalSettings Create(int tabId, IPortalInfo portal) + /// A new instance. + public static IPortalSettingsV2 Create(int tabId, IPortalInfo portal) => portal is PortalInfo portalInfo ? new PortalSettings(tabId, portalInfo) : new PortalSettings(tabId, portal.PortalId); /// diff --git a/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs b/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs index 720d7e184e0..c5ee1a25248 100644 --- a/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs +++ b/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs @@ -212,7 +212,7 @@ internal override string FriendlyUrl(TabInfo tab, string path, string pageName) } /// - internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings portalSettings) + internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 portalSettings) { if (portalSettings == null) { diff --git a/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs b/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs index b23c9706199..c0ce9a6962f 100644 --- a/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs +++ b/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs @@ -65,7 +65,7 @@ internal override string FriendlyUrl(TabInfo tab, string path, string pageName) } /// - internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) + internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) { IPortalAliasInfo portalAliasInfo = ((PortalSettings)settings)?.PortalAlias; return this.FriendlyUrl(tab, path, pageName, portalAliasInfo?.HttpAlias, settings); @@ -306,7 +306,7 @@ private string GetFriendlyQueryString(TabInfo tab, string path, string pageName) return AddPage(friendlyPath, pageName); } - private string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias, IPortalSettings portalSettings) + private string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias, IPortalSettingsV2 portalSettings) { string friendlyPath = path; bool isPagePath = tab != null; diff --git a/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs b/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs index 3b896db2cad..39146ac60b7 100644 --- a/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs +++ b/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs @@ -135,9 +135,9 @@ public static TabInfo GetTab(int tabId, bool addStdUrls) } public static TabInfo GetTab(int tabId, bool addStdUrls, PortalSettings portalSettings, FriendlyUrlSettings settings) - => GetTab(tabId, addStdUrls, (IPortalSettings)portalSettings, settings); + => GetTab(tabId, addStdUrls, (IPortalSettingsV2)portalSettings, settings); - public static TabInfo GetTab(int tabId, bool addStdUrls, IPortalSettings portalSettings, FriendlyUrlSettings settings) + public static TabInfo GetTab(int tabId, bool addStdUrls, IPortalSettingsV2 portalSettings, FriendlyUrlSettings settings) { TabInfo tab = TabController.Instance.GetTab(tabId, portalSettings.PortalId, false); if (addStdUrls) diff --git a/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs b/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs index 64a9ea64ec7..73f12e8e037 100644 --- a/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs +++ b/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs @@ -41,7 +41,7 @@ internal FriendlyUrlProviderBase(NameValueCollection attributes) internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName); - internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings portalSettings); + internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 portalSettings); internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias); } diff --git a/DNN Platform/Library/Entities/Urls/RewriteController.cs b/DNN Platform/Library/Entities/Urls/RewriteController.cs index 6801528e34d..6c25016fe34 100644 --- a/DNN Platform/Library/Entities/Urls/RewriteController.cs +++ b/DNN Platform/Library/Entities/Urls/RewriteController.cs @@ -960,7 +960,7 @@ internal static bool IdentifyByTabPathEx( PortalInfo portal = CacheController.GetPortal(result.PortalId, false); // DNN-3789 - culture is defined by GetPageLocale - IPortalSettings portalSettings = new PortalSettings(result.TabId, result.PortalAlias); + IPortalSettingsV2 portalSettings = new PortalSettings(result.TabId, result.PortalAlias); string currentLocale = Localization.GetPageLocale(portalSettings).Name; if (portal != null && !string.IsNullOrEmpty(currentLocale)) { @@ -1816,7 +1816,7 @@ private static bool CheckTabPath(IHostSettings hostSettings, IPortalController p var currentLocale = result.CultureCode; if (string.IsNullOrEmpty(currentLocale)) { - IPortalSettings portalSettings = new PortalSettings(result.PortalId); + IPortalSettingsV2 portalSettings = new PortalSettings(result.PortalId); currentLocale = Localization.GetPageLocale(portalSettings).Name; } diff --git a/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs b/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs index 88d49e47193..9d939d0a1ae 100644 --- a/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs +++ b/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs @@ -59,7 +59,7 @@ public CacheLevel Cacheability [DnnDeprecated(9, 8, 0, "Use the overload that takes IPortalSettings instead")] public static partial bool CheckAccessLevel(PortalSettings portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) { - var portalSettingsAsInterface = (IPortalSettings)portalSettings; + var portalSettingsAsInterface = (IPortalSettingsV2)portalSettings; return CheckAccessLevel(portalSettingsAsInterface, property, accessingUser, targetUser); } @@ -69,7 +69,7 @@ public static partial bool CheckAccessLevel(PortalSettings portalSettings, Profi /// The accessing user. /// The target user. /// if property accessible, otherwise . - public static bool CheckAccessLevel(IPortalSettings portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) + public static bool CheckAccessLevel(IPortalSettingsV2 portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) { var isAdminUser = IsAdminUser(portalSettings, accessingUser, targetUser); @@ -258,7 +258,7 @@ public string GetProperty(string propertyName, string format, CultureInfo format return string.Empty; } - private static bool IsAdminUser(IPortalSettings portalSettings, UserInfo accessingUser, UserInfo targetUser) + private static bool IsAdminUser(IPortalSettingsV2 portalSettings, UserInfo accessingUser, UserInfo targetUser) { bool isAdmin = false; diff --git a/DNN Platform/Library/Entities/Users/UserController.cs b/DNN Platform/Library/Entities/Users/UserController.cs index 9550f941d0d..ab65d687968 100644 --- a/DNN Platform/Library/Entities/Users/UserController.cs +++ b/DNN Platform/Library/Entities/Users/UserController.cs @@ -2089,7 +2089,7 @@ internal static void UpdateUser(IEventLogger eventLogger, int portalId, UserInfo if (loggedAction) { // if the HttpContext is null, then get portal settings by portal id. - IPortalSettings portalSettings = null; + IPortalSettingsV2 portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs b/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs index 8bbf8dde359..383cd7f90d9 100644 --- a/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs +++ b/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs @@ -135,7 +135,7 @@ public static partial void RequestRegistration(string jsname) /// The event logger. /// The portal settings. /// the library name. - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -165,7 +165,7 @@ public static partial void RequestRegistration(string jsname, Version version) /// The portal settings. /// the library name. /// the library's version. - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -200,7 +200,7 @@ public static partial void RequestRegistration(string jsname, Version version, S /// When is passed, match the major and minor versions. /// When is passed, match all parts of the version. /// - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version, SpecificVersion specific) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version, SpecificVersion specific) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -241,7 +241,7 @@ public static partial void Register(Page page) /// The event logger. /// The portal settings. /// reference to the current page. - public static void Register(IHostSettings hostSettings, IHostSettingsService hostSettingsService, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, Page page) + public static void Register(IHostSettings hostSettings, IHostSettingsService hostSettingsService, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, Page page) { hostSettings ??= Globals.GetCurrentServiceProvider().GetRequiredService(); hostSettingsService ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -397,7 +397,7 @@ private static void RequestHighestVersionLibraryRegistration(IApplicationStatusI } } - private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version, SpecificVersion specific) + private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version, SpecificVersion specific) { Func isValidLibrary = specific == SpecificVersion.LatestMajor ? l => l.Version.Major == version.Major && l.Version.Minor >= version.Minor @@ -423,7 +423,7 @@ private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInf return false; } - private static void RequestSpecificVersionLibraryRegistration(IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version) + private static void RequestSpecificVersionLibraryRegistration(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version) { var library = JavaScriptLibraryController.Instance.GetLibrary(l => l.LibraryName.Equals(jsname, StringComparison.OrdinalIgnoreCase) && l.Version == version); if (library != null) @@ -465,7 +465,7 @@ private static void AddPreInstallOrLegacyItemRequest(string jsl) HttpContextSource.Current.Items[LegacyPrefix + jsl] = true; } - private static List ResolveVersionConflicts(IEventLogger eventLogger, IPortalSettings portalSettings, IEnumerable scripts) + private static List ResolveVersionConflicts(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, IEnumerable scripts) { var finalScripts = new List(); foreach (var libraryId in scripts) @@ -615,7 +615,7 @@ private static IEnumerable GetAllDependencies(IApplicationSta } } - private static void LogCollision(IEventLogger eventLogger, IPortalSettings portalSettings, string collisionText) + private static void LogCollision(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string collisionText) { // need to log an event eventLogger.AddLog( diff --git a/DNN Platform/Library/Obsolete/EventLogController.cs b/DNN Platform/Library/Obsolete/EventLogController.cs index 93179605ce0..585fb3cc8ae 100644 --- a/DNN Platform/Library/Obsolete/EventLogController.cs +++ b/DNN Platform/Library/Obsolete/EventLogController.cs @@ -525,61 +525,61 @@ public partial void AddLog(string propertyName, string propertyValue, EventLogTy /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, EventLogType logType) => - this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); + this.AddLog(propertyName, propertyValue, (IPortalSettingsV2)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogType logType) => + public partial void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, EventLogType logType) => this.EventLogger.AddLog(propertyName, propertyValue, portalSettings, userID, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType) => - this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); + this.AddLog(propertyName, propertyValue, (IPortalSettingsV2)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType) => + public partial void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, string logType) => this.EventLogger.AddLog(propertyName, propertyValue, portalSettings, userID, logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(LogProperties properties, PortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) => - this.AddLog(properties, (IPortalSettings)portalSettings, userID, logTypeKey, bypassBuffering); + this.AddLog(properties, (IPortalSettingsV2)portalSettings, userID, logTypeKey, bypassBuffering); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) => + public partial void AddLog(LogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering) => this.EventLogger.AddLog(properties, portalSettings, userID, logTypeKey, bypassBuffering); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(PortalSettings portalSettings, int userID, EventLogType logType) => - this.AddLog((IPortalSettings)portalSettings, userID, logType); + this.AddLog((IPortalSettingsV2)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(IPortalSettings portalSettings, int userID, EventLogType logType) => + public partial void AddLog(IPortalSettingsV2 portalSettings, int userID, EventLogType logType) => this.EventLogger.AddLog(portalSettings, userID, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, EventLogType logType) => - this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); + this.AddLog(businessObject, (IPortalSettingsV2)portalSettings, userID, userName, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogType logType) => + public partial void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogType logType) => this.EventLogger.AddLog(businessObject, portalSettings, userID, userName, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType) => - this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); + this.AddLog(businessObject, (IPortalSettingsV2)portalSettings, userID, userName, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType) => + public partial void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType) => this.EventLogger.AddLog(businessObject, portalSettings, userID, userName, logType); /// diff --git a/DNN Platform/Library/Prompt/ConsoleCommand.cs b/DNN Platform/Library/Prompt/ConsoleCommand.cs index 37a159d8efd..f147971ec42 100644 --- a/DNN Platform/Library/Prompt/ConsoleCommand.cs +++ b/DNN Platform/Library/Prompt/ConsoleCommand.cs @@ -28,7 +28,7 @@ public abstract class ConsoleCommand : IConsoleCommand public virtual string ResultHtml => this.LocalizeString($"Prompt_{this.GetType().Name}_ResultHtml"); /// Gets the portal settings. - protected IPortalSettings PortalSettings { get; private set; } + protected IPortalSettingsV2 PortalSettings { get; private set; } /// Gets the current user. protected IUserInfo User { get; private set; } @@ -49,7 +49,7 @@ public abstract class ConsoleCommand : IConsoleCommand Common.Globals.GetCurrentServiceProvider().GetRequiredService(); /// - public virtual void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) + public virtual void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) { this.Args = args; this.PortalSettings = portalSettings; diff --git a/DNN Platform/Library/Security/PortalSecurity.cs b/DNN Platform/Library/Security/PortalSecurity.cs index f987b98c51a..0919c8f1839 100644 --- a/DNN Platform/Library/Security/PortalSecurity.cs +++ b/DNN Platform/Library/Security/PortalSecurity.cs @@ -298,14 +298,14 @@ public static bool IsDenied(string roles) /// The semicolon separated list of roles. /// if the specified user is denied; otherwise, . public static bool IsDenied(UserInfo objUserInfo, PortalSettings settings, string roles) - => IsDenied(objUserInfo, (IPortalSettings)settings, roles); + => IsDenied(objUserInfo, (IPortalSettingsV2)settings, roles); /// Determines whether the specified user is denied for the given roles. /// The user information. /// The settings. /// The semicolon separated list of roles. /// if the specified user is denied; otherwise, . - public static bool IsDenied(UserInfo objUserInfo, IPortalSettings settings, string roles) + public static bool IsDenied(UserInfo objUserInfo, IPortalSettingsV2 settings, string roles) { // superuser always has full access if (objUserInfo.IsSuperUser) @@ -373,14 +373,14 @@ public static bool IsInRoles(string roles) /// if the provided user belongs to the specific roles; otherwise, . [DnnDeprecated(10, 0, 2, "Use overload taking IPortalSettings")] public static partial bool IsInRoles(UserInfo objUserInfo, PortalSettings settings, string roles) - => IsInRoles(objUserInfo, (IPortalSettings)settings, roles); + => IsInRoles(objUserInfo, (IPortalSettingsV2)settings, roles); /// Determines whether the provided user belongs to the specified roles. /// The user information. /// The settings. /// The semicolon separated list of roles. /// if the provided user belongs to the specific roles; otherwise, . - public static bool IsInRoles(UserInfo objUserInfo, IPortalSettings settings, string roles) + public static bool IsInRoles(UserInfo objUserInfo, IPortalSettingsV2 settings, string roles) { if (objUserInfo.IsSuperUser) { @@ -592,7 +592,7 @@ public string Replace(string inputString, ConfigType configType, string configSo const RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline; const string listName = "ProfanityFilter"; - IPortalSettings settings; + IPortalSettingsV2 settings; IEnumerable listEntryHostInfos; IEnumerable listEntryPortalInfos; @@ -649,7 +649,7 @@ public string Remove(string inputString, ConfigType configType, string configSou const RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline; const string listName = "ProfanityFilter"; - IPortalSettings settings; + IPortalSettingsV2 settings; IEnumerable listEntryHostInfos; IEnumerable listEntryPortalInfos; @@ -907,7 +907,7 @@ public void CheckAllPortalFileExtensionWhitelists(string newMasterList) } } - private static void ProcessRole(UserInfo user, IPortalSettings settings, string roleName, out bool? roleAllowed) + private static void ProcessRole(UserInfo user, IPortalSettingsV2 settings, string roleName, out bool? roleAllowed) { var roleType = GetRoleType(roleName); switch (roleType) @@ -971,7 +971,7 @@ private static int GetEntityFromRoleName(string roleName) return Null.NullInteger; } - private static void ProcessSecurityRole(UserInfo user, IPortalSettings settings, string roleName, out bool? roleAllowed) + private static void ProcessSecurityRole(UserInfo user, IPortalSettingsV2 settings, string roleName, out bool? roleAllowed) { roleAllowed = null; diff --git a/DNN Platform/Library/Security/Roles/RoleController.cs b/DNN Platform/Library/Security/Roles/RoleController.cs index 49c773d77e2..05487b97c49 100644 --- a/DNN Platform/Library/Security/Roles/RoleController.cs +++ b/DNN Platform/Library/Security/Roles/RoleController.cs @@ -101,7 +101,7 @@ public static int AddRoleGroup(RoleGroupInfo objRoleGroupInfo) /// The portal settings. /// The RoleGroup to Add. /// The ID of the new role. - public static int AddRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroupInfo) + public static int AddRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroupInfo) { var id = roleProvider.CreateRoleGroup(roleGroupInfo); eventLogger.AddLog( @@ -238,7 +238,7 @@ public static void DeleteRoleGroup(int portalID, int roleGroupId) /// The portal ID of the role group. /// The role group ID. [Obsolete("Deprecated in DotNetNuke 10.0.2. Please use overload with RoleProvider. Scheduled removal in v12.0.0.")] - public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, int portalId, int roleGroupId) + public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, int portalId, int roleGroupId) => DeleteRoleGroup(roleProvider, eventLogger, userController, portalSettings, GetRoleGroup(portalId, roleGroupId)); /// Deletes a Role Group. @@ -258,7 +258,7 @@ public static void DeleteRoleGroup(RoleGroupInfo objRoleGroupInfo) /// The user controller. /// The portal settings. /// The RoleGroup to Delete. - public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroupInfo) + public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroupInfo) { roleProvider.DeleteRoleGroup(roleGroupInfo); eventLogger.AddLog( @@ -418,7 +418,7 @@ public static void UpdateRoleGroup(RoleGroupInfo roleGroup) /// The user controller. /// The portal settings. /// The RoleGroup to Update. - public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroup) + public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroup) { UpdateRoleGroup(roleProvider, roleController, eventLogger, userController, portalSettings, roleGroup, false); } @@ -433,7 +433,7 @@ public static void UpdateRoleGroup(RoleGroupInfo roleGroup, bool includeRoles) roleGroup, includeRoles); - public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroup, bool includeRoles) + public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroup, bool includeRoles) { roleProvider.UpdateRoleGroup(roleGroup); eventLogger.AddLog(roleGroup, portalSettings, userController.GetCurrentUserInfo().UserID, string.Empty, EventLogType.USER_ROLE_UPDATED); diff --git a/DNN Platform/Library/Services/FileSystem/FileInfo.cs b/DNN Platform/Library/Services/FileSystem/FileInfo.cs index 7011581c0ed..a99e5be02ba 100644 --- a/DNN Platform/Library/Services/FileSystem/FileInfo.cs +++ b/DNN Platform/Library/Services/FileSystem/FileInfo.cs @@ -141,7 +141,7 @@ public string PhysicalPath get { string physicalPath = Null.NullString; - IPortalSettings portalSettings = null; + IPortalSettingsV2 portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Services/FileSystem/FolderInfo.cs b/DNN Platform/Library/Services/FileSystem/FolderInfo.cs index fd843c4bb95..d4fdef3b35a 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderInfo.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderInfo.cs @@ -97,7 +97,7 @@ public string PhysicalPath get { string physicalPath; - IPortalSettings portalSettings = null; + IPortalSettingsV2 portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Services/Installer/Packages/PackageController.cs b/DNN Platform/Library/Services/Installer/Packages/PackageController.cs index 8d4f6b5227f..44f79df5d9c 100644 --- a/DNN Platform/Library/Services/Installer/Packages/PackageController.cs +++ b/DNN Platform/Library/Services/Installer/Packages/PackageController.cs @@ -68,7 +68,7 @@ public static partial bool CanDeletePackage(PackageInfo package, PortalSettings /// The package. /// The portal settings. /// if the package can be deleted, otherwise . - public static bool CanDeletePackage(IHostSettings hostSettings, IApplicationStatusInfo appStatus, PackageInfo package, IPortalSettings portalSettings) + public static bool CanDeletePackage(IHostSettings hostSettings, IApplicationStatusInfo appStatus, PackageInfo package, IPortalSettingsV2 portalSettings) { bool bCanDelete = true; diff --git a/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs b/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs index 3351f23c207..7f3b367fdcc 100644 --- a/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs +++ b/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs @@ -73,13 +73,13 @@ public string BestCultureCodeBasedOnBrowserLanguages(IEnumerable culture /// public CultureInfo GetPageLocale(PortalSettings portalSettings) { - return Localization.GetPageLocale((IPortalSettings)portalSettings); + return Localization.GetPageLocale((IPortalSettingsV2)portalSettings); } /// public void SetThreadCultures(CultureInfo cultureInfo, PortalSettings portalSettings) { - Localization.SetThreadCultures(cultureInfo, (IPortalSettings)portalSettings); + Localization.SetThreadCultures(cultureInfo, (IPortalSettingsV2)portalSettings); } } } diff --git a/DNN Platform/Library/Services/Localization/Localization.cs b/DNN Platform/Library/Services/Localization/Localization.cs index e1baad4cc33..324ff0675df 100644 --- a/DNN Platform/Library/Services/Localization/Localization.cs +++ b/DNN Platform/Library/Services/Localization/Localization.cs @@ -573,7 +573,7 @@ public static string GetLocaleName(string code, CultureDropDownTypes displayType [DnnDeprecated(9, 8, 0, "Use overload taking IPortalSettings instead")] public static partial CultureInfo GetPageLocale(PortalSettings portalSettings) { - return GetPageLocale((IPortalSettings)portalSettings); + return GetPageLocale((IPortalSettingsV2)portalSettings); } /// @@ -591,7 +591,7 @@ public static partial CultureInfo GetPageLocale(PortalSettings portalSettings) /// /// Current PortalSettings. /// A valid CultureInfo. - public static CultureInfo GetPageLocale(IPortalSettings portalSettings) + public static CultureInfo GetPageLocale(IPortalSettingsV2 portalSettings) { CultureInfo pageCulture = null; @@ -1577,7 +1577,7 @@ public static void SetLanguage(string value) [DnnDeprecated(9, 8, 0, "Use overload taking IPortalSettings instead")] public static partial void SetThreadCultures(CultureInfo cultureInfo, PortalSettings portalSettings) { - SetThreadCultures(cultureInfo, (IPortalSettings)portalSettings); + SetThreadCultures(cultureInfo, (IPortalSettingsV2)portalSettings); } /// Sets the culture codes on the current Thread. @@ -1587,7 +1587,7 @@ public static partial void SetThreadCultures(CultureInfo cultureInfo, PortalSett /// This method will configure the Thread culture codes. Any page which does not derive from should /// be sure to call this method in to ensure localization works correctly. /// - public static void SetThreadCultures(CultureInfo cultureInfo, IPortalSettings portalSettings) + public static void SetThreadCultures(CultureInfo cultureInfo, IPortalSettingsV2 portalSettings) { if (cultureInfo == null) { @@ -1888,7 +1888,7 @@ private static string GetValidLanguageUrl(int portalId, string httpAlias, string /// Tries to get a valid language from the querystring. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromQs(IPortalSettings portalSettings) + private static CultureInfo GetCultureFromQs(IPortalSettingsV2 portalSettings) { if (HttpContext.Current == null || HttpContext.Current.Request["language"] == null) { @@ -1903,7 +1903,7 @@ private static CultureInfo GetCultureFromQs(IPortalSettings portalSettings) /// Tries to get a valid language from the cookie. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromCookie(IPortalSettings portalSettings) + private static CultureInfo GetCultureFromCookie(IPortalSettingsV2 portalSettings) { CultureInfo culture; if (HttpContext.Current == null || HttpContext.Current.Request.Cookies["language"] == null) @@ -1919,7 +1919,7 @@ private static CultureInfo GetCultureFromCookie(IPortalSettings portalSettings) /// Tries to get a valid language from the user profile. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromProfile(IPortalSettings portalSettings) + private static CultureInfo GetCultureFromProfile(IPortalSettingsV2 portalSettings) { UserInfo objUserInfo = UserController.Instance.GetCurrentUserInfo(); @@ -1936,7 +1936,7 @@ private static CultureInfo GetCultureFromProfile(IPortalSettings portalSettings) /// Tries to get a valid language from the browser preferences if the portal has the setting to use browser languages enabled. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromBrowser(IPortalSettings portalSettings) + private static CultureInfo GetCultureFromBrowser(IPortalSettingsV2 portalSettings) { if (!portalSettings.EnableBrowserLanguage) { @@ -1951,7 +1951,7 @@ private static CultureInfo GetCultureFromBrowser(IPortalSettings portalSettings) /// Tries to get a valid language from the portal default preferences. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromPortal(IPortalSettings portalSettings) + private static CultureInfo GetCultureFromPortal(IPortalSettingsV2 portalSettings) { CultureInfo culture = null; if (!string.IsNullOrEmpty(portalSettings.DefaultLanguage)) @@ -1994,7 +1994,7 @@ private static List GetPortalLocalizations(int portalId) /// Current culture. /// Portal settings for the current request. /// A instance representing the user's UI culture. - private static CultureInfo GetUserUICulture(CultureInfo currentCulture, IPortalSettings portalSettings) + private static CultureInfo GetUserUICulture(CultureInfo currentCulture, IPortalSettingsV2 portalSettings) { CultureInfo uiCulture = currentCulture; try diff --git a/DNN Platform/Library/Services/Localization/LocalizationProvider.cs b/DNN Platform/Library/Services/Localization/LocalizationProvider.cs index b803c669eb0..a9fce7c7adc 100644 --- a/DNN Platform/Library/Services/Localization/LocalizationProvider.cs +++ b/DNN Platform/Library/Services/Localization/LocalizationProvider.cs @@ -219,7 +219,7 @@ private static object GetCompiledResourceFileCallBack(CacheItemArgs cacheItemArg { var resourceFile = (string)cacheItemArgs.Params[0]; var locale = (string)cacheItemArgs.Params[1]; - var portalSettings = (IPortalSettings)cacheItemArgs.Params[2]; + var portalSettings = (IPortalSettingsV2)cacheItemArgs.Params[2]; var hostSettings = (IHostSettings)cacheItemArgs.Params[3]; string systemLanguage = Localization.SystemLocale; string defaultLanguage = portalSettings.DefaultLanguage; diff --git a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs index 57f4f48a14e..40fb6a4dfdf 100644 --- a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs @@ -33,13 +33,13 @@ void IEventLogger.AddLog(string name, string value, Abstractions.Logging.EventLo } /// - void IEventLogger.AddLog(string name, string value, IPortalSettings portalSettings, int userID, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, Abstractions.Logging.EventLogType logType) { this.EventLogger.AddLog(name, value, portalSettings, userID, logType.ToString()); } /// - void IEventLogger.AddLog(string name, string value, IPortalSettings portalSettings, int userID, string logType) + void IEventLogger.AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, string logType) { var properties = new LogProperties(); var logDetailInfo = new LogDetailInfo { PropertyName = name, PropertyValue = value }; @@ -48,7 +48,7 @@ void IEventLogger.AddLog(string name, string value, IPortalSettings portalSettin } /// - void IEventLogger.AddLog(ILogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) + void IEventLogger.AddLog(ILogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering) { // supports adding a custom string for LogType var log = new LogInfo @@ -69,19 +69,19 @@ void IEventLogger.AddLog(ILogProperties properties, IPortalSettings portalSettin } /// - void IEventLogger.AddLog(IPortalSettings portalSettings, int userID, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(IPortalSettingsV2 portalSettings, int userID, Abstractions.Logging.EventLogType logType) { this.EventLogger.AddLog(new LogProperties(), portalSettings, userID, logType.ToString(), false); } /// - void IEventLogger.AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, Abstractions.Logging.EventLogType logType) { this.AddLog(businessObject, portalSettings, userID, userName, logType.ToString()); } /// - void IEventLogger.AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType) + void IEventLogger.AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType) { var log = new LogInfo { LogUserID = userID, LogTypeKey = logType }; if (portalSettings != null) diff --git a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs index 114d84d112a..a1fcfc6b944 100644 --- a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs @@ -25,9 +25,9 @@ public partial interface IEventLogController : ILogController [Obsolete("Deprecated in DotNetNuke 9.7.0. It has been replaced by the overload taking IPortalSettings. Scheduled for removal in v11.0.0.")] void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType); - void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogController.EventLogType logType); + void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, EventLogController.EventLogType logType); - void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType); + void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, string logType); void AddLog(PortalSettings portalSettings, int userID, EventLogController.EventLogType logType); @@ -40,11 +40,11 @@ public partial interface IEventLogController : ILogController [Obsolete("Deprecated in DotNetNuke 9.7.0. It has been replaced by the overload taking IPortalSettings. Scheduled for removal in v11.0.0.")] void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType); - void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); + void AddLog(LogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering); - void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogController.EventLogType logType); + void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogController.EventLogType logType); - void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType); + void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType); #pragma warning restore SA1600 // Elements should be documented } } diff --git a/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs b/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs index c251e46dfd5..5826197ad7a 100644 --- a/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs +++ b/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs @@ -44,7 +44,7 @@ public class SendTokenizedBulkEmail : IDisposable private UserInfo replyToUser; private bool smtpEnableSSL; private TokenReplace tokenReplace; - private IPortalSettings portalSettings; + private IPortalSettingsV2 portalSettings; private UserInfo sendingUser; private string body = string.Empty; private string confirmBodyHTML; diff --git a/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs b/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs index ed52266befb..4b2092aa8a1 100644 --- a/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs +++ b/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs @@ -31,7 +31,7 @@ public class UserResultController : BaseResultController /// public override string LocalizedSearchTypeName => Localization.GetString("Crawler_user", LocalizedResxFile); - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); /// public override bool HasViewPermission(SearchResult searchResult) diff --git a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs index ac31ba03d3d..ab065f3dea6 100644 --- a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs +++ b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs @@ -41,7 +41,7 @@ public override List GetUrls(int portalId, PortalSettings ps, string var currentLanguage = ps.CultureCode; if (string.IsNullOrEmpty(currentLanguage)) { - currentLanguage = Localization.GetPageLocale((IPortalSettings)ps).Name; + currentLanguage = Localization.GetPageLocale((IPortalSettingsV2)ps).Name; } var languagePublished = LocaleController.Instance.GetLocale(ps.PortalId, currentLanguage).IsPublished; diff --git a/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs b/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs index 19dab45e5b2..4af3738e0c3 100644 --- a/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs +++ b/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs @@ -51,7 +51,7 @@ public string CacheFileName var currentCulture = this.portalSettings.CultureCode?.ToLowerInvariant(); if (string.IsNullOrEmpty(currentCulture)) { - currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); + currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); } this.cacheFileName = $"sitemap.{currentCulture}.xml"; @@ -67,7 +67,7 @@ public string CacheIndexFileNameFormat { if (string.IsNullOrEmpty(this.cacheIndexFileNameFormat)) { - var currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); + var currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); this.cacheIndexFileNameFormat = $"sitemap_{{0}}.{currentCulture}.xml"; } @@ -207,7 +207,7 @@ public void GetSitemapIndexFile(string index, TextWriter output) return; } - var currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); + var currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); this.WriteSitemapFileToOutput($"sitemap_{theIndex}.{currentCulture}.xml", output); } diff --git a/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs b/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs index cc217465921..fb0ee29c9b5 100644 --- a/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs +++ b/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs @@ -395,7 +395,7 @@ private static int GetMessageTab(IHostSettings hostSettings, PortalSettings send /// The tab ID for the Message Center OR the user profile page tab ID. private static object GetMessageTabCallback(CacheItemArgs cacheItemArgs) { - var portalSettings = (IPortalSettings)cacheItemArgs.Params[0]; + var portalSettings = (IPortalSettingsV2)cacheItemArgs.Params[0]; var profileTab = TabController.Instance.GetTab(portalSettings.UserTabId, portalSettings.PortalId, false); if (profileTab != null) diff --git a/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs b/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs index 586f68580e2..b3d5b8ab629 100644 --- a/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs +++ b/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs @@ -41,7 +41,7 @@ public static FriendlyUrlProvider Instance() [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public virtual partial string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return this.FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); + return this.FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); } /// Generate a friendly URL. @@ -50,7 +50,7 @@ public virtual partial string FriendlyUrl(TabInfo tab, string path, string pageN /// The page name. /// The portal settings. /// The friendly URL. - public abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings); + public abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings); /// Generate a friendly URL. /// The page. diff --git a/DNN Platform/Library/UI/Containers/ActionManager.cs b/DNN Platform/Library/UI/Containers/ActionManager.cs index d17cc7740b1..f70d715715e 100644 --- a/DNN Platform/Library/UI/Containers/ActionManager.cs +++ b/DNN Platform/Library/UI/Containers/ActionManager.cs @@ -30,7 +30,7 @@ namespace DotNetNuke.UI.Containers /// ActionManager is a helper class that provides common Action Behaviors that can be used by any implementation. public class ActionManager { - private readonly IPortalSettings portalSettings = PortalController.Instance.GetCurrentSettings(); + private readonly IPortalSettingsV2 portalSettings = PortalController.Instance.GetCurrentSettings(); private readonly HttpRequest request = HttpContext.Current.Request; private readonly HttpResponse response = HttpContext.Current.Response; private readonly IEventLogger eventLogger; diff --git a/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs b/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs index 3f99abf9f9f..530523a1089 100644 --- a/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs +++ b/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs @@ -178,7 +178,7 @@ public HttpResponseMessage GetLocalizationTable(string culture) { if (!string.IsNullOrEmpty(culture)) { - Localization.SetThreadCultures(new CultureInfo(culture), (IPortalSettings)this.PortalSettings); + Localization.SetThreadCultures(new CultureInfo(culture), (IPortalSettingsV2)this.PortalSettings); } var dictionary = new Dictionary(); diff --git a/DNN Platform/Modules/DDRMenu/MenuBase.cs b/DNN Platform/Modules/DDRMenu/MenuBase.cs index 56241588bc0..c4a82ed70b8 100644 --- a/DNN Platform/Modules/DDRMenu/MenuBase.cs +++ b/DNN Platform/Modules/DDRMenu/MenuBase.cs @@ -75,7 +75,7 @@ public MenuBase(ILocaliser localiser, IHostSettings hostSettings, ITabController public TemplateDefinition TemplateDef { get; set; } /// Gets the portal settings for the current portal. - // TODO: In v11 we should replace this by IPortalSettings and make it private or instantiate PortalSettings in the constructor. + // TODO: In v11 we should replace this by IPortalSettingsV2 and make it private or instantiate PortalSettings in the constructor. [Obsolete("Deprecated in DotNetNuke 9.8.1. This should not have been public. Scheduled removal in v11.0.0.")] internal PortalSettings HostPortalSettings => this.hostPortalSettings ??= PortalSettings.Current; @@ -158,7 +158,7 @@ internal virtual void PreRender() { #pragma warning disable CS0618 // Type or member is obsolete - // TODO: In Dnn v11, replace this to use IPortalSettings private field instantiate in constructor + // TODO: In Dnn v11, replace this to use IPortalSettingsV2 private field instantiate in constructor this.localiser.LocaliseNode(this.RootNode, this.HostPortalSettings.PortalId); #pragma warning restore CS0618 // Type or member is obsolete } @@ -440,7 +440,7 @@ private void ApplyNodeSelector() private void ApplyNodeManipulator() { - // TODO: In Dnn v11, replace this.HostPortalSettings to use IPortalSettings private field instantiate in constructor + // TODO: In Dnn v11, replace this.HostPortalSettings to use IPortalSettingsV2 private field instantiate in constructor #pragma warning disable CS0618 // Type or member is obsolete this.RootNode = new MenuNode( diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs index 84e6e9a92b1..72c882e7b71 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs @@ -94,7 +94,7 @@ public partial class Browser : PageBase private EditorProviderSettings allPortalsSettings = new EditorProviderSettings(); /// The portal settings. - private IPortalSettings portalSettings; + private IPortalSettingsV2 portalSettings; /// The extension white list. private IFileExtensionAllowList extensionWhiteList; @@ -1520,7 +1520,7 @@ private void FillQualityPercentages() /// The get portal settings. /// Current Portal Settings. - private IPortalSettings GetPortalSettings() + private IPortalSettingsV2 GetPortalSettings() { int iTabId = 0, iPortalId = 0; @@ -1545,7 +1545,7 @@ private IPortalSettings GetPortalSettings() } catch (Exception) { - return (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; + return (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; } } diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs index 3e16cffdeca..bbfc97b14e7 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs @@ -79,7 +79,7 @@ public partial class CKEditorOptions : PortalModuleBase private readonly HttpRequest request = HttpContext.Current.Request; /// The _portal settings. - private IPortalSettings portalSettings; + private IPortalSettingsV2 portalSettings; /// Override Default Config Folder from Web.config. private string configFolder = string.Empty; @@ -1234,7 +1234,7 @@ private void FillFolders() /// Gets the portal settings. /// Returns the Current Portal Settings. - private IPortalSettings GetPortalSettings() + private IPortalSettingsV2 GetPortalSettings() { try { @@ -1267,7 +1267,7 @@ private IPortalSettings GetPortalSettings() } catch (Exception) { - return (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; + return (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; } } diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs index d7661291134..11ddf43110a 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs @@ -37,7 +37,7 @@ public partial class Options : PageBase private readonly HttpRequest request = HttpContext.Current.Request; /// The portal settings. - private IPortalSettings curPortalSettings; + private IPortalSettingsV2 curPortalSettings; /// Initializes a new instance of the class. [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IUserController. Scheduled removal in v12.0.0.")] @@ -183,11 +183,11 @@ private void ClosePage() /// Gets the portal settings. /// The Portal Settings. - private IPortalSettings GetPortalSettings() + private IPortalSettingsV2 GetPortalSettings() { int iTabId = 0, iPortalId = 0; - IPortalSettings portalSettings; + IPortalSettingsV2 portalSettings; try { @@ -210,7 +210,7 @@ private IPortalSettings GetPortalSettings() } catch (Exception) { - portalSettings = (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; + portalSettings = (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; } return portalSettings; diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs index 0276e9ca082..c4d2a67feed 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs @@ -94,7 +94,7 @@ internal static bool CheckExistsModuleInstanceSettings(string moduleKey, int mod /// Returns the Filled Settings. /// internal static EditorProviderSettings LoadEditorSettingsByKey( - IPortalSettings portalSettings, + IPortalSettingsV2 portalSettings, EditorProviderSettings currentSettings, List editorHostSettings, string key, @@ -1001,7 +1001,7 @@ internal static EditorProviderSettings LoadEditorSettingsByKey( /// /// Returns the filled Module Settings. /// - internal static EditorProviderSettings LoadModuleSettings(IPortalSettings portalSettings, EditorProviderSettings currentSettings, string key, int moduleId, IList portalRoles) + internal static EditorProviderSettings LoadModuleSettings(IPortalSettingsV2 portalSettings, EditorProviderSettings currentSettings, string key, int moduleId, IList portalRoles) { Hashtable hshModSet = null; var module = ModuleController.Instance.GetModule(moduleId, Null.NullInteger, false); @@ -1516,7 +1516,7 @@ PropertyInfo info in /// The alternate Sub Folder. /// The portal roles. /// Returns the Default Provider Settings. - internal static EditorProviderSettings GetDefaultSettings(IPortalSettings portalSettings, IHostSettings hostSettings, string homeDirPath, string alternateSubFolder, IList portalRoles) + internal static EditorProviderSettings GetDefaultSettings(IPortalSettingsV2 portalSettings, IHostSettings hostSettings, string homeDirPath, string alternateSubFolder, IList portalRoles) { var roles = new ArrayList(); @@ -1850,7 +1850,7 @@ internal static partial void ImportSettingBaseXml(string homeDirPath, bool isDef /// The portal settings. /// The HTTP request. /// Returns the MAX. upload file size for the current user. - internal static int GetCurrentUserUploadSize(EditorProviderSettings settings, IPortalSettings portalSettings, HttpRequest httpRequest) + internal static int GetCurrentUserUploadSize(EditorProviderSettings settings, IPortalSettingsV2 portalSettings, HttpRequest httpRequest) { var uploadFileLimitForPortal = Convert.ToInt32(Utility.GetMaxUploadSize()); diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs index 826d6cdcddd..3e953c93c54 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs @@ -245,7 +245,7 @@ public static string ConvertUnicodeChars(string input) /// /// Returns if the user has write access to the folder. /// - public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettings portalSettings) + public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettingsV2 portalSettings) { return CheckIfUserHasFolderAccess(folderId, portalSettings, "WRITE"); } @@ -256,7 +256,7 @@ public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettings /// /// Returns if the user has write access to the folder. /// - public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettings portalSettings) + public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettingsV2 portalSettings) { return CheckIfUserHasFolderAccess(folderId, portalSettings, "READ"); } @@ -267,7 +267,7 @@ public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettings /// /// Returns the Folder Info. /// - public static IFolderInfo ConvertFilePathToFolderInfo(string folderPath, IPortalSettings portalSettings) + public static IFolderInfo ConvertFilePathToFolderInfo(string folderPath, IPortalSettingsV2 portalSettings) { if (!string.IsNullOrEmpty(portalSettings.HomeDirectoryMapPath) && folderPath.Length >= portalSettings.HomeDirectoryMapPath.Length) { @@ -348,7 +348,7 @@ public static void SortDescending(List source, Func /// if [is in roles] [the specified roles]; otherwise, . /// - public static bool IsInRoles(string roles, IPortalSettings settings) + public static bool IsInRoles(string roles, IPortalSettingsV2 settings) { var objUserInfo = UserController.Instance.GetCurrentUserInfo(); @@ -510,7 +510,7 @@ public static IFolderInfo EnsureGetFolder(int portalId, string folderPath) return null; } - private static bool CheckIfUserHasFolderAccess(int folderId, IPortalSettings portalSettings, string permissionKey) + private static bool CheckIfUserHasFolderAccess(int folderId, IPortalSettingsV2 portalSettings, string permissionKey) { try { diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs index 3049a665829..233e1688f67 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs @@ -383,7 +383,7 @@ public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlK var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); + var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettingsV2), controlKey, null); Assert.That(actual, Is.Not.Null); Assert.That(actual, Is.EqualTo(expected)); @@ -402,7 +402,7 @@ public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlK [TestCase(10, "My-Control-Key-10")] public void NavigateUrl_TabId_Settings_ControlKey(int tabId, string controlKey) { - var mockSettings = new Mock(); + var mockSettings = new Mock(); mockSettings .Setup(x => x.ContentLocalizationEnabled) .Returns(true); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs index dad48d210e0..6364cecd16c 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs @@ -48,7 +48,7 @@ public AdminLogsController(IEventLogger eventLogger) protected Dictionary LogTypeDictionary => this.logTypeDictionary = LogController.Instance.GetLogTypeInfoDictionary(); - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); public LogTypeInfo GetMyLogType(string logTypeKey) { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs index 2d0a4e52203..725bde616c4 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs @@ -285,7 +285,7 @@ private static bool IsValidTabPath(TabInfo tab, string newTabPath, out string er return valid; } - private int CreateTabFromParent(IPortalSettings portalSettings, TabInfo objRoot, TabInfo oTab, int parentId, bool validateOnly, out string errorMessage) + private int CreateTabFromParent(IPortalSettingsV2 portalSettings, TabInfo objRoot, TabInfo oTab, int parentId, bool validateOnly, out string errorMessage) { var tab = new TabInfo { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs index 13e7afc12c5..1caf60c14d3 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs @@ -42,7 +42,7 @@ public class CheckUserProfilePage : BaseCheck private readonly ITabController tabController; private readonly IPagesController pagesController; - private readonly Lazy portalSettings; + private readonly Lazy portalSettings; /// Initializes a new instance of the class. [Obsolete("Deprecated in DotNetNuke 10.0.0. Please use overload with IPagesController. Scheduled removal in v12.0.0.")] @@ -75,7 +75,7 @@ internal CheckUserProfilePage( throw new ArgumentNullException(nameof(portalController)); } - this.portalSettings = new Lazy(portalController.GetCurrentSettings); + this.portalSettings = new Lazy(portalController.GetCurrentSettings); } private int PortalId => this.portalSettings.Value.PortalId; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs index dea1a4e06f0..98dccaed5c5 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs @@ -29,7 +29,7 @@ namespace Dnn.PersonaBar.Security.Components public class SecurityController { - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] public IEnumerable GetAuthenticationProviders() diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs index 8c0ef863a56..de135db314c 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs @@ -50,7 +50,7 @@ public class SitesController [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] public string LocalResourcesFile => Path.Combine("~/DesktopModules/admin/Dnn.PersonaBar/Modules/Dnn.Sites/App_LocalResources/Sites.resx"); - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); private CultureDropDownTypes DisplayType { get; set; } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs index 57a39cc572a..7e6b115d0f6 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs @@ -82,7 +82,7 @@ public UserBasicDto(UserInfo user) [DataMember(Name = "isAdmin")] public bool IsAdmin { get; set; } - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); public static UserBasicDto FromUserInfo(UserInfo user) { diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs index 86dadc7972a..d9987655500 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs @@ -43,7 +43,7 @@ public class TabsController private static string AllUsersIcon => Globals.ResolveUrl("~/DesktopModules/Admin/Tabs/images/Icon_Everyone.png"); - private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); public TabDto GetPortalTabs(UserInfo userInfo, int portalId, string cultureCode, bool isMultiLanguage, bool excludeAdminTabs = true, string roles = "", bool disabledNotSelectable = false, int sortOrder = 0, int selectedTabId = -1, string validateTab = "", bool includeHostPages = false, bool includeDisabled = false, bool includeDeleted = false, bool includeDeletedChildren = true) { diff --git a/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs b/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs index 2578f504b0c..644a8c19d56 100644 --- a/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs +++ b/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs @@ -298,9 +298,9 @@ private static PagePermissions BuildPermissionsData(bool allUsersCanView) return permissionsData; } - private static Mock SetupPortalSettingsMock(int portalId, int userTabId) + private static Mock SetupPortalSettingsMock(int portalId, int userTabId) { - var mock = new Mock(); + var mock = new Mock(); mock.SetupGet(x => x.PortalId).Returns(portalId); mock.SetupGet(x => x.UserTabId).Returns(userTabId); return mock; From ddea5b15a5f91575f14cf6e72d90443261da5382 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 4 Jun 2026 11:27:22 +0200 Subject: [PATCH 013/109] Move method from interface to extension method --- .../Entities/Portals/IPortalSettingsController.cs | 2 -- .../Library/Entities/Portals/PortalSettingsController.cs | 6 ------ .../Library/Entities/Portals/PortalSettingsExtensions.cs | 9 +++++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs index 433ecd2f65c..1bfba00e3c1 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs @@ -15,8 +15,6 @@ public interface IPortalSettingsController PortalSettings.PortalAliasMapping GetPortalAliasMappingMode(int portalId); - PagePipeline.PortalRenderingPipeline GetPortalPagePipeline(int portalId); - /// The GetActiveTab method gets the active Tab for the current request. /// The current tab's id. /// The current PortalSettings. diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs index d58c304c0c0..b7902ad4709 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs @@ -127,12 +127,6 @@ public virtual PortalSettings.PortalAliasMapping GetPortalAliasMappingMode(int p return aliasMapping; } - /// - public virtual PagePipeline.PortalRenderingPipeline GetPortalPagePipeline(int portalId) - { - return PortalController.Instance.GetPortalSettings(portalId).GetPortalPipeline(PagePipeline.SettingName); - } - /// public virtual IList GetTabModules(PortalSettings portalSettings) { diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs index f3e8678583c..cd5e3d11859 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs @@ -1,8 +1,12 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information + namespace DotNetNuke.Entities.Portals { + using DotNetNuke.Abstractions.Framework; + using DotNetNuke.Framework; + public static class PortalSettingsExtensions { /// Detect whether current page is custom error page. @@ -13,5 +17,10 @@ public static bool InErrorPageRequest(this PortalSettings portalSettings) return portalSettings.ActiveTab.TabID == portalSettings.ErrorPage404 || portalSettings.ActiveTab.TabID == portalSettings.ErrorPage500; } + + public static PagePipeline.PortalRenderingPipeline GetPortalPagePipeline(this IPortalSettingsController portalSettingsController, int portalId) + { + return PortalController.Instance.GetPortalSettings(portalId).GetPortalPipeline(PagePipeline.SettingName); + } } } From e133c2ed3b1b4dad585ca04be652b53d06804879 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:14:20 +0000 Subject: [PATCH 014/109] Bump react-router in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router). Updates `react-router` from 7.13.1 to 7.15.0 - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router@7.15.0/packages/react-router) --- updated-dependencies: - dependency-name: react-router dependency-version: 7.15.0 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index dd84116d2b7..ea86b72495f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14102,8 +14102,8 @@ __metadata: linkType: hard "react-router@npm:^7.13.1": - version: 7.13.1 - resolution: "react-router@npm:7.13.1" + version: 7.16.0 + resolution: "react-router@npm:7.16.0" dependencies: cookie: "npm:^1.0.1" set-cookie-parser: "npm:^2.6.0" @@ -14113,7 +14113,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: 10/da3c9f52ccb968647090013f735b8506b5f6a0290a43259d78e9ef6a664715978b6de90417e56b18717ce4ffc306e02826f0418e046aae22936a6f8cf386bc79 + checksum: 10/2c77d27170eab1dfa6f0593e846f9d352424cc789a505aaee9bee9c9da1ed9d6a044d0a476e3eaf240e73b09169b4ffb85b5910d026a34abd055aed5b2f5a5cb languageName: node linkType: hard From c6176cda57f24d93e9ccd64b895fcf47041bc5d7 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:24:40 -0500 Subject: [PATCH 015/109] Misc clean up Rename *DTO objects to *Request Use file-scoped namespaces Add docs And much more! --- .../Dnn.Modules.Console.csproj | 4 + .../Dnn.Modules.Console/ViewConsole.ascx | 2 +- .../Dnn.Modules.Console/ViewConsole.ascx.cs | 835 +++--- .../ViewConsole.ascx.designer.cs | 46 +- .../ContentWorkflowServiceController.cs | 377 +-- .../InternalServices/ControlBarController.cs | 1571 +++++----- .../CountryRegionController.cs | 127 +- .../EventLogServiceController.cs | 139 +- .../InternalServices/FileUploadController.cs | 1333 +++++---- .../InternalServices/ImageHeader.cs | 271 +- .../ItemListServiceController.cs | 2571 ++++++++--------- .../LanguageServiceController.cs | 149 +- .../MessagingServiceController.cs | 327 ++- .../ModuleServiceController.cs | 275 +- .../NewUserNotificationServiceController.cs | 273 +- .../InternalServices/NotificationDto.cs | 13 - .../InternalServices/NotificationRequest.cs | 12 + .../NotificationsServiceController.cs | 105 +- .../Obsolete/NotificationDto.cs | 25 + .../Obsolete/PublishPageDto.cs | 25 + .../InternalServices/PageServiceController.cs | 310 +- .../ProfileServiceController.cs | 269 +- .../InternalServices/PublishPageDto.cs | 13 - .../InternalServices/PublishPageRequest.cs | 12 + .../RelationshipServiceController.cs | 240 +- .../SearchServiceController.cs | 1211 ++++---- .../InternalServices/ServiceRouteMapper.cs | 29 +- .../InternalServices/UserFileController.cs | 267 +- .../Permissions/PermissionProvider.cs | 13 +- .../Components/Pages/XssCleaner.cs | 129 +- .../Components/Themes/ThemesController.cs | 1058 +++---- .../Services/PagesController.cs | 2316 +++++++-------- .../DTO/Tabs/LocaleInfoDto.cs | 2 +- 33 files changed, 7305 insertions(+), 7044 deletions(-) delete mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/NotificationDto.cs create mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/NotificationRequest.cs create mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/NotificationDto.cs create mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/PublishPageDto.cs delete mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/PublishPageDto.cs create mode 100644 DNN Platform/DotNetNuke.Web/InternalServices/PublishPageRequest.cs diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/Dnn.Modules.Console.csproj b/DNN Platform/Admin Modules/Dnn.Modules.Console/Dnn.Modules.Console.csproj index 41469d8c0f6..f06ced21a49 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/Dnn.Modules.Console.csproj +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/Dnn.Modules.Console.csproj @@ -103,6 +103,10 @@ + + {5FE5D021-9C8D-47A6-BD34-F328BA3E709C} + DotNetNuke.Internal.SourceGenerators + {6928A9B1-F88A-4581-A132-D3EB38669BB0} DotNetNuke.Abstractions diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx index 246d8ba5146..823ae81e4a7 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx @@ -2,7 +2,7 @@ <%@ Register TagPrefix="dnn" Namespace="DotNetNuke.Web.UI.WebControls" Assembly="DotNetNuke.Web" %> diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.cs b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.cs index c72da3ae90b..35cf886a1a1 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.cs +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.cs @@ -1,539 +1,566 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace Dnn.Modules.Console +namespace Dnn.Modules.Console; + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Web; +using System.Web.UI.WebControls; + +using Dnn.Modules.Console.Components; +using DotNetNuke.Abstractions; +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.ClientResources; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Modules; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Users; +using DotNetNuke.Framework.JavaScriptLibraries; +using DotNetNuke.Instrumentation; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Security.Permissions; +using DotNetNuke.Security.Roles; +using DotNetNuke.Services.ClientDependency; +using DotNetNuke.Services.Exceptions; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.Personalization; +using Microsoft.Extensions.DependencyInjection; + +/// Implements the module view logic. +public partial class ViewConsole : PortalModuleBase { - using System; - using System.Collections.Generic; - using System.Globalization; - using System.IO; - using System.Linq; - using System.Text; - using System.Web; - using System.Web.UI.WebControls; - - using Dnn.Modules.Console.Components; - using DotNetNuke.Abstractions; - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.ClientResources; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Framework.JavaScriptLibraries; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Security.Roles; - using DotNetNuke.Services.ClientDependency; - using DotNetNuke.Services.Exceptions; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Personalization; - using Microsoft.Extensions.DependencyInjection; - - /// Implements the module view logic. - public partial class ViewConsole : PortalModuleBase + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ViewConsole)); + private readonly INavigationManager navigationManager; + private readonly IJavaScriptLibraryHelper javaScript; + private readonly IClientResourceController clientResourceController; + private readonly IHostSettings hostSettings; + + private string defaultSize = string.Empty; + private string defaultView = string.Empty; + private int groupTabId = -1; + private IList tabs; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ViewConsole() + : this(null, null, null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ViewConsole)); - private readonly INavigationManager navigationManager; - private readonly IJavaScriptLibraryHelper javaScript; - private readonly IClientResourceController clientResourceController; - private readonly IHostSettings hostSettings; - - private string defaultSize = string.Empty; - private string defaultView = string.Empty; - private int groupTabId = -1; - private IList tabs; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ViewConsole() - : this(null, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The navigation manager. - /// The JavaScript library helper. - /// The client resources controller. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ViewConsole(INavigationManager navigationManager, IJavaScriptLibraryHelper javaScript, IClientResourceController clientResourceController) - : this(navigationManager, javaScript, clientResourceController, null) - { - } + /// Initializes a new instance of the class. + /// The navigation manager. + /// The JavaScript library helper. + /// The client resources controller. + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ViewConsole(INavigationManager navigationManager, IJavaScriptLibraryHelper javaScript, IClientResourceController clientResourceController) + : this(navigationManager, javaScript, clientResourceController, null) + { + } - /// Initializes a new instance of the class. - /// The navigation manager. - /// The JavaScript library helper. - /// The client resources controller. - /// The host settings. - public ViewConsole(INavigationManager navigationManager, IJavaScriptLibraryHelper javaScript, IClientResourceController clientResourceController, IHostSettings hostSettings) - { - this.navigationManager = navigationManager ?? this.DependencyProvider.GetRequiredService(); - this.javaScript = javaScript ?? this.DependencyProvider.GetRequiredService(); - this.clientResourceController = clientResourceController ?? this.DependencyProvider.GetRequiredService(); - this.hostSettings = hostSettings ?? this.DependencyProvider.GetRequiredService(); - } + /// Initializes a new instance of the class. + /// The navigation manager. + /// The JavaScript library helper. + /// The client resources controller. + /// The host settings. + public ViewConsole(INavigationManager navigationManager, IJavaScriptLibraryHelper javaScript, IClientResourceController clientResourceController, IHostSettings hostSettings) + { + this.navigationManager = navigationManager ?? this.DependencyProvider.GetRequiredService(); + this.javaScript = javaScript ?? this.DependencyProvider.GetRequiredService(); + this.clientResourceController = clientResourceController ?? this.DependencyProvider.GetRequiredService(); + this.hostSettings = hostSettings ?? this.DependencyProvider.GetRequiredService(); + } - /// Gets a value indicating whether the module settings allow size change. - public bool AllowSizeChange => !this.Settings.ContainsKey("AllowSizeChange") || bool.Parse(this.Settings["AllowSizeChange"].ToString()); + /// Gets a value indicating whether the module settings allow size change. + public bool AllowSizeChange => !this.Settings.ContainsKey("AllowSizeChange") || bool.Parse(this.Settings["AllowSizeChange"].ToString()); - /// Gets a value indicating whether the module settings allow to change view. - public bool AllowViewChange => !this.Settings.ContainsKey("AllowViewChange") || bool.Parse(this.Settings["AllowViewChange"].ToString()); + /// Gets a value indicating whether the module settings allow to change view. + public bool AllowViewChange => !this.Settings.ContainsKey("AllowViewChange") || bool.Parse(this.Settings["AllowViewChange"].ToString()); - /// Gets a value indicating whether the module settings indicate to include hidden pages. - public bool IncludeHiddenPages => this.Settings.ContainsKey("IncludeHiddenPages") && bool.Parse(this.Settings["IncludeHiddenPages"].ToString()); + /// Gets a value indicating whether the module settings indicate to include hidden pages. + public bool IncludeHiddenPages => this.Settings.ContainsKey("IncludeHiddenPages") && bool.Parse(this.Settings["IncludeHiddenPages"].ToString()); - /// Gets the id of the page (tab) for the root node of the console display. - public int ConsoleTabID => - (this.Mode == "Profile") - ? this.PortalSettings.UserTabId - : (this.Settings.ContainsKey("ParentTabID") - ? int.Parse(this.Settings["ParentTabID"].ToString()) - : this.TabId); + /// Gets the id of the page (tab) for the root node of the console display. + public int ConsoleTabID => + (this.Mode == "Profile") + ? this.PortalSettings.UserTabId + : (this.Settings.ContainsKey("ParentTabID") + ? int.Parse(this.Settings["ParentTabID"].ToString()) + : this.TabId); - /// Gets the configured console width or an empty string if not specified in the settings. - public string ConsoleWidth => this.Settings.ContainsKey("ConsoleWidth") ? this.Settings["ConsoleWidth"].ToString() : string.Empty; + /// Gets the configured console width or an empty string if not specified in the settings. + public string ConsoleWidth => this.Settings.ContainsKey("ConsoleWidth") ? this.Settings["ConsoleWidth"].ToString() : string.Empty; - /// Gets the default size for the console icons. - public string DefaultSize + /// Gets the default size for the console icons. + public string DefaultSize + { + get { - get + if (this.defaultSize == string.Empty && this.AllowSizeChange && this.UserId > Null.NullInteger) { - if (this.defaultSize == string.Empty && this.AllowSizeChange && this.UserId > Null.NullInteger) + object personalizedValue = this.GetUserSetting("DefaultSize"); + if (personalizedValue != null) { - object personalizedValue = this.GetUserSetting("DefaultSize"); - if (personalizedValue != null) - { - this.defaultSize = Convert.ToString(personalizedValue); - } - } - - if (this.defaultSize == string.Empty) - { - this.defaultSize = this.Settings.ContainsKey("DefaultSize") ? Convert.ToString(this.Settings["DefaultSize"]) : "IconFile"; + this.defaultSize = Convert.ToString(personalizedValue); } + } - return this.defaultSize; + if (this.defaultSize == string.Empty) + { + this.defaultSize = this.Settings.ContainsKey("DefaultSize") ? Convert.ToString(this.Settings["DefaultSize"]) : "IconFile"; } + + return this.defaultSize; } + } - /// Gets the default view module for the console. - public string DefaultView + /// Gets the default view module for the console. + public string DefaultView + { + get { - get + if (this.defaultView == string.Empty && this.AllowViewChange && this.UserId > Null.NullInteger) { - if (this.defaultView == string.Empty && this.AllowViewChange && this.UserId > Null.NullInteger) + object personalizedValue = this.GetUserSetting("DefaultView"); + if (personalizedValue != null) { - object personalizedValue = this.GetUserSetting("DefaultView"); - if (personalizedValue != null) - { - this.defaultView = Convert.ToString(personalizedValue); - } - } - - if (this.defaultView == string.Empty) - { - this.defaultView = this.Settings.ContainsKey("DefaultView") ? Convert.ToString(this.Settings["DefaultView"]) : "Hide"; + this.defaultView = Convert.ToString(personalizedValue); } + } - return this.defaultView; + if (this.defaultView == string.Empty) + { + this.defaultView = this.Settings.ContainsKey("DefaultView") ? Convert.ToString(this.Settings["DefaultView"]) : "Hide"; } + + return this.defaultView; } + } - /// Gets the group id, if not displayed in a group, will return . - public int GroupId + /// Gets the group id, if not displayed in a group, will return . + public int GroupId + { + get { - get + var groupId = Null.NullInteger; + if (!string.IsNullOrEmpty(this.Request.Params["GroupId"])) { - var groupId = Null.NullInteger; - if (!string.IsNullOrEmpty(this.Request.Params["GroupId"])) - { - groupId = int.Parse(this.Request.Params["GroupId"]); - } - - return groupId; + groupId = int.Parse(this.Request.Params["GroupId"]); } + + return groupId; } + } - /// Gets a value indicating whether the parent should be shown. - public bool IncludeParent => (this.Mode == "Profile") || (this.Settings.ContainsKey("IncludeParent") && bool.Parse(this.Settings["IncludeParent"].ToString())); + /// Gets a value indicating whether the parent should be shown. + public bool IncludeParent => (this.Mode == "Profile") || (this.Settings.ContainsKey("IncludeParent") && bool.Parse(this.Settings["IncludeParent"].ToString())); - /// Gets the module display mode. - public string Mode => this.Settings.ContainsKey("Mode") ? this.Settings["Mode"].ToString() : "Normal"; + /// Gets the module display mode. + public string Mode => this.Settings.ContainsKey("Mode") ? this.Settings["Mode"].ToString() : "Normal"; - /// Gets the id of the user when used in a user profile page, if not used on a user profile returns . - public int ProfileUserId + /// Gets the id of the user when used in a user profile page, if not used on a user profile returns . + public int ProfileUserId + { + get { - get + var userId = Null.NullInteger; + if (!string.IsNullOrEmpty(this.Request.Params["UserId"])) { - var userId = Null.NullInteger; - if (!string.IsNullOrEmpty(this.Request.Params["UserId"])) - { - userId = int.Parse(this.Request.Params["UserId"]); - } - - return userId; + userId = int.Parse(this.Request.Params["UserId"]); } + + return userId; } + } - /// Gets a value indicating whether the tooltips should be shown. - public bool ShowTooltip => !this.Settings.ContainsKey("ShowTooltip") || bool.Parse(this.Settings["ShowTooltip"].ToString()); + /// Gets a value indicating whether the tooltips should be shown. + public bool ShowTooltip => !this.Settings.ContainsKey("ShowTooltip") || bool.Parse(this.Settings["ShowTooltip"].ToString()); - /// Gets a value indicating whether the pages (tabs) should by ordered by their hierarchy. - public bool OrderTabsByHierarchy => this.Settings.ContainsKey("OrderTabsByHierarchy") && bool.Parse(this.Settings["OrderTabsByHierarchy"].ToString()); + /// Gets a value indicating whether the pages (tabs) should by ordered by their hierarchy. + public bool OrderTabsByHierarchy => this.Settings.ContainsKey("OrderTabsByHierarchy") && bool.Parse(this.Settings["OrderTabsByHierarchy"].ToString()); - /// - protected override void OnInit(EventArgs e) - { - base.OnInit(e); + /// + protected override void OnInit(EventArgs e) + { + base.OnInit(e); - try - { - this.javaScript.RequestRegistration(CommonJs.jQuery); + try + { + this.javaScript.RequestRegistration(CommonJs.jQuery); - this.clientResourceController.RegisterScript("~/desktopmodules/admin/console/scripts/jquery.console.js"); + this.clientResourceController.RegisterScript("~/desktopmodules/admin/console/scripts/jquery.console.js"); - this.DetailView.ItemDataBound += this.RepeaterItemDataBound; + this.DetailView.ItemDataBound += this.RepeaterItemDataBound; - // Save User Preferences - this.SavePersonalizedSettings(); - } - catch (Exception exc) - { - Exceptions.ProcessModuleLoadException(this, exc); - } + // Save User Preferences + this.SavePersonalizedSettings(); + } + catch (Exception exc) + { + Exceptions.ProcessModuleLoadException(this, exc); } + } - /// - protected override void OnLoad(EventArgs e) + /// + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + try { - base.OnLoad(e); - try - { - this.IconSize.Visible = this.AllowSizeChange; - this.View.Visible = this.AllowViewChange; + this.IconSize.Visible = this.AllowSizeChange; + this.View.Visible = this.AllowViewChange; - foreach (string val in ConsoleController.GetSizeValues()) - { - this.IconSize.Items.Add(new ListItem(Localization.GetString(val + ".Text", this.LocalResourceFile), val)); - } + foreach (string val in ConsoleController.GetSizeValues()) + { + this.IconSize.Items.Add(new ListItem(Localization.GetString(val + ".Text", this.LocalResourceFile), val)); + } - foreach (string val in ConsoleController.GetViewValues()) - { - this.View.Items.Add(new ListItem(Localization.GetString(val + ".Text", this.LocalResourceFile), val)); - } + foreach (string val in ConsoleController.GetViewValues()) + { + this.View.Items.Add(new ListItem(Localization.GetString(val + ".Text", this.LocalResourceFile), val)); + } - this.IconSize.SelectedValue = this.DefaultSize; - this.View.SelectedValue = this.DefaultView; + this.IconSize.SelectedValue = this.DefaultSize; + this.View.SelectedValue = this.DefaultView; - if (!this.IsPostBack) - { - this.Console.Attributes["class"] = this.Console.Attributes["class"] + " " + this.Mode.ToLower(CultureInfo.InvariantCulture); + if (!this.IsPostBack) + { + this.Console.Attributes["class"] = this.Console.Attributes["class"] + " " + this.Mode.ToLower(CultureInfo.InvariantCulture); - this.SettingsBreak.Visible = this.AllowSizeChange && this.AllowViewChange; + this.SettingsBreak.Visible = this.AllowSizeChange && this.AllowViewChange; - List tempTabs = this.IsHostTab() - ? TabController.GetTabsBySortOrder(Null.NullInteger).OrderBy(t => t.Level).ThenBy(t => t.LocalizedTabName).ToList() - : TabController.GetTabsBySortOrder(this.PortalId).OrderBy(t => t.Level).ThenBy(t => t.LocalizedTabName).ToList(); + List tempTabs = this.IsHostTab() + ? TabController.GetTabsBySortOrder(Null.NullInteger).OrderBy(t => t.Level).ThenBy(t => t.LocalizedTabName).ToList() + : TabController.GetTabsBySortOrder(this.PortalId).OrderBy(t => t.Level).ThenBy(t => t.LocalizedTabName).ToList(); - this.tabs = new List(); + this.tabs = new List(); - IList tabIdList = new List(); - tabIdList.Add(this.ConsoleTabID); + IList tabIdList = new List(); + tabIdList.Add(this.ConsoleTabID); - if (this.IncludeParent) + if (this.IncludeParent) + { + TabInfo consoleTab = TabController.Instance.GetTab(this.ConsoleTabID, this.PortalId); + if (consoleTab != null) { - TabInfo consoleTab = TabController.Instance.GetTab(this.ConsoleTabID, this.PortalId); - if (consoleTab != null) - { - this.tabs.Add(consoleTab); - } + this.tabs.Add(consoleTab); } + } - foreach (TabInfo tab in tempTabs) + foreach (TabInfo tab in tempTabs) + { + if (!this.CanShowTab(tab)) { - if (!this.CanShowTab(tab)) - { - continue; - } - - if (tabIdList.Contains(tab.ParentId)) - { - if (!tabIdList.Contains(tab.TabID)) - { - tabIdList.Add(tab.TabID); - } - - this.tabs.Add(tab); - } + continue; } - // if OrderTabsByHierarchy set to true, we need reorder the tab list to move tabs which have child tabs to the end of list. - // so that the list display in UI can show tabs in same level in same area, and not break by child tabs. - if (this.OrderTabsByHierarchy) + if (tabIdList.Contains(tab.ParentId)) { - this.tabs = this.tabs.OrderBy(t => t.HasChildren).ToList(); - } + if (!tabIdList.Contains(tab.TabID)) + { + tabIdList.Add(tab.TabID); + } - int minLevel = -1; - if (this.tabs.Count > 0) - { - minLevel = this.tabs.Min(t => t.Level); + this.tabs.Add(tab); } + } - this.DetailView.DataSource = (minLevel > -1) ? this.tabs.Where(t => t.Level == minLevel) : this.tabs; - this.DetailView.DataBind(); + // if OrderTabsByHierarchy set to true, we need reorder the tab list to move tabs which have child tabs to the end of list. + // so that the list display in UI can show tabs in same level in same area, and not break by child tabs. + if (this.OrderTabsByHierarchy) + { + this.tabs = this.tabs.OrderBy(t => t.HasChildren).ToList(); } - if (this.ConsoleWidth != string.Empty) + int minLevel = -1; + if (this.tabs.Count > 0) { - this.Console.Attributes.Add("style", "width:" + this.ConsoleWidth); + minLevel = this.tabs.Min(t => t.Level); } + + this.DetailView.DataSource = (minLevel > -1) ? this.tabs.Where(t => t.Level == minLevel) : this.tabs; + this.DetailView.DataBind(); } - catch (Exception exc) + + if (this.ConsoleWidth != string.Empty) { - Exceptions.ProcessModuleLoadException(this, exc); + this.Console.Attributes.Add("style", $"width:{this.ConsoleWidth}"); } } + catch (Exception exc) + { + Exceptions.ProcessModuleLoadException(this, exc); + } + } - /// Gets the HTML rendering of the console view according to the module settings. - /// The root page to render the console from, . - /// A string containing the rendered HTML. - protected string GetHtml(TabInfo tab) + /// Gets the HTML rendering of the console view according to the module settings. + /// The root page to render the console from, . + /// A string containing the rendered HTML. + protected string GetHtml(TabInfo tab) + { + string returnValue = string.Empty; + if (this.groupTabId > -1 && this.groupTabId != tab.ParentId) { - string returnValue = string.Empty; - if (this.groupTabId > -1 && this.groupTabId != tab.ParentId) + this.groupTabId = -1; + if (!tab.DisableLink) { - this.groupTabId = -1; - if (!tab.DisableLink) - { - returnValue = "

"; - } + returnValue = "

"; } + } - if (tab.DisableLink) + if (tab.DisableLink) + { + returnValue += $"

{WebUtility.HtmlEncode(tab.TabName)}


"; + this.groupTabId = tab.TabID; + } + else + { + var sb = new StringBuilder(); + sb.Append( + tab.TabID == this.PortalSettings.ActiveTab.TabID + ? "
" + : "
"); + + sb.Append(""); + + if (this.DefaultSize != "IconNone" || this.AllowSizeChange || this.AllowViewChange) { - const string headerHtml = "

{0}


"; - returnValue += string.Format(headerHtml, tab.TabName); - this.groupTabId = tab.TabID; + sb.Append("\"{3}\""); + sb.Append("\"{3}\""); } - else - { - var sb = new StringBuilder(); - if (tab.TabID == this.PortalSettings.ActiveTab.TabID) - { - sb.Append("
"); - } - else - { - sb.Append("
"); - } - sb.Append(""); + sb.Append(""); + sb.Append("

{3}

"); + sb.Append("
{4}
"); + sb.Append("
"); - if (this.DefaultSize != "IconNone" || (this.AllowSizeChange || this.AllowViewChange)) - { - sb.Append("\"{3}\""); - sb.Append("\"{3}\""); - } + ////const string contentHtml = "
" + "\"{3}\"\"{3}\"" + "

{3}

" + "
{4}
" + "
"; + var tabUrl = tab.FullUrl; + if (this.ProfileUserId > -1) + { + tabUrl = this.navigationManager.NavigateURL(tab.TabID, string.Empty, "UserId=" + this.ProfileUserId.ToString(CultureInfo.InvariantCulture)); + } - sb.Append(""); - sb.Append("

{3}

"); - sb.Append("
{4}
"); - sb.Append("
"); + if (this.GroupId > -1) + { + tabUrl = this.navigationManager.NavigateURL(tab.TabID, string.Empty, "GroupId=" + this.GroupId.ToString(CultureInfo.InvariantCulture)); + } - ////const string contentHtml = "
" + "\"{3}\"\"{3}\"" + "

{3}

" + "
{4}
" + "
"; - var tabUrl = tab.FullUrl; - if (this.ProfileUserId > -1) - { - tabUrl = this.navigationManager.NavigateURL(tab.TabID, string.Empty, "UserId=" + this.ProfileUserId.ToString(CultureInfo.InvariantCulture)); - } + returnValue += string.Format( + sb.ToString(), + tabUrl, + this.GetIconUrl(tab.IconFile, "IconFile"), + this.GetIconUrl(tab.IconFileLarge, "IconFileLarge"), + WebUtility.HtmlEncode(tab.LocalizedTabName), + WebUtility.HtmlEncode(tab.Description)); + } - if (this.GroupId > -1) - { - tabUrl = this.navigationManager.NavigateURL(tab.TabID, string.Empty, "GroupId=" + this.GroupId.ToString(CultureInfo.InvariantCulture)); - } + return returnValue; + } - returnValue += string.Format( - sb.ToString(), - tabUrl, - this.GetIconUrl(tab.IconFile, "IconFile"), - this.GetIconUrl(tab.IconFileLarge, "IconFileLarge"), - tab.LocalizedTabName, - tab.Description); - } + /// Gets the client side settings for the module. + /// A settings string ready to use by the .dnnConsole jQuery plugin. + [DnnDeprecated(10, 3, 3, "Use GetClientSideSettingsObject")] + protected partial string GetClientSideSettings() + { + string tabModuleId = "-1"; + if (this.UserId > -1) + { + tabModuleId = this.TabModuleId.ToString(CultureInfo.InvariantCulture); + } + + return string.Format( + "allowIconSizeChange: {0}, allowDetailChange: {1}, selectedSize: '{2}', showDetails: '{3}', tabModuleID: {4}, showTooltip: {5}", + this.AllowSizeChange.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), + this.AllowViewChange.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), + HttpUtility.JavaScriptStringEncode(this.DefaultSize), + HttpUtility.JavaScriptStringEncode(this.DefaultView), + tabModuleId, + this.ShowTooltip.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); + } - return returnValue; + /// Gets the client side settings for the module. + /// A JSON object with settings for the .dnnConsole jQuery plugin. + protected IHtmlString GetClientSideSettingsObject() + { + var tabModuleId = -1; + if (this.UserId > -1) + { + tabModuleId = this.TabModuleId; } - /// Gets the client side settings for the module. - /// - /// A settings string ready to use by the .dnnConsole jQuery plugin. - /// - protected string GetClientSideSettings() + var json = new { - string tabModuleId = "-1"; - if (this.UserId > -1) - { - tabModuleId = this.TabModuleId.ToString(CultureInfo.InvariantCulture); - } + allowIconSizeChange = this.AllowSizeChange, + allowDetailChange = this.AllowViewChange, + selectedSize = this.DefaultSize, + showDetails = this.DefaultView, + tabModuleID = tabModuleId, + showTooltip = this.ShowTooltip, + }.ToJson(); + return new HtmlString(json); + } - return string.Format( - "allowIconSizeChange: {0}, allowDetailChange: {1}, selectedSize: '{2}', showDetails: '{3}', tabModuleID: {4}, showTooltip: {5}", - this.AllowSizeChange.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), - this.AllowViewChange.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), - HttpUtility.JavaScriptStringEncode(this.DefaultSize), - HttpUtility.JavaScriptStringEncode(this.DefaultView), - tabModuleId, - this.ShowTooltip.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); + private bool CanShowTab(TabInfo tab) + { + var canShowTab = TabPermissionController.CanViewPage(tab) && + !tab.IsDeleted && + (this.IncludeHiddenPages || tab.IsVisible) && + (tab.StartDate < DateTime.Now || tab.StartDate == Null.NullDate); + + if (!canShowTab) + { + return false; } - private bool CanShowTab(TabInfo tab) + var key = $"TabVisibility{tab.TabPath.Replace("//", "-")}"; + var visibility = this.Settings.ContainsKey(key) ? this.Settings[key].ToString() : "AllUsers"; + + switch (visibility) { - bool canShowTab = TabPermissionController.CanViewPage(tab) && - !tab.IsDeleted && - (this.IncludeHiddenPages || tab.IsVisible) && - (tab.StartDate < DateTime.Now || tab.StartDate == Null.NullDate); + case "Owner": + canShowTab = this.UserInfo.Social.Roles.SingleOrDefault(ur => ur.RoleID == this.GroupId && ur.IsOwner) != null; + break; + case "Members": + var group = RoleController.Instance.GetRole(this.PortalId, r => r.RoleID == this.GroupId); + canShowTab = (group != null) && this.UserInfo.IsInRole(group.RoleName); + break; + case "Friends": + var profileUser = UserController.GetUserById(this.hostSettings, this.PortalId, this.ProfileUserId); + canShowTab = profileUser?.Social.Friend != null || this.UserId == this.ProfileUserId; + break; + case "User": + canShowTab = this.UserId == this.ProfileUserId; + break; + case "AllUsers": + break; + } - if (canShowTab) - { - var key = $"TabVisibility{tab.TabPath.Replace("//", "-")}"; - var visibility = this.Settings.ContainsKey(key) ? this.Settings[key].ToString() : "AllUsers"; + return canShowTab; + } - switch (visibility) - { - case "Owner": - canShowTab = this.UserInfo.Social.Roles.SingleOrDefault(ur => ur.RoleID == this.GroupId && ur.IsOwner) != null; - break; - case "Members": - var group = RoleController.Instance.GetRole(this.PortalId, r => r.RoleID == this.GroupId); - canShowTab = (group != null) && this.UserInfo.IsInRole(group.RoleName); - break; - case "Friends": - var profileUser = UserController.GetUserById(this.hostSettings, this.PortalId, this.ProfileUserId); - canShowTab = profileUser?.Social.Friend != null || this.UserId == this.ProfileUserId; - break; - case "User": - canShowTab = this.UserId == this.ProfileUserId; - break; - case "AllUsers": - break; - } - } + private string GetIconUrl(string iconURL, string size) + { + if (string.IsNullOrEmpty(iconURL)) + { + iconURL = size == "IconFile" + ? "~/images/icon_unknown_16px.gif" + : "~/images/icon_unknown_32px.gif"; + } - return canShowTab; + if (!iconURL.Contains("~", StringComparison.Ordinal)) + { + iconURL = Path.Combine(this.PortalSettings.HomeDirectory, iconURL); } - private string GetIconUrl(string iconURL, string size) + return this.ResolveUrl(iconURL); + } + + private object GetUserSetting(string key) + { + return Personalization.GetProfile(this.ModuleConfiguration.ModuleDefinition.FriendlyName, this.PersonalizationKey(key)); + } + + private bool IsHostTab() + { + var returnValue = false; + if (this.ConsoleTabID != this.TabId) { - if (string.IsNullOrEmpty(iconURL)) + if (this.UserInfo is not { IsSuperUser: true, }) { - iconURL = (size == "IconFile") ? "~/images/icon_unknown_16px.gif" : "~/images/icon_unknown_32px.gif"; + return false; } - if (iconURL.Contains("~") == false) + var hostTabs = TabController.Instance.GetTabsByPortal(Null.NullInteger); + if (hostTabs.Keys.Any(key => key == this.ConsoleTabID)) { - iconURL = Path.Combine(this.PortalSettings.HomeDirectory, iconURL); + returnValue = true; } - - return this.ResolveUrl(iconURL); } + else + { + returnValue = this.PortalSettings.ActiveTab.IsSuperTab; + } + + return returnValue; + } + + private string PersonalizationKey(string key) + { + return $"{this.PortalId}_{this.TabModuleId}_{key}"; + } - private object GetUserSetting(string key) + private void SavePersonalizedSettings() + { + if (this.UserId <= -1) { - return Personalization.GetProfile(this.ModuleConfiguration.ModuleDefinition.FriendlyName, this.PersonalizationKey(key)); + return; } - private bool IsHostTab() + var consoleModuleId = -1; + try { - var returnValue = false; - if (this.ConsoleTabID != this.TabId) - { - if (this.UserInfo != null && this.UserInfo.IsSuperUser) - { - var hostTabs = TabController.Instance.GetTabsByPortal(Null.NullInteger); - if (hostTabs.Keys.Any(key => key == this.ConsoleTabID)) - { - returnValue = true; - } - } - } - else + if (this.Request.QueryString["CTMID"] != null) { - returnValue = this.PortalSettings.ActiveTab.IsSuperTab; + consoleModuleId = Convert.ToInt32(this.Request.QueryString["CTMID"]); } + } + catch (Exception exc) + { + Logger.Error(exc); - return returnValue; + consoleModuleId = -1; } - private string PersonalizationKey(string key) + if (consoleModuleId != this.TabModuleId) { - return string.Format("{0}_{1}_{2}", this.PortalId, this.TabModuleId, key); + return; } - private void SavePersonalizedSettings() + var consoleSize = string.Empty; + if (this.Request.QueryString["CS"] != null) { - if (this.UserId > -1) - { - int consoleModuleID = -1; - try - { - if (this.Request.QueryString["CTMID"] != null) - { - consoleModuleID = Convert.ToInt32(this.Request.QueryString["CTMID"]); - } - } - catch (Exception exc) - { - Logger.Error(exc); - - consoleModuleID = -1; - } - - if (consoleModuleID == this.TabModuleId) - { - string consoleSize = string.Empty; - if (this.Request.QueryString["CS"] != null) - { - consoleSize = this.Request.QueryString["CS"]; - } - - string consoleView = string.Empty; - if (this.Request.QueryString["CV"] != null) - { - consoleView = this.Request.QueryString["CV"]; - } + consoleSize = this.Request.QueryString["CS"]; + } - if (consoleSize != string.Empty && ConsoleController.GetSizeValues().Contains(consoleSize)) - { - this.SaveUserSetting("DefaultSize", consoleSize); - } + var consoleView = string.Empty; + if (this.Request.QueryString["CV"] != null) + { + consoleView = this.Request.QueryString["CV"]; + } - if (consoleView != string.Empty && ConsoleController.GetViewValues().Contains(consoleView)) - { - this.SaveUserSetting("DefaultView", consoleView); - } - } - } + if (consoleSize != string.Empty && ConsoleController.GetSizeValues().Contains(consoleSize)) + { + this.SaveUserSetting("DefaultSize", consoleSize); } - private void SaveUserSetting(string key, object val) + if (consoleView != string.Empty && ConsoleController.GetViewValues().Contains(consoleView)) { - Personalization.SetProfile(this.ModuleConfiguration.ModuleDefinition.FriendlyName, this.PersonalizationKey(key), val); + this.SaveUserSetting("DefaultView", consoleView); } + } - private void RepeaterItemDataBound(object sender, RepeaterItemEventArgs e) + private void SaveUserSetting(string key, object val) + { + Personalization.SetProfile(this.ModuleConfiguration.ModuleDefinition.FriendlyName, this.PersonalizationKey(key), val); + } + + private void RepeaterItemDataBound(object sender, RepeaterItemEventArgs e) + { + var tab = (TabInfo)e.Item.DataItem; + e.Item.Controls.Add(new Literal() { Text = this.GetHtml(tab) }); + if (this.tabs.Any(t => t.ParentId == tab.TabID)) { - var tab = (TabInfo)e.Item.DataItem; - e.Item.Controls.Add(new Literal() { Text = this.GetHtml(tab) }); - if (this.tabs.Any(t => t.ParentId == tab.TabID)) - { - var repeater = new Repeater(); - repeater.ItemDataBound += this.RepeaterItemDataBound; - e.Item.Controls.Add(repeater); - repeater.DataSource = this.tabs.Where(t => t.ParentId == tab.TabID); - repeater.DataBind(); - } + var repeater = new Repeater(); + repeater.ItemDataBound += this.RepeaterItemDataBound; + e.Item.Controls.Add(repeater); + repeater.DataSource = this.tabs.Where(t => t.ParentId == tab.TabID); + repeater.DataBind(); } } } diff --git a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.designer.cs b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.designer.cs index 288b42a9292..f1ad10d01f4 100644 --- a/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.designer.cs +++ b/DNN Platform/Admin Modules/Dnn.Modules.Console/ViewConsole.ascx.designer.cs @@ -1,8 +1,4 @@ -// -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See LICENSE file in the project root for full license information. -// -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // @@ -11,40 +7,52 @@ // //------------------------------------------------------------------------------ -namespace Dnn.Modules.Console { - - - public partial class ViewConsole { - - /// Console control. +namespace Dnn.Modules.Console +{ + + + public partial class ViewConsole + { + + /// + /// Console control. + /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.HtmlControls.HtmlGenericControl Console; - - /// IconSize control. + + /// + /// IconSize control. + /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.DropDownList IconSize; - - /// View control. + + /// + /// View control. + /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.WebControls.DropDownList View; - - /// SettingsBreak control. + + /// + /// SettingsBreak control. + /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.HtmlControls.HtmlGenericControl SettingsBreak; - - /// DetailView control. + + /// + /// DetailView control. + /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ContentWorkflowServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ContentWorkflowServiceController.cs index 14a65a21fcb..34dc2412ddc 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ContentWorkflowServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ContentWorkflowServiceController.cs @@ -2,217 +2,234 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Common; +using DotNetNuke.Entities.Content; +using DotNetNuke.Entities.Content.Common; +using DotNetNuke.Entities.Content.Workflow; +using DotNetNuke.Entities.Content.Workflow.Dto; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Framework; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Services.Exceptions; +using DotNetNuke.Services.Social.Notifications; +using DotNetNuke.Web.Api; + +using Microsoft.Extensions.DependencyInjection; + +/// An API controller for managing content moving through its workflow. +/// The content controller. +/// The workflow engine. +/// The tab controller. +[DnnAuthorize] +public partial class ContentWorkflowServiceController(IContentController contentController, IWorkflowEngine workflowEngine, ITabController tabController) + : DnnApiController { - using System; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Common; - using DotNetNuke.Entities.Content; - using DotNetNuke.Entities.Content.Common; - using DotNetNuke.Entities.Content.Workflow; - using DotNetNuke.Entities.Content.Workflow.Dto; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Framework; - using DotNetNuke.Internal.SourceGenerators; - using DotNetNuke.Services.Exceptions; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Web.Api; - - using Microsoft.Extensions.DependencyInjection; - - /// An API controller for managing content moving through its workflow. - /// The content controller. - /// The workflow engine. - /// The tab controller. - [DnnAuthorize] - public partial class ContentWorkflowServiceController(IContentController contentController, IWorkflowEngine workflowEngine, ITabController tabController) - : DnnApiController + private readonly IContentController contentController = contentController ?? ContentController.Instance; + private readonly IWorkflowEngine workflowEngine = workflowEngine ?? WorkflowEngine.Instance; + private readonly ITabController tabController = tabController ?? TabController.Instance; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IContentController. Scheduled removal in v12.0.0.")] + public ContentWorkflowServiceController() + : this(null, null, null) { - private readonly IContentController contentController = contentController ?? ContentController.Instance; - private readonly IWorkflowEngine workflowEngine = workflowEngine ?? WorkflowEngine.Instance; - private readonly ITabController tabController = tabController ?? TabController.Instance; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IContentController. Scheduled removal in v12.0.0.")] - public ContentWorkflowServiceController() - : this(null, null, null) - { - } + } - /// Rejects a workflow. - /// The workflow notification to reject. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage Reject(NotificationDTO postData) + /// Rejects a workflow. + /// The workflow notification to reject. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage Reject(NotificationDTO postData) + => this.Reject(postData?.ToNotificationRequest()); + + /// Rejects a workflow. + /// The workflow notification to reject. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage Reject(NotificationRequest requestBody) + { + try { - try + var notification = NotificationsController.Instance.GetNotification(requestBody.NotificationId); + if (notification != null) { - var notification = NotificationsController.Instance.GetNotification(postData.NotificationId); - if (notification != null) + if (string.IsNullOrEmpty(notification.Context)) { - if (string.IsNullOrEmpty(notification.Context)) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } - - string[] parameters = notification.Context.Split(':'); - - var stateTransaction = new StateTransaction - { - ContentItemId = int.Parse(parameters[0], CultureInfo.InvariantCulture), - CurrentStateId = int.Parse(parameters[2], CultureInfo.InvariantCulture), - Message = new StateTransactionMessage(), - UserId = this.UserInfo.UserID, - }; - this.workflowEngine.DiscardState(stateTransaction); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); } - } - catch (Exception exc) - { - Exceptions.LogException(exc); - } - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + var parameters = notification.Context.Split(':'); + + var stateTransaction = new StateTransaction + { + ContentItemId = int.Parse(parameters[0], CultureInfo.InvariantCulture), + CurrentStateId = int.Parse(parameters[2], CultureInfo.InvariantCulture), + Message = new StateTransactionMessage(), + UserId = this.UserInfo.UserID, + }; + this.workflowEngine.DiscardState(stateTransaction); + + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + } + } + catch (Exception exc) + { + Exceptions.LogException(exc); } - /// Approves a workflow. - /// The workflow notification to approve. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage Approve(NotificationDTO postData) + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + + /// Approves a workflow. + /// The workflow notification to approve. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage Approve(NotificationDTO postData) + => this.Approve(postData?.ToNotificationRequest()); + + /// Approves a workflow. + /// The workflow notification to approve. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage Approve(NotificationRequest requestBody) + { + try { - try + var notification = NotificationsController.Instance.GetNotification(requestBody.NotificationId); + if (notification != null) { - var notification = NotificationsController.Instance.GetNotification(postData.NotificationId); - if (notification != null) + if (string.IsNullOrEmpty(notification.Context)) { - if (string.IsNullOrEmpty(notification.Context)) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } - - string[] parameters = notification.Context.Split(':'); - - var stateTransaction = new StateTransaction - { - ContentItemId = int.Parse(parameters[0], CultureInfo.InvariantCulture), - CurrentStateId = int.Parse(parameters[2], CultureInfo.InvariantCulture), - Message = new StateTransactionMessage(), - UserId = this.UserInfo.UserID, - }; - this.workflowEngine.CompleteState(stateTransaction); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); } - } - catch (Exception exc) - { - Exceptions.LogException(exc); - } - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); - } + string[] parameters = notification.Context.Split(':'); - /// Complete a workflow state for the current page. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage CompleteState() - { - try - { - this.workflowEngine.CompleteState(this.BuildStateTransaction()); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); - } - catch (Exception exc) - { - Exceptions.LogException(exc); + var stateTransaction = new StateTransaction + { + ContentItemId = int.Parse(parameters[0], CultureInfo.InvariantCulture), + CurrentStateId = int.Parse(parameters[2], CultureInfo.InvariantCulture), + Message = new StateTransactionMessage(), + UserId = this.UserInfo.UserID, + }; + this.workflowEngine.CompleteState(stateTransaction); + + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); } - - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); } - - /// Discards a workflow state for the current page. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage DiscardState() + catch (Exception exc) { - try - { - this.workflowEngine.DiscardState(this.BuildStateTransaction()); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); - } - catch (Exception exc) - { - Exceptions.LogException(exc); - } - - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + Exceptions.LogException(exc); } - /// Complete a workflow for the current page. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage CompleteWorkflow() - { - try - { - this.workflowEngine.CompleteWorkflow(this.BuildStateTransaction()); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); - } - catch (Exception exc) - { - Exceptions.LogException(exc); - } + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + /// Complete a workflow state for the current page. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage CompleteState() + { + try + { + this.workflowEngine.CompleteState(this.BuildStateTransaction()); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); + } + catch (Exception exc) + { + Exceptions.LogException(exc); } - /// Discards a workflow for the current page. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage DiscardWorkflow() + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + + /// Discards a workflow state for the current page. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage DiscardState() + { + try { - try - { - this.workflowEngine.DiscardWorkflow(this.BuildStateTransaction()); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); - } - catch (Exception exc) - { - Exceptions.LogException(exc); - } + this.workflowEngine.DiscardState(this.BuildStateTransaction()); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); + } + catch (Exception exc) + { + Exceptions.LogException(exc); + } - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + + /// Complete a workflow for the current page. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage CompleteWorkflow() + { + try + { + this.workflowEngine.CompleteWorkflow(this.BuildStateTransaction()); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); } + catch (Exception exc) + { + Exceptions.LogException(exc); + } + + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } - private StateTransaction BuildStateTransaction() + /// Discards a workflow for the current page. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage DiscardWorkflow() + { + try { - var portalId = this.PortalSettings.PortalId; - var tabId = this.Request.FindTabId(); - var currentPage = this.tabController.GetTab(tabId, portalId); - var contentItemId = currentPage.ContentItemId; - var contentItem = this.contentController.GetContentItem(contentItemId); - var stateTransaction = new StateTransaction - { - ContentItemId = contentItem.ContentItemId, - CurrentStateId = contentItem.StateID, - Message = new StateTransactionMessage(), - UserId = this.UserInfo.UserID, - }; - return stateTransaction; + this.workflowEngine.DiscardWorkflow(this.BuildStateTransaction()); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); + } + catch (Exception exc) + { + Exceptions.LogException(exc); } + + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + + private StateTransaction BuildStateTransaction() + { + var portalId = this.PortalSettings.PortalId; + var tabId = this.Request.FindTabId(); + var currentPage = this.tabController.GetTab(tabId, portalId); + var contentItemId = currentPage.ContentItemId; + var contentItem = this.contentController.GetContentItem(contentItemId); + var stateTransaction = new StateTransaction + { + ContentItemId = contentItem.ContentItemId, + CurrentStateId = contentItem.StateID, + Message = new StateTransactionMessage(), + UserId = this.UserInfo.UserID, + }; + return stateTransaction; } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ControlBarController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ControlBarController.cs index 55215cdce5f..8ec4dc8bc9a 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ControlBarController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ControlBarController.cs @@ -1,45 +1,89 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Logging; +using DotNetNuke.Abstractions.Modules; +using DotNetNuke.Abstractions.Portals; +using DotNetNuke.Abstractions.Security.Permissions; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Modules; +using DotNetNuke.Entities.Modules.Definitions; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Users; +using DotNetNuke.Instrumentation; +using DotNetNuke.Security; +using DotNetNuke.Security.Permissions; +using DotNetNuke.Services.Exceptions; +using DotNetNuke.Services.Installer.Packages; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.Log.EventLog; +using DotNetNuke.Services.Personalization; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.Api.Internal; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API for the control bar. +/// The business controller provider. +/// The personalization controller. +/// The application status. +/// The portal alias service. +/// The host settings service. +/// The portal controller. +/// The permission definition service. +/// The event logger. +/// The host settings. +[DnnAuthorize] +public class ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController, IApplicationStatusInfo appStatus, IPortalAliasService portalAliasService, IHostSettingsService hostSettingsService, IPortalController portalController, IPermissionDefinitionService permissionDefinitionService, IEventLogger eventLogger, IHostSettings hostSettings) + : DnnApiController { - using System; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Net.Http.Headers; - using System.Threading; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Logging; - using DotNetNuke.Abstractions.Modules; - using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Abstractions.Security.Permissions; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Modules.Definitions; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.Exceptions; - using DotNetNuke.Services.Installer.Packages; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Log.EventLog; - using DotNetNuke.Services.Personalization; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.Api.Internal; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API for the control bar. + private const string DefaultExtensionImage = "icon_extensions_32px.png"; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ControlBarController)); + private readonly IBusinessControllerProvider businessControllerProvider = businessControllerProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly PersonalizationController personalizationController = personalizationController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalAliasService portalAliasService = portalAliasService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IHostSettingsService hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPermissionDefinitionService permissionDefinitionService = permissionDefinitionService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly Components.Controllers.IControlBarController controller = Components.Controllers.ControlBarController.Instance; + + /// Initializes a new instance of the class. + /// The business controller provider. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IApplicationStatusInfo. Scheduled removal in v12.0.0.")] + public ControlBarController(IBusinessControllerProvider businessControllerProvider) + : this(businessControllerProvider, null, null, null, null, null, null, null) + { + } + + /// Initializes a new instance of the class. + /// The business controller provider. + /// The personalization controller. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IApplicationStatusInfo. Scheduled removal in v12.0.0.")] + public ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController) + : this(businessControllerProvider, personalizationController, null, null, null, null, null, null) + { + } + + /// Initializes a new instance of the class. /// The business controller provider. /// The personalization controller. /// The application status. @@ -48,399 +92,321 @@ namespace DotNetNuke.Web.InternalServices /// The portal controller. /// The permission definition service. /// The event logger. - /// The host settings. - [DnnAuthorize] - public class ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController, IApplicationStatusInfo appStatus, IPortalAliasService portalAliasService, IHostSettingsService hostSettingsService, IPortalController portalController, IPermissionDefinitionService permissionDefinitionService, IEventLogger eventLogger, IHostSettings hostSettings) - : DnnApiController - { - private const string DefaultExtensionImage = "icon_extensions_32px.png"; - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ControlBarController)); - private readonly IBusinessControllerProvider businessControllerProvider = businessControllerProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly PersonalizationController personalizationController = personalizationController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalAliasService portalAliasService = portalAliasService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IHostSettingsService hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPermissionDefinitionService permissionDefinitionService = permissionDefinitionService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly Components.Controllers.IControlBarController controller = Components.Controllers.ControlBarController.Instance; - - /// Initializes a new instance of the class. - /// The business controller provider. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IApplicationStatusInfo. Scheduled removal in v12.0.0.")] - public ControlBarController(IBusinessControllerProvider businessControllerProvider) - : this(businessControllerProvider, null, null, null, null, null, null, null) - { - } + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController, IApplicationStatusInfo appStatus, IPortalAliasService portalAliasService, IHostSettingsService hostSettingsService, IPortalController portalController, IPermissionDefinitionService permissionDefinitionService, IEventLogger eventLogger) + : this(businessControllerProvider, personalizationController, appStatus, portalAliasService, hostSettingsService, portalController, permissionDefinitionService, eventLogger, null) + { + } - /// Initializes a new instance of the class. - /// The business controller provider. - /// The personalization controller. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IApplicationStatusInfo. Scheduled removal in v12.0.0.")] - public ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController) - : this(businessControllerProvider, personalizationController, null, null, null, null, null, null) + /// Gets the desktop modules available to the portal. + /// The module category ("All" if or ). + /// The index. + /// The page size. + /// The search term. + /// A comma-delimited list of categories to exclude. + /// Whether to sort bookmarked modules to the top. + /// The friendly name of a module to display first in the list (only if is ). + /// A response containing a list of objects. + [HttpGet] + [DnnPageEditor] + public HttpResponseMessage GetPortalDesktopModules(string category, int loadingStartIndex, int loadingPageSize, string searchTerm, string excludeCategories = "", bool sortBookmarks = false, string topModule = "") + { + if (string.IsNullOrEmpty(category)) { + category = "All"; } - /// Initializes a new instance of the class. - /// The business controller provider. - /// The personalization controller. - /// The application status. - /// The portal alias service. - /// The host settings service. - /// The portal controller. - /// The permission definition service. - /// The event logger. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ControlBarController(IBusinessControllerProvider businessControllerProvider, PersonalizationController personalizationController, IApplicationStatusInfo appStatus, IPortalAliasService portalAliasService, IHostSettingsService hostSettingsService, IPortalController portalController, IPermissionDefinitionService permissionDefinitionService, IEventLogger eventLogger) - : this(businessControllerProvider, personalizationController, appStatus, portalAliasService, hostSettingsService, portalController, permissionDefinitionService, eventLogger, null) + var bookmarkCategory = this.controller.GetBookmarkCategory(PortalSettings.Current.PortalId); + var bookmarkedModules = this.controller.GetBookmarkedDesktopModules(PortalSettings.Current.PortalId, UserController.Instance.GetCurrentUserInfo().UserID, searchTerm); + var bookmarkCategoryModules = this.controller.GetCategoryDesktopModules(this.PortalSettings.PortalId, bookmarkCategory, searchTerm); + + var filteredList = bookmarkCategory == category + ? bookmarkCategoryModules.OrderBy(m => m.Key).Union(bookmarkedModules.OrderBy(m => m.Key)).Distinct() + : this.controller.GetCategoryDesktopModules(this.PortalSettings.PortalId, category, searchTerm).OrderBy(m => m.Key); + + if (!string.IsNullOrEmpty(excludeCategories)) { + var excludeList = excludeCategories.ToLowerInvariant().Split(','); + filteredList = + filteredList.Where(kvp => + !excludeList.Contains(kvp.Value.DesktopModule.Category.ToLowerInvariant())); } - /// Gets the desktop modules available to the portal. - /// The module category ("All" if or ). - /// The index. - /// The page size. - /// The search term. - /// A comma-delimited list of categories to exclude. - /// Whether to sort bookmarked modules to the top. - /// The friendly name of a module to display first in the list (only if is ). - /// A response containing a list of objects. - [HttpGet] - [DnnPageEditor] - public HttpResponseMessage GetPortalDesktopModules(string category, int loadingStartIndex, int loadingPageSize, string searchTerm, string excludeCategories = "", bool sortBookmarks = false, string topModule = "") - { - if (string.IsNullOrEmpty(category)) - { - category = "All"; - } - - var bookmarkCategory = this.controller.GetBookmarkCategory(PortalSettings.Current.PortalId); - var bookmarkedModules = this.controller.GetBookmarkedDesktopModules(PortalSettings.Current.PortalId, UserController.Instance.GetCurrentUserInfo().UserID, searchTerm); - var bookmarkCategoryModules = this.controller.GetCategoryDesktopModules(this.PortalSettings.PortalId, bookmarkCategory, searchTerm); + if (sortBookmarks) + { + // sort bookmarked modules + filteredList = bookmarkedModules.OrderBy(m => m.Key).Concat(filteredList.Except(bookmarkedModules)); - var filteredList = bookmarkCategory == category - ? bookmarkCategoryModules.OrderBy(m => m.Key).Union(bookmarkedModules.OrderBy(m => m.Key)).Distinct() - : this.controller.GetCategoryDesktopModules(this.PortalSettings.PortalId, category, searchTerm).OrderBy(m => m.Key); + // move Html on top + filteredList = filteredList.Where(m => m.Key.Equals(topModule, StringComparison.OrdinalIgnoreCase)). + Concat(filteredList.Except(filteredList.Where(m => m.Key.Equals(topModule, StringComparison.OrdinalIgnoreCase)))); + } - if (!string.IsNullOrEmpty(excludeCategories)) - { - var excludeList = excludeCategories.ToLowerInvariant().Split(','); - filteredList = - filteredList.Where(kvp => - !excludeList.Contains(kvp.Value.DesktopModule.Category.ToLowerInvariant())); - } + filteredList = filteredList + .Skip(loadingStartIndex) + .Take(loadingPageSize); - if (sortBookmarks) - { - // sort bookmarked modules - filteredList = bookmarkedModules.OrderBy(m => m.Key).Concat(filteredList.Except(bookmarkedModules)); - - // move Html on top - filteredList = filteredList.Where(m => m.Key.Equals(topModule, StringComparison.OrdinalIgnoreCase)). - Concat(filteredList.Except(filteredList.Where(m => m.Key.Equals(topModule, StringComparison.OrdinalIgnoreCase)))); - } + var result = filteredList.Select(kvp => new ModuleDefDTO + { + ModuleID = kvp.Value.DesktopModuleID, + ModuleName = kvp.Key, + ModuleImage = GetDeskTopModuleImage(this.hostSettings, kvp.Value.DesktopModuleID), + Bookmarked = bookmarkedModules.Any(m => m.Key == kvp.Key), + ExistsInBookmarkCategory = bookmarkCategoryModules.Any(m => m.Key == kvp.Key), + }).ToList(); + return this.Request.CreateResponse(HttpStatusCode.OK, result); + } - filteredList = filteredList - .Skip(loadingStartIndex) - .Take(loadingPageSize); + /// Gets the pages for a portal. + /// The portal ID, or or for the current portal. + /// A response with a list of objects. + [HttpGet] + [DnnPageEditor] + public HttpResponseMessage GetPageList(string portal) + { + var portalSettings = this.GetPortalSettings(portal); - var result = filteredList.Select(kvp => new ModuleDefDTO - { - ModuleID = kvp.Value.DesktopModuleID, - ModuleName = kvp.Key, - ModuleImage = GetDeskTopModuleImage(this.hostSettings, kvp.Value.DesktopModuleID), - Bookmarked = bookmarkedModules.Any(m => m.Key == kvp.Key), - ExistsInBookmarkCategory = bookmarkCategoryModules.Any(m => m.Key == kvp.Key), - }).ToList(); - return this.Request.CreateResponse(HttpStatusCode.OK, result); + List tabList; + if (this.PortalSettings.PortalId == portalSettings.PortalId) + { + tabList = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalSettings.PortalId, this.PortalSettings.ActiveTab.TabID, false, string.Empty, true, false, false, false, true); } - - /// Gets the pages for a portal. - /// The portal ID, or or for the current portal. - /// A response with a list of objects. - [HttpGet] - [DnnPageEditor] - public HttpResponseMessage GetPageList(string portal) + else { - var portalSettings = this.GetPortalSettings(portal); + var groups = PortalGroupController.Instance.GetPortalGroups().ToArray(); - List tabList; - if (this.PortalSettings.PortalId == portalSettings.PortalId) - { - tabList = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalSettings.PortalId, this.PortalSettings.ActiveTab.TabID, false, string.Empty, true, false, false, false, true); - } - else - { - var groups = PortalGroupController.Instance.GetPortalGroups().ToArray(); - - var myGroup = ( + var myGroup = ( from @group in groups select PortalGroupController.Instance.GetPortalsByGroup(@group.PortalGroupId).Cast() into portals where portals.Any(x => x.PortalId == PortalSettings.Current.PortalId) select portals.ToArray()) - .FirstOrDefault(); + .FirstOrDefault(); - if (myGroup != null && myGroup.Any(p => p.PortalId == portalSettings.PortalId)) - { - tabList = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalSettings.PortalId, Null.NullInteger, false, string.Empty, true, false, false, false, false); - } - else - { - // try to get pages not allowed - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); - } + if (myGroup != null && myGroup.Any(p => p.PortalId == portalSettings.PortalId)) + { + tabList = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalSettings.PortalId, Null.NullInteger, false, string.Empty, true, false, false, false, false); } - - List result = new List(); - foreach (var tab in tabList) + else { - if (tab.PortalID == this.PortalSettings.PortalId || (GetModules(tab.TabID).Count > 0 && tab.TabID != portalSettings.AdminTabId && tab.ParentId != portalSettings.AdminTabId)) - { - result.Add(new PageDefDTO { TabID = tab.TabID, IndentedTabName = tab.IndentedTabName }); - } + // try to get pages not allowed + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); } - - return this.Request.CreateResponse(HttpStatusCode.OK, result); } - /// Gets the modules to a page. - /// The tab ID. - /// A response with a list of objects. - [HttpGet] - [DnnPageEditor] - public HttpResponseMessage GetTabModules(string tab) + List result = new List(); + foreach (var tab in tabList) { - if (int.TryParse(tab, out var tabId)) + if (tab.PortalID == this.PortalSettings.PortalId || (GetModules(tab.TabID).Count > 0 && tab.TabID != portalSettings.AdminTabId && tab.ParentId != portalSettings.AdminTabId)) { - var result = new List(); - if (tabId > 0) - { - var pageModules = GetModules(tabId); - - Dictionary resultDict = pageModules.ToDictionary(module => module.ModuleID, module => module.ModuleTitle); - result.AddRange(from kvp in resultDict - let imageUrl = GetTabModuleImage(this.hostSettings, tabId, kvp.Key) - select new ModuleDefDTO { ModuleID = kvp.Key, ModuleName = kvp.Value, ModuleImage = imageUrl }); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, result); + result.Add(new PageDefDTO { TabID = tab.TabID, IndentedTabName = tab.IndentedTabName }); } - - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); } - /// Copy permissions from the active page to its descendants. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPageEditor] - public HttpResponseMessage CopyPermissionsToChildren() + return this.Request.CreateResponse(HttpStatusCode.OK, result); + } + + /// Gets the modules to a page. + /// The tab ID. + /// A response with a list of objects. + [HttpGet] + [DnnPageEditor] + public HttpResponseMessage GetTabModules(string tab) + { + if (int.TryParse(tab, out var tabId)) { - if (TabPermissionController.CanManagePage() && UserController.Instance.GetCurrentUserInfo().IsInRole("Administrators") - && this.ActiveTabHasChildren() && !this.PortalSettings.ActiveTab.IsSuperTab) + var result = new List(); + if (tabId > 0) { - TabController.CopyPermissionsToChildren(this.eventLogger, this.PortalSettings.ActiveTab, this.PortalSettings.ActiveTab.TabPermissions); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + var pageModules = GetModules(tabId); + + Dictionary resultDict = pageModules.ToDictionary(module => module.ModuleID, module => module.ModuleTitle); + result.AddRange(from kvp in resultDict + let imageUrl = GetTabModuleImage(this.hostSettings, tabId, kvp.Key) + select new ModuleDefDTO { ModuleID = kvp.Key, ModuleName = kvp.Value, ModuleImage = imageUrl }); } - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + return this.Request.CreateResponse(HttpStatusCode.OK, result); } - /// Add a module to a page. - /// Information about the module to add. - /// A response with an object containing the tab-module ID of the new instance. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPageEditor] - public HttpResponseMessage AddModule(AddModuleDTO dto) + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } + + /// Copy permissions from the active page to its descendants. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPageEditor] + public HttpResponseMessage CopyPermissionsToChildren() + { + if (TabPermissionController.CanManagePage() && UserController.Instance.GetCurrentUserInfo().IsInRole("Administrators") + && this.ActiveTabHasChildren() && !this.PortalSettings.ActiveTab.IsSuperTab) { - if (TabPermissionController.CanAddContentToPage() && this.CanAddModuleToPage()) - { - int permissionType; - try - { - permissionType = int.Parse(dto.Visibility, CultureInfo.InvariantCulture); - } - catch (Exception exc) - { - Logger.Error(exc); - permissionType = 0; - } + TabController.CopyPermissionsToChildren(this.eventLogger, this.PortalSettings.ActiveTab, this.PortalSettings.ActiveTab.TabPermissions); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } - int positionId = -1; - if (!string.IsNullOrEmpty(dto.Sort)) - { - try - { - var sortId = int.Parse(dto.Sort, CultureInfo.InvariantCulture); - if (sortId >= 0) - { - positionId = GetPaneModuleOrder(dto.Pane, sortId); - } - } - catch (Exception exc) - { - Logger.Error(exc); - } - } + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } - if (positionId == -1) - { - switch (dto.Position) - { - case "TOP": - case "0": - positionId = 0; - break; - case "BOTTOM": - case "-1": - positionId = -1; - break; - } - } + /// Add a module to a page. + /// Information about the module to add. + /// A response with an object containing the tab-module ID of the new instance. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPageEditor] + public HttpResponseMessage AddModule(AddModuleDTO dto) + { + if (TabPermissionController.CanAddContentToPage() && this.CanAddModuleToPage()) + { + int permissionType; + try + { + permissionType = int.Parse(dto.Visibility, CultureInfo.InvariantCulture); + } + catch (Exception exc) + { + Logger.Error(exc); + permissionType = 0; + } - int moduleLstId; + int positionId = -1; + if (!string.IsNullOrEmpty(dto.Sort)) + { try { - moduleLstId = int.Parse(dto.Module, CultureInfo.InvariantCulture); + var sortId = int.Parse(dto.Sort, CultureInfo.InvariantCulture); + if (sortId >= 0) + { + positionId = GetPaneModuleOrder(dto.Pane, sortId); + } } catch (Exception exc) { Logger.Error(exc); - moduleLstId = -1; } + } - try - { - int tabModuleId = -1; - if (moduleLstId > -1) - { - if (dto.AddExistingModule == "true") - { - int pageId; - try - { - pageId = int.Parse(dto.Page, CultureInfo.InvariantCulture); - } - catch (Exception exc) - { - Logger.Error(exc); - pageId = -1; - } - - if (pageId > -1) - { - tabModuleId = this.DoAddExistingModule(moduleLstId, pageId, dto.Pane, positionId, string.Empty, dto.CopyModule == "true"); - } - } - else - { - tabModuleId = DoAddNewModule(this.hostSettings, string.Empty, moduleLstId, dto.Pane, positionId, permissionType, string.Empty); - } - } - - return this.Request.CreateResponse(HttpStatusCode.OK, new { TabModuleID = tabModuleId }); - } - catch (Exception ex) + if (positionId == -1) + { + switch (dto.Position) { - Logger.Error(ex); + case "TOP": + case "0": + positionId = 0; + break; + case "BOTTOM": + case "-1": + positionId = -1; + break; } } - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); - } - - /// Clears the host cache. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [RequireHost] - public HttpResponseMessage ClearHostCache() - { - if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) + int moduleLstId; + try { - DataCache.ClearCache(); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + moduleLstId = int.Parse(dto.Module, CultureInfo.InvariantCulture); } - - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); - } - - /// Recycles the application pool. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [RequireHost] - public HttpResponseMessage RecycleApplicationPool() - { - if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) + catch (Exception exc) { - var log = new LogInfo { BypassBuffering = true, LogTypeKey = nameof(EventLogType.HOST_ALERT) }; - log.AddProperty("Message", "UserRestart"); - LogController.Instance.AddLog(log); - Config.Touch(this.appStatus); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + Logger.Error(exc); + moduleLstId = -1; } - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); - } - - /// Switches to a different portal/site. - /// Information about the site to switch to. - /// A response with an object containing a RedirectURL field. - [HttpPost] - [ValidateAntiForgeryToken] - [RequireHost] - public HttpResponseMessage SwitchSite(SwitchSiteDTO dto) - { - if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) + try { - try + int tabModuleId = -1; + if (moduleLstId > -1) { - if (!string.IsNullOrEmpty(dto.Site)) + if (dto.AddExistingModule == "true") { - int selectedPortalId = int.Parse(dto.Site, CultureInfo.InvariantCulture); - var portalAliases = this.portalAliasService.GetPortalAliasesByPortalId(selectedPortalId).ToList(); + int pageId; + try + { + pageId = int.Parse(dto.Page, CultureInfo.InvariantCulture); + } + catch (Exception exc) + { + Logger.Error(exc); + pageId = -1; + } - if (portalAliases.Count > 0 && portalAliases[0] != null) + if (pageId > -1) { - return this.Request.CreateResponse(HttpStatusCode.OK, new { RedirectURL = Globals.AddHTTP(portalAliases[0].HttpAlias), }); + tabModuleId = this.DoAddExistingModule(moduleLstId, pageId, dto.Pane, positionId, string.Empty, dto.CopyModule == "true"); } } + else + { + tabModuleId = DoAddNewModule(this.hostSettings, string.Empty, moduleLstId, dto.Pane, positionId, permissionType, string.Empty); + } } - catch (ThreadAbortException) - { - // Do nothing we are not logging ThreadAbortExceptions caused by redirects - } - catch (Exception ex) - { - Exceptions.LogException(ex); - } + + return this.Request.CreateResponse(HttpStatusCode.OK, new { TabModuleID = tabModuleId }); + } + catch (Exception ex) + { + Logger.Error(ex); } + } + + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } + + /// Clears the host cache. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [RequireHost] + public HttpResponseMessage ClearHostCache() + { + if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) + { + DataCache.ClearCache(); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } + + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + /// Recycles the application pool. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [RequireHost] + public HttpResponseMessage RecycleApplicationPool() + { + if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) + { + var log = new LogInfo { BypassBuffering = true, LogTypeKey = nameof(EventLogType.HOST_ALERT) }; + log.AddProperty("Message", "UserRestart"); + LogController.Instance.AddLog(log); + Config.Touch(this.appStatus); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); } - /// Updates the user's preferred language. - /// Information about the language switch. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage SwitchLanguage(SwitchLanguageDTO dto) + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } + + /// Switches to a different portal/site. + /// Information about the site to switch to. + /// A response with an object containing a RedirectURL field. + [HttpPost] + [ValidateAntiForgeryToken] + [RequireHost] + public HttpResponseMessage SwitchSite(SwitchSiteDTO dto) + { + if (UserController.Instance.GetCurrentUserInfo().IsSuperUser) { try { - if (this.PortalSettings.AllowUserUICulture && this.PortalSettings.ContentLocalizationEnabled) + if (!string.IsNullOrEmpty(dto.Site)) { - if (!string.IsNullOrEmpty(dto.Language)) + int selectedPortalId = int.Parse(dto.Site, CultureInfo.InvariantCulture); + var portalAliases = this.portalAliasService.GetPortalAliasesByPortalId(selectedPortalId).ToList(); + + if (portalAliases.Count > 0 && portalAliases[0] != null) { - var personalization = this.personalizationController.LoadProfile(this.UserInfo.UserID, this.PortalSettings.PortalId); - personalization.Profile["Usability:UICulture"] = dto.Language; - personalization.IsModified = true; - this.personalizationController.SaveProfile(personalization); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + return this.Request.CreateResponse(HttpStatusCode.OK, new { RedirectURL = Globals.AddHTTP(portalAliases[0].HttpAlias), }); } } } @@ -452,568 +418,601 @@ public HttpResponseMessage SwitchLanguage(SwitchLanguageDTO dto) { Exceptions.LogException(ex); } - - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); } - /// Toggle between view and edit mode. - /// The user mode to switch to. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPageEditor] - public HttpResponseMessage ToggleUserMode(UserModeDTO userMode) - { - if (userMode == null) - { - userMode = new UserModeDTO { UserMode = "VIEW" }; - } - - this.ToggleUserMode(userMode.UserMode); - var response = this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } - if (userMode.UserMode.Equals("VIEW", StringComparison.OrdinalIgnoreCase)) + /// Updates the user's preferred language. + /// Information about the language switch. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage SwitchLanguage(SwitchLanguageDTO dto) + { + try + { + if (this.PortalSettings.AllowUserUICulture && this.PortalSettings.ContentLocalizationEnabled) { - var cookie = this.Request.Headers.GetCookies("StayInEditMode").FirstOrDefault(); - if (cookie != null && !string.IsNullOrEmpty(cookie["StayInEditMode"].Value)) + if (!string.IsNullOrEmpty(dto.Language)) { - var expireCookie = new CookieHeaderValue("StayInEditMode", string.Empty); - expireCookie.Expires = DateTimeOffset.Now.AddDays(-1); - expireCookie.Path = !string.IsNullOrEmpty(Globals.ApplicationPath) ? Globals.ApplicationPath : "/"; - response.Headers.AddCookies(new List { expireCookie }); + var personalization = this.personalizationController.LoadProfile(this.UserInfo.UserID, this.PortalSettings.PortalId); + personalization.Profile["Usability:UICulture"] = dto.Language; + personalization.IsModified = true; + this.personalizationController.SaveProfile(personalization); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); } } - - return response; } - - /// Saves a bookmark for a user. - /// The bookmark to save. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPageEditor] - public HttpResponseMessage SaveBookmark(BookmarkDTO bookmark) + catch (ThreadAbortException) { - if (string.IsNullOrEmpty(bookmark.Bookmark)) - { - bookmark.Bookmark = string.Empty; - } - - this.controller.SaveBookMark(this.PortalSettings.PortalId, this.UserInfo.UserID, bookmark.Title, bookmark.Bookmark); - - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + // Do nothing we are not logging ThreadAbortExceptions caused by redirects } - - /// Locks or unlocks the instance. - /// The lock request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [RequireHost] - public HttpResponseMessage LockInstance(LockingDTO lockingRequest) + catch (Exception ex) { - this.hostSettingsService.Update("IsLocked", lockingRequest.Lock.ToString(), true); - return this.Request.CreateResponse(HttpStatusCode.OK); + Exceptions.LogException(ex); } - /// Locks or unlocks the current site. - /// The lock request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [RequireHost] - public HttpResponseMessage LockSite(LockingDTO lockingRequest) + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } + + /// Toggle between view and edit mode. + /// The user mode to switch to. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPageEditor] + public HttpResponseMessage ToggleUserMode(UserModeDTO userMode) + { + if (userMode == null) { - PortalController.UpdatePortalSetting(this.portalController, this.PortalSettings.PortalId, "IsLocked", lockingRequest.Lock.ToString(), true); - return this.Request.CreateResponse(HttpStatusCode.OK); + userMode = new UserModeDTO { UserMode = "VIEW" }; } - /// Gets a value indicating whether the current user can add a module to the current page. - /// . - [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] - public bool CanAddModuleToPage() - { - return true; + this.ToggleUserMode(userMode.UserMode); + var response = this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - // If we are not in an edit page - ////return (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["mid"])) && (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["ctl"])); + if (userMode.UserMode.Equals("VIEW", StringComparison.OrdinalIgnoreCase)) + { + var cookie = this.Request.Headers.GetCookies("StayInEditMode").FirstOrDefault(); + if (cookie != null && !string.IsNullOrEmpty(cookie["StayInEditMode"].Value)) + { + var expireCookie = new CookieHeaderValue("StayInEditMode", string.Empty); + expireCookie.Expires = DateTimeOffset.Now.AddDays(-1); + expireCookie.Path = !string.IsNullOrEmpty(Globals.ApplicationPath) ? Globals.ApplicationPath : "/"; + response.Headers.AddCookies(new List { expireCookie }); + } } - private static void SetCloneModuleContext(bool cloneModuleContext) + return response; + } + + /// Saves a bookmark for a user. + /// The bookmark to save. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPageEditor] + public HttpResponseMessage SaveBookmark(BookmarkDTO bookmark) + { + if (string.IsNullOrEmpty(bookmark.Bookmark)) { - Thread.SetData( - Thread.GetNamedDataSlot("CloneModuleContext"), - cloneModuleContext ? bool.TrueString : bool.FalseString); + bookmark.Bookmark = string.Empty; } - private static List GetModules(int tabID) - { - var isRemote = TabController.Instance.GetTab(tabID, Null.NullInteger, false).PortalID != PortalSettings.Current.PortalId; - var tabModules = ModuleController.Instance.GetTabModules(tabID); + this.controller.SaveBookMark(this.PortalSettings.PortalId, this.UserInfo.UserID, bookmark.Title, bookmark.Bookmark); - var pageModules = isRemote - ? tabModules.Values.Where(m => ModuleSupportsSharing(m) && !m.IsDeleted).ToList() - : tabModules.Values.Where(m => ModulePermissionController.HasModuleAccess(SecurityAccessLevel.Edit, "MANAGE", m) && !m.IsDeleted).ToList(); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } - return pageModules; - } + /// Locks or unlocks the instance. + /// The lock request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [RequireHost] + public HttpResponseMessage LockInstance(LockingDTO lockingRequest) + { + this.hostSettingsService.Update("IsLocked", lockingRequest.Lock.ToString(), true); + return this.Request.CreateResponse(HttpStatusCode.OK); + } - private static bool ModuleSupportsSharing(ModuleInfo moduleInfo) - { - switch (moduleInfo.DesktopModule.Shareable) - { - case ModuleSharing.Supported: - case ModuleSharing.Unknown: - return moduleInfo.IsShareable; - default: - return false; - } - } + /// Locks or unlocks the current site. + /// The lock request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [RequireHost] + public HttpResponseMessage LockSite(LockingDTO lockingRequest) + { + PortalController.UpdatePortalSetting(this.portalController, this.PortalSettings.PortalId, "IsLocked", lockingRequest.Lock.ToString(), true); + return this.Request.CreateResponse(HttpStatusCode.OK); + } - private static string GetDeskTopModuleImage(IHostSettings hostSettings, int moduleId) - { - var portalDesktopModules = DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId); - var packages = PackageController.Instance.GetExtensionPackages(PortalSettings.Current.PortalId); + /// Gets a value indicating whether the current user can add a module to the current page. + /// . + [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] + public bool CanAddModuleToPage() + { + return true; - string imageUrl = - (from package in packages - join portMods in portalDesktopModules on package.PackageID equals portMods.Value.PackageID - where portMods.Value.DesktopModuleID == moduleId - select package.IconFile).FirstOrDefault(); + // If we are not in an edit page + ////return (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["mid"])) && (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["ctl"])); + } - imageUrl = string.IsNullOrEmpty(imageUrl) ? Globals.ImagePath + DefaultExtensionImage : imageUrl; - return System.Web.VirtualPathUtility.ToAbsolute(imageUrl); - } + private static void SetCloneModuleContext(bool cloneModuleContext) + { + Thread.SetData( + Thread.GetNamedDataSlot("CloneModuleContext"), + cloneModuleContext ? bool.TrueString : bool.FalseString); + } + + private static List GetModules(int tabID) + { + var isRemote = TabController.Instance.GetTab(tabID, Null.NullInteger, false).PortalID != PortalSettings.Current.PortalId; + var tabModules = ModuleController.Instance.GetTabModules(tabID); + + var pageModules = isRemote + ? tabModules.Values.Where(m => ModuleSupportsSharing(m) && !m.IsDeleted).ToList() + : tabModules.Values.Where(m => ModulePermissionController.HasModuleAccess(SecurityAccessLevel.Edit, "MANAGE", m) && !m.IsDeleted).ToList(); + + return pageModules; + } - private static string GetTabModuleImage(IHostSettings hostSettings, int tabId, int moduleId) + private static bool ModuleSupportsSharing(ModuleInfo moduleInfo) + { + switch (moduleInfo.DesktopModule.Shareable) { - var tabModules = ModuleController.Instance.GetTabModules(tabId); - var portalDesktopModules = DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId); - var moduleDefinitions = ModuleDefinitionController.GetModuleDefinitions(hostSettings); - var packages = PackageController.Instance.GetExtensionPackages(PortalSettings.Current.PortalId); + case ModuleSharing.Supported: + case ModuleSharing.Unknown: + return moduleInfo.IsShareable; + default: + return false; + } + } + + private static string GetDeskTopModuleImage(IHostSettings hostSettings, int moduleId) + { + var portalDesktopModules = DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId); + var packages = PackageController.Instance.GetExtensionPackages(PortalSettings.Current.PortalId); - string imageUrl = (from package in packages + string imageUrl = + (from package in packages join portMods in portalDesktopModules on package.PackageID equals portMods.Value.PackageID - join modDefs in moduleDefinitions on portMods.Value.DesktopModuleID equals modDefs.Value.DesktopModuleID - join tabMods in tabModules on modDefs.Value.DesktopModuleID equals tabMods.Value.DesktopModuleID - where tabMods.Value.ModuleID == moduleId + where portMods.Value.DesktopModuleID == moduleId select package.IconFile).FirstOrDefault(); - imageUrl = string.IsNullOrEmpty(imageUrl) ? Globals.ImagePath + DefaultExtensionImage : imageUrl; - return System.Web.VirtualPathUtility.ToAbsolute(imageUrl); - } + imageUrl = string.IsNullOrEmpty(imageUrl) ? Globals.ImagePath + DefaultExtensionImage : imageUrl; + return System.Web.VirtualPathUtility.ToAbsolute(imageUrl); + } + + private static string GetTabModuleImage(IHostSettings hostSettings, int tabId, int moduleId) + { + var tabModules = ModuleController.Instance.GetTabModules(tabId); + var portalDesktopModules = DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId); + var moduleDefinitions = ModuleDefinitionController.GetModuleDefinitions(hostSettings); + var packages = PackageController.Instance.GetExtensionPackages(PortalSettings.Current.PortalId); + + string imageUrl = (from package in packages + join portMods in portalDesktopModules on package.PackageID equals portMods.Value.PackageID + join modDefs in moduleDefinitions on portMods.Value.DesktopModuleID equals modDefs.Value.DesktopModuleID + join tabMods in tabModules on modDefs.Value.DesktopModuleID equals tabMods.Value.DesktopModuleID + where tabMods.Value.ModuleID == moduleId + select package.IconFile).FirstOrDefault(); + + imageUrl = string.IsNullOrEmpty(imageUrl) ? Globals.ImagePath + DefaultExtensionImage : imageUrl; + return System.Web.VirtualPathUtility.ToAbsolute(imageUrl); + } - private static void AddModulePermission(ModuleInfo objModule, IPermissionDefinitionInfo permission, int roleId, int userId, bool allowAccess) + private static void AddModulePermission(ModuleInfo objModule, IPermissionDefinitionInfo permission, int roleId, int userId, bool allowAccess) + { + IPermissionInfo objModulePermission = new ModulePermissionInfo { - IPermissionInfo objModulePermission = new ModulePermissionInfo - { - ModuleID = objModule.ModuleID, - PermissionKey = permission.PermissionKey, - AllowAccess = allowAccess, - }; - objModulePermission.PermissionId = permission.PermissionId; - objModulePermission.RoleId = roleId; - objModulePermission.UserId = userId; - - // add the permission to the collection - if (!objModule.ModulePermissions.Contains(objModulePermission)) - { - objModule.ModulePermissions.Add((ModulePermissionInfo)objModulePermission); - } - } + ModuleID = objModule.ModuleID, + PermissionKey = permission.PermissionKey, + AllowAccess = allowAccess, + }; + objModulePermission.PermissionId = permission.PermissionId; + objModulePermission.RoleId = roleId; + objModulePermission.UserId = userId; - private static int GetPaneModuleOrder(string pane, int sort) + // add the permission to the collection + if (!objModule.ModulePermissions.Contains(objModulePermission)) { - var items = new List(); + objModule.ModulePermissions.Add((ModulePermissionInfo)objModulePermission); + } + } - foreach (ModuleInfo m in PortalSettings.Current.ActiveTab.Modules) + private static int GetPaneModuleOrder(string pane, int sort) + { + var items = new List(); + + foreach (ModuleInfo m in PortalSettings.Current.ActiveTab.Modules) + { + // if user is allowed to view module and module is not deleted + if (ModulePermissionController.CanViewModule(m) && !m.IsDeleted) { - // if user is allowed to view module and module is not deleted - if (ModulePermissionController.CanViewModule(m) && !m.IsDeleted) + // modules which are displayed on all tabs should not be displayed on the Admin or Super tabs + if (!m.AllTabs || !PortalSettings.Current.ActiveTab.IsSuperTab) { - // modules which are displayed on all tabs should not be displayed on the Admin or Super tabs - if (!m.AllTabs || !PortalSettings.Current.ActiveTab.IsSuperTab) + if (string.Equals(m.PaneName, pane, StringComparison.OrdinalIgnoreCase)) { - if (string.Equals(m.PaneName, pane, StringComparison.OrdinalIgnoreCase)) - { - int moduleOrder = m.ModuleOrder; + int moduleOrder = m.ModuleOrder; - while (items.Contains(moduleOrder) || moduleOrder == 0) - { - moduleOrder++; - } - - items.Add(moduleOrder); + while (items.Contains(moduleOrder) || moduleOrder == 0) + { + moduleOrder++; } + + items.Add(moduleOrder); } } } + } - items.Sort(); - - if (items.Count > sort) - { - var itemOrder = items[sort]; - return itemOrder - 1; - } - else if (items.Count > 0) - { - return items.Last() + 1; - } + items.Sort(); - return 0; + if (items.Count > sort) + { + var itemOrder = items[sort]; + return itemOrder - 1; + } + else if (items.Count > 0) + { + return items.Last() + 1; } - private static int DoAddNewModule(IHostSettings hostSettings, string title, int desktopModuleId, string paneName, int position, int permissionType, string align) + return 0; + } + + private static int DoAddNewModule(IHostSettings hostSettings, string title, int desktopModuleId, string paneName, int position, int permissionType, string align) + { + try { - try - { - if (!DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId).TryGetValue(desktopModuleId, out _)) - { - throw new ArgumentException($"Could not find desktop module with given ID: {desktopModuleId}", nameof(desktopModuleId)); - } - } - catch (Exception ex) + if (!DesktopModuleController.GetDesktopModules(hostSettings, PortalSettings.Current.PortalId).TryGetValue(desktopModuleId, out _)) { - Exceptions.LogException(ex); + throw new ArgumentException($"Could not find desktop module with given ID: {desktopModuleId}", nameof(desktopModuleId)); } + } + catch (Exception ex) + { + Exceptions.LogException(ex); + } + + var tabModuleId = Null.NullInteger; + foreach (ModuleDefinitionInfo objModuleDefinition in + ModuleDefinitionController.GetModuleDefinitionsByDesktopModuleID(desktopModuleId).Values) + { + var objModule = new ModuleInfo(); + objModule.Initialize(PortalSettings.Current.ActiveTab.PortalID); - var tabModuleId = Null.NullInteger; - foreach (ModuleDefinitionInfo objModuleDefinition in - ModuleDefinitionController.GetModuleDefinitionsByDesktopModuleID(desktopModuleId).Values) + objModule.PortalID = PortalSettings.Current.ActiveTab.PortalID; + objModule.TabID = PortalSettings.Current.ActiveTab.TabID; + objModule.ModuleOrder = position; + objModule.ModuleTitle = string.IsNullOrEmpty(title) ? objModuleDefinition.FriendlyName : title; + objModule.PaneName = paneName; + objModule.ModuleDefID = objModuleDefinition.ModuleDefID; + if (objModuleDefinition.DefaultCacheTime > 0) { - var objModule = new ModuleInfo(); - objModule.Initialize(PortalSettings.Current.ActiveTab.PortalID); - - objModule.PortalID = PortalSettings.Current.ActiveTab.PortalID; - objModule.TabID = PortalSettings.Current.ActiveTab.TabID; - objModule.ModuleOrder = position; - objModule.ModuleTitle = string.IsNullOrEmpty(title) ? objModuleDefinition.FriendlyName : title; - objModule.PaneName = paneName; - objModule.ModuleDefID = objModuleDefinition.ModuleDefID; - if (objModuleDefinition.DefaultCacheTime > 0) + objModule.CacheTime = objModuleDefinition.DefaultCacheTime; + if (PortalSettings.Current.DefaultModuleId > Null.NullInteger && PortalSettings.Current.DefaultTabId > Null.NullInteger) { - objModule.CacheTime = objModuleDefinition.DefaultCacheTime; - if (PortalSettings.Current.DefaultModuleId > Null.NullInteger && PortalSettings.Current.DefaultTabId > Null.NullInteger) + ModuleInfo defaultModule = ModuleController.Instance.GetModule(PortalSettings.Current.DefaultModuleId, PortalSettings.Current.DefaultTabId, true); + if (defaultModule != null) { - ModuleInfo defaultModule = ModuleController.Instance.GetModule(PortalSettings.Current.DefaultModuleId, PortalSettings.Current.DefaultTabId, true); - if (defaultModule != null) - { - objModule.CacheTime = defaultModule.CacheTime; - } + objModule.CacheTime = defaultModule.CacheTime; } } + } - ModuleController.Instance.InitialModulePermission(objModule, objModule.TabID, permissionType); + ModuleController.Instance.InitialModulePermission(objModule, objModule.TabID, permissionType); - if (PortalSettings.Current.ContentLocalizationEnabled) - { - Locale defaultLocale = LocaleController.Instance.GetDefaultLocale(PortalSettings.Current.PortalId); + if (PortalSettings.Current.ContentLocalizationEnabled) + { + Locale defaultLocale = LocaleController.Instance.GetDefaultLocale(PortalSettings.Current.PortalId); - // set the culture of the module to that of the tab - var tabInfo = TabController.Instance.GetTab(objModule.TabID, PortalSettings.Current.PortalId, false); - objModule.CultureCode = tabInfo != null ? tabInfo.CultureCode : defaultLocale.Code; - } - else - { - objModule.CultureCode = Null.NullString; - } + // set the culture of the module to that of the tab + var tabInfo = TabController.Instance.GetTab(objModule.TabID, PortalSettings.Current.PortalId, false); + objModule.CultureCode = tabInfo != null ? tabInfo.CultureCode : defaultLocale.Code; + } + else + { + objModule.CultureCode = Null.NullString; + } - objModule.AllTabs = false; - objModule.Alignment = align; + objModule.AllTabs = false; + objModule.Alignment = align; - ModuleController.Instance.AddModule(objModule); + ModuleController.Instance.AddModule(objModule); - if (tabModuleId == Null.NullInteger) - { - tabModuleId = objModule.ModuleID; - } - - // update the position to let later modules with add after previous one. - position = ModuleController.Instance.GetTabModule(objModule.TabModuleID).ModuleOrder + 1; + if (tabModuleId == Null.NullInteger) + { + tabModuleId = objModule.ModuleID; } - return tabModuleId; + // update the position to let later modules with add after previous one. + position = ModuleController.Instance.GetTabModule(objModule.TabModuleID).ModuleOrder + 1; } - private void ToggleUserMode(string mode) - { - var personalization = this.personalizationController.LoadProfile(this.UserInfo.UserID, this.PortalSettings.PortalId); - personalization.Profile["Usability:UserMode" + this.PortalSettings.PortalId] = mode.ToUpperInvariant(); - personalization.IsModified = true; - this.personalizationController.SaveProfile(personalization); - } + return tabModuleId; + } - private PortalSettings GetPortalSettings(string portal) - { - var portalSettings = PortalSettings.Current; + private void ToggleUserMode(string mode) + { + var personalization = this.personalizationController.LoadProfile(this.UserInfo.UserID, this.PortalSettings.PortalId); + personalization.Profile["Usability:UserMode" + this.PortalSettings.PortalId] = mode.ToUpperInvariant(); + personalization.IsModified = true; + this.personalizationController.SaveProfile(personalization); + } - try + private PortalSettings GetPortalSettings(string portal) + { + var portalSettings = PortalSettings.Current; + + try + { + if (!string.IsNullOrEmpty(portal)) { - if (!string.IsNullOrEmpty(portal)) + var selectedPortalId = int.Parse(portal, CultureInfo.InvariantCulture); + if (this.PortalSettings.PortalId != selectedPortalId) { - var selectedPortalId = int.Parse(portal, CultureInfo.InvariantCulture); - if (this.PortalSettings.PortalId != selectedPortalId) - { - portalSettings = new PortalSettings(selectedPortalId); - } + portalSettings = new PortalSettings(selectedPortalId); } } - catch (Exception) - { - portalSettings = PortalSettings.Current; - } - - return portalSettings; } - - private bool ActiveTabHasChildren() + catch (Exception) { - var children = TabController.GetTabsByParent(this.PortalSettings.ActiveTab.TabID, this.PortalSettings.ActiveTab.PortalID); + portalSettings = PortalSettings.Current; + } - if ((children == null) || children.Count < 1) - { - return false; - } + return portalSettings; + } - return true; + private bool ActiveTabHasChildren() + { + var children = TabController.GetTabsByParent(this.PortalSettings.ActiveTab.TabID, this.PortalSettings.ActiveTab.PortalID); + + if ((children == null) || children.Count < 1) + { + return false; } - private int DoAddExistingModule(int moduleId, int tabId, string paneName, int position, string align, bool cloneModule) + return true; + } + + private int DoAddExistingModule(int moduleId, int tabId, string paneName, int position, string align, bool cloneModule) + { + ModuleInfo moduleInfo = ModuleController.Instance.GetModule(moduleId, tabId, false); + + int userID = -1; + + UserInfo user = UserController.Instance.GetCurrentUserInfo(); + if (user != null) { - ModuleInfo moduleInfo = ModuleController.Instance.GetModule(moduleId, tabId, false); + userID = user.UserID; + } - int userID = -1; + if (moduleInfo is { IsDeleted: false }) + { + // Is this from a site other than our own? (i.e., is the user requesting "module sharing"?) + var remote = moduleInfo.PortalID != PortalSettings.Current.PortalId; + if (remote) + { + switch (moduleInfo.DesktopModule.Shareable) + { + case ModuleSharing.Unsupported: + // Should never happen since the module should not be listed in the first place. + throw new SharingUnsupportedException($"Module '{moduleInfo.DesktopModule.FriendlyName}' does not support Shareable and should not be listed in Add Existing Module from a different source site"); + case ModuleSharing.Supported: + case ModuleSharing.Unknown: + break; + } + } - UserInfo user = UserController.Instance.GetCurrentUserInfo(); - if (user != null) + if (!ModulePermissionController.HasModuleAccess(SecurityAccessLevel.Edit, "MANAGE", moduleInfo)) { - userID = user.UserID; + throw new SecurityException($"Module '{moduleInfo.ModuleID}' is not available in current context."); } - if (moduleInfo is { IsDeleted: false }) + // clone the module object ( to avoid creating an object reference to the data cache ) + ModuleInfo newModule = moduleInfo.Clone(); + + newModule.UniqueId = Guid.NewGuid(); // Cloned Module requires a different uniqueID + newModule.TabModuleID = Null.NullInteger; + newModule.PortalID = PortalSettings.Current.PortalId; + newModule.TabID = PortalSettings.Current.ActiveTab.TabID; + newModule.ModuleOrder = position; + newModule.PaneName = paneName; + newModule.Alignment = align; + + if (cloneModule) { - // Is this from a site other than our own? (i.e., is the user requesting "module sharing"?) - var remote = moduleInfo.PortalID != PortalSettings.Current.PortalId; - if (remote) + newModule.ModuleID = Null.NullInteger; + + // copy module settings and tab module settings + newModule.ModuleSettings.Clear(); + foreach (var key in moduleInfo.ModuleSettings.Keys) { - switch (moduleInfo.DesktopModule.Shareable) - { - case ModuleSharing.Unsupported: - // Should never happen since the module should not be listed in the first place. - throw new SharingUnsupportedException($"Module '{moduleInfo.DesktopModule.FriendlyName}' does not support Shareable and should not be listed in Add Existing Module from a different source site"); - case ModuleSharing.Supported: - case ModuleSharing.Unknown: - break; - } + newModule.ModuleSettings.Add(key, moduleInfo.ModuleSettings[key]); } - if (!ModulePermissionController.HasModuleAccess(SecurityAccessLevel.Edit, "MANAGE", moduleInfo)) + newModule.TabModuleSettings.Clear(); + foreach (var key in moduleInfo.TabModuleSettings.Keys) { - throw new SecurityException($"Module '{moduleInfo.ModuleID}' is not available in current context."); + newModule.TabModuleSettings.Add(key, moduleInfo.TabModuleSettings[key]); } - // clone the module object ( to avoid creating an object reference to the data cache ) - ModuleInfo newModule = moduleInfo.Clone(); - - newModule.UniqueId = Guid.NewGuid(); // Cloned Module requires a different uniqueID - newModule.TabModuleID = Null.NullInteger; - newModule.PortalID = PortalSettings.Current.PortalId; - newModule.TabID = PortalSettings.Current.ActiveTab.TabID; - newModule.ModuleOrder = position; - newModule.PaneName = paneName; - newModule.Alignment = align; + // reset the module id + newModule.ModuleID = ModuleController.Instance.AddModule(newModule); - if (cloneModule) + if (!string.IsNullOrEmpty(newModule.DesktopModule.BusinessControllerClass)) { - newModule.ModuleID = Null.NullInteger; - - // copy module settings and tab module settings - newModule.ModuleSettings.Clear(); - foreach (var key in moduleInfo.ModuleSettings.Keys) + var portable = this.businessControllerProvider.GetInstance(newModule); + if (portable is not null) { - newModule.ModuleSettings.Add(key, moduleInfo.ModuleSettings[key]); - } - - newModule.TabModuleSettings.Clear(); - foreach (var key in moduleInfo.TabModuleSettings.Keys) - { - newModule.TabModuleSettings.Add(key, moduleInfo.TabModuleSettings[key]); - } - - // reset the module id - newModule.ModuleID = ModuleController.Instance.AddModule(newModule); - - if (!string.IsNullOrEmpty(newModule.DesktopModule.BusinessControllerClass)) - { - var portable = this.businessControllerProvider.GetInstance(newModule); - if (portable is not null) + try { - try + SetCloneModuleContext(true); + var content = portable.ExportModule(moduleId); + if (!string.IsNullOrEmpty(content)) { - SetCloneModuleContext(true); - var content = portable.ExportModule(moduleId); - if (!string.IsNullOrEmpty(content)) - { - portable.ImportModule( - newModule.ModuleID, - content, - newModule.DesktopModule.Version, - userID); - } - } - finally - { - SetCloneModuleContext(false); + portable.ImportModule( + newModule.ModuleID, + content, + newModule.DesktopModule.Version, + userID); } } + finally + { + SetCloneModuleContext(false); + } } } - else + } + else + { + // copy tab module settings + newModule.TabModuleSettings.Clear(); + foreach (var key in moduleInfo.TabModuleSettings.Keys) { - // copy tab module settings - newModule.TabModuleSettings.Clear(); - foreach (var key in moduleInfo.TabModuleSettings.Keys) - { - newModule.TabModuleSettings.Add(key, moduleInfo.TabModuleSettings[key]); - } - - ModuleController.Instance.AddModule(newModule); + newModule.TabModuleSettings.Add(key, moduleInfo.TabModuleSettings[key]); } - // if the tab of original module has custom stylesheet defined, then also copy the stylesheet - // to the destination tab if its custom stylesheet is empty. - var originalTab = TabController.Instance.GetTab(moduleInfo.TabID, moduleInfo.PortalID); - var targetTab = PortalSettings.Current.ActiveTab; - if (originalTab != null - && originalTab.TabSettings.ContainsKey("CustomStylesheet") - && !string.IsNullOrEmpty(originalTab.TabSettings["CustomStylesheet"].ToString()) - && (!targetTab.TabSettings.ContainsKey("CustomStylesheet") || - string.IsNullOrEmpty(targetTab.TabSettings["CustomStylesheet"].ToString()))) - { - TabController.Instance.UpdateTabSetting(targetTab.TabID, "CustomStylesheet", originalTab.TabSettings["CustomStylesheet"].ToString()); - } + ModuleController.Instance.AddModule(newModule); + } - if (remote) - { - // Ensure the Portal Admin has View rights - var arrSystemModuleViewPermissions = this.permissionDefinitionService.GetDefinitionsByCodeAndKey("SYSTEM_MODULE_DEFINITION", "VIEW"); - AddModulePermission( - newModule, - arrSystemModuleViewPermissions.First(), - PortalSettings.Current.AdministratorRoleId, - Null.NullInteger, - true); - - // Set PortalID correctly - newModule.OwnerPortalID = newModule.PortalID; - newModule.PortalID = PortalSettings.Current.PortalId; - ModulePermissionController.SaveModulePermissions(newModule); - } + // if the tab of original module has custom stylesheet defined, then also copy the stylesheet + // to the destination tab if its custom stylesheet is empty. + var originalTab = TabController.Instance.GetTab(moduleInfo.TabID, moduleInfo.PortalID); + var targetTab = PortalSettings.Current.ActiveTab; + if (originalTab != null + && originalTab.TabSettings.ContainsKey("CustomStylesheet") + && !string.IsNullOrEmpty(originalTab.TabSettings["CustomStylesheet"].ToString()) + && (!targetTab.TabSettings.ContainsKey("CustomStylesheet") || + string.IsNullOrEmpty(targetTab.TabSettings["CustomStylesheet"].ToString()))) + { + TabController.Instance.UpdateTabSetting(targetTab.TabID, "CustomStylesheet", originalTab.TabSettings["CustomStylesheet"].ToString()); + } - // Add Event Log - this.eventLogger.AddLog(newModule, PortalSettings.Current, userID, string.Empty, EventLogType.MODULE_CREATED); + if (remote) + { + // Ensure the Portal Admin has View rights + var arrSystemModuleViewPermissions = this.permissionDefinitionService.GetDefinitionsByCodeAndKey("SYSTEM_MODULE_DEFINITION", "VIEW"); + AddModulePermission( + newModule, + arrSystemModuleViewPermissions.First(), + PortalSettings.Current.AdministratorRoleId, + Null.NullInteger, + true); - return newModule.ModuleID; + // Set PortalID correctly + newModule.OwnerPortalID = newModule.PortalID; + newModule.PortalID = PortalSettings.Current.PortalId; + ModulePermissionController.SaveModulePermissions(newModule); } - return -1; + // Add Event Log + this.eventLogger.AddLog(newModule, PortalSettings.Current, userID, string.Empty, EventLogType.MODULE_CREATED); + + return newModule.ModuleID; } - /// A data transfer object with information about a module definition. - public class ModuleDefDTO - { - /// Gets or sets the module ID. - public int ModuleID { get; set; } + return -1; + } - /// Gets or sets the module name. - public string ModuleName { get; set; } + /// A data transfer object with information about a module definition. + public class ModuleDefDTO + { + /// Gets or sets the module ID. + public int ModuleID { get; set; } - /// Gets or sets the path to the module's image. - public string ModuleImage { get; set; } + /// Gets or sets the module name. + public string ModuleName { get; set; } - /// Gets or sets a value indicating whether the module is bookmarked. - public bool Bookmarked { get; set; } + /// Gets or sets the path to the module's image. + public string ModuleImage { get; set; } - /// Gets or sets a value indicating whether the module is in a bookmarked category. - public bool ExistsInBookmarkCategory { get; set; } - } + /// Gets or sets a value indicating whether the module is bookmarked. + public bool Bookmarked { get; set; } - /// A data transfer object with information about a page. - public class PageDefDTO - { - /// Gets or sets the page's ID. - public int TabID { get; set; } + /// Gets or sets a value indicating whether the module is in a bookmarked category. + public bool ExistsInBookmarkCategory { get; set; } + } - /// Gets or sets the page's indented name. - public string IndentedTabName { get; set; } - } + /// A data transfer object with information about a page. + public class PageDefDTO + { + /// Gets or sets the page's ID. + public int TabID { get; set; } - /// A data transfer object with information about adding a module to a page. - public class AddModuleDTO - { - /// Gets or sets the visibility of the module. - public string Visibility { get; set; } + /// Gets or sets the page's indented name. + public string IndentedTabName { get; set; } + } - /// Gets or sets the position of the module. - public string Position { get; set; } + /// A data transfer object with information about adding a module to a page. + public class AddModuleDTO + { + /// Gets or sets the visibility of the module. + public string Visibility { get; set; } - /// Gets or sets the ID of an existing module. - public string Module { get; set; } + /// Gets or sets the position of the module. + public string Position { get; set; } - /// Gets or sets the ID of the page. - public string Page { get; set; } + /// Gets or sets the ID of an existing module. + public string Module { get; set; } - /// Gets or sets the pane name. - public string Pane { get; set; } + /// Gets or sets the ID of the page. + public string Page { get; set; } - /// Gets or sets a value indicating whether to add an existing module instead of a new module. - public string AddExistingModule { get; set; } + /// Gets or sets the pane name. + public string Pane { get; set; } - /// Gets or sets a value indicating whether to copy an existing module instead of making a shared reference. - public string CopyModule { get; set; } + /// Gets or sets a value indicating whether to add an existing module instead of a new module. + public string AddExistingModule { get; set; } - /// Gets or sets the sort of the module. - public string Sort { get; set; } - } + /// Gets or sets a value indicating whether to copy an existing module instead of making a shared reference. + public string CopyModule { get; set; } - /// A data transfer object with information about the user mode. - public class UserModeDTO - { - /// Gets or sets the user mode. - public string UserMode { get; set; } - } + /// Gets or sets the sort of the module. + public string Sort { get; set; } + } - /// A data transfer object with information about the site to switch to. - public class SwitchSiteDTO - { - /// Gets or sets the portal ID. - public string Site { get; set; } - } + /// A data transfer object with information about the user mode. + public class UserModeDTO + { + /// Gets or sets the user mode. + public string UserMode { get; set; } + } - /// A data transfer object with information about the language to switch to. - public class SwitchLanguageDTO - { - /// Gets or sets the language code. - public string Language { get; set; } - } + /// A data transfer object with information about the site to switch to. + public class SwitchSiteDTO + { + /// Gets or sets the portal ID. + public string Site { get; set; } + } - /// A data transfer object with information about a bookmark to add. - public class BookmarkDTO - { - /// Gets or sets the bookmark title. - public string Title { get; set; } + /// A data transfer object with information about the language to switch to. + public class SwitchLanguageDTO + { + /// Gets or sets the language code. + public string Language { get; set; } + } - /// Gets or sets the bookmark value. - public string Bookmark { get; set; } - } + /// A data transfer object with information about a bookmark to add. + public class BookmarkDTO + { + /// Gets or sets the bookmark title. + public string Title { get; set; } - /// A data transfer object with information about a lock/unlock request. - public class LockingDTO - { - /// Gets or sets a value indicating whether to lock or unlock the site or instance. - public bool Lock { get; set; } - } + /// Gets or sets the bookmark value. + public string Bookmark { get; set; } + } + + /// A data transfer object with information about a lock/unlock request. + public class LockingDTO + { + /// Gets or sets a value indicating whether to lock or unlock the site or instance. + public bool Lock { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/CountryRegionController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/CountryRegionController.cs index 7b738d87c47..a50fcb3d77c 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/CountryRegionController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/CountryRegionController.cs @@ -2,80 +2,79 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices -{ - using System; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web; - using System.Web.Http; +namespace DotNetNuke.Web.InternalServices; - using DotNetNuke.Common; - using DotNetNuke.Common.Lists; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Web.Api; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web; +using System.Web.Http; - using Microsoft.Extensions.DependencyInjection; +using DotNetNuke.Common; +using DotNetNuke.Common.Lists; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Web.Api; - /// A web API controller for retrieving regions and countries. - /// The list controller. - [AllowAnonymous] - public class CountryRegionController(ListController listController) - : DnnApiController - { - private readonly ListController listController = listController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); +using Microsoft.Extensions.DependencyInjection; - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with ListController. Scheduled removal in v12.0.0.")] - public CountryRegionController() - : this(null) - { - } +/// A web API controller for retrieving regions and countries. +/// The list controller. +[AllowAnonymous] +public class CountryRegionController(ListController listController) + : DnnApiController +{ + private readonly ListController listController = listController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - /// Gets the countries. - /// A response with an alphabetized list of objects. - [HttpGet] - public HttpResponseMessage Countries() - { - var searchString = (HttpContext.Current.Request.Params["SearchString"] ?? string.Empty).NormalizeString(); - var countries = CachedCountryList.GetCountryList(this.listController); - return this.Request.CreateResponse(HttpStatusCode.OK, countries.Values.Where( - x => x.NormalizedFullName.IndexOf(searchString, StringComparison.CurrentCulture) > -1).OrderBy(x => x.NormalizedFullName)); - } + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with ListController. Scheduled removal in v12.0.0.")] + public CountryRegionController() + : this(null) + { + } - /// Gets the regions for a country. - /// The country ID. - /// A response with an alphabetized list of objects. - [HttpGet] - public HttpResponseMessage Regions(int country) + /// Gets the countries. + /// A response with an alphabetized list of objects. + [HttpGet] + public HttpResponseMessage Countries() + { + var searchString = (HttpContext.Current.Request.Params["SearchString"] ?? string.Empty).NormalizeString(); + var countries = CachedCountryList.GetCountryList(this.listController); + return this.Request.CreateResponse(HttpStatusCode.OK, countries.Values.Where( + x => x.NormalizedFullName.IndexOf(searchString, StringComparison.CurrentCulture) > -1).OrderBy(x => x.NormalizedFullName)); + } + + /// Gets the regions for a country. + /// The country ID. + /// A response with an alphabetized list of objects. + [HttpGet] + public HttpResponseMessage Regions(int country) + { + List res = []; + foreach (ListEntryInfo r in this.listController.GetListEntryInfoItems("Region").Where(l => l.ParentID == country)) { - List res = []; - foreach (ListEntryInfo r in this.listController.GetListEntryInfoItems("Region").Where(l => l.ParentID == country)) + res.Add(new Region { - res.Add(new Region - { - Text = r.Text, - Value = r.EntryID.ToString(CultureInfo.InvariantCulture), - }); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, res.OrderBy(r => r.Text)); + Text = r.Text, + Value = r.EntryID.ToString(CultureInfo.InvariantCulture), + }); } - /// A data transfer object representing a region. - public struct Region - { - /// Gets or sets the text. - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string Text; + return this.Request.CreateResponse(HttpStatusCode.OK, res.OrderBy(r => r.Text)); + } - /// Gets or sets the entry ID. - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string Value; - } + /// A data transfer object representing a region. + public struct Region + { + /// Gets or sets the text. + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string Text; + + /// Gets or sets the entry ID. + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string Value; } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/EventLogServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/EventLogServiceController.cs index c220b21bb5d..bae61ad6c74 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/EventLogServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/EventLogServiceController.cs @@ -2,96 +2,95 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices -{ - using System; - using System.Diagnostics.CodeAnalysis; - using System.Net; - using System.Net.Http; - using System.Text; - using System.Web; - using System.Web.Http; +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Web; +using System.Web.Http; + +using DotNetNuke.Abstractions.Logging; +using DotNetNuke.Common; +using DotNetNuke.Instrumentation; +using DotNetNuke.Services.Localization; +using DotNetNuke.Web.Api; - using DotNetNuke.Abstractions.Logging; - using DotNetNuke.Common; - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.Localization; - using DotNetNuke.Web.Api; +using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.DependencyInjection; +/// A web API which gets event log details. +[DnnAuthorize] +public class EventLogServiceController : DnnApiController +{ + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(EventLogServiceController)); + private readonly IEventLogService eventLogService; - /// A web API which gets event log details. - [DnnAuthorize] - public class EventLogServiceController : DnnApiController + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IEventLogService. Scheduled removal in v12.0.0.")] + public EventLogServiceController() + : this(null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(EventLogServiceController)); - private readonly IEventLogService eventLogService; + } - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IEventLogService. Scheduled removal in v12.0.0.")] - public EventLogServiceController() - : this(null) - { - } + /// Initializes a new instance of the class. + /// The event log service. + public EventLogServiceController(IEventLogService eventLogService) + { + this.eventLogService = eventLogService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } - /// Initializes a new instance of the class. - /// The event log service. - public EventLogServiceController(IEventLogService eventLogService) + /// Gets event log details. + /// The event log GUID. + /// A response with an object with Title and Content fields. + [HttpGet] + [DnnAuthorize(StaticRoles = "Administrators")] + [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", Justification = "Breaking change")] + public HttpResponseMessage GetLogDetails(string guid) + { + if (string.IsNullOrEmpty(guid) || !Guid.TryParse(guid, out _)) { - this.eventLogService = eventLogService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + return this.Request.CreateResponse(HttpStatusCode.BadRequest); } - /// Gets event log details. - /// The event log GUID. - /// A response with an object with Title and Content fields. - [HttpGet] - [DnnAuthorize(StaticRoles = "Administrators")] - [SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", Justification = "Breaking change")] - public HttpResponseMessage GetLogDetails(string guid) + try { - if (string.IsNullOrEmpty(guid) || !Guid.TryParse(guid, out _)) + if (this.eventLogService.GetLog(guid) is not ILogInfo logInfo) { return this.Request.CreateResponse(HttpStatusCode.BadRequest); } - try + return this.Request.CreateResponse(HttpStatusCode.OK, new { - if (this.eventLogService.GetLog(guid) is not ILogInfo logInfo) - { - return this.Request.CreateResponse(HttpStatusCode.BadRequest); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, new - { - Title = Localization.GetSafeJSString("CriticalError.Error", Localization.SharedResourceFile), - Content = GetPropertiesText(logInfo), - }); - } - catch (Exception ex) - { - Logger.Error(ex); - return this.Request.CreateResponse(HttpStatusCode.BadRequest); - } + Title = Localization.GetSafeJSString("CriticalError.Error", Localization.SharedResourceFile), + Content = GetPropertiesText(logInfo), + }); } + catch (Exception ex) + { + Logger.Error(ex); + return this.Request.CreateResponse(HttpStatusCode.BadRequest); + } + } - private static string GetPropertiesText(ILogInfo logInfo) + private static string GetPropertiesText(ILogInfo logInfo) + { + var str = new StringBuilder(); + foreach (var ldi in logInfo.LogProperties) { - var str = new StringBuilder(); - foreach (var ldi in logInfo.LogProperties) + // display the values in the Panel child controls. + if (ldi.PropertyName == "Message") { - // display the values in the Panel child controls. - if (ldi.PropertyName == "Message") - { - str.Append($"

{ldi.PropertyName}:

{HttpUtility.HtmlEncode(ldi.PropertyValue)}

"); - } - else - { - str.Append($"

{ldi.PropertyName}:{HttpUtility.HtmlEncode(ldi.PropertyValue)}

"); - } + str.Append($"

{ldi.PropertyName}:

{HttpUtility.HtmlEncode(ldi.PropertyValue)}

"); + } + else + { + str.Append($"

{ldi.PropertyName}:{HttpUtility.HtmlEncode(ldi.PropertyValue)}

"); } - - str.Append($"

Server Name: {HttpUtility.HtmlEncode(logInfo.LogServerName)}

"); - return str.ToString(); } + + str.Append($"

Server Name: {HttpUtility.HtmlEncode(logInfo.LogServerName)}

"); + return str.ToString(); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs index 06cece5d667..ff95ccf8414 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs @@ -2,828 +2,827 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Formatting; +using System.Net.Http.Headers; +using System.Runtime.Serialization; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using System.Web.Http; +using System.Web.UI.WebControls; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Portals; +using DotNetNuke.Abstractions.Security; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Icons; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Users; +using DotNetNuke.Instrumentation; +using DotNetNuke.Security; +using DotNetNuke.Security.Permissions; +using DotNetNuke.Services.FileSystem; +using DotNetNuke.Services.Localization; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.Api.Internal; + +using Microsoft.Extensions.DependencyInjection; + +using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; + +/// A web API for uploading files. +[DnnAuthorize] +public class FileUploadController : DnnApiController { - using System; - using System.Collections.Generic; - using System.Drawing; - using System.Globalization; - using System.IO; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Net.Http.Formatting; - using System.Net.Http.Headers; - using System.Runtime.Serialization; - using System.Text.RegularExpressions; - using System.Threading; - using System.Threading.Tasks; - using System.Web; - using System.Web.Http; - using System.Web.UI.WebControls; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Abstractions.Security; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Icons; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Services.Localization; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.Api.Internal; - - using Microsoft.Extensions.DependencyInjection; - - using FileInfo = DotNetNuke.Services.FileSystem.FileInfo; - - /// A web API for uploading files. - [DnnAuthorize] - public class FileUploadController : DnnApiController + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(FileUploadController)); + private static readonly Regex UserFolderEx = new Regex(@"users/\d+/\d+/(\d+)/", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly List ImageExtensions = Globals.ImageFileTypes.Split(',').ToList(); + + private readonly IHostSettings hostSettings; + private readonly ICryptographyProvider cryptographyProvider; + private readonly IPortalController portalController; + private readonly IApplicationStatusInfo appStatus; + private readonly IPortalGroupController portalGroupController; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Use overload with ICryptographyProvider. Scheduled for removal in v12.0.0.")] + public FileUploadController() + : this(null, null, null, null, null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(FileUploadController)); - private static readonly Regex UserFolderEx = new Regex(@"users/\d+/\d+/(\d+)/", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly List ImageExtensions = Globals.ImageFileTypes.Split(',').ToList(); - - private readonly IHostSettings hostSettings; - private readonly ICryptographyProvider cryptographyProvider; - private readonly IPortalController portalController; - private readonly IApplicationStatusInfo appStatus; - private readonly IPortalGroupController portalGroupController; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Use overload with ICryptographyProvider. Scheduled for removal in v12.0.0.")] - public FileUploadController() - : this(null, null, null, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The host settings. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Use overload with ICryptographyProvider. Scheduled for removal in v12.0.0.")] - public FileUploadController(IHostSettings hostSettings) - : this(hostSettings, null, null, null, null) - { - } + /// Initializes a new instance of the class. + /// The host settings. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Use overload with ICryptographyProvider. Scheduled for removal in v12.0.0.")] + public FileUploadController(IHostSettings hostSettings) + : this(hostSettings, null, null, null, null) + { + } + + /// Initializes a new instance of the class. + /// The host settings. + /// The cryptography provider. + /// The portal controller. + /// The application status. + /// The portal group controller. + public FileUploadController(IHostSettings hostSettings, ICryptographyProvider cryptographyProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + { + this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.cryptographyProvider = cryptographyProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } - /// Initializes a new instance of the class. - /// The host settings. - /// The cryptography provider. - /// The portal controller. - /// The application status. - /// The portal group controller. - public FileUploadController(IHostSettings hostSettings, ICryptographyProvider cryptographyProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + /// Gets the URL for a file. + /// The ID of the file. + /// The URL. + public static string GetUrl(int fileId) + { + var file = FileManager.Instance.GetFile(fileId, true); + return FileManager.Instance.GetUrl(file); + } + + /// Gets the files in the folder. + /// Information about the folder. + /// A response with a list of objects. + [HttpPost] + public HttpResponseMessage LoadFiles(FolderItemDTO folderItem) + { + int effectivePortalId = this.PortalSettings.PortalId; + + if (folderItem.FolderId <= 0) { - this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.cryptographyProvider = cryptographyProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + return this.Request.CreateResponse(HttpStatusCode.BadRequest); } - /// Gets the URL for a file. - /// The ID of the file. - /// The URL. - public static string GetUrl(int fileId) + var folder = FolderManager.Instance.GetFolder(folderItem.FolderId); + + if (folder == null) { - var file = FileManager.Instance.GetFile(fileId, true); - return FileManager.Instance.GetUrl(file); + return this.Request.CreateResponse(HttpStatusCode.BadRequest); } - /// Gets the files in the folder. - /// Information about the folder. - /// A response with a list of objects. - [HttpPost] - public HttpResponseMessage LoadFiles(FolderItemDTO folderItem) + if (IsUserFolder(folder.FolderPath, out var userId)) { - int effectivePortalId = this.PortalSettings.PortalId; - - if (folderItem.FolderId <= 0) + var user = UserController.GetUserById(this.hostSettings, effectivePortalId, userId); + if (user is { IsSuperUser: true, }) { - return this.Request.CreateResponse(HttpStatusCode.BadRequest); + effectivePortalId = Null.NullInteger; } - - var folder = FolderManager.Instance.GetFolder(folderItem.FolderId); - - if (folder == null) + else { - return this.Request.CreateResponse(HttpStatusCode.BadRequest); + effectivePortalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, effectivePortalId); } + } - if (IsUserFolder(folder.FolderPath, out var userId)) + var list = Globals.GetFileList(effectivePortalId, folderItem.FileFilter, !folderItem.Required, folder.FolderPath); + var fileItems = list.OfType().ToList(); + + return this.Request.CreateResponse(HttpStatusCode.OK, fileItems); + } + + /// Gets the URL of an image file. + /// The file ID. + /// A response with either null or the image URL. + [HttpGet] + public HttpResponseMessage LoadImage(string fileId) + { + if (!string.IsNullOrEmpty(fileId)) + { + int file; + if (int.TryParse(fileId, out file)) { - var user = UserController.GetUserById(this.hostSettings, effectivePortalId, userId); - if (user is { IsSuperUser: true, }) - { - effectivePortalId = Null.NullInteger; - } - else - { - effectivePortalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, effectivePortalId); - } + var imageUrl = ShowImage(file); + return this.Request.CreateResponse(HttpStatusCode.OK, imageUrl); } + } - var list = Globals.GetFileList(effectivePortalId, folderItem.FileFilter, !folderItem.Required, folder.FolderPath); - var fileItems = list.OfType().ToList(); + return this.Request.CreateResponse(HttpStatusCode.InternalServerError); + } - return this.Request.CreateResponse(HttpStatusCode.OK, fileItems); - } + /// Uploads an image. + /// A response with an object. + /// If the request is not using a multipart MIME content type. + [HttpPost] + [IFrameSupportedValidateAntiForgeryToken] + public Task PostFile() + { + HttpRequestMessage request = this.Request; - /// Gets the URL of an image file. - /// The file ID. - /// A response with either null or the image URL. - [HttpGet] - public HttpResponseMessage LoadImage(string fileId) + if (!request.Content.IsMimeMultipartContent()) { - if (!string.IsNullOrEmpty(fileId)) + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + var provider = new MultipartMemoryStreamProvider(); + + // local references for use in closure + IPortalSettings portalSettings = this.PortalSettings; + var currentSynchronizationContext = SynchronizationContext.Current; + var userInfo = this.UserInfo; + var task = request.Content.ReadAsMultipartAsync(provider) + .ContinueWith(_ => { - int file; - if (int.TryParse(fileId, out file)) + string folder = string.Empty; + string filter = string.Empty; + string fileName = string.Empty; + bool overwrite = false; + bool isHostMenu = false; + bool extract = false; + Stream stream = null; + var returnFileDto = new SavedFileDTO(); + + foreach (var item in provider.Contents) { - var imageUrl = ShowImage(file); - return this.Request.CreateResponse(HttpStatusCode.OK, imageUrl); - } - } + var name = item.Headers.ContentDisposition.Name; + switch (name.ToUpperInvariant()) + { + case "\"FOLDER\"": + folder = item.ReadAsStringAsync().Result ?? string.Empty; + break; - return this.Request.CreateResponse(HttpStatusCode.InternalServerError); - } + case "\"FILTER\"": + filter = item.ReadAsStringAsync().Result ?? string.Empty; + break; - /// Uploads an image. - /// A response with an object. - /// If the request is not using a multipart MIME content type. - [HttpPost] - [IFrameSupportedValidateAntiForgeryToken] - public Task PostFile() - { - HttpRequestMessage request = this.Request; + case "\"OVERWRITE\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out overwrite)) + { + overwrite = false; + } - if (!request.Content.IsMimeMultipartContent()) - { - throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); - } + break; + + case "\"ISHOSTMENU\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out isHostMenu)) + { + isHostMenu = false; + } - var provider = new MultipartMemoryStreamProvider(); + break; - // local references for use in closure - IPortalSettings portalSettings = this.PortalSettings; - var currentSynchronizationContext = SynchronizationContext.Current; - var userInfo = this.UserInfo; - var task = request.Content.ReadAsMultipartAsync(provider) - .ContinueWith(_ => - { - string folder = string.Empty; - string filter = string.Empty; - string fileName = string.Empty; - bool overwrite = false; - bool isHostMenu = false; - bool extract = false; - Stream stream = null; - var returnFileDto = new SavedFileDTO(); - - foreach (var item in provider.Contents) - { - var name = item.Headers.ContentDisposition.Name; - switch (name.ToUpperInvariant()) + case "\"EXTRACT\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out extract)) { - case "\"FOLDER\"": - folder = item.ReadAsStringAsync().Result ?? string.Empty; - break; - - case "\"FILTER\"": - filter = item.ReadAsStringAsync().Result ?? string.Empty; - break; - - case "\"OVERWRITE\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out overwrite)) - { - overwrite = false; - } - - break; - - case "\"ISHOSTMENU\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out isHostMenu)) - { - isHostMenu = false; - } - - break; - - case "\"EXTRACT\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out extract)) - { - extract = false; - } - - break; - - case "\"POSTFILE\"": - fileName = item.Headers.ContentDisposition.FileName.Replace("\"", string.Empty); - if (fileName.IndexOf(@"\", StringComparison.Ordinal) != -1) - { - fileName = Path.GetFileName(fileName); - } - - stream = item.ReadAsStreamAsync().Result; - break; + extract = false; } - } - var errorMessage = string.Empty; - var alreadyExists = false; - if (!string.IsNullOrEmpty(fileName) && stream != null) - { - // Everything ready - - // The SynchronizationContext keeps the main thread context. Send method is synchronous - currentSynchronizationContext.Send( - _ => - { - returnFileDto = SaveFile(stream, this.portalController, this.appStatus, this.portalGroupController, this.hostSettings, portalSettings, userInfo, folder, filter, fileName, overwrite, isHostMenu, extract, out alreadyExists, out errorMessage); - }, - null); - } - - /* Response Content Type cannot be application/json - * because IE9 with iframe-transport manages the response - * as a file download - */ - var mediaTypeFormatter = new JsonMediaTypeFormatter(); - mediaTypeFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); - - if (!string.IsNullOrEmpty(errorMessage)) - { - return this.Request.CreateResponse( - HttpStatusCode.BadRequest, - new - { - AlreadyExists = alreadyExists, - Message = string.Format( - CultureInfo.CurrentCulture, - GetLocalizedString("ErrorMessage"), - fileName, - errorMessage), - }, - mediaTypeFormatter, - "text/plain"); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, returnFileDto, mediaTypeFormatter, "text/plain"); - }); - - return task; - } + break; - /// Uploads a file to the current portal. - /// A response with a object. - [HttpPost] - [IFrameSupportedValidateAntiForgeryToken] - [AllowAnonymous] - public Task UploadFromLocal() - { - return this.UploadFromLocal(this.PortalSettings.PortalId); - } + case "\"POSTFILE\"": + fileName = item.Headers.ContentDisposition.FileName.Replace("\"", string.Empty); + if (fileName.IndexOf(@"\", StringComparison.Ordinal) != -1) + { + fileName = Path.GetFileName(fileName); + } - /// Uploads a file. - /// The ID of the portal to which to upload it. - /// A response with a object. - /// If the request is not using a multipart MIME content type. - [HttpPost] - [IFrameSupportedValidateAntiForgeryToken] - [AllowAnonymous] - public Task UploadFromLocal(int portalId) - { - var request = this.Request; - FileUploadDto result = null; - if (!request.Content.IsMimeMultipartContent()) - { - throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); - } + stream = item.ReadAsStreamAsync().Result; + break; + } + } - if (portalId > -1) - { - if (!this.IsPortalIdValid(portalId)) + var errorMessage = string.Empty; + var alreadyExists = false; + if (!string.IsNullOrEmpty(fileName) && stream != null) { - throw new HttpResponseException(HttpStatusCode.Unauthorized); + // Everything ready + + // The SynchronizationContext keeps the main thread context. Send method is synchronous + currentSynchronizationContext.Send( + _ => + { + returnFileDto = SaveFile(stream, this.portalController, this.appStatus, this.portalGroupController, this.hostSettings, portalSettings, userInfo, folder, filter, fileName, overwrite, isHostMenu, extract, out alreadyExists, out errorMessage); + }, + null); } - } - else - { - portalId = this.PortalSettings.PortalId; - } - var provider = new MultipartMemoryStreamProvider(); + /* Response Content Type cannot be application/json + * because IE9 with iframe-transport manages the response + * as a file download + */ + var mediaTypeFormatter = new JsonMediaTypeFormatter(); + mediaTypeFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); - // local references for use in closure - var currentSynchronizationContext = SynchronizationContext.Current; - var userInfo = this.UserInfo; - var task = request.Content.ReadAsMultipartAsync(provider) - .ContinueWith(_ => + if (!string.IsNullOrEmpty(errorMessage)) { - var folder = string.Empty; - var filter = string.Empty; - var fileName = string.Empty; - var validationCode = string.Empty; - var overwrite = false; - var isHostPortal = false; - var extract = false; - Stream stream = null; - - foreach (var item in provider.Contents) - { - var name = item.Headers.ContentDisposition.Name; - switch (name.ToUpperInvariant()) + return this.Request.CreateResponse( + HttpStatusCode.BadRequest, + new { - case "\"FOLDER\"": - folder = item.ReadAsStringAsync().Result ?? string.Empty; - break; - - case "\"FILTER\"": - filter = item.ReadAsStringAsync().Result ?? string.Empty; - break; + AlreadyExists = alreadyExists, + Message = string.Format( + CultureInfo.CurrentCulture, + GetLocalizedString("ErrorMessage"), + fileName, + errorMessage), + }, + mediaTypeFormatter, + "text/plain"); + } - case "\"OVERWRITE\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out overwrite)) - { - overwrite = false; - } + return this.Request.CreateResponse(HttpStatusCode.OK, returnFileDto, mediaTypeFormatter, "text/plain"); + }); - break; + return task; + } - case "\"ISHOSTPORTAL\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out isHostPortal)) - { - isHostPortal = false; - } + /// Uploads a file to the current portal. + /// A response with a object. + [HttpPost] + [IFrameSupportedValidateAntiForgeryToken] + [AllowAnonymous] + public Task UploadFromLocal() + { + return this.UploadFromLocal(this.PortalSettings.PortalId); + } - break; + /// Uploads a file. + /// The ID of the portal to which to upload it. + /// A response with a object. + /// If the request is not using a multipart MIME content type. + [HttpPost] + [IFrameSupportedValidateAntiForgeryToken] + [AllowAnonymous] + public Task UploadFromLocal(int portalId) + { + var request = this.Request; + FileUploadDto result = null; + if (!request.Content.IsMimeMultipartContent()) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } - case "\"EXTRACT\"": - if (!bool.TryParse(item.ReadAsStringAsync().Result, out extract)) - { - extract = false; - } + if (portalId > -1) + { + if (!this.IsPortalIdValid(portalId)) + { + throw new HttpResponseException(HttpStatusCode.Unauthorized); + } + } + else + { + portalId = this.PortalSettings.PortalId; + } - break; + var provider = new MultipartMemoryStreamProvider(); - case "\"PORTALID\"": - if (userInfo.IsSuperUser) - { - var originalPortalId = portalId; - if (!int.TryParse(item.ReadAsStringAsync().Result, out portalId)) - { - portalId = originalPortalId; - } - } + // local references for use in closure + var currentSynchronizationContext = SynchronizationContext.Current; + var userInfo = this.UserInfo; + var task = request.Content.ReadAsMultipartAsync(provider) + .ContinueWith(_ => + { + var folder = string.Empty; + var filter = string.Empty; + var fileName = string.Empty; + var validationCode = string.Empty; + var overwrite = false; + var isHostPortal = false; + var extract = false; + Stream stream = null; + + foreach (var item in provider.Contents) + { + var name = item.Headers.ContentDisposition.Name; + switch (name.ToUpperInvariant()) + { + case "\"FOLDER\"": + folder = item.ReadAsStringAsync().Result ?? string.Empty; + break; - break; - case "\"VALIDATIONCODE\"": - validationCode = item.ReadAsStringAsync().Result ?? string.Empty; - break; - case "\"POSTFILE\"": - fileName = item.Headers.ContentDisposition.FileName.Replace("\"", string.Empty); - if (fileName.IndexOf(@"\", StringComparison.Ordinal) != -1) - { - fileName = Path.GetFileName(fileName); - } + case "\"FILTER\"": + filter = item.ReadAsStringAsync().Result ?? string.Empty; + break; - if (!Globals.FileEscapingRegex.IsMatch(fileName)) - { - stream = item.ReadAsStreamAsync().Result; - } + case "\"OVERWRITE\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out overwrite)) + { + overwrite = false; + } - break; - } - } + break; - if (!string.IsNullOrEmpty(fileName) && stream != null) - { - // The SynchronizationContext keeps the main thread context. Send method is synchronous - currentSynchronizationContext.Send( - _ => + case "\"ISHOSTPORTAL\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out isHostPortal)) { - result = UploadFile(this.cryptographyProvider, this.hostSettings, stream, portalId, userInfo, folder, filter, fileName, overwrite, isHostPortal, extract, validationCode); - }, - null); - } + isHostPortal = false; + } - var mediaTypeFormatter = new JsonMediaTypeFormatter(); - mediaTypeFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); + break; - /* Response Content Type cannot be application/json - * because IE9 with iframe-transport manages the response - * as a file download - */ - return this.Request.CreateResponse( - HttpStatusCode.OK, - result, - mediaTypeFormatter, - "text/plain"); - }); + case "\"EXTRACT\"": + if (!bool.TryParse(item.ReadAsStringAsync().Result, out extract)) + { + extract = false; + } - return task; - } + break; - private static SavedFileDTO SaveFile( - Stream stream, - IPortalController portalController, - IApplicationStatusInfo appStatus, - IPortalGroupController portalGroupController, - IHostSettings hostSettings, - IPortalSettings portalSettings, - UserInfo userInfo, - string folder, - string filter, - string fileName, - bool overwrite, - bool isHostMenu, - bool extract, - out bool alreadyExists, - out string errorMessage) - { - alreadyExists = false; - var savedFileDto = new SavedFileDTO(); - try - { - var extension = Path.GetExtension(fileName).ValueOrEmpty().Replace(".", string.Empty); - if (!string.IsNullOrEmpty(filter) && !filter.ToLowerInvariant().Contains(extension.ToLowerInvariant())) - { - errorMessage = GetLocalizedString("ExtensionNotAllowed"); - return savedFileDto; - } + case "\"PORTALID\"": + if (userInfo.IsSuperUser) + { + var originalPortalId = portalId; + if (!int.TryParse(item.ReadAsStringAsync().Result, out portalId)) + { + portalId = originalPortalId; + } + } - var folderManager = FolderManager.Instance; + break; + case "\"VALIDATIONCODE\"": + validationCode = item.ReadAsStringAsync().Result ?? string.Empty; + break; + case "\"POSTFILE\"": + fileName = item.Headers.ContentDisposition.FileName.Replace("\"", string.Empty); + if (fileName.IndexOf(@"\", StringComparison.Ordinal) != -1) + { + fileName = Path.GetFileName(fileName); + } - // Check if this is a User Folder - var effectivePortalId = isHostMenu ? Null.NullInteger : PortalController.GetEffectivePortalId(portalController, appStatus, portalGroupController, portalSettings.PortalId); - var folderInfo = folderManager.GetFolder(effectivePortalId, folder); - if (IsUserFolder(folder, out var userId)) - { - var user = UserController.GetUserById(hostSettings, effectivePortalId, userId); - if (user != null) - { - folderInfo = folderManager.GetUserFolder(user); + if (!Globals.FileEscapingRegex.IsMatch(fileName)) + { + stream = item.ReadAsStreamAsync().Result; + } + + break; } } - if (!PortalSecurity.IsInRoles(userInfo, portalSettings, folderInfo.FolderPermissions.ToString("WRITE")) - && !PortalSecurity.IsInRoles(userInfo, portalSettings, folderInfo.FolderPermissions.ToString("ADD"))) + if (!string.IsNullOrEmpty(fileName) && stream != null) { - errorMessage = GetLocalizedString("NoPermission"); - return savedFileDto; + // The SynchronizationContext keeps the main thread context. Send method is synchronous + currentSynchronizationContext.Send( + _ => + { + result = UploadFile(this.cryptographyProvider, this.hostSettings, stream, portalId, userInfo, folder, filter, fileName, overwrite, isHostPortal, extract, validationCode); + }, + null); } - const bool AlreadyCheckedPermissions = true; - if (!overwrite && FileManager.Instance.FileExists(folderInfo, fileName, true)) - { - errorMessage = GetLocalizedString("AlreadyExists"); - alreadyExists = true; - savedFileDto.FilePath = Path.Combine(folderInfo.PhysicalPath, fileName); - return savedFileDto; - } + var mediaTypeFormatter = new JsonMediaTypeFormatter(); + mediaTypeFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); + + /* Response Content Type cannot be application/json + * because IE9 with iframe-transport manages the response + * as a file download + */ + return this.Request.CreateResponse( + HttpStatusCode.OK, + result, + mediaTypeFormatter, + "text/plain"); + }); + + return task; + } - var contentType = FileContentTypeManager.Instance.GetContentType(Path.GetExtension(fileName)); - var file = FileManager.Instance.AddFile(folderInfo, fileName, stream, true, !AlreadyCheckedPermissions, contentType, userInfo.UserID); + private static SavedFileDTO SaveFile( + Stream stream, + IPortalController portalController, + IApplicationStatusInfo appStatus, + IPortalGroupController portalGroupController, + IHostSettings hostSettings, + IPortalSettings portalSettings, + UserInfo userInfo, + string folder, + string filter, + string fileName, + bool overwrite, + bool isHostMenu, + bool extract, + out bool alreadyExists, + out string errorMessage) + { + alreadyExists = false; + var savedFileDto = new SavedFileDTO(); + try + { + var extension = Path.GetExtension(fileName).ValueOrEmpty().Replace(".", string.Empty); + if (!string.IsNullOrEmpty(filter) && !filter.ToLowerInvariant().Contains(extension.ToLowerInvariant())) + { + errorMessage = GetLocalizedString("ExtensionNotAllowed"); + return savedFileDto; + } - if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) + var folderManager = FolderManager.Instance; + + // Check if this is a User Folder + var effectivePortalId = isHostMenu ? Null.NullInteger : PortalController.GetEffectivePortalId(portalController, appStatus, portalGroupController, portalSettings.PortalId); + var folderInfo = folderManager.GetFolder(effectivePortalId, folder); + if (IsUserFolder(folder, out var userId)) + { + var user = UserController.GetUserById(hostSettings, effectivePortalId, userId); + if (user != null) { - FileManager.Instance.UnzipFile(file); - FileManager.Instance.DeleteFile(file); + folderInfo = folderManager.GetUserFolder(user); } + } - errorMessage = string.Empty; - savedFileDto.FileId = file.FileId.ToString(CultureInfo.InvariantCulture); - savedFileDto.FilePath = FileManager.Instance.GetUrl(file); + if (!PortalSecurity.IsInRoles(userInfo, portalSettings, folderInfo.FolderPermissions.ToString("WRITE")) + && !PortalSecurity.IsInRoles(userInfo, portalSettings, folderInfo.FolderPermissions.ToString("ADD"))) + { + errorMessage = GetLocalizedString("NoPermission"); return savedFileDto; } - catch (InvalidFileExtensionException) + + const bool AlreadyCheckedPermissions = true; + if (!overwrite && FileManager.Instance.FileExists(folderInfo, fileName, true)) { - errorMessage = GetLocalizedString("ExtensionNotAllowed"); + errorMessage = GetLocalizedString("AlreadyExists"); + alreadyExists = true; + savedFileDto.FilePath = Path.Combine(folderInfo.PhysicalPath, fileName); return savedFileDto; } - catch (Exception ex) + + var contentType = FileContentTypeManager.Instance.GetContentType(Path.GetExtension(fileName)); + var file = FileManager.Instance.AddFile(folderInfo, fileName, stream, true, !AlreadyCheckedPermissions, contentType, userInfo.UserID); + + if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) { - Logger.Error(ex); - errorMessage = ex.Message; - return savedFileDto; + FileManager.Instance.UnzipFile(file); + FileManager.Instance.DeleteFile(file); } - } - private static string GetLocalizedString(string key) + errorMessage = string.Empty; + savedFileDto.FileId = file.FileId.ToString(CultureInfo.InvariantCulture); + savedFileDto.FilePath = FileManager.Instance.GetUrl(file); + return savedFileDto; + } + catch (InvalidFileExtensionException) { - const string resourceFile = "/App_GlobalResources/FileUpload.resx"; - return Localization.GetString(key, resourceFile); + errorMessage = GetLocalizedString("ExtensionNotAllowed"); + return savedFileDto; } - - private static bool IsUserFolder(string folderPath, out int userId) + catch (Exception ex) { - var match = UserFolderEx.Match(folderPath); - userId = match.Success ? int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture) : Null.NullInteger; - - return match.Success; + Logger.Error(ex); + errorMessage = ex.Message; + return savedFileDto; } + } - private static string ShowImage(int fileId) - { - var image = (FileInfo)FileManager.Instance.GetFile(fileId); + private static string GetLocalizedString(string key) + { + const string resourceFile = "/App_GlobalResources/FileUpload.resx"; + return Localization.GetString(key, resourceFile); + } - if (image != null && IsImageExtension(image.Extension)) - { - var imageUrl = FileManager.Instance.GetUrl(image); - return imageUrl; - } + private static bool IsUserFolder(string folderPath, out int userId) + { + var match = UserFolderEx.Match(folderPath); + userId = match.Success ? int.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture) : Null.NullInteger; - return null; - } + return match.Success; + } - private static bool IsImageExtension(string extension) - { - return ImageExtensions.Any(e => e.Equals(extension, StringComparison.OrdinalIgnoreCase)); - } + private static string ShowImage(int fileId) + { + var image = (FileInfo)FileManager.Instance.GetFile(fileId); - private static bool IsImage(string fileName) + if (image != null && IsImageExtension(image.Extension)) { - return ImageExtensions.Any(extension => fileName.EndsWith("." + extension, StringComparison.OrdinalIgnoreCase)); + var imageUrl = FileManager.Instance.GetUrl(image); + return imageUrl; } - private static FileUploadDto UploadFile( - ICryptographyProvider cryptographyProvider, - IHostSettings hostSettings, - Stream stream, - int portalId, - UserInfo userInfo, - string folder, - string filter, - string fileName, - bool overwrite, - bool isHostPortal, - bool extract, - string validationCode) + return null; + } + + private static bool IsImageExtension(string extension) + { + return ImageExtensions.Any(e => e.Equals(extension, StringComparison.OrdinalIgnoreCase)); + } + + private static bool IsImage(string fileName) + { + return ImageExtensions.Any(extension => fileName.EndsWith("." + extension, StringComparison.OrdinalIgnoreCase)); + } + + private static FileUploadDto UploadFile( + ICryptographyProvider cryptographyProvider, + IHostSettings hostSettings, + Stream stream, + int portalId, + UserInfo userInfo, + string folder, + string filter, + string fileName, + bool overwrite, + bool isHostPortal, + bool extract, + string validationCode) + { + var result = new FileUploadDto(); + BinaryReader reader = null; + Stream fileContent = null; + try { - var result = new FileUploadDto(); - BinaryReader reader = null; - Stream fileContent = null; - try + var extensionList = new List(); + if (!string.IsNullOrWhiteSpace(filter)) { - var extensionList = new List(); - if (!string.IsNullOrWhiteSpace(filter)) - { - extensionList = filter.Split(',').Select(i => i.Trim()).ToList(); - } + extensionList = filter.Split(',').Select(i => i.Trim()).ToList(); + } - var validateParams = new List { extensionList, userInfo.UserID }; - if (!userInfo.IsSuperUser) - { - validateParams.Add(portalId); - } + var validateParams = new List { extensionList, userInfo.UserID }; + if (!userInfo.IsSuperUser) + { + validateParams.Add(portalId); + } - if (!ValidationUtils.ValidationCodeMatched(cryptographyProvider, hostSettings, validateParams, validationCode)) - { - throw new InvalidOperationException("Bad Request"); - } + if (!ValidationUtils.ValidationCodeMatched(cryptographyProvider, hostSettings, validateParams, validationCode)) + { + throw new InvalidOperationException("Bad Request"); + } - var extension = Path.GetExtension(fileName).ValueOrEmpty().Replace(".", string.Empty); - result.FileIconUrl = IconController.GetFileIconUrl(extension); + var extension = Path.GetExtension(fileName).ValueOrEmpty().Replace(".", string.Empty); + result.FileIconUrl = IconController.GetFileIconUrl(extension); - if (!string.IsNullOrEmpty(filter) && !filter.ToLowerInvariant().Contains(extension.ToLowerInvariant())) - { - result.Message = GetLocalizedString("ExtensionNotAllowed"); - return result; - } + if (!string.IsNullOrEmpty(filter) && !filter.ToLowerInvariant().Contains(extension.ToLowerInvariant())) + { + result.Message = GetLocalizedString("ExtensionNotAllowed"); + return result; + } - var folderManager = FolderManager.Instance; - var effectivePortalId = isHostPortal ? Null.NullInteger : portalId; - var folderInfo = folderManager.GetFolder(effectivePortalId, folder); + var folderManager = FolderManager.Instance; + var effectivePortalId = isHostPortal ? Null.NullInteger : portalId; + var folderInfo = folderManager.GetFolder(effectivePortalId, folder); - if (folderInfo == null && IsUserFolder(folder, out var userId)) + if (folderInfo == null && IsUserFolder(folder, out var userId)) + { + var user = UserController.GetUserById(hostSettings, effectivePortalId, userId); + if (user != null) { - var user = UserController.GetUserById(hostSettings, effectivePortalId, userId); - if (user != null) - { - folderInfo = folderManager.GetUserFolder(user); - } + folderInfo = folderManager.GetUserFolder(user); } + } - if (!FolderPermissionController.HasFolderPermission(portalId, folder, "WRITE") - && !FolderPermissionController.HasFolderPermission(portalId, folder, "ADD")) - { - result.Message = GetLocalizedString("NoPermission"); - return result; - } + if (!FolderPermissionController.HasFolderPermission(portalId, folder, "WRITE") + && !FolderPermissionController.HasFolderPermission(portalId, folder, "ADD")) + { + result.Message = GetLocalizedString("NoPermission"); + return result; + } - const bool AlreadyCheckedPermissions = true; - IFileInfo file; - if (!overwrite && FileManager.Instance.FileExists(folderInfo, fileName, true)) + const bool AlreadyCheckedPermissions = true; + IFileInfo file; + if (!overwrite && FileManager.Instance.FileExists(folderInfo, fileName, true)) + { + result.Message = GetLocalizedString("AlreadyExists"); + result.AlreadyExists = true; + file = FileManager.Instance.GetFile(folderInfo, fileName, true); + result.FileId = file.FileId; + } + else + { + file = FileManager.Instance.AddFile(folderInfo, fileName, stream, true, !AlreadyCheckedPermissions, FileContentTypeManager.Instance.GetContentType(Path.GetExtension(fileName)), userInfo.UserID); + if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) { - result.Message = GetLocalizedString("AlreadyExists"); - result.AlreadyExists = true; - file = FileManager.Instance.GetFile(folderInfo, fileName, true); - result.FileId = file.FileId; + var destinationFolder = FolderManager.Instance.GetFolder(file.FolderId); + var invalidFiles = new List(); + var filesCount = FileManager.Instance.UnzipFile(file, destinationFolder, invalidFiles); + + var invalidFilesJson = invalidFiles.Count > 0 + ? string.Join(",", invalidFiles.Select(invalidFile => HttpUtility.JavaScriptStringEncode(invalidFile, addDoubleQuotes: true))) + : string.Empty; + result.Prompt = $"{{\"invalidFiles\":[{invalidFilesJson}], \"totalCount\": {filesCount}}}"; } - else - { - file = FileManager.Instance.AddFile(folderInfo, fileName, stream, true, !AlreadyCheckedPermissions, FileContentTypeManager.Instance.GetContentType(Path.GetExtension(fileName)), userInfo.UserID); - if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) - { - var destinationFolder = FolderManager.Instance.GetFolder(file.FolderId); - var invalidFiles = new List(); - var filesCount = FileManager.Instance.UnzipFile(file, destinationFolder, invalidFiles); - - var invalidFilesJson = invalidFiles.Count > 0 - ? string.Join(",", invalidFiles.Select(invalidFile => HttpUtility.JavaScriptStringEncode(invalidFile, addDoubleQuotes: true))) - : string.Empty; - result.Prompt = $"{{\"invalidFiles\":[{invalidFilesJson}], \"totalCount\": {filesCount}}}"; - } - result.FileId = file.FileId; - } + result.FileId = file.FileId; + } - fileContent = FileManager.Instance.GetFileContent(file); + fileContent = FileManager.Instance.GetFileContent(file); - var path = GetUrl(result.FileId); - using (reader = new BinaryReader(fileContent)) + var path = GetUrl(result.FileId); + using (reader = new BinaryReader(fileContent)) + { + Size size; + if (IsImage(fileName)) { - Size size; - if (IsImage(fileName)) + try { - try - { - size = ImageHeader.GetDimensions(reader); - } - catch (ArgumentException exc) - { - Logger.Warn("Unable to get image dimensions for image file", exc); - size = new Size(32, 32); - } + size = ImageHeader.GetDimensions(reader); } - else + catch (ArgumentException exc) { + Logger.Warn("Unable to get image dimensions for image file", exc); size = new Size(32, 32); } - - result.Orientation = size.Orientation(); } - - result.Path = result.FileId > 0 ? path : string.Empty; - result.FileName = fileName; - - if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) + else { - FileManager.Instance.DeleteFile(file); + size = new Size(32, 32); } - return result; + result.Orientation = size.Orientation(); } - catch (InvalidFileExtensionException) + + result.Path = result.FileId > 0 ? path : string.Empty; + result.FileName = fileName; + + if (extract && extension.Equals("zip", StringComparison.OrdinalIgnoreCase)) { - result.Message = GetLocalizedString("ExtensionNotAllowed"); - return result; + FileManager.Instance.DeleteFile(file); } - catch (Exception exe) + + return result; + } + catch (InvalidFileExtensionException) + { + result.Message = GetLocalizedString("ExtensionNotAllowed"); + return result; + } + catch (Exception exe) + { + Logger.Error(exe); + result.Message = exe.Message; + return result; + } + finally + { + if (reader != null) { - Logger.Error(exe); - result.Message = exe.Message; - return result; + reader.Close(); + reader.Dispose(); } - finally - { - if (reader != null) - { - reader.Close(); - reader.Dispose(); - } - if (fileContent != null) - { - fileContent.Close(); - fileContent.Dispose(); - } + if (fileContent != null) + { + fileContent.Close(); + fileContent.Dispose(); } } + } - private static IPortalInfo[] GetMyPortalGroup() - { - return ( + private static IPortalInfo[] GetMyPortalGroup() + { + return ( from @group in PortalGroupController.Instance.GetPortalGroups().ToArray() select PortalGroupController.Instance.GetPortalsByGroup(@group.PortalGroupId) into portals where portals.Any((IPortalInfo x) => x.PortalId == PortalSettings.Current.PortalId) select portals.Cast().ToArray()) - .FirstOrDefault(); - } + .FirstOrDefault(); + } - private bool IsPortalIdValid(int portalId) + private bool IsPortalIdValid(int portalId) + { + if (this.UserInfo.IsSuperUser) { - if (this.UserInfo.IsSuperUser) - { - return true; - } - - if (this.PortalSettings.PortalId == portalId) - { - return true; - } - - var isAdminUser = PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName); - if (!isAdminUser) - { - return false; - } + return true; + } - var myGroup = GetMyPortalGroup(); - return myGroup != null && myGroup.Any(p => p.PortalId == portalId); + if (this.PortalSettings.PortalId == portalId) + { + return true; } - /// A data transfer object with information about a folder. - public class FolderItemDTO + var isAdminUser = PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName); + if (!isAdminUser) { - /// Gets or sets the folder ID. - public int FolderId { get; set; } + return false; + } - /// Gets or sets the file filter. - public string FileFilter { get; set; } + var myGroup = GetMyPortalGroup(); + return myGroup != null && myGroup.Any(p => p.PortalId == portalId); + } - /// Gets or sets a value indicating whether to include an entry for an unspecified file. - public bool Required { get; set; } - } + /// A data transfer object with information about a folder. + public class FolderItemDTO + { + /// Gets or sets the folder ID. + public int FolderId { get; set; } - /// A data transfer object with information about a file that has been saved. - public class SavedFileDTO - { - /// Gets or sets the ID of the file. - public string FileId { get; set; } + /// Gets or sets the file filter. + public string FileFilter { get; set; } - /// Gets or sets the path of the file. - public string FilePath { get; set; } - } + /// Gets or sets a value indicating whether to include an entry for an unspecified file. + public bool Required { get; set; } + } - /// A data transfer object with information about an upload by URL request. - public class UploadByUrlDto - { - /// Gets or sets the URL. - public string Url { get; set; } + /// A data transfer object with information about a file that has been saved. + public class SavedFileDTO + { + /// Gets or sets the ID of the file. + public string FileId { get; set; } - /// Gets or sets the destination folder. - public string Folder { get; set; } + /// Gets or sets the path of the file. + public string FilePath { get; set; } + } - /// Gets or sets a value indicating whether to overwrite an existing file. - public bool Overwrite { get; set; } + /// A data transfer object with information about an upload by URL request. + public class UploadByUrlDto + { + /// Gets or sets the URL. + public string Url { get; set; } - /// Gets or sets a value indicating whether to unzip the resulting file. - public bool Unzip { get; set; } + /// Gets or sets the destination folder. + public string Folder { get; set; } - /// Gets or sets the filter. - public string Filter { get; set; } + /// Gets or sets a value indicating whether to overwrite an existing file. + public bool Overwrite { get; set; } - /// Gets or sets a value indicating whether the request is from the host menu. - public bool IsHostMenu { get; set; } + /// Gets or sets a value indicating whether to unzip the resulting file. + public bool Unzip { get; set; } - /// Gets or sets the portal ID. - public int PortalId { get; set; } = -1; + /// Gets or sets the filter. + public string Filter { get; set; } - /// Gets or sets the validation code. - public string ValidationCode { get; set; } - } + /// Gets or sets a value indicating whether the request is from the host menu. + public bool IsHostMenu { get; set; } - /// A data transfer object with information about a file upload. - [DataContract] - public class FileUploadDto - { - /// Gets or sets the file path. - [DataMember(Name = "path")] - public string Path { get; set; } + /// Gets or sets the portal ID. + public int PortalId { get; set; } = -1; + + /// Gets or sets the validation code. + public string ValidationCode { get; set; } + } + + /// A data transfer object with information about a file upload. + [DataContract] + public class FileUploadDto + { + /// Gets or sets the file path. + [DataMember(Name = "path")] + public string Path { get; set; } - /// Gets or sets the image orientation. - [DataMember(Name = "orientation")] - public Orientation Orientation { get; set; } + /// Gets or sets the image orientation. + [DataMember(Name = "orientation")] + public Orientation Orientation { get; set; } - /// Gets or sets a value indicating whether the file already exists. - [DataMember(Name = "alreadyExists")] - public bool AlreadyExists { get; set; } + /// Gets or sets a value indicating whether the file already exists. + [DataMember(Name = "alreadyExists")] + public bool AlreadyExists { get; set; } - /// Gets or sets an error message. - [DataMember(Name = "message")] - public string Message { get; set; } + /// Gets or sets an error message. + [DataMember(Name = "message")] + public string Message { get; set; } - /// Gets or sets the URL of the file type icon. - [DataMember(Name = "fileIconUrl")] - public string FileIconUrl { get; set; } + /// Gets or sets the URL of the file type icon. + [DataMember(Name = "fileIconUrl")] + public string FileIconUrl { get; set; } - /// Gets or sets the ID of the file. - [DataMember(Name = "fileId")] - public int FileId { get; set; } + /// Gets or sets the ID of the file. + [DataMember(Name = "fileId")] + public int FileId { get; set; } - /// Gets or sets the name of the file. - [DataMember(Name = "fileName")] - public string FileName { get; set; } + /// Gets or sets the name of the file. + [DataMember(Name = "fileName")] + public string FileName { get; set; } - /// Gets or sets a JSON string with invalidFiles and totalCount fields. - [DataMember(Name = "prompt")] - public string Prompt { get; set; } - } + /// Gets or sets a JSON string with invalidFiles and totalCount fields. + [DataMember(Name = "prompt")] + public string Prompt { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ImageHeader.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ImageHeader.cs index a013c7d00e2..5dbcf2637d4 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ImageHeader.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ImageHeader.cs @@ -2,184 +2,183 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; + +/// +/// Taken from http://stackoverflow.com/questions/111345/getting-image-dimensions-without-reading-the-entire-file/111349 +/// Minor improvements including supporting unsigned 16-bit integers when decoding Jfif and added logic +/// to load the image using new Bitmap if reading the headers fails. +/// +public static class ImageHeader { - using System; - using System.Collections.Generic; - using System.Drawing; - using System.IO; - using System.Linq; - - /// - /// Taken from http://stackoverflow.com/questions/111345/getting-image-dimensions-without-reading-the-entire-file/111349 - /// Minor improvements including supporting unsigned 16-bit integers when decoding Jfif and added logic - /// to load the image using new Bitmap if reading the headers fails. - /// - public static class ImageHeader - { - private const string ErrorMessage = "Could not recognize image format."; + private const string ErrorMessage = "Could not recognize image format."; - private static readonly Dictionary> ImageFormatDecoders = new Dictionary - > - { - { new byte[] { 0x42, 0x4D }, DecodeBitmap }, - { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, - { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, - { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, - { new byte[] { 0xff, 0xd8 }, DecodeJfif }, - }; - - /// Gets the dimensions of an image. - /// The path of the image to get the dimensions of. - /// The dimensions of the specified image. - /// The image was of an unrecognised format. - public static Size GetDimensions(string path) + private static readonly Dictionary> ImageFormatDecoders = new Dictionary + > + { + { new byte[] { 0x42, 0x4D }, DecodeBitmap }, + { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, + { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, + { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, + { new byte[] { 0xff, 0xd8 }, DecodeJfif }, + }; + + /// Gets the dimensions of an image. + /// The path of the image to get the dimensions of. + /// The dimensions of the specified image. + /// The image was of an unrecognised format. + public static Size GetDimensions(string path) + { + Size size; + try { - Size size; - try + using (var binaryReader = new BinaryReader(File.OpenRead(path))) { - using (var binaryReader = new BinaryReader(File.OpenRead(path))) + try { - try - { - size = GetDimensions(binaryReader); - } - catch (ArgumentException e) - { - throw new ArgumentException($"{ErrorMessage} file: '{path}' ", nameof(path), e); - } + size = GetDimensions(binaryReader); } - } - catch (ArgumentException) - { - // do it the old fashioned way - using (var b = new Bitmap(path)) + catch (ArgumentException e) { - size = b.Size; + throw new ArgumentException($"{ErrorMessage} file: '{path}' ", nameof(path), e); } } - - return size; } - - /// Gets the dimensions of an image. - /// The path of the image to get the dimensions of. - /// The dimensions of the specified image. - /// The image was of an unrecognised format. - public static Size GetDimensions(BinaryReader binaryReader) + catch (ArgumentException) { - int maxMagicBytesLength = ImageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length; - var magicBytes = new byte[maxMagicBytesLength]; - for (var i = 0; i < maxMagicBytesLength; i += 1) + // do it the old fashioned way + using (var b = new Bitmap(path)) { - magicBytes[i] = binaryReader.ReadByte(); - foreach (var pair in ImageFormatDecoders) - { - if (StartsWith(magicBytes, pair.Key)) - { - return pair.Value(binaryReader); - } - } + size = b.Size; } - - throw new ArgumentException(ErrorMessage, nameof(binaryReader)); } - private static bool StartsWith(byte[] thisBytes, byte[] thatBytes) + return size; + } + + /// Gets the dimensions of an image. + /// The path of the image to get the dimensions of. + /// The dimensions of the specified image. + /// The image was of an unrecognised format. + public static Size GetDimensions(BinaryReader binaryReader) + { + int maxMagicBytesLength = ImageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length; + var magicBytes = new byte[maxMagicBytesLength]; + for (var i = 0; i < maxMagicBytesLength; i += 1) { - for (var i = 0; i < thatBytes.Length; i += 1) + magicBytes[i] = binaryReader.ReadByte(); + foreach (var pair in ImageFormatDecoders) { - if (thisBytes[i] != thatBytes[i]) + if (StartsWith(magicBytes, pair.Key)) { - return false; + return pair.Value(binaryReader); } } - - return true; } - private static short ReadLittleEndianInt16(BinaryReader binaryReader) - { - var bytes = new byte[sizeof(short)]; - for (var i = 0; i < sizeof(short); i += 1) - { - bytes[sizeof(short) - 1 - i] = binaryReader.ReadByte(); - } - - return BitConverter.ToInt16(bytes, 0); - } + throw new ArgumentException(ErrorMessage, nameof(binaryReader)); + } - private static ushort ReadLittleEndianUInt16(BinaryReader binaryReader) + private static bool StartsWith(byte[] thisBytes, byte[] thatBytes) + { + for (var i = 0; i < thatBytes.Length; i += 1) { - var bytes = new byte[sizeof(ushort)]; - for (var i = 0; i < sizeof(ushort); i += 1) + if (thisBytes[i] != thatBytes[i]) { - bytes[sizeof(ushort) - 1 - i] = binaryReader.ReadByte(); + return false; } - - return BitConverter.ToUInt16(bytes, 0); } - private static int ReadLittleEndianInt32(BinaryReader binaryReader) - { - var bytes = new byte[sizeof(int)]; - for (var i = 0; i < sizeof(int); i += 1) - { - bytes[sizeof(int) - 1 - i] = binaryReader.ReadByte(); - } - - return BitConverter.ToInt32(bytes, 0); - } + return true; + } - private static Size DecodeBitmap(BinaryReader binaryReader) + private static short ReadLittleEndianInt16(BinaryReader binaryReader) + { + var bytes = new byte[sizeof(short)]; + for (var i = 0; i < sizeof(short); i += 1) { - binaryReader.ReadBytes(16); - var width = binaryReader.ReadInt32(); - var height = binaryReader.ReadInt32(); - return new Size(width, height); + bytes[sizeof(short) - 1 - i] = binaryReader.ReadByte(); } - private static Size DecodeGif(BinaryReader binaryReader) + return BitConverter.ToInt16(bytes, 0); + } + + private static ushort ReadLittleEndianUInt16(BinaryReader binaryReader) + { + var bytes = new byte[sizeof(ushort)]; + for (var i = 0; i < sizeof(ushort); i += 1) { - int width = binaryReader.ReadInt16(); - int height = binaryReader.ReadInt16(); - return new Size(width, height); + bytes[sizeof(ushort) - 1 - i] = binaryReader.ReadByte(); } - private static Size DecodePng(BinaryReader binaryReader) + return BitConverter.ToUInt16(bytes, 0); + } + + private static int ReadLittleEndianInt32(BinaryReader binaryReader) + { + var bytes = new byte[sizeof(int)]; + for (var i = 0; i < sizeof(int); i += 1) { - binaryReader.ReadBytes(8); - var width = ReadLittleEndianInt32(binaryReader); - var height = ReadLittleEndianInt32(binaryReader); - return new Size(width, height); + bytes[sizeof(int) - 1 - i] = binaryReader.ReadByte(); } - private static Size DecodeJfif(BinaryReader binaryReader) + return BitConverter.ToInt32(bytes, 0); + } + + private static Size DecodeBitmap(BinaryReader binaryReader) + { + binaryReader.ReadBytes(16); + var width = binaryReader.ReadInt32(); + var height = binaryReader.ReadInt32(); + return new Size(width, height); + } + + private static Size DecodeGif(BinaryReader binaryReader) + { + int width = binaryReader.ReadInt16(); + int height = binaryReader.ReadInt16(); + return new Size(width, height); + } + + private static Size DecodePng(BinaryReader binaryReader) + { + binaryReader.ReadBytes(8); + var width = ReadLittleEndianInt32(binaryReader); + var height = ReadLittleEndianInt32(binaryReader); + return new Size(width, height); + } + + private static Size DecodeJfif(BinaryReader binaryReader) + { + while (binaryReader.ReadByte() == 0xff) { - while (binaryReader.ReadByte() == 0xff) + byte marker = binaryReader.ReadByte(); + short chunkLength = ReadLittleEndianInt16(binaryReader); + if (marker == 0xc0 || marker == 0xc2) { - byte marker = binaryReader.ReadByte(); - short chunkLength = ReadLittleEndianInt16(binaryReader); - if (marker == 0xc0 || marker == 0xc2) - { - binaryReader.ReadByte(); - int height = ReadLittleEndianInt16(binaryReader); - int width = ReadLittleEndianInt16(binaryReader); - return new Size(width, height); - } - - if (chunkLength < 0) - { - var uchunkLength = (ushort)chunkLength; - binaryReader.ReadBytes(uchunkLength - 2); - } - else - { - binaryReader.ReadBytes(chunkLength - 2); - } + binaryReader.ReadByte(); + int height = ReadLittleEndianInt16(binaryReader); + int width = ReadLittleEndianInt16(binaryReader); + return new Size(width, height); } - throw new ArgumentException(ErrorMessage); + if (chunkLength < 0) + { + var uchunkLength = (ushort)chunkLength; + binaryReader.ReadBytes(uchunkLength - 2); + } + else + { + binaryReader.ReadBytes(chunkLength - 2); + } } + + throw new ArgumentException(ErrorMessage); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ItemListServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ItemListServiceController.cs index 398d6fb78b1..958d7046bbd 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ItemListServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ItemListServiceController.cs @@ -2,1603 +2,1602 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Runtime.Serialization; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Portals; +using DotNetNuke.Abstractions.Security.Permissions; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Data; +using DotNetNuke.Entities.Content.Taxonomy; +using DotNetNuke.Entities.DataStructures; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Users; +using DotNetNuke.Instrumentation; +using DotNetNuke.Security; +using DotNetNuke.Security.Permissions; +using DotNetNuke.Services.FileSystem; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.Common; + +using Microsoft.Extensions.DependencyInjection; + +using Globals = DotNetNuke.Common.Globals; + +/// A web API controller for lists of items. +/// The host settings. +/// The data provider. +/// The portal controller. +/// The application status. +/// The portal group controller. +/// The vocabulary controller. +/// The term controller. +[DnnAuthorize] +public class ItemListServiceController(IHostSettings hostSettings, DataProvider dataProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IVocabularyController vocabularyController, ITermController termController) + : DnnApiController { - using System; - using System.Collections; - using System.Collections.Generic; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Runtime.Serialization; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Abstractions.Security.Permissions; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Entities.Content.Taxonomy; - using DotNetNuke.Entities.DataStructures; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.Common; - - using Microsoft.Extensions.DependencyInjection; - - using Globals = DotNetNuke.Common.Globals; - - /// A web API controller for lists of items. + private const string PortalPrefix = "P-"; + private const string RootKey = "Root"; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ItemListServiceController)); + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly DataProvider dataProvider = dataProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalGroupController portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IVocabularyController vocabularyController = vocabularyController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly ITermController termController = termController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ItemListServiceController() + : this(null, null, null, null, null, null, null) + { + } + + /// Initializes a new instance of the class. /// The host settings. /// The data provider. /// The portal controller. /// The application status. /// The portal group controller. - /// The vocabulary controller. - /// The term controller. - [DnnAuthorize] - public class ItemListServiceController(IHostSettings hostSettings, DataProvider dataProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IVocabularyController vocabularyController, ITermController termController) - : DnnApiController - { - private const string PortalPrefix = "P-"; - private const string RootKey = "Root"; - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ItemListServiceController)); - private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly DataProvider dataProvider = dataProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalGroupController portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IVocabularyController vocabularyController = vocabularyController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly ITermController termController = termController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ItemListServiceController() - : this(null, null, null, null, null, null, null) - { - } - - /// Initializes a new instance of the class. - /// The host settings. - /// The data provider. - /// The portal controller. - /// The application status. - /// The portal group controller. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IVocabularyController. Scheduled removal in v12.0.0.")] - public ItemListServiceController(IHostSettings hostSettings, DataProvider dataProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) - : this(hostSettings, dataProvider, portalController, appStatus, portalGroupController, null, null) - { - } - - /// Gets a list of page descendants. - /// The parent ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// The portal ID. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// Whether disabled pages are not selectable. - /// A response with a list of objects. - [HttpGet] - public HttpResponseMessage GetPageDescendants(string parentId = null, int sortOrder = 0, string searchText = "", int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) - { - var response = new - { - Success = true, - Items = this.GetPageDescendantsInternal(portalId, parentId, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable), - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Gets the tree path for a page. - /// The tab ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The portal ID. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetTreePathForPage(string itemId, int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = this.GetTreePathForPageInternal(portalId, itemId, sortOrder, false, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Sort the given . - /// The tree as JSON. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// The portal ID. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SortPages(string treeAsJson, int sortOrder = 0, string searchText = "", int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.SortPagesInternal(portalId, treeAsJson, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages) - : this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Sort the given in portal group. - /// The tree as JSON. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SortPagesInPortalGroup(string treeAsJson, int sortOrder = 0, string searchText = "", bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.SortPagesInPortalGroupInternal(treeAsJson, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages) - : this.SearchPagesInPortalGroupInternal(treeAsJson, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Gets pages. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The portal ID. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// Whether disabled pages are not selectable. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetPages(int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) - { - var response = new - { - Success = true, - Tree = this.GetPagesInternal(portalId, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IVocabularyController. Scheduled removal in v12.0.0.")] + public ItemListServiceController(IHostSettings hostSettings, DataProvider dataProvider, IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + : this(hostSettings, dataProvider, portalController, appStatus, portalGroupController, null, null) + { + } - /// Gets pages in the current portal group. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetPagesInPortalGroup(int sortOrder = 0) + /// Gets a list of page descendants. + /// The parent ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// The portal ID. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// Whether disabled pages are not selectable. + /// A response with a list of objects. + [HttpGet] + public HttpResponseMessage GetPageDescendants(string parentId = null, int sortOrder = 0, string searchText = "", int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + var response = new { - var response = new - { - Success = true, - Tree = this.GetPagesInPortalGroupInternal(sortOrder), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Search pages. - /// The search text. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The portal ID. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SearchPages(string searchText, int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.GetPagesInternal(portalId, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, false) - : this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Gets descendants of a page in the current portal group. - /// The parent page ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetPageDescendantsInPortalGroup(string parentId = null, int sortOrder = 0, string searchText = "", bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Items = this.GetPageDescendantsInPortalGroupInternal(parentId, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Items = this.GetPageDescendantsInternal(portalId, parentId, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable), + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Gets the portals in the current portal group. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// A response with an object that has sites and portalId fields. - [HttpGet] - public HttpResponseMessage GetPortalsInGroup(int sortOrder = 0) + /// Gets the tree path for a page. + /// The tab ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The portal ID. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetTreePathForPage(string itemId, int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new { - var sites = this.GetPortalGroup(sortOrder); - var portalId = this.PortalSettings.PortalId; - return this.Request.CreateResponse(HttpStatusCode.OK, new { sites, portalId }); - } + Success = true, + Tree = this.GetTreePathForPageInternal(portalId, itemId, sortOrder, false, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Gets the tree path for a page in the current portal group. - /// The tab ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetTreePathForPageInPortalGroup(string itemId, int sortOrder = 0, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = this.GetTreePathForPageInternal(itemId, sortOrder, true, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } - - /// Search pages in the current portal group. - /// The search text. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// Whether to include disabled pages. - /// Whether to include all page types. - /// Whether to include active pages. - /// Whether to include host pages. - /// A semicolon-delimited list of role IDs. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SearchPagesInPortalGroup(string searchText, int sortOrder = 0, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") - { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.GetPagesInPortalGroupInternal(sortOrder) - : this.SearchPagesInPortalGroupInternal(searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + /// Sort the given . + /// The tree as JSON. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// The portal ID. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SortPages(string treeAsJson, int sortOrder = 0, string searchText = "", int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.SortPagesInternal(portalId, treeAsJson, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages) + : this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Gets folder descendants. - /// The parent ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// The permission key. - /// The portal ID. - /// A response with an object that has an Items fields that's a list of objects. - [HttpGet] - public HttpResponseMessage GetFolderDescendants(string parentId = null, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) - { - var response = new - { - Success = true, - Items = this.GetFolderDescendantsInternal(portalId, parentId, sortOrder, searchText, permission), - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + /// Sort the given in portal group. + /// The tree as JSON. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SortPagesInPortalGroup(string treeAsJson, int sortOrder = 0, string searchText = "", bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.SortPagesInPortalGroupInternal(treeAsJson, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages) + : this.SearchPagesInPortalGroupInternal(treeAsJson, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Get folders. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The permission key. - /// The portal ID. - /// The parent folder ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetFolders(int sortOrder = 0, string permission = null, int portalId = -1, int parentFolderId = -1) + /// Gets pages. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The portal ID. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// Whether disabled pages are not selectable. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetPages(int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + var response = new { - var response = new - { - Success = true, - Tree = this.GetFoldersInternal(portalId, sortOrder, permission, parentFolderId), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Tree = this.GetPagesInternal(portalId, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Sorts the folder in . - /// The tree as JSON. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SortFolders(string treeAsJson, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) + /// Gets pages in the current portal group. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetPagesInPortalGroup(int sortOrder = 0) + { + var response = new { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.SortFoldersInternal(portalId, treeAsJson, sortOrder, permission) : this.SearchFoldersInternal(portalId, searchText, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Tree = this.GetPagesInPortalGroupInternal(sortOrder), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Get the tree path for a folder. - /// The folder ID. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetTreePathForFolder(string itemId, int sortOrder = 0, string permission = null, int portalId = -1) + /// Search pages. + /// The search text. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The portal ID. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SearchPages(string searchText, int sortOrder = 0, int portalId = -1, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.GetPagesInternal(portalId, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, false) + : this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } + + /// Gets descendants of a page in the current portal group. + /// The parent page ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetPageDescendantsInPortalGroup(string parentId = null, int sortOrder = 0, string searchText = "", bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new { - var response = new - { - Success = true, - Tree = this.GetTreePathForFolderInternal(itemId, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Items = this.GetPageDescendantsInPortalGroupInternal(parentId, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Search folders. - /// The search text. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SearchFolders(string searchText, int sortOrder = 0, string permission = null, int portalId = -1) + /// Gets the portals in the current portal group. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// A response with an object that has sites and portalId fields. + [HttpGet] + public HttpResponseMessage GetPortalsInGroup(int sortOrder = 0) + { + var sites = this.GetPortalGroup(sortOrder); + var portalId = this.PortalSettings.PortalId; + return this.Request.CreateResponse(HttpStatusCode.OK, new { sites, portalId }); + } + + /// Gets the tree path for a page in the current portal group. + /// The tab ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetTreePathForPageInPortalGroup(string itemId, int sortOrder = 0, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.GetFoldersInternal(portalId, sortOrder, permission) : this.SearchFoldersInternal(portalId, searchText, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Tree = this.GetTreePathForPageInternal(itemId, sortOrder, true, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } + + /// Search pages in the current portal group. + /// The search text. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// Whether to include disabled pages. + /// Whether to include all page types. + /// Whether to include active pages. + /// Whether to include host pages. + /// A semicolon-delimited list of role IDs. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SearchPagesInPortalGroup(string searchText, int sortOrder = 0, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.GetPagesInPortalGroupInternal(sortOrder) + : this.SearchPagesInPortalGroupInternal(searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Gets the files. - /// The parent ID. - /// The filter. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage GetFiles(int parentId, string filter, int sortOrder = 0, string permission = null, int portalId = -1) + /// Gets folder descendants. + /// The parent ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// The permission key. + /// The portal ID. + /// A response with an object that has an Items fields that's a list of objects. + [HttpGet] + public HttpResponseMessage GetFolderDescendants(string parentId = null, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) + { + var response = new { - var response = new - { - Success = true, - Tree = this.GetFilesInternal(portalId, parentId, filter, string.Empty, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Items = this.GetFolderDescendantsInternal(portalId, parentId, sortOrder, searchText, permission), + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Sort the files. - /// The parent ID. - /// The filter. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The search text. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SortFiles(int parentId, string filter, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) + /// Get folders. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The permission key. + /// The portal ID. + /// The parent folder ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetFolders(int sortOrder = 0, string permission = null, int portalId = -1, int parentFolderId = -1) + { + var response = new { - var response = new - { - Success = true, - Tree = string.IsNullOrEmpty(searchText) ? this.SortFilesInternal(portalId, parentId, filter, sortOrder, permission) : this.GetFilesInternal(portalId, parentId, filter, searchText, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Tree = this.GetFoldersInternal(portalId, sortOrder, permission, parentFolderId), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Search files. - /// The parent ID. - /// The filter. - /// The search text. - /// 1 for A-Z, 2 for Z-A, any other value for no sorting. - /// The permission key. - /// The portal ID. - /// A response with an object with a Tree field containing objects. - [HttpGet] - public HttpResponseMessage SearchFiles(int parentId, string filter, string searchText, int sortOrder = 0, string permission = null, int portalId = -1) + /// Sorts the folder in . + /// The tree as JSON. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SortFolders(string treeAsJson, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) + { + var response = new { - var response = new - { - Success = true, - Tree = this.GetFilesInternal(portalId, parentId, filter, searchText, sortOrder, permission), - IgnoreRoot = true, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); - } + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.SortFoldersInternal(portalId, treeAsJson, sortOrder, permission) : this.SearchFoldersInternal(portalId, searchText, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Search users. - /// The search criteria. - /// A response with a list of results (containing id, name, and iconfile fields) or null if there was no search query. - [HttpGet] - public HttpResponseMessage SearchUser(string q) + /// Get the tree path for a folder. + /// The folder ID. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetTreePathForFolder(string itemId, int sortOrder = 0, string permission = null, int portalId = -1) + { + var response = new { - try - { - var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); - const int numResults = 5; + Success = true, + Tree = this.GetTreePathForFolderInternal(itemId, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - // GetUsersAdvancedSearch doesn't accept a comma or a single quote in the query so we have to remove them for now. See issue 20224. - q = q.Replace(",", string.Empty).Replace("'", string.Empty); - if (q.Length == 0) - { - return this.Request.CreateResponse(HttpStatusCode.OK, null); - } + /// Search folders. + /// The search text. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SearchFolders(string searchText, int sortOrder = 0, string permission = null, int portalId = -1) + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.GetFoldersInternal(portalId, sortOrder, permission) : this.SearchFoldersInternal(portalId, searchText, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - var results = UserController.Instance.GetUsersBasicSearch(portalId, 0, numResults, "DisplayName", true, "DisplayName", q) - .Select(user => new - { - id = user.UserID, - name = user.DisplayName, - iconfile = UserController.Instance.GetUserProfilePictureUrl(user.UserID, 32, 32), - }).ToList(); + /// Gets the files. + /// The parent ID. + /// The filter. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage GetFiles(int parentId, string filter, int sortOrder = 0, string permission = null, int portalId = -1) + { + var response = new + { + Success = true, + Tree = this.GetFilesInternal(portalId, parentId, filter, string.Empty, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - return this.Request.CreateResponse(HttpStatusCode.OK, results.OrderBy(sr => sr.name)); - } - catch (Exception exc) - { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); - } - } + /// Sort the files. + /// The parent ID. + /// The filter. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The search text. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SortFiles(int parentId, string filter, int sortOrder = 0, string searchText = "", string permission = null, int portalId = -1) + { + var response = new + { + Success = true, + Tree = string.IsNullOrEmpty(searchText) ? this.SortFilesInternal(portalId, parentId, filter, sortOrder, permission) : this.GetFilesInternal(portalId, parentId, filter, searchText, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - /// Gets terms. - /// The search criteria. - /// Whether to include terms from system vocabularies. - /// Whether to include terms from the tags vocabulary. - /// A response with a list of objects with text and value fields. - [HttpGet] - public HttpResponseMessage GetTerms(string q, bool includeSystem, bool includeTags) + /// Search files. + /// The parent ID. + /// The filter. + /// The search text. + /// 1 for A-Z, 2 for Z-A, any other value for no sorting. + /// The permission key. + /// The portal ID. + /// A response with an object with a Tree field containing objects. + [HttpGet] + public HttpResponseMessage SearchFiles(int parentId, string filter, string searchText, int sortOrder = 0, string permission = null, int portalId = -1) + { + var response = new { - var portalId = PortalSettings.Current.PortalId; + Success = true, + Tree = this.GetFilesInternal(portalId, parentId, filter, searchText, sortOrder, permission), + IgnoreRoot = true, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } - var terms = new ArrayList(); - var vocabularies = from v in this.vocabularyController.GetVocabularies() - where (v.ScopeType.ScopeType == "Application" - || (v.ScopeType.ScopeType == "Portal" && v.ScopeId == portalId)) - && (!v.IsSystem || includeSystem) - && (v.Name != "Tags" || includeTags) - select v; + /// Search users. + /// The search criteria. + /// A response with a list of results (containing id, name, and iconfile fields) or null if there was no search query. + [HttpGet] + public HttpResponseMessage SearchUser(string q) + { + try + { + var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); + const int numResults = 5; - foreach (var v in vocabularies) + // GetUsersAdvancedSearch doesn't accept a comma or a single quote in the query so we have to remove them for now. See issue 20224. + q = q.Replace(",", string.Empty).Replace("'", string.Empty); + if (q.Length == 0) { - terms.AddRange(new[] - { - from t in this.termController.GetTermsByVocabulary(v.VocabularyId) - where string.IsNullOrEmpty(q) || t.Name.Contains(q, StringComparison.OrdinalIgnoreCase) - select new { text = t.Name, value = t.TermId }, - }); + return this.Request.CreateResponse(HttpStatusCode.OK, null); } - return this.Request.CreateResponse(HttpStatusCode.OK, terms); + var results = UserController.Instance.GetUsersBasicSearch(portalId, 0, numResults, "DisplayName", true, "DisplayName", q) + .Select(user => new + { + id = user.UserID, + name = user.DisplayName, + iconfile = UserController.Instance.GetUserProfilePictureUrl(user.UserID, 32, 32), + }).ToList(); + + return this.Request.CreateResponse(HttpStatusCode.OK, results.OrderBy(sr => sr.name)); + } + catch (Exception exc) + { + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } + } + + /// Gets terms. + /// The search criteria. + /// Whether to include terms from system vocabularies. + /// Whether to include terms from the tags vocabulary. + /// A response with a list of objects with text and value fields. + [HttpGet] + public HttpResponseMessage GetTerms(string q, bool includeSystem, bool includeTags) + { + var portalId = PortalSettings.Current.PortalId; - private static List GetChildrenOf(IEnumerable tabs, int parentId, List filterTabs = null) + var terms = new ArrayList(); + var vocabularies = from v in this.vocabularyController.GetVocabularies() + where (v.ScopeType.ScopeType == "Application" + || (v.ScopeType.ScopeType == "Portal" && v.ScopeId == portalId)) + && (!v.IsSystem || includeSystem) + && (v.Name != "Tags" || includeTags) + select v; + + foreach (var v in vocabularies) { - return tabs.Where(tab => tab.ParentId == parentId).Select(tab => new ItemDto + terms.AddRange(new[] { - Key = tab.TabID.ToString(CultureInfo.InvariantCulture), - Value = tab.LocalizedTabName, - HasChildren = tab.HasChildren, - Selectable = filterTabs == null || filterTabs.Contains(tab.TabID), - }).ToList(); + from t in this.termController.GetTermsByVocabulary(v.VocabularyId) + where string.IsNullOrEmpty(q) || t.Name.Contains(q, StringComparison.OrdinalIgnoreCase) + select new { text = t.Name, value = t.TermId }, + }); } - private static List GetChildrenOf(IEnumerable tabs, string parentId) + return this.Request.CreateResponse(HttpStatusCode.OK, terms); + } + + private static List GetChildrenOf(IEnumerable tabs, int parentId, List filterTabs = null) + { + return tabs.Where(tab => tab.ParentId == parentId).Select(tab => new ItemDto { - int id; - id = int.TryParse(parentId, out id) ? id : Null.NullInteger; - return GetChildrenOf(tabs, id); - } + Key = tab.TabID.ToString(CultureInfo.InvariantCulture), + Value = tab.LocalizedTabName, + HasChildren = tab.HasChildren, + Selectable = filterTabs == null || filterTabs.Contains(tab.TabID), + }).ToList(); + } - private static void SortPagesRecursively(IEnumerable tabs, NTree treeNode, NTree openedNode, int sortOrder) + private static List GetChildrenOf(IEnumerable tabs, string parentId) + { + int id; + id = int.TryParse(parentId, out id) ? id : Null.NullInteger; + return GetChildrenOf(tabs, id); + } + + private static void SortPagesRecursively(IEnumerable tabs, NTree treeNode, NTree openedNode, int sortOrder) + { + if (openedNode == null) { - if (openedNode == null) - { - return; - } + return; + } - var children = ApplySort(GetChildrenOf(tabs, openedNode.Data.Id), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - treeNode.Children = children; - if (openedNode.HasChildren()) + var children = ApplySort(GetChildrenOf(tabs, openedNode.Data.Id), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + treeNode.Children = children; + if (openedNode.HasChildren()) + { + foreach (var openedNodeChild in openedNode.Children) { - foreach (var openedNodeChild in openedNode.Children) + var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, openedNodeChild.Data.Id, StringComparison.OrdinalIgnoreCase)); + if (treeNodeChild == null) { - var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, openedNodeChild.Data.Id, StringComparison.OrdinalIgnoreCase)); - if (treeNodeChild == null) - { - continue; - } - - SortPagesRecursively(tabs, treeNodeChild, openedNodeChild, sortOrder); + continue; } + + SortPagesRecursively(tabs, treeNodeChild, openedNodeChild, sortOrder); } } + } - private static IEnumerable ApplySort(IEnumerable items, int sortOrder) + private static IEnumerable ApplySort(IEnumerable items, int sortOrder) + { + switch (sortOrder) { - switch (sortOrder) - { - case 1: // sort by a-z - return items.OrderBy(item => item.Value).ToList(); - case 2: // sort by z-a - return items.OrderByDescending(item => item.Value).ToList(); - default: // no sort - return items; - } + case 1: // sort by a-z + return items.OrderBy(item => item.Value).ToList(); + case 2: // sort by z-a + return items.OrderByDescending(item => item.Value).ToList(); + default: // no sort + return items; } + } - private static List FilterTabsByRole(IList tabs, string roles, bool disabledNotSelectable) + private static List FilterTabsByRole(IList tabs, string roles, bool disabledNotSelectable) + { + var filterTabs = new List(); + if (!string.IsNullOrEmpty(roles)) { - var filterTabs = new List(); - if (!string.IsNullOrEmpty(roles)) - { - var roleList = roles.Split(';').Select(int.Parse); - - filterTabs.AddRange( - tabs.Where( - t => - t.TabPermissions.Cast() - .Any(p => roleList.Contains(p.RoleId) && p.UserId == Null.NullInteger && p.PermissionKey == "VIEW" && p.AllowAccess)).ToList() - .Where(t => !disabledNotSelectable || !t.DisableLink) - .Select(t => t.TabID)); - } - else - { - filterTabs.AddRange(tabs.Where(t => !disabledNotSelectable || !t.DisableLink).Select(t => t.TabID)); - } + var roleList = roles.Split(';').Select(int.Parse); - return filterTabs; + filterTabs.AddRange( + tabs.Where( + t => + t.TabPermissions.Cast() + .Any(p => roleList.Contains(p.RoleId) && p.UserId == Null.NullInteger && p.PermissionKey == "VIEW" && p.AllowAccess)).ToList() + .Where(t => !disabledNotSelectable || !t.DisableLink) + .Select(t => t.TabID)); } - - private static IEnumerable GetFiles(IFolderInfo parentFolder, string filter, string searchText) + else { - Func searchFunc; - var filterList = string.IsNullOrEmpty(filter) ? null : filter.ToLowerInvariant().Split(',').ToList(); - if (string.IsNullOrEmpty(searchText)) - { - searchFunc = f => filterList == null || filterList.Contains(f.Extension.ToLowerInvariant()); - } - else - { - searchFunc = f => f.FileName.Contains(searchText, StringComparison.OrdinalIgnoreCase) - && (filterList == null || filterList.Contains(f.Extension.ToLowerInvariant())); - } - - return FolderManager.Instance.GetFiles(parentFolder).Where(f => searchFunc(f)); + filterTabs.AddRange(tabs.Where(t => !disabledNotSelectable || !t.DisableLink).Select(t => t.TabID)); } - private NTree GetPagesInPortalGroupInternal(int sortOrder) + return filterTabs; + } + + private static IEnumerable GetFiles(IFolderInfo parentFolder, string filter, string searchText) + { + Func searchFunc; + var filterList = string.IsNullOrEmpty(filter) ? null : filter.ToLowerInvariant().Split(',').ToList(); + if (string.IsNullOrEmpty(searchText)) { - var treeNode = new NTree { Data = new ItemDto { Key = RootKey, }, }; - var portals = this.GetPortalGroup(sortOrder); - treeNode.Children = portals.Select(dto => new NTree { Data = dto, }).ToList(); - return treeNode; + searchFunc = f => filterList == null || filterList.Contains(f.Extension.ToLowerInvariant()); } - - private IEnumerable GetPortalGroup(int sortOrder) + else { - var myGroup = this.GetMyPortalGroup(); - var portals = myGroup.Select(p => new ItemDto - { - Key = PortalPrefix + p.PortalId.ToString(CultureInfo.InvariantCulture), - Value = p.PortalName, - HasChildren = true, - Selectable = false, - }).ToList(); - return ApplySort(portals, sortOrder); + searchFunc = f => f.FileName.Contains(searchText, StringComparison.OrdinalIgnoreCase) + && (filterList == null || filterList.Contains(f.Extension.ToLowerInvariant())); } - private IEnumerable GetMyPortalGroup() + return FolderManager.Instance.GetFiles(parentFolder).Where(f => searchFunc(f)); + } + + private NTree GetPagesInPortalGroupInternal(int sortOrder) + { + var treeNode = new NTree { Data = new ItemDto { Key = RootKey, }, }; + var portals = this.GetPortalGroup(sortOrder); + treeNode.Children = portals.Select(dto => new NTree { Data = dto, }).ToList(); + return treeNode; + } + + private IEnumerable GetPortalGroup(int sortOrder) + { + var myGroup = this.GetMyPortalGroup(); + var portals = myGroup.Select(p => new ItemDto + { + Key = PortalPrefix + p.PortalId.ToString(CultureInfo.InvariantCulture), + Value = p.PortalName, + HasChildren = true, + Selectable = false, + }).ToList(); + return ApplySort(portals, sortOrder); + } + + private IEnumerable GetMyPortalGroup() + { + var groups = PortalGroupController.Instance.GetPortalGroups().ToArray(); + if (groups.Length != 0) { - var groups = PortalGroupController.Instance.GetPortalGroups().ToArray(); - if (groups.Length != 0) - { - return ( + return ( from @group in groups select PortalGroupController.Instance.GetPortalsByGroup(@group.PortalGroupId) into portals where portals.Any((IPortalInfo x) => x.PortalId == PortalSettings.Current.PortalId) select portals.ToArray()) - .FirstOrDefault(); - } + .FirstOrDefault(); + } + + var currentPortal = PortalController.Instance.GetPortal(this.PortalSettings.PortalId); + return new List { currentPortal, }; + } - var currentPortal = PortalController.Instance.GetPortal(this.PortalSettings.PortalId); - return new List { currentPortal, }; + private NTree GetPagesInternal(int portalId, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + if (portalId == -1) + { + portalId = this.GetActivePortalId(); } - private NTree GetPagesInternal(int portalId, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + var tabs = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); + var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; + if (tabs == null) { - if (portalId == -1) - { - portalId = this.GetActivePortalId(); - } + return sortedTree; + } - var tabs = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); - var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; - if (tabs == null) - { - return sortedTree; - } + var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); + var children = ApplySort(GetChildrenOf(tabs, Null.NullInteger, filterTabs), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + sortedTree.Children = children; + return sortedTree; + } - var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); - var children = ApplySort(GetChildrenOf(tabs, Null.NullInteger, filterTabs), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - sortedTree.Children = children; - return sortedTree; + private IEnumerable GetPageDescendantsInPortalGroupInternal(string parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + { + if (string.IsNullOrEmpty(parentId)) + { + return null; } - private IEnumerable GetPageDescendantsInPortalGroupInternal(string parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "") + int portalId; + int parentIdAsInt; + if (parentId.StartsWith(PortalPrefix, StringComparison.Ordinal)) { - if (string.IsNullOrEmpty(parentId)) + parentIdAsInt = -1; + if (!int.TryParse(parentId.Replace(PortalPrefix, string.Empty), out portalId)) { - return null; + portalId = -1; } - int portalId; - int parentIdAsInt; - if (parentId.StartsWith(PortalPrefix, StringComparison.Ordinal)) + if (!string.IsNullOrEmpty(searchText)) { - parentIdAsInt = -1; - if (!int.TryParse(parentId.Replace(PortalPrefix, string.Empty), out portalId)) - { - portalId = -1; - } - - if (!string.IsNullOrEmpty(searchText)) - { - return this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles).Children.Select(node => node.Data); - } + return this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles).Children.Select(node => node.Data); } - else + } + else + { + portalId = -1; + if (!int.TryParse(parentId, out parentIdAsInt)) { - portalId = -1; - if (!int.TryParse(parentId, out parentIdAsInt)) - { - parentIdAsInt = -1; - } + parentIdAsInt = -1; } - - return this.GetPageDescendantsInternal(portalId, parentIdAsInt, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); } - private IEnumerable GetPageDescendantsInternal(int portalId, string parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + return this.GetPageDescendantsInternal(portalId, parentIdAsInt, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + } + + private IEnumerable GetPageDescendantsInternal(int portalId, string parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + int id; + id = int.TryParse(parentId, out id) ? id : Null.NullInteger; + return this.GetPageDescendantsInternal(portalId, id, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable); + } + + private IEnumerable GetPageDescendantsInternal(int portalId, int parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + List tabs; + + if (portalId == -1) { - int id; - id = int.TryParse(parentId, out id) ? id : Null.NullInteger; - return this.GetPageDescendantsInternal(portalId, id, sortOrder, searchText, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles, disabledNotSelectable); + portalId = this.GetActivePortalId(parentId); } - - private IEnumerable GetPageDescendantsInternal(int portalId, int parentId, int sortOrder, string searchText, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + else { - List tabs; - - if (portalId == -1) - { - portalId = this.GetActivePortalId(parentId); - } - else + if (!this.IsPortalIdValid(portalId)) { - if (!this.IsPortalIdValid(portalId)) - { - return new List(); - } + return new List(); } + } - Func searchFunc; - if (string.IsNullOrEmpty(searchText)) - { - searchFunc = _ => true; - } - else + Func searchFunc; + if (string.IsNullOrEmpty(searchText)) + { + searchFunc = _ => true; + } + else + { + searchFunc = page => page.LocalizedTabName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; + } + + if (portalId > -1) + { + tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalId, includeActive ? Null.NullInteger : this.PortalSettings.ActiveTab.TabID, false, null, true, false, includeAllTypes, true, false) + .Where(tab => searchFunc(tab) + && tab.ParentId == parentId + && (includeDisabled || !tab.DisableLink) + && (includeAllTypes || tab.TabType == TabType.Normal) + && !tab.IsSystem) + .OrderBy(tab => tab.TabOrder) + .ToList(); + + if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) { - searchFunc = page => page.LocalizedTabName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; + tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).AsList() + .Where(tab => searchFunc(tab) && tab.ParentId == parentId && !tab.IsDeleted && !tab.DisableLink && !tab.IsSystem) + .OrderBy(tab => tab.TabOrder) + .ToList()); } - - if (portalId > -1) + } + else + { + if (this.PortalSettings.UserInfo.IsSuperUser) { - tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalId, includeActive ? Null.NullInteger : this.PortalSettings.ActiveTab.TabID, false, null, true, false, includeAllTypes, true, false) - .Where(tab => searchFunc(tab) - && tab.ParentId == parentId - && (includeDisabled || !tab.DisableLink) - && (includeAllTypes || tab.TabType == TabType.Normal) - && !tab.IsSystem) + tabs = TabController.Instance.GetTabsByPortal(-1).AsList() + .Where(tab => searchFunc(tab) && tab.ParentId == parentId && !tab.IsDeleted && !tab.DisableLink && !tab.IsSystem) .OrderBy(tab => tab.TabOrder) .ToList(); - - if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) - { - tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).AsList() - .Where(tab => searchFunc(tab) && tab.ParentId == parentId && !tab.IsDeleted && !tab.DisableLink && !tab.IsSystem) - .OrderBy(tab => tab.TabOrder) - .ToList()); - } } else { - if (this.PortalSettings.UserInfo.IsSuperUser) - { - tabs = TabController.Instance.GetTabsByPortal(-1).AsList() - .Where(tab => searchFunc(tab) && tab.ParentId == parentId && !tab.IsDeleted && !tab.DisableLink && !tab.IsSystem) - .OrderBy(tab => tab.TabOrder) - .ToList(); - } - else - { - return new List(); - } + return new List(); } + } - var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); + var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); - var pages = tabs.Select(tab => new ItemDto - { - Key = tab.TabID.ToString(CultureInfo.InvariantCulture), - Value = tab.LocalizedTabName, - HasChildren = tab.HasChildren, - Selectable = filterTabs.Contains(tab.TabID), - }); + var pages = tabs.Select(tab => new ItemDto + { + Key = tab.TabID.ToString(CultureInfo.InvariantCulture), + Value = tab.LocalizedTabName, + HasChildren = tab.HasChildren, + Selectable = filterTabs.Contains(tab.TabID), + }); - return ApplySort(pages, sortOrder); - } + return ApplySort(pages, sortOrder); + } - private NTree SearchPagesInternal(int portalId, string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) - { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + private NTree SearchPagesInternal(int portalId, string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = true, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - List tabs; - if (portalId == -1) - { - portalId = this.GetActivePortalId(); - } - else + List tabs; + if (portalId == -1) + { + portalId = this.GetActivePortalId(); + } + else + { + if (!this.IsPortalIdValid(portalId)) { - if (!this.IsPortalIdValid(portalId)) - { - return tree; - } + return tree; } + } - Func searchFunc; - if (string.IsNullOrEmpty(searchText)) - { - searchFunc = _ => true; - } - else - { - searchFunc = page => page.LocalizedTabName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; - } + Func searchFunc; + if (string.IsNullOrEmpty(searchText)) + { + searchFunc = _ => true; + } + else + { + searchFunc = page => page.LocalizedTabName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; + } - if (portalId > -1) + if (portalId > -1) + { + tabs = TabController.Instance.GetTabsByPortal(portalId).Where(tab => + (includeActive || tab.Value.TabID != this.PortalSettings.ActiveTab.TabID) + && (includeDisabled || !tab.Value.DisableLink) + && (includeAllTypes || tab.Value.TabType == TabType.Normal) + && searchFunc(tab.Value) + && !tab.Value.IsSystem) + .OrderBy(tab => tab.Value.TabOrder) + .Select(tab => tab.Value) + .ToList(); + + if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) { - tabs = TabController.Instance.GetTabsByPortal(portalId).Where(tab => - (includeActive || tab.Value.TabID != this.PortalSettings.ActiveTab.TabID) - && (includeDisabled || !tab.Value.DisableLink) - && (includeAllTypes || tab.Value.TabType == TabType.Normal) - && searchFunc(tab.Value) - && !tab.Value.IsSystem) + tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).Where(tab => !tab.Value.DisableLink && searchFunc(tab.Value) && !tab.Value.IsSystem) .OrderBy(tab => tab.Value.TabOrder) .Select(tab => tab.Value) - .ToList(); - - if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) - { - tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).Where(tab => !tab.Value.DisableLink && searchFunc(tab.Value) && !tab.Value.IsSystem) - .OrderBy(tab => tab.Value.TabOrder) - .Select(tab => tab.Value) - .ToList()); - } + .ToList()); } - else - { - if (this.PortalSettings.UserInfo.IsSuperUser) - { - tabs = TabController.Instance.GetTabsByPortal(-1).Where(tab => !tab.Value.DisableLink && searchFunc(tab.Value) && !tab.Value.IsSystem) - .OrderBy(tab => tab.Value.TabOrder) - .Select(tab => tab.Value) - .ToList(); - } - else - { - return tree; - } - } - - var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); - - var pages = tabs.Select(tab => new ItemDto - { - Key = tab.TabID.ToString(CultureInfo.InvariantCulture), - Value = tab.LocalizedTabName, - HasChildren = false, - Selectable = filterTabs.Contains(tab.TabID), - }); - - tree.Children = ApplySort(pages, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - return tree; } - - private List GetPortalPages(int portalId, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + else { - List tabs = null; - if (portalId == -1) + if (this.PortalSettings.UserInfo.IsSuperUser) { - portalId = this.GetActivePortalId(); + tabs = TabController.Instance.GetTabsByPortal(-1).Where(tab => !tab.Value.DisableLink && searchFunc(tab.Value) && !tab.Value.IsSystem) + .OrderBy(tab => tab.Value.TabOrder) + .Select(tab => tab.Value) + .ToList(); } else { - if (!this.IsPortalIdValid(portalId)) - { - return null; - } + return tree; } + } - if (portalId > -1) - { - tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalId, includeActive ? Null.NullInteger : this.PortalSettings.ActiveTab.TabID, false, null, true, false, includeAllTypes, true, false) - .Where(t => (!t.DisableLink || includeDisabled) && !t.IsSystem) - .ToList(); + var filterTabs = FilterTabsByRole(tabs, roles, disabledNotSelectable); - if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) - { - tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).AsList().Where(t => !t.IsDeleted && !t.DisableLink && !t.IsSystem).ToList()); - } - } - else - { - if (this.PortalSettings.UserInfo.IsSuperUser) - { - tabs = TabController.Instance.GetTabsByPortal(-1).AsList().Where(t => !t.IsDeleted && !t.DisableLink && !t.IsSystem).ToList(); - } - } + var pages = tabs.Select(tab => new ItemDto + { + Key = tab.TabID.ToString(CultureInfo.InvariantCulture), + Value = tab.LocalizedTabName, + HasChildren = false, + Selectable = filterTabs.Contains(tab.TabID), + }); - return tabs; - } + tree.Children = ApplySort(pages, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + return tree; + } - private NTree SortPagesInternal(int portalId, string treeAsJson, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + private List GetPortalPages(int portalId, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + { + List tabs = null; + if (portalId == -1) { - var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); - return this.SortPagesInternal(portalId, tree, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); + portalId = this.GetActivePortalId(); } - - private NTree SortPagesInternal(int portalId, NTree openedNodesTree, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + else { - var pages = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); - var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; - if (pages == null) + if (!this.IsPortalIdValid(portalId)) { - return sortedTree; + return null; } - - SortPagesRecursively(pages, sortedTree, openedNodesTree, sortOrder); - return sortedTree; } - private NTree SearchPagesInPortalGroupInternal(string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + if (portalId > -1) { - var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; - var portals = this.GetPortalGroup(sortOrder); - treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); - foreach (var child in treeNode.Children) + tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, portalId, includeActive ? Null.NullInteger : this.PortalSettings.ActiveTab.TabID, false, null, true, false, includeAllTypes, true, false) + .Where(t => (!t.DisableLink || includeDisabled) && !t.IsSystem) + .ToList(); + + if (this.PortalSettings.UserInfo.IsSuperUser && includeHostPages) { - int portalId; - if (int.TryParse(child.Data.Key.Replace(PortalPrefix, string.Empty), out portalId)) - { - var pageTree = this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); - child.Children = pageTree.Children; - } + tabs.AddRange(TabController.Instance.GetTabsByPortal(-1).AsList().Where(t => !t.IsDeleted && !t.DisableLink && !t.IsSystem).ToList()); } - - return treeNode; } - - private NTree SearchPagesInPortalGroupInternal(string treeAsJson, string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + else { - var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; - var openedNode = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); - if (openedNode == null) + if (this.PortalSettings.UserInfo.IsSuperUser) { - return treeNode; + tabs = TabController.Instance.GetTabsByPortal(-1).AsList().Where(t => !t.IsDeleted && !t.DisableLink && !t.IsSystem).ToList(); } + } - var portals = this.GetPortalGroup(sortOrder); - treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); - - if (!openedNode.HasChildren()) - { - return treeNode; - } - - foreach (var openedNodeChild in openedNode.Children) - { - var portalIdString = openedNodeChild.Data.Id; - var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, portalIdString, StringComparison.OrdinalIgnoreCase)); - if (treeNodeChild == null) - { - continue; - } - - int portalId; - if (int.TryParse(treeNodeChild.Data.Key.Replace(PortalPrefix, string.Empty), out portalId)) - { - var pageTree = this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); - treeNodeChild.Children = pageTree.Children; - } - } + return tabs; + } - return treeNode; - } + private NTree SortPagesInternal(int portalId, string treeAsJson, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + { + var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); + return this.SortPagesInternal(portalId, tree, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); + } - private NTree SortPagesInPortalGroupInternal(string treeAsJson, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + private NTree SortPagesInternal(int portalId, NTree openedNodesTree, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + { + var pages = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); + var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; + if (pages == null) { - var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); - return this.SortPagesInPortalGroupInternal(tree, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); + return sortedTree; } - private NTree SortPagesInPortalGroupInternal(NTree openedNode, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + SortPagesRecursively(pages, sortedTree, openedNodesTree, sortOrder); + return sortedTree; + } + + private NTree SearchPagesInPortalGroupInternal(string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + { + var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; + var portals = this.GetPortalGroup(sortOrder); + treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); + foreach (var child in treeNode.Children) { - var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; - if (openedNode == null) + int portalId; + if (int.TryParse(child.Data.Key.Replace(PortalPrefix, string.Empty), out portalId)) { - return treeNode; + var pageTree = this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + child.Children = pageTree.Children; } + } - var portals = this.GetPortalGroup(sortOrder); - treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); - if (openedNode.HasChildren()) - { - foreach (var openedNodeChild in openedNode.Children) - { - var portalIdString = openedNodeChild.Data.Id; - var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, portalIdString, StringComparison.OrdinalIgnoreCase)); - if (treeNodeChild == null) - { - continue; - } - - int portalId; - if (!int.TryParse(portalIdString.Replace(PortalPrefix, string.Empty), out portalId)) - { - portalId = -1; - } - - var treeOfPages = this.SortPagesInternal(portalId, openedNodeChild, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); - treeNodeChild.Children = treeOfPages.Children; - } - } + return treeNode; + } + private NTree SearchPagesInPortalGroupInternal(string treeAsJson, string searchText, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + { + var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; + var openedNode = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); + if (openedNode == null) + { return treeNode; } - private NTree GetTreePathForPageInternal(int portalId, string itemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") - { - int itemIdAsInt; - if (string.IsNullOrEmpty(itemId) || !int.TryParse(itemId, out itemIdAsInt)) - { - itemIdAsInt = Null.NullInteger; - } + var portals = this.GetPortalGroup(sortOrder); + treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); - return this.GetTreePathForPageInternal(portalId, itemIdAsInt, sortOrder, includePortalTree, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + if (!openedNode.HasChildren()) + { + return treeNode; } - private NTree GetTreePathForPageInternal(string itemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + foreach (var openedNodeChild in openedNode.Children) { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - if (string.IsNullOrEmpty(itemId) || !int.TryParse(itemId, out var itemIdAsInt)) + var portalIdString = openedNodeChild.Data.Id; + var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, portalIdString, StringComparison.OrdinalIgnoreCase)); + if (treeNodeChild == null) { - return tree; + continue; } - var portals = PortalController.GetPortalDictionary(this.hostSettings, this.dataProvider); int portalId; - if (portals.TryGetValue(itemIdAsInt, out var pid)) + if (int.TryParse(treeNodeChild.Data.Key.Replace(PortalPrefix, string.Empty), out portalId)) { - portalId = pid; + var pageTree = this.SearchPagesInternal(portalId, searchText, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + treeNodeChild.Children = pageTree.Children; } - else - { - return tree; - } - - return this.GetTreePathForPageInternal(portalId, itemIdAsInt, sortOrder, includePortalTree, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); } - private NTree GetTreePathForPageInternal(int portalId, int selectedItemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) - { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - - if (selectedItemId <= 0) - { - return tree; - } - - var pages = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); - - if (pages == null) - { - return tree; - } - - var page = pages.SingleOrDefault(pageInfo => pageInfo.TabID == selectedItemId); + return treeNode; + } - if (page == null) - { - return tree; - } + private NTree SortPagesInPortalGroupInternal(string treeAsJson, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + { + var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); + return this.SortPagesInPortalGroupInternal(tree, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); + } - var selfTree = new NTree - { - Data = new ItemDto - { - Key = page.TabID.ToString(CultureInfo.InvariantCulture), - Value = page.LocalizedTabName, - HasChildren = page.HasChildren, - Selectable = true, - }, - }; + private NTree SortPagesInPortalGroupInternal(NTree openedNode, int sortOrder, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false) + { + var treeNode = new NTree { Data = new ItemDto { Key = RootKey } }; + if (openedNode == null) + { + return treeNode; + } - var parentId = page.ParentId; - var parentTab = parentId > 0 ? pages.SingleOrDefault(t => t.TabID == parentId) : null; - var filterTabs = FilterTabsByRole(pages, roles, disabledNotSelectable); - while (parentTab != null) + var portals = this.GetPortalGroup(sortOrder); + treeNode.Children = portals.Select(dto => new NTree { Data = dto }).ToList(); + if (openedNode.HasChildren()) + { + foreach (var openedNodeChild in openedNode.Children) { - // load all siblings - var siblingTabs = ApplySort(GetChildrenOf(pages, parentId, filterTabs), sortOrder); - var siblingTabsTree = siblingTabs.Select(t => new NTree { Data = t, }).ToList(); - - // attach the tree - if (selfTree.Children != null) + var portalIdString = openedNodeChild.Data.Id; + var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, portalIdString, StringComparison.OrdinalIgnoreCase)); + if (treeNodeChild == null) { - foreach (var node in siblingTabsTree) - { - if (node.Data.Key == selfTree.Data.Key) - { - node.Children = selfTree.Children; - break; - } - } + continue; } - selfTree = new NTree + int portalId; + if (!int.TryParse(portalIdString.Replace(PortalPrefix, string.Empty), out portalId)) { - Data = new ItemDto - { - Key = parentId.ToString(CultureInfo.InvariantCulture), - Value = parentTab.LocalizedTabName, - HasChildren = true, - Selectable = true, - }, - Children = siblingTabsTree, - }; + portalId = -1; + } - parentId = parentTab.ParentId; - parentTab = parentId > 0 ? pages.SingleOrDefault(t => t.TabID == parentId) : null; + var treeOfPages = this.SortPagesInternal(portalId, openedNodeChild, sortOrder, includeDisabled, includeAllTypes, includeActive, includeHostPages); + treeNodeChild.Children = treeOfPages.Children; } + } - // retain root pages - var rootTabs = ApplySort(GetChildrenOf(pages, Null.NullInteger, filterTabs), sortOrder); - var rootTree = rootTabs.Select(dto => new NTree { Data = dto }).ToList(); + return treeNode; + } - foreach (var node in rootTree) - { - if (node.Data.Key == selfTree.Data.Key) - { - node.Children = selfTree.Children; - break; - } - } + private NTree GetTreePathForPageInternal(int portalId, string itemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + { + int itemIdAsInt; + if (string.IsNullOrEmpty(itemId) || !int.TryParse(itemId, out itemIdAsInt)) + { + itemIdAsInt = Null.NullInteger; + } - if (includePortalTree) - { - var myGroup = this.GetMyPortalGroup(); - var portalTree = myGroup.Select( - portal => new NTree - { - Data = new ItemDto - { - Key = PortalPrefix + portal.PortalId.ToString(CultureInfo.InvariantCulture), - Value = portal.PortalName, - HasChildren = true, - Selectable = false, - }, - }).ToList(); - - foreach (var node in portalTree) - { - if (node.Data.Key == PortalPrefix + portalId.ToString(CultureInfo.InvariantCulture)) - { - node.Children = rootTree; - break; - } - } + return this.GetTreePathForPageInternal(portalId, itemIdAsInt, sortOrder, includePortalTree, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + } + + private NTree GetTreePathForPageInternal(string itemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "") + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + if (string.IsNullOrEmpty(itemId) || !int.TryParse(itemId, out var itemIdAsInt)) + { + return tree; + } + + var portals = PortalController.GetPortalDictionary(this.hostSettings, this.dataProvider); + int portalId; + if (portals.TryGetValue(itemIdAsInt, out var pid)) + { + portalId = pid; + } + else + { + return tree; + } - rootTree = portalTree; - } + return this.GetTreePathForPageInternal(portalId, itemIdAsInt, sortOrder, includePortalTree, includeDisabled, includeAllTypes, includeActive, includeHostPages, roles); + } - tree.Children = rootTree; + private NTree GetTreePathForPageInternal(int portalId, int selectedItemId, int sortOrder, bool includePortalTree = false, bool includeDisabled = false, bool includeAllTypes = false, bool includeActive = false, bool includeHostPages = false, string roles = "", bool disabledNotSelectable = false) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + if (selectedItemId <= 0) + { return tree; } - private NTree GetFoldersInternal(int portalId, int sortOrder, string permissions, int parentFolderId = -1) - { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - var children = ApplySort(this.GetFolderDescendantsInternal(portalId, parentFolderId, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - tree.Children = children; - foreach (var child in tree.Children) - { - children = ApplySort(this.GetFolderDescendantsInternal(portalId, child.Data.Key, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - child.Children = children; - } + var pages = this.GetPortalPages(portalId, includeDisabled, includeAllTypes, includeActive, includeHostPages); + if (pages == null) + { return tree; } - private NTree SortFoldersInternal(int portalId, string treeAsJson, int sortOrder, string permissions) - { - var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); - return this.SortFoldersInternal(portalId, tree, sortOrder, permissions); - } + var page = pages.SingleOrDefault(pageInfo => pageInfo.TabID == selectedItemId); - private NTree SortFoldersInternal(int portalId, NTree openedNodesTree, int sortOrder, string permissions) + if (page == null) { - var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; - this.SortFoldersRecursevely(portalId, sortedTree, openedNodesTree, sortOrder, permissions); - return sortedTree; + return tree; } - private void SortFoldersRecursevely(int portalId, NTree treeNode, NTree openedNode, int sortOrder, string permissions) + var selfTree = new NTree { - if (openedNode == null) + Data = new ItemDto { - return; - } + Key = page.TabID.ToString(CultureInfo.InvariantCulture), + Value = page.LocalizedTabName, + HasChildren = page.HasChildren, + Selectable = true, + }, + }; + + var parentId = page.ParentId; + var parentTab = parentId > 0 ? pages.SingleOrDefault(t => t.TabID == parentId) : null; + var filterTabs = FilterTabsByRole(pages, roles, disabledNotSelectable); + while (parentTab != null) + { + // load all siblings + var siblingTabs = ApplySort(GetChildrenOf(pages, parentId, filterTabs), sortOrder); + var siblingTabsTree = siblingTabs.Select(t => new NTree { Data = t, }).ToList(); - var children = ApplySort(this.GetFolderDescendantsInternal(portalId, openedNode.Data.Id, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - treeNode.Children = children; - if (openedNode.HasChildren()) + // attach the tree + if (selfTree.Children != null) { - foreach (var openedNodeChild in openedNode.Children) + foreach (var node in siblingTabsTree) { - var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, openedNodeChild.Data.Id, StringComparison.OrdinalIgnoreCase)); - if (treeNodeChild == null) + if (node.Data.Key == selfTree.Data.Key) { - continue; + node.Children = selfTree.Children; + break; } - - this.SortFoldersRecursevely(portalId, treeNodeChild, openedNodeChild, sortOrder, permissions); } } - } - - private IEnumerable GetFolderDescendantsInternal(int portalId, string parentId, int sortOrder, string searchText, string permission) - { - int id; - id = int.TryParse(parentId, out id) ? id : Null.NullInteger; - return this.GetFolderDescendantsInternal(portalId, id, sortOrder, searchText, permission); - } - private IEnumerable GetFolderDescendantsInternal(int portalId, int parentId, int sortOrder, string searchText, string permission) - { - if (portalId > -1) + selfTree = new NTree { - if (!this.IsPortalIdValid(portalId)) + Data = new ItemDto { - return new List(); - } - } - else - { - portalId = this.GetActivePortalId(); - } + Key = parentId.ToString(CultureInfo.InvariantCulture), + Value = parentTab.LocalizedTabName, + HasChildren = true, + Selectable = true, + }, + Children = siblingTabsTree, + }; - var parentFolder = parentId > -1 ? FolderManager.Instance.GetFolder(parentId) : FolderManager.Instance.GetFolder(portalId, string.Empty); + parentId = parentTab.ParentId; + parentTab = parentId > 0 ? pages.SingleOrDefault(t => t.TabID == parentId) : null; + } - if (parentFolder == null) - { - return new List(); - } + // retain root pages + var rootTabs = ApplySort(GetChildrenOf(pages, Null.NullInteger, filterTabs), sortOrder); + var rootTree = rootTabs.Select(dto => new NTree { Data = dto }).ToList(); - var hasPermission = string.IsNullOrEmpty(permission) ? - this.HasPermission(parentFolder, "BROWSE") || this.HasPermission(parentFolder, "READ") : - this.HasPermission(parentFolder, permission); - if (!hasPermission) + foreach (var node in rootTree) + { + if (node.Data.Key == selfTree.Data.Key) { - return new List(); + node.Children = selfTree.Children; + break; } + } - if (parentId < 1) - { - return new List + if (includePortalTree) + { + var myGroup = this.GetMyPortalGroup(); + var portalTree = myGroup.Select( + portal => new NTree { - new ItemDto + Data = new ItemDto { - Key = parentFolder.FolderID.ToString(CultureInfo.InvariantCulture), - Value = portalId == -1 ? DynamicSharedConstants.HostRootFolder : DynamicSharedConstants.RootFolder, - HasChildren = this.HasChildren(parentFolder, permission), - Selectable = true, + Key = PortalPrefix + portal.PortalId.ToString(CultureInfo.InvariantCulture), + Value = portal.PortalName, + HasChildren = true, + Selectable = false, }, - }; + }).ToList(); + + foreach (var node in portalTree) + { + if (node.Data.Key == PortalPrefix + portalId.ToString(CultureInfo.InvariantCulture)) + { + node.Children = rootTree; + break; + } } - var childrenFolders = this.GetFolderDescendants(parentFolder, searchText, permission); + rootTree = portalTree; + } - var folders = childrenFolders.Select(folder => new ItemDto - { - Key = folder.FolderID.ToString(CultureInfo.InvariantCulture), - Value = folder.FolderName, - HasChildren = this.HasChildren(folder, permission), - Selectable = true, - }); + tree.Children = rootTree; - return ApplySort(folders, sortOrder); + return tree; + } + + private NTree GetFoldersInternal(int portalId, int sortOrder, string permissions, int parentFolderId = -1) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + var children = ApplySort(this.GetFolderDescendantsInternal(portalId, parentFolderId, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + tree.Children = children; + foreach (var child in tree.Children) + { + children = ApplySort(this.GetFolderDescendantsInternal(portalId, child.Data.Key, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + child.Children = children; } - private NTree SearchFoldersInternal(int portalId, string searchText, int sortOrder, string permission) + return tree; + } + + private NTree SortFoldersInternal(int portalId, string treeAsJson, int sortOrder, string permissions) + { + var tree = DotNetNuke.Common.Utilities.Json.Deserialize>(treeAsJson); + return this.SortFoldersInternal(portalId, tree, sortOrder, permissions); + } + + private NTree SortFoldersInternal(int portalId, NTree openedNodesTree, int sortOrder, string permissions) + { + var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; + this.SortFoldersRecursevely(portalId, sortedTree, openedNodesTree, sortOrder, permissions); + return sortedTree; + } + + private void SortFoldersRecursevely(int portalId, NTree treeNode, NTree openedNode, int sortOrder, string permissions) + { + if (openedNode == null) { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + return; + } - if (portalId > -1) + var children = ApplySort(this.GetFolderDescendantsInternal(portalId, openedNode.Data.Id, sortOrder, string.Empty, permissions), sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + treeNode.Children = children; + if (openedNode.HasChildren()) + { + foreach (var openedNodeChild in openedNode.Children) { - if (!this.IsPortalIdValid(portalId)) + var treeNodeChild = treeNode.Children.Find(child => string.Equals(child.Data.Key, openedNodeChild.Data.Id, StringComparison.OrdinalIgnoreCase)); + if (treeNodeChild == null) { - return tree; + continue; } - } - else - { - portalId = this.GetActivePortalId(); - } - var allFolders = this.GetPortalFolders(portalId, searchText, permission); - var folders = allFolders.Select(f => new ItemDto - { - Key = f.FolderID.ToString(CultureInfo.InvariantCulture), - Value = f.FolderName, - HasChildren = false, - Selectable = true, - }); - tree.Children = ApplySort(folders, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - return tree; + this.SortFoldersRecursevely(portalId, treeNodeChild, openedNodeChild, sortOrder, permissions); + } } + } - private NTree GetTreePathForFolderInternal(string selectedItemId, int sortOrder, string permission) - { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + private IEnumerable GetFolderDescendantsInternal(int portalId, string parentId, int sortOrder, string searchText, string permission) + { + int id; + id = int.TryParse(parentId, out id) ? id : Null.NullInteger; + return this.GetFolderDescendantsInternal(portalId, id, sortOrder, searchText, permission); + } - int itemId; - if (string.IsNullOrEmpty(selectedItemId) || !int.TryParse(selectedItemId, out itemId)) + private IEnumerable GetFolderDescendantsInternal(int portalId, int parentId, int sortOrder, string searchText, string permission) + { + if (portalId > -1) + { + if (!this.IsPortalIdValid(portalId)) { - return tree; + return new List(); } + } + else + { + portalId = this.GetActivePortalId(); + } - if (itemId <= 0) - { - return tree; - } + var parentFolder = parentId > -1 ? FolderManager.Instance.GetFolder(parentId) : FolderManager.Instance.GetFolder(portalId, string.Empty); - var folder = FolderManager.Instance.GetFolder(itemId); - if (folder == null) - { - return tree; - } + if (parentFolder == null) + { + return new List(); + } - var hasPermission = string.IsNullOrEmpty(permission) ? - (this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ")) : - this.HasPermission(folder, permission); - if (!hasPermission) - { - return new NTree(); - } + var hasPermission = string.IsNullOrEmpty(permission) ? + this.HasPermission(parentFolder, "BROWSE") || this.HasPermission(parentFolder, "READ") : + this.HasPermission(parentFolder, permission); + if (!hasPermission) + { + return new List(); + } - var selfTree = new NTree + if (parentId < 1) + { + return new List { - Data = new ItemDto + new ItemDto { - Key = folder.FolderID.ToString(CultureInfo.InvariantCulture), - Value = folder.FolderName, - HasChildren = this.HasChildren(folder, permission), + Key = parentFolder.FolderID.ToString(CultureInfo.InvariantCulture), + Value = portalId == -1 ? DynamicSharedConstants.HostRootFolder : DynamicSharedConstants.RootFolder, + HasChildren = this.HasChildren(parentFolder, permission), Selectable = true, }, }; - var parentId = folder.ParentID; - var parentFolder = parentId > 0 ? FolderManager.Instance.GetFolder(parentId) : null; + } - while (parentFolder != null) - { - // load all sibling - var siblingFolders = this.GetFolderDescendants(parentFolder, string.Empty, permission) - .Select(folderInfo => new ItemDto - { - Key = folderInfo.FolderID.ToString(CultureInfo.InvariantCulture), - Value = folderInfo.FolderName, - HasChildren = this.HasChildren(folderInfo, permission), - Selectable = true, - }).ToList(); - siblingFolders = ApplySort(siblingFolders, sortOrder).ToList(); + var childrenFolders = this.GetFolderDescendants(parentFolder, searchText, permission); - var siblingFoldersTree = siblingFolders.Select(f => new NTree { Data = f }).ToList(); + var folders = childrenFolders.Select(folder => new ItemDto + { + Key = folder.FolderID.ToString(CultureInfo.InvariantCulture), + Value = folder.FolderName, + HasChildren = this.HasChildren(folder, permission), + Selectable = true, + }); - // attach the tree - if (selfTree.Children != null) - { - foreach (var node in siblingFoldersTree) - { - if (node.Data.Key == selfTree.Data.Key) - { - node.Children = selfTree.Children; - break; - } - } - } + return ApplySort(folders, sortOrder); + } - selfTree = new NTree - { - Data = new ItemDto - { - Key = parentId.ToString(CultureInfo.InvariantCulture), - Value = parentFolder.FolderName, - HasChildren = true, - Selectable = true, - }, - Children = siblingFoldersTree, - }; + private NTree SearchFoldersInternal(int portalId, string searchText, int sortOrder, string permission) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - parentId = parentFolder.ParentID; - parentFolder = parentId > 0 ? FolderManager.Instance.GetFolder(parentId) : null; + if (portalId > -1) + { + if (!this.IsPortalIdValid(portalId)) + { + return tree; } + } + else + { + portalId = this.GetActivePortalId(); + } + + var allFolders = this.GetPortalFolders(portalId, searchText, permission); + var folders = allFolders.Select(f => new ItemDto + { + Key = f.FolderID.ToString(CultureInfo.InvariantCulture), + Value = f.FolderName, + HasChildren = false, + Selectable = true, + }); + tree.Children = ApplySort(folders, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + return tree; + } - selfTree.Data.Value = DynamicSharedConstants.RootFolder; + private NTree GetTreePathForFolderInternal(string selectedItemId, int sortOrder, string permission) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - tree.Children.Add(selfTree); + int itemId; + if (string.IsNullOrEmpty(selectedItemId) || !int.TryParse(selectedItemId, out itemId)) + { return tree; } - private bool HasPermission(IFolderInfo folder, string permissionKey) + if (itemId <= 0) { - var hasPermission = this.PortalSettings.UserInfo.IsSuperUser; - - if (!hasPermission && folder != null) - { - hasPermission = FolderPermissionController.HasFolderPermission(folder.FolderPermissions, permissionKey); - } - - return hasPermission; + return tree; } - private IEnumerable GetFolderDescendants(IFolderInfo parentFolder, string searchText, string permission) + var folder = FolderManager.Instance.GetFolder(itemId); + if (folder == null) { - Func searchFunc; - if (string.IsNullOrEmpty(searchText)) - { - searchFunc = _ => true; - } - else - { - searchFunc = folder => folder.FolderName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; - } + return tree; + } - return FolderManager.Instance.GetFolders(parentFolder).Where(folder => - (string.IsNullOrEmpty(permission) ? - this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : - this.HasPermission(folder, permission)) && searchFunc(folder)); + var hasPermission = string.IsNullOrEmpty(permission) ? + (this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ")) : + this.HasPermission(folder, permission); + if (!hasPermission) + { + return new NTree(); } - private IEnumerable GetPortalFolders(int portalId, string searchText, string permission) + var selfTree = new NTree { - if (portalId == -1) + Data = new ItemDto { - portalId = this.GetActivePortalId(); - } + Key = folder.FolderID.ToString(CultureInfo.InvariantCulture), + Value = folder.FolderName, + HasChildren = this.HasChildren(folder, permission), + Selectable = true, + }, + }; + var parentId = folder.ParentID; + var parentFolder = parentId > 0 ? FolderManager.Instance.GetFolder(parentId) : null; - Func searchFunc; - if (string.IsNullOrEmpty(searchText)) + while (parentFolder != null) + { + // load all sibling + var siblingFolders = this.GetFolderDescendants(parentFolder, string.Empty, permission) + .Select(folderInfo => new ItemDto + { + Key = folderInfo.FolderID.ToString(CultureInfo.InvariantCulture), + Value = folderInfo.FolderName, + HasChildren = this.HasChildren(folderInfo, permission), + Selectable = true, + }).ToList(); + siblingFolders = ApplySort(siblingFolders, sortOrder).ToList(); + + var siblingFoldersTree = siblingFolders.Select(f => new NTree { Data = f }).ToList(); + + // attach the tree + if (selfTree.Children != null) { - searchFunc = _ => true; + foreach (var node in siblingFoldersTree) + { + if (node.Data.Key == selfTree.Data.Key) + { + node.Children = selfTree.Children; + break; + } + } } - else + + selfTree = new NTree { - searchFunc = folder => folder.FolderName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; - } + Data = new ItemDto + { + Key = parentId.ToString(CultureInfo.InvariantCulture), + Value = parentFolder.FolderName, + HasChildren = true, + Selectable = true, + }, + Children = siblingFoldersTree, + }; - return FolderManager.Instance.GetFolders(portalId).Where(folder => - (string.IsNullOrEmpty(permission) ? - this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : - this.HasPermission(folder, permission)) && searchFunc(folder)); + parentId = parentFolder.ParentID; + parentFolder = parentId > 0 ? FolderManager.Instance.GetFolder(parentId) : null; } - private bool HasChildren(IFolderInfo parentFolder, string permission) + selfTree.Data.Value = DynamicSharedConstants.RootFolder; + + tree.Children.Add(selfTree); + return tree; + } + + private bool HasPermission(IFolderInfo folder, string permissionKey) + { + var hasPermission = this.PortalSettings.UserInfo.IsSuperUser; + + if (!hasPermission && folder != null) { - return FolderManager.Instance.GetFolders(parentFolder).Any(folder => - string.IsNullOrEmpty(permission) ? - this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : - this.HasPermission(folder, permission)); + hasPermission = FolderPermissionController.HasFolderPermission(folder.FolderPermissions, permissionKey); } - private NTree GetFilesInternal(int portalId, int parentId, string filter, string searchText, int sortOrder, string permissions) + return hasPermission; + } + + private IEnumerable GetFolderDescendants(IFolderInfo parentFolder, string searchText, string permission) + { + Func searchFunc; + if (string.IsNullOrEmpty(searchText)) { - var tree = new NTree { Data = new ItemDto { Key = RootKey } }; - var children = this.GetFileItemsDto(portalId, parentId, filter, searchText, permissions, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - tree.Children = children; - return tree; + searchFunc = _ => true; + } + else + { + searchFunc = folder => folder.FolderName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; } - private NTree SortFilesInternal(int portalId, int parentId, string filter, int sortOrder, string permissions) + return FolderManager.Instance.GetFolders(parentFolder).Where(folder => + (string.IsNullOrEmpty(permission) ? + this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : + this.HasPermission(folder, permission)) && searchFunc(folder)); + } + + private IEnumerable GetPortalFolders(int portalId, string searchText, string permission) + { + if (portalId == -1) { - var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; - var children = this.GetFileItemsDto(portalId, parentId, filter, string.Empty, permissions, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); - sortedTree.Children = children; - return sortedTree; + portalId = this.GetActivePortalId(); } - private IEnumerable GetFileItemsDto(int portalId, int parentId, string filter, string searchText, string permission, int sortOrder) + Func searchFunc; + if (string.IsNullOrEmpty(searchText)) { - if (portalId > -1) - { - if (!this.IsPortalIdValid(portalId)) - { - return new List(); - } - } - else - { - portalId = this.GetActivePortalId(); - } + searchFunc = _ => true; + } + else + { + searchFunc = folder => folder.FolderName.IndexOf(searchText, StringComparison.InvariantCultureIgnoreCase) > -1; + } - var parentFolder = parentId > -1 ? FolderManager.Instance.GetFolder(parentId) : FolderManager.Instance.GetFolder(portalId, string.Empty); + return FolderManager.Instance.GetFolders(portalId).Where(folder => + (string.IsNullOrEmpty(permission) ? + this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : + this.HasPermission(folder, permission)) && searchFunc(folder)); + } - if (parentFolder == null) - { - return new List(); - } + private bool HasChildren(IFolderInfo parentFolder, string permission) + { + return FolderManager.Instance.GetFolders(parentFolder).Any(folder => + string.IsNullOrEmpty(permission) ? + this.HasPermission(folder, "BROWSE") || this.HasPermission(folder, "READ") : + this.HasPermission(folder, permission)); + } - var hasPermission = string.IsNullOrEmpty(permission) ? - this.HasPermission(parentFolder, "BROWSE") || this.HasPermission(parentFolder, "READ") : - this.HasPermission(parentFolder, permission); - if (!hasPermission) - { - return new List(); - } + private NTree GetFilesInternal(int portalId, int parentId, string filter, string searchText, int sortOrder, string permissions) + { + var tree = new NTree { Data = new ItemDto { Key = RootKey } }; + var children = this.GetFileItemsDto(portalId, parentId, filter, searchText, permissions, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + tree.Children = children; + return tree; + } + + private NTree SortFilesInternal(int portalId, int parentId, string filter, int sortOrder, string permissions) + { + var sortedTree = new NTree { Data = new ItemDto { Key = RootKey } }; + var children = this.GetFileItemsDto(portalId, parentId, filter, string.Empty, permissions, sortOrder).Select(dto => new NTree { Data = dto }).ToList(); + sortedTree.Children = children; + return sortedTree; + } - if (parentId < 1) + private IEnumerable GetFileItemsDto(int portalId, int parentId, string filter, string searchText, string permission, int sortOrder) + { + if (portalId > -1) + { + if (!this.IsPortalIdValid(portalId)) { return new List(); } + } + else + { + portalId = this.GetActivePortalId(); + } - var files = GetFiles(parentFolder, filter, searchText); - - var filesDto = files.Select(f => new ItemDto - { - Key = f.FileId.ToString(CultureInfo.InvariantCulture), - Value = f.FileName, - HasChildren = false, - Selectable = true, - }).ToList(); - - var sortedList = ApplySort(filesDto, sortOrder); + var parentFolder = parentId > -1 ? FolderManager.Instance.GetFolder(parentId) : FolderManager.Instance.GetFolder(portalId, string.Empty); - return sortedList; + if (parentFolder == null) + { + return new List(); } - private bool IsPortalIdValid(int portalId) + var hasPermission = string.IsNullOrEmpty(permission) ? + this.HasPermission(parentFolder, "BROWSE") || this.HasPermission(parentFolder, "READ") : + this.HasPermission(parentFolder, permission); + if (!hasPermission) { - if (this.UserInfo.IsSuperUser) - { - return true; - } - - if (this.PortalSettings.PortalId == portalId) - { - return true; - } - - var isAdminUser = PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName); - if (!isAdminUser) - { - return false; - } + return new List(); + } - var mygroup = this.GetMyPortalGroup(); - return mygroup != null && mygroup.Any(p => p.PortalId == portalId); + if (parentId < 1) + { + return new List(); } - private int GetActivePortalId(int pageId) + var files = GetFiles(parentFolder, filter, searchText); + + var filesDto = files.Select(f => new ItemDto { - var page = TabController.Instance.GetTab(pageId, Null.NullInteger, false); - var portalId = page.PortalID; + Key = f.FileId.ToString(CultureInfo.InvariantCulture), + Value = f.FileName, + HasChildren = false, + Selectable = true, + }).ToList(); - if (portalId == Null.NullInteger) - { - portalId = this.GetActivePortalId(); - } + var sortedList = ApplySort(filesDto, sortOrder); - return portalId; - } + return sortedList; + } - private int GetActivePortalId() + private bool IsPortalIdValid(int portalId) + { + if (this.UserInfo.IsSuperUser) { - var portalId = -1; - if (!TabController.CurrentPage.IsSuperTab) - { - portalId = this.PortalSettings.PortalId; - } + return true; + } - return portalId; + if (this.PortalSettings.PortalId == portalId) + { + return true; } - /// A data transfer object with information about an item in a list. - [DataContract] - public class ItemDto + var isAdminUser = PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName); + if (!isAdminUser) { - /// Gets or sets the key. - [DataMember(Name = "key")] - public string Key { get; set; } + return false; + } - /// Gets or sets the value. - [DataMember(Name = "value")] - public string Value { get; set; } + var mygroup = this.GetMyPortalGroup(); + return mygroup != null && mygroup.Any(p => p.PortalId == portalId); + } - /// Gets or sets a value indicating whether this item has children. - [DataMember(Name = "hasChildren")] - public bool HasChildren { get; set; } + private int GetActivePortalId(int pageId) + { + var page = TabController.Instance.GetTab(pageId, Null.NullInteger, false); + var portalId = page.PortalID; - /// Gets or sets a value indicating whether this item is selectable. - [DataMember(Name = "selectable")] - public bool Selectable { get; set; } + if (portalId == Null.NullInteger) + { + portalId = this.GetActivePortalId(); } - /// A data transfer object with information about an item with an ID. - [DataContract] - public class ItemIdDto + return portalId; + } + + private int GetActivePortalId() + { + var portalId = -1; + if (!TabController.CurrentPage.IsSuperTab) { - /// Gets or sets the ID. - [DataMember(Name = "id")] - public string Id { get; set; } + portalId = this.PortalSettings.PortalId; } + + return portalId; + } + + /// A data transfer object with information about an item in a list. + [DataContract] + public class ItemDto + { + /// Gets or sets the key. + [DataMember(Name = "key")] + public string Key { get; set; } + + /// Gets or sets the value. + [DataMember(Name = "value")] + public string Value { get; set; } + + /// Gets or sets a value indicating whether this item has children. + [DataMember(Name = "hasChildren")] + public bool HasChildren { get; set; } + + /// Gets or sets a value indicating whether this item is selectable. + [DataMember(Name = "selectable")] + public bool Selectable { get; set; } + } + + /// A data transfer object with information about an item with an ID. + [DataContract] + public class ItemIdDto + { + /// Gets or sets the ID. + [DataMember(Name = "id")] + public string Id { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/LanguageServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/LanguageServiceController.cs index c13b95f964f..09e34f597b5 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/LanguageServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/LanguageServiceController.cs @@ -2,97 +2,96 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web; - using System.Web.Http; +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web; +using System.Web.Http; + +using DotNetNuke.Abstractions; +using DotNetNuke.Common; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Services.Localization; +using DotNetNuke.Web.Api; - using DotNetNuke.Abstractions; - using DotNetNuke.Common; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Services.Localization; - using DotNetNuke.Web.Api; +using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.DependencyInjection; +/// A web API for getting the translation status of a site. +[DnnAuthorize] +public class LanguageServiceController : DnnApiController +{ + private readonly ILocaleController localeController; + private readonly ITabController tabController; - /// A web API for getting the translation status of a site. - [DnnAuthorize] - public class LanguageServiceController : DnnApiController + /// Initializes a new instance of the class. + /// The navigation manager. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalAliasService. Scheduled removal in v12.0.0.")] + public LanguageServiceController(INavigationManager navigationManager) + : this(navigationManager, null, null) { - private readonly ILocaleController localeController; - private readonly ITabController tabController; + this.NavigationManager = navigationManager; + } - /// Initializes a new instance of the class. - /// The navigation manager. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalAliasService. Scheduled removal in v12.0.0.")] - public LanguageServiceController(INavigationManager navigationManager) - : this(navigationManager, null, null) - { - this.NavigationManager = navigationManager; - } + /// Initializes a new instance of the class. + /// The navigation manager. + /// The locale controller. + /// The tab controller. + public LanguageServiceController(INavigationManager navigationManager, ILocaleController localeController, ITabController tabController) + { + this.NavigationManager = navigationManager ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.localeController = localeController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.tabController = tabController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } - /// Initializes a new instance of the class. - /// The navigation manager. - /// The locale controller. - /// The tab controller. - public LanguageServiceController(INavigationManager navigationManager, ILocaleController localeController, ITabController tabController) - { - this.NavigationManager = navigationManager ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.localeController = localeController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.tabController = tabController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - } + /// Gets the navigation manager. + protected INavigationManager NavigationManager { get; } - /// Gets the navigation manager. - protected INavigationManager NavigationManager { get; } + /// Gets the pages which aren't translated for the . + /// The language code. + /// A response with a list of instances. + [HttpGet] + public HttpResponseMessage GetNonTranslatedPages(string languageCode) + { + var request = HttpContext.Current.Request; + var locale = this.localeController.GetLocale(languageCode); - /// Gets the pages which aren't translated for the . - /// The language code. - /// A response with a list of instances. - [HttpGet] - public HttpResponseMessage GetNonTranslatedPages(string languageCode) + List pages = []; + if (!this.IsDefaultLanguage(locale.Code)) { - var request = HttpContext.Current.Request; - var locale = this.localeController.GetLocale(languageCode); - - List pages = []; - if (!this.IsDefaultLanguage(locale.Code)) + var nonTranslated = from t in this.tabController.GetTabsByPortal(this.PortalSettings.PortalId).WithCulture(locale.Code, false).Values where !t.IsTranslated && !t.IsDeleted select t; + foreach (TabInfo page in nonTranslated) { - var nonTranslated = from t in this.tabController.GetTabsByPortal(this.PortalSettings.PortalId).WithCulture(locale.Code, false).Values where !t.IsTranslated && !t.IsDeleted select t; - foreach (TabInfo page in nonTranslated) + pages.Add(new PageDto() { - pages.Add(new PageDto() - { - Name = page.TabName, - ViewUrl = this.NavigationManager.NavigateURL(page.TabID), - EditUrl = this.NavigationManager.NavigateURL(page.TabID, "Tab", "action=edit", "returntabid=" + this.PortalSettings.ActiveTab.TabID), - }); - } + Name = page.TabName, + ViewUrl = this.NavigationManager.NavigateURL(page.TabID), + EditUrl = this.NavigationManager.NavigateURL(page.TabID, "Tab", "action=edit", "returntabid=" + this.PortalSettings.ActiveTab.TabID), + }); } - - return this.Request.CreateResponse(HttpStatusCode.OK, pages); } - private bool IsDefaultLanguage(string code) - { - return code == this.PortalSettings.DefaultLanguage; - } + return this.Request.CreateResponse(HttpStatusCode.OK, pages); + } - /// A data transfer object with information about a page. - public class PageDto - { - /// Gets or sets the page's name. - public string Name { get; set; } + private bool IsDefaultLanguage(string code) + { + return code == this.PortalSettings.DefaultLanguage; + } - /// Gets or sets the page's view URL. - public string ViewUrl { get; set; } + /// A data transfer object with information about a page. + public class PageDto + { + /// Gets or sets the page's name. + public string Name { get; set; } - /// Gets or sets the page's edit URL. - public string EditUrl { get; set; } - } + /// Gets or sets the page's view URL. + public string ViewUrl { get; set; } + + /// Gets or sets the page's edit URL. + public string EditUrl { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/MessagingServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/MessagingServiceController.cs index d33ac14b8f8..d18acef99a0 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/MessagingServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/MessagingServiceController.cs @@ -2,192 +2,191 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Common; +using DotNetNuke.Common.Internal; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Users; +using DotNetNuke.Instrumentation; +using DotNetNuke.Security; +using DotNetNuke.Security.Roles; +using DotNetNuke.Services.Social.Messaging; +using DotNetNuke.Services.Social.Messaging.Internal; +using DotNetNuke.Web.Api; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API for messaging. +[DnnAuthorize] +public class MessagingServiceController : DnnApiController { - using System; - using System.Collections.Generic; - using System.Diagnostics.CodeAnalysis; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Internal; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security; - using DotNetNuke.Security.Roles; - using DotNetNuke.Services.Social.Messaging; - using DotNetNuke.Services.Social.Messaging.Internal; - using DotNetNuke.Web.Api; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API for messaging. - [DnnAuthorize] - public class MessagingServiceController : DnnApiController + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(MessagingServiceController)); + private readonly IPortalController portalController; + private readonly IApplicationStatusInfo appStatus; + private readonly IPortalGroupController portalGroupController; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalController. Scheduled removal in v12.0.0.")] + public MessagingServiceController() + : this(null, null, null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(MessagingServiceController)); - private readonly IPortalController portalController; - private readonly IApplicationStatusInfo appStatus; - private readonly IPortalGroupController portalGroupController; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalController. Scheduled removal in v12.0.0.")] - public MessagingServiceController() - : this(null, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The portal controller. - /// The application status. - /// The portal group controller. - public MessagingServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + /// Initializes a new instance of the class. + /// The portal controller. + /// The application status. + /// The portal group controller. + public MessagingServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + { + this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } + + /// Gets how long a user needs to wait before being allowed to send a message. + /// A response with an object containing a Value field with the number of seconds. + [HttpGet] + public HttpResponseMessage WaitTimeForNextMessage() + { + try { - this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", Value = InternalMessagingController.Instance.WaitTimeForNextMessage(this.UserInfo) }); } - - /// Gets how long a user needs to wait before being allowed to send a message. - /// A response with an object containing a Value field with the number of seconds. - [HttpGet] - public HttpResponseMessage WaitTimeForNextMessage() + catch (Exception exc) { - try - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", Value = InternalMessagingController.Instance.WaitTimeForNextMessage(this.UserInfo) }); - } - catch (Exception exc) - { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); - } + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } + } - /// Creates a message. - /// Information about the new message. - /// A response with an object containing the ID of the new message. - [ValidateAntiForgeryToken] - [HttpPost] - public HttpResponseMessage Create(CreateDTO postData) + /// Creates a message. + /// Information about the new message. + /// A response with an object containing the ID of the new message. + [ValidateAntiForgeryToken] + [HttpPost] + public HttpResponseMessage Create(CreateDTO postData) + { + try { - try - { - var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); - var roleIdsList = string.IsNullOrEmpty(postData.RoleIds) ? null : postData.RoleIds.FromJson>(); - var userIdsList = string.IsNullOrEmpty(postData.UserIds) ? null : postData.UserIds.FromJson>(); - var fileIdsList = string.IsNullOrEmpty(postData.FileIds) ? null : postData.FileIds.FromJson>(); + var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); + var roleIdsList = string.IsNullOrEmpty(postData.RoleIds) ? null : postData.RoleIds.FromJson>(); + var userIdsList = string.IsNullOrEmpty(postData.UserIds) ? null : postData.UserIds.FromJson>(); + var fileIdsList = string.IsNullOrEmpty(postData.FileIds) ? null : postData.FileIds.FromJson>(); - var roles = roleIdsList is { Count: > 0, } - ? roleIdsList.Select(id => RoleController.Instance.GetRole(portalId, r => r.RoleID == id)).Where(role => role != null).ToList() - : null; + var roles = roleIdsList is { Count: > 0, } + ? roleIdsList.Select(id => RoleController.Instance.GetRole(portalId, r => r.RoleID == id)).Where(role => role != null).ToList() + : null; - List users = null; - if (userIdsList != null) - { - users = userIdsList.Select(id => UserController.Instance.GetUser(portalId, id)).Where(user => user != null).ToList(); - } + List users = null; + if (userIdsList != null) + { + users = userIdsList.Select(id => UserController.Instance.GetUser(portalId, id)).Where(user => user != null).ToList(); + } - var body = HttpUtility.UrlDecode(postData.Body); + var body = HttpUtility.UrlDecode(postData.Body); #pragma warning disable CS0618 // Type or member is obsolete - body = PortalSecurity.Instance.InputFilter(body, PortalSecurity.FilterFlag.NoMarkup); + body = PortalSecurity.Instance.InputFilter(body, PortalSecurity.FilterFlag.NoMarkup); #pragma warning restore CS0618 // Type or member is obsolete - var message = new Message { Subject = HttpUtility.UrlDecode(postData.Subject), Body = body, }; - MessagingController.Instance.SendMessage(message, roles, users, fileIdsList); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", Value = message.MessageID }); - } - catch (Exception exc) - { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); - } + var message = new Message { Subject = HttpUtility.UrlDecode(postData.Subject), Body = body, }; + MessagingController.Instance.SendMessage(message, roles, users, fileIdsList); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", Value = message.MessageID }); + } + catch (Exception exc) + { + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } + } - /// Searches users and roles. - /// The search query. - /// A response with a list of results (containing id, name, and iconfile fields) or null if there was no search query. - [HttpGet] - public HttpResponseMessage Search(string q) + /// Searches users and roles. + /// The search query. + /// A response with a list of results (containing id, name, and iconfile fields) or null if there was no search query. + [HttpGet] + public HttpResponseMessage Search(string q) + { + try { - try - { - var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); - var isAdmin = this.UserInfo.IsSuperUser || this.UserInfo.IsInRole("Administrators"); - const int numResults = 10; + var portalId = PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId); + var isAdmin = this.UserInfo.IsSuperUser || this.UserInfo.IsInRole("Administrators"); + const int numResults = 10; - // GetUsersAdvancedSearch doesn't accept a comma or a single quote in the query so we have to remove them for now. See issue 20224. - q = q.Replace(",", string.Empty).Replace("'", string.Empty); - if (q.Length == 0) - { - return this.Request.CreateResponse(HttpStatusCode.OK, null); - } - - var results = UserController.Instance.GetUsersBasicSearch(portalId, 0, numResults, "DisplayName", true, "DisplayName", q) - .Select(user => new - { - id = "user-" + user.UserID, - name = user.DisplayName, - iconfile = UserController.Instance.GetUserProfilePictureUrl(user.UserID, 32, 32), - }).ToList(); - - // Roles should be visible to Administrators or User in the Role. - var roles = RoleController.Instance.GetRolesBasicSearch(portalId, numResults, q); - results.AddRange(from roleInfo in roles - where - isAdmin || - this.UserInfo.Social.Roles.SingleOrDefault(ur => ur.RoleID == roleInfo.RoleID && ur.IsOwner) != null - select new - { - id = "role-" + roleInfo.RoleID, - name = roleInfo.RoleName, - iconfile = TestableGlobals.Instance.ResolveUrl(string.IsNullOrEmpty(roleInfo.IconFile) - ? "~/images/no_avatar.gif" - : this.PortalSettings.HomeDirectory.TrimEnd('/') + "/" + roleInfo.IconFile), - }); - - return this.Request.CreateResponse(HttpStatusCode.OK, results.OrderBy(sr => sr.name)); - } - catch (Exception exc) + // GetUsersAdvancedSearch doesn't accept a comma or a single quote in the query so we have to remove them for now. See issue 20224. + q = q.Replace(",", string.Empty).Replace("'", string.Empty); + if (q.Length == 0) { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); + return this.Request.CreateResponse(HttpStatusCode.OK, null); } - } - /// A data transfer object with information to create a message. - public class CreateDTO + var results = UserController.Instance.GetUsersBasicSearch(portalId, 0, numResults, "DisplayName", true, "DisplayName", q) + .Select(user => new + { + id = "user-" + user.UserID, + name = user.DisplayName, + iconfile = UserController.Instance.GetUserProfilePictureUrl(user.UserID, 32, 32), + }).ToList(); + + // Roles should be visible to Administrators or User in the Role. + var roles = RoleController.Instance.GetRolesBasicSearch(portalId, numResults, q); + results.AddRange(from roleInfo in roles + where + isAdmin || + this.UserInfo.Social.Roles.SingleOrDefault(ur => ur.RoleID == roleInfo.RoleID && ur.IsOwner) != null + select new + { + id = "role-" + roleInfo.RoleID, + name = roleInfo.RoleName, + iconfile = TestableGlobals.Instance.ResolveUrl(string.IsNullOrEmpty(roleInfo.IconFile) + ? "~/images/no_avatar.gif" + : this.PortalSettings.HomeDirectory.TrimEnd('/') + "/" + roleInfo.IconFile), + }); + + return this.Request.CreateResponse(HttpStatusCode.OK, results.OrderBy(sr => sr.name)); + } + catch (Exception exc) { - /// Gets or sets the message subject. - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string Subject; - - /// Gets or sets the message body. - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string Body; - - /// Gets or sets the IDs of the roles which are recipients of the message. - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string RoleIds; - - /// Gets or sets the IDs of the users which are recipients of the message. - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string UserIds; - - /// Gets or sets the IDs of the files which are attached to the message. - [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] - [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] - public string FileIds; + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } } + + /// A data transfer object with information to create a message. + public class CreateDTO + { + /// Gets or sets the message subject. + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string Subject; + + /// Gets or sets the message body. + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string Body; + + /// Gets or sets the IDs of the roles which are recipients of the message. + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string RoleIds; + + /// Gets or sets the IDs of the users which are recipients of the message. + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string UserIds; + + /// Gets or sets the IDs of the files which are attached to the message. + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1401:FieldsMustBePrivate", Justification = "Breaking change")] + [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields", Justification = "Breaking change")] + public string FileIds; + } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ModuleServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ModuleServiceController.cs index 07c3bacd439..fdd5d804c62 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ModuleServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ModuleServiceController.cs @@ -2,173 +2,172 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Portals; +using DotNetNuke.Common; +using DotNetNuke.Data; +using DotNetNuke.Entities.Modules; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Instrumentation; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.Api.Internal; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for module information. +[DnnAuthorize] +public class ModuleServiceController : DnnApiController { - using System; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Portals; - using DotNetNuke.Common; - using DotNetNuke.Data; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Instrumentation; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.Api.Internal; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for module information. - [DnnAuthorize] - public class ModuleServiceController : DnnApiController + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ModuleServiceController)); + private readonly IHostSettings hostSettings; + private readonly DataProvider dataProvider; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ModuleServiceController() + : this(null, null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ModuleServiceController)); - private readonly IHostSettings hostSettings; - private readonly DataProvider dataProvider; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ModuleServiceController() - : this(null, null) + } + + /// Initializes a new instance of the class. + /// The host settings. + /// The data provider. + public ModuleServiceController(IHostSettings hostSettings, DataProvider dataProvider) + { + this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.dataProvider = dataProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } + + /// Gets a value determining whether a module is shareable. + /// The module ID. + /// The tab ID. + /// The portal ID. + /// A response with an object containing Shareable and RequiredWarning fields. + [HttpGet] + [DnnAuthorize(StaticRoles = "Registered Users")] + public HttpResponseMessage GetModuleShareable(int moduleId, int tabId, int portalId = -1) + { + var requiresWarning = false; + if (portalId <= -1) { + var portalDict = PortalController.GetPortalDictionary(this.hostSettings, this.dataProvider); + portalId = portalDict[tabId]; } - - /// Initializes a new instance of the class. - /// The host settings. - /// The data provider. - public ModuleServiceController(IHostSettings hostSettings, DataProvider dataProvider) + else { - this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.dataProvider = dataProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + portalId = this.FixPortalId(portalId); } - /// Gets a value determining whether a module is shareable. - /// The module ID. - /// The tab ID. - /// The portal ID. - /// A response with an object containing Shareable and RequiredWarning fields. - [HttpGet] - [DnnAuthorize(StaticRoles = "Registered Users")] - public HttpResponseMessage GetModuleShareable(int moduleId, int tabId, int portalId = -1) + DesktopModuleInfo desktopModule; + if (tabId < 0) { - var requiresWarning = false; - if (portalId <= -1) - { - var portalDict = PortalController.GetPortalDictionary(this.hostSettings, this.dataProvider); - portalId = portalDict[tabId]; - } - else - { - portalId = this.FixPortalId(portalId); - } - - DesktopModuleInfo desktopModule; - if (tabId < 0) - { - desktopModule = DesktopModuleController.GetDesktopModule(this.hostSettings, moduleId, portalId); - } - else - { - var moduleInfo = ModuleController.Instance.GetModule(moduleId, tabId, false); - - desktopModule = moduleInfo.DesktopModule; + desktopModule = DesktopModuleController.GetDesktopModule(this.hostSettings, moduleId, portalId); + } + else + { + var moduleInfo = ModuleController.Instance.GetModule(moduleId, tabId, false); - requiresWarning = moduleInfo.PortalID != this.PortalSettings.PortalId && desktopModule.Shareable == ModuleSharing.Unknown; - } + desktopModule = moduleInfo.DesktopModule; - if (desktopModule == null) - { - var message = $"Cannot find module ID {moduleId} (tab ID {tabId}, portal ID {portalId})"; - Logger.Error(message); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message); - } + requiresWarning = moduleInfo.PortalID != this.PortalSettings.PortalId && desktopModule.Shareable == ModuleSharing.Unknown; + } - return this.Request.CreateResponse(HttpStatusCode.OK, new { Shareable = desktopModule.Shareable.ToString(), RequiresWarning = requiresWarning }); + if (desktopModule == null) + { + var message = $"Cannot find module ID {moduleId} (tab ID {tabId}, portal ID {portalId})"; + Logger.Error(message); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message); } - /// Moves a module. - /// Information about the move request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPageEditor] - public HttpResponseMessage MoveModule(MoveModuleDTO postData) + return this.Request.CreateResponse(HttpStatusCode.OK, new { Shareable = desktopModule.Shareable.ToString(), RequiresWarning = requiresWarning }); + } + + /// Moves a module. + /// Information about the move request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPageEditor] + public HttpResponseMessage MoveModule(MoveModuleDTO postData) + { + var moduleOrder = postData.ModuleOrder; + if (moduleOrder > 0) { - var moduleOrder = postData.ModuleOrder; - if (moduleOrder > 0) + // DNN-7099: the deleted modules won't show in page, so when the module index calculated from client, it will lost the + // index count of deleted modules and will cause order issue. + var deletedModules = ModuleController.Instance.GetTabModules(postData.TabId).Values.Where(m => m.IsDeleted); + foreach (var module in deletedModules) { - // DNN-7099: the deleted modules won't show in page, so when the module index calculated from client, it will lost the - // index count of deleted modules and will cause order issue. - var deletedModules = ModuleController.Instance.GetTabModules(postData.TabId).Values.Where(m => m.IsDeleted); - foreach (var module in deletedModules) + if (module.ModuleOrder < moduleOrder && module.PaneName == postData.Pane) { - if (module.ModuleOrder < moduleOrder && module.PaneName == postData.Pane) - { - moduleOrder += 2; - } + moduleOrder += 2; } } + } - ModuleController.Instance.UpdateModuleOrder(postData.TabId, postData.ModuleId, moduleOrder, postData.Pane); - ModuleController.Instance.UpdateTabModuleOrder(postData.TabId); + ModuleController.Instance.UpdateModuleOrder(postData.TabId, postData.ModuleId, moduleOrder, postData.Pane); + ModuleController.Instance.UpdateTabModuleOrder(postData.TabId); - return this.Request.CreateResponse(HttpStatusCode.OK); - } + return this.Request.CreateResponse(HttpStatusCode.OK); + } - /// Web method that deletes a tab module. - /// This has been introduced for integration testing purposes. - /// delete module dto. - /// Http response message. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnAuthorize(StaticRoles = "Administrators")] - public HttpResponseMessage DeleteModule(DeleteModuleDto deleteModuleDto) - { - ModuleController.Instance.DeleteTabModule(deleteModuleDto.TabId, deleteModuleDto.ModuleId, deleteModuleDto.SoftDelete); + /// Web method that deletes a tab module. + /// This has been introduced for integration testing purposes. + /// delete module dto. + /// Http response message. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnAuthorize(StaticRoles = "Administrators")] + public HttpResponseMessage DeleteModule(DeleteModuleDto deleteModuleDto) + { + ModuleController.Instance.DeleteTabModule(deleteModuleDto.TabId, deleteModuleDto.ModuleId, deleteModuleDto.SoftDelete); - return this.Request.CreateResponse(HttpStatusCode.OK); - } + return this.Request.CreateResponse(HttpStatusCode.OK); + } - private int FixPortalId(int portalId) - { - return this.UserInfo.IsSuperUser && - this.PortalSettings.PortalId != portalId && - PortalController.Instance.GetPortals().OfType().Any(x => x.PortalId == portalId) - ? portalId - : this.PortalSettings.PortalId; - } + private int FixPortalId(int portalId) + { + return this.UserInfo.IsSuperUser && + this.PortalSettings.PortalId != portalId && + PortalController.Instance.GetPortals().OfType().Any(x => x.PortalId == portalId) + ? portalId + : this.PortalSettings.PortalId; + } - /// A data transfer object with information about moving a module. - public class MoveModuleDTO - { - /// Gets or sets the module's ID. - public int ModuleId { get; set; } + /// A data transfer object with information about moving a module. + public class MoveModuleDTO + { + /// Gets or sets the module's ID. + public int ModuleId { get; set; } - /// Gets or sets the module order. - public int ModuleOrder { get; set; } + /// Gets or sets the module order. + public int ModuleOrder { get; set; } - /// Gets or sets the pane name. - public string Pane { get; set; } + /// Gets or sets the pane name. + public string Pane { get; set; } - /// Gets or sets the tab ID. - public int TabId { get; set; } - } + /// Gets or sets the tab ID. + public int TabId { get; set; } + } - /// A data transfer object with information about a request to delete a module. - public class DeleteModuleDto - { - /// Gets or sets the module ID. - public int ModuleId { get; set; } + /// A data transfer object with information about a request to delete a module. + public class DeleteModuleDto + { + /// Gets or sets the module ID. + public int ModuleId { get; set; } - /// Gets or sets the tab ID. - public int TabId { get; set; } + /// Gets or sets the tab ID. + public int TabId { get; set; } - /// Gets or sets a value indicating whether it is a soft or hard delete. - public bool SoftDelete { get; set; } - } + /// Gets or sets a value indicating whether it is a soft or hard delete. + public bool SoftDelete { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/NewUserNotificationServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/NewUserNotificationServiceController.cs index 759a8774047..e965eacc62d 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/NewUserNotificationServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/NewUserNotificationServiceController.cs @@ -2,155 +2,194 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Logging; +using DotNetNuke.Common; +using DotNetNuke.Entities; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Users; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Security; +using DotNetNuke.Security.Roles; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.Mail; +using DotNetNuke.Services.Social.Notifications; +using DotNetNuke.Web.Api; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for new user notifications. +/// The role provider. +/// The role controller. +/// The event manager. +/// The portal controller. +/// The user controller. +/// The event logger. +/// The host settings. +[DnnAuthorize] +public partial class NewUserNotificationServiceController(RoleProvider roleProvider, IRoleController roleController, IEventManager eventManager, IPortalController portalController, IUserController userController, IEventLogger eventLogger, IHostSettings hostSettings) + : DnnApiController { - using System; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Logging; - using DotNetNuke.Common; - using DotNetNuke.Entities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Security.Roles; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Mail; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Web.Api; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for new user notifications. + private readonly RoleProvider roleProvider = roleProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IRoleController roleController = roleController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IEventManager eventManager = eventManager ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IUserController userController = userController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public NewUserNotificationServiceController() + : this(null, null, null, null, null, null) + { + } + + /// Initializes a new instance of the class. /// The role provider. /// The role controller. /// The event manager. /// The portal controller. /// The user controller. /// The event logger. - /// The host settings. - [DnnAuthorize] - public class NewUserNotificationServiceController(RoleProvider roleProvider, IRoleController roleController, IEventManager eventManager, IPortalController portalController, IUserController userController, IEventLogger eventLogger, IHostSettings hostSettings) - : DnnApiController + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public NewUserNotificationServiceController(RoleProvider roleProvider, IRoleController roleController, IEventManager eventManager, IPortalController portalController, IUserController userController, IEventLogger eventLogger) + : this(roleProvider, roleController, eventManager, portalController, userController, eventLogger, null) { - private readonly RoleProvider roleProvider = roleProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IRoleController roleController = roleController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IEventManager eventManager = eventManager ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IUserController userController = userController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public NewUserNotificationServiceController() - : this(null, null, null, null, null, null) + } + + /// Authorizes a new user. + /// Information about the request. + /// A response indicating success. + [NonAction] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage Authorize(NotificationDTO postData) + => this.Authorize(postData?.ToNotificationRequest()); + + /// Authorizes a new user. + /// Information about the request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage Authorize(NotificationRequest requestBody) + { + if (!PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName)) { + return this.Request.CreateResponse(HttpStatusCode.Unauthorized); } - /// Initializes a new instance of the class. - /// The role provider. - /// The role controller. - /// The event manager. - /// The portal controller. - /// The user controller. - /// The event logger. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public NewUserNotificationServiceController(RoleProvider roleProvider, IRoleController roleController, IEventManager eventManager, IPortalController portalController, IUserController userController, IEventLogger eventLogger) - : this(roleProvider, roleController, eventManager, portalController, userController, eventLogger, null) + var user = this.GetUser(requestBody); + if (user == null) { + NotificationsController.Instance.DeleteNotification(requestBody.NotificationId); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "User not found"); } - /// Authorizes a new user. - /// Information about the request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage Authorize(NotificationDTO postData) - { - var user = this.GetUser(postData); - if (user == null) - { - NotificationsController.Instance.DeleteNotification(postData.NotificationId); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "User not found"); - } + user.Membership.Approved = true; + UserController.UpdateUser(this.eventLogger, this.PortalSettings.PortalId, user); - user.Membership.Approved = true; - UserController.UpdateUser(this.eventLogger, this.PortalSettings.PortalId, user); + // Update User Roles if needed + if (!user.IsSuperUser && user.IsInRole("Unverified Users") && this.PortalSettings.UserRegistration == (int)Globals.PortalRegistrationType.VerifiedRegistration) + { + UserController.ApproveUser(this.roleProvider, this.roleController, this.eventManager, this.portalController, this.userController, this.eventLogger, this.PortalSettings, user); + } - // Update User Roles if needed - if (!user.IsSuperUser && user.IsInRole("Unverified Users") && this.PortalSettings.UserRegistration == (int)Globals.PortalRegistrationType.VerifiedRegistration) - { - UserController.ApproveUser(this.roleProvider, this.roleController, this.eventManager, this.portalController, this.userController, this.eventLogger, this.PortalSettings, user); - } + Mail.SendMail(user, MessageType.UserAuthorized, this.PortalSettings); - Mail.SendMail(user, MessageType.UserAuthorized, this.PortalSettings); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + } - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + /// Rejects a new user. + /// Information about the request. + /// A response indicating success. + [NonAction] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage Reject(NotificationDTO postData) + => this.Reject(postData?.ToNotificationRequest()); + + /// Rejects a new user. + /// Information about the request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage Reject(NotificationRequest requestBody) + { + if (!PortalSecurity.IsInRole(this.PortalSettings.AdministratorRoleName)) + { + return this.Request.CreateResponse(HttpStatusCode.Unauthorized); } - /// Rejects a new user. - /// Information about the request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage Reject(NotificationDTO postData) + var user = this.GetUser(requestBody); + if (user == null) { - var user = this.GetUser(postData); - if (user == null) - { - NotificationsController.Instance.DeleteNotification(postData.NotificationId); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "User not found"); - } + NotificationsController.Instance.DeleteNotification(requestBody.NotificationId); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "User not found"); + } - UserController.RemoveUser(user); + UserController.RemoveUser(user); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + } - /// Sends a verification email to the current user. - /// Information about the request. - /// A response with an object that has a Result field. - /// The user is already verified. - /// The user is not unverified. - [HttpPost] - [DnnAuthorize] - [ValidateAntiForgeryToken] - public HttpResponseMessage SendVerificationMail(NotificationDTO postData) + /// Sends a verification email to the current user. + /// Information about the request. + /// A response with an object that has a Result field. + /// The user is already verified. + /// The user is not unverified. + [NonAction] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage SendVerificationMail(NotificationDTO postData) + => this.SendVerificationMail(postData?.ToNotificationRequest()); + + /// Sends a verification email to the current user. + /// Information about the request. + /// A response with an object that has a Result field. + /// The user is already verified. + /// The user is not unverified. + [HttpPost] + [DnnAuthorize] + [ValidateAntiForgeryToken] + public HttpResponseMessage SendVerificationMail(NotificationRequest requestBody) + { + if (this.UserInfo.Membership.Approved) { - if (this.UserInfo.Membership.Approved) - { - throw new UserAlreadyVerifiedException(); - } - - if (!this.UserInfo.IsInRole("Unverified Users")) - { - throw new InvalidVerificationCodeException(); - } + throw new UserAlreadyVerifiedException(); + } - var message = Mail.SendMail(this.UserInfo, MessageType.UserRegistrationVerified, this.PortalSettings); - if (string.IsNullOrEmpty(message)) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = Localization.GetSafeJSString("VerificationMailSendSuccessful", Localization.SharedResourceFile), }); - } - else - { - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message); - } + if (!this.UserInfo.IsInRole("Unverified Users")) + { + throw new InvalidVerificationCodeException(); } - private UserInfo GetUser(NotificationDTO notificationDto) + var message = Mail.SendMail(this.UserInfo, MessageType.UserRegistrationVerified, this.PortalSettings); + if (!string.IsNullOrEmpty(message)) { - var notification = NotificationsController.Instance.GetNotification(notificationDto.NotificationId); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message); + } - if (!int.TryParse(notification.Context, out var userId)) + return this.Request.CreateResponse( + HttpStatusCode.OK, + new { - return null; - } + Result = Localization.GetSafeJSString("VerificationMailSendSuccessful", Localization.SharedResourceFile), + }); + } - return UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, userId); + private UserInfo GetUser(NotificationRequest requestBody) + { + var notification = NotificationsController.Instance.GetNotification(requestBody.NotificationId); + if (!int.TryParse(notification.Context, out var userId)) + { + return null; } + + return UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, userId); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/NotificationDto.cs b/DNN Platform/DotNetNuke.Web/InternalServices/NotificationDto.cs deleted file mode 100644 index 2388feb4ed9..00000000000 --- a/DNN Platform/DotNetNuke.Web/InternalServices/NotificationDto.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - -namespace DotNetNuke.Web.InternalServices -{ - /// A data transfer object with information about a notification. - public class NotificationDTO - { - /// Gets or sets the ID of the notification. - public int NotificationId { get; set; } - } -} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/NotificationRequest.cs b/DNN Platform/DotNetNuke.Web/InternalServices/NotificationRequest.cs new file mode 100644 index 00000000000..043508f0505 --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/InternalServices/NotificationRequest.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Web.InternalServices; + +/// A data transfer object with information about a notification. +public class NotificationRequest +{ + /// Gets or sets the ID of the notification. + public int NotificationId { get; set; } +} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/NotificationsServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/NotificationsServiceController.cs index cbc4e4e9b4e..a3e443a5272 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/NotificationsServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/NotificationsServiceController.cs @@ -2,64 +2,73 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Instrumentation; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Services.Social.Messaging.Internal; +using DotNetNuke.Services.Social.Notifications; +using DotNetNuke.Web.Api; + +/// A web API controller for notifications. +[DnnAuthorize] +public partial class NotificationsServiceController : DnnApiController { - using System; - using System.Collections.Generic; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web.Http; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(NotificationsServiceController)); - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.Social.Messaging.Internal; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Web.Api; + /// Dismisses a notification. + /// Information about the notification. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage Dismiss(NotificationDTO postData) + => this.Dismiss(postData?.ToNotificationRequest()); - /// A web API controller for notifications. - [DnnAuthorize] - public class NotificationsServiceController : DnnApiController + /// Dismisses a notification. + /// Information about the notification. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage Dismiss(NotificationRequest requestBody) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(NotificationsServiceController)); - - /// Dismisses a notification. - /// Information about the notification. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage Dismiss(NotificationDTO postData) + try { - try + var recipient = InternalMessagingController.Instance.GetMessageRecipient(requestBody.NotificationId, this.UserInfo.UserID); + if (recipient != null) { - var recipient = InternalMessagingController.Instance.GetMessageRecipient(postData.NotificationId, this.UserInfo.UserID); - if (recipient != null) - { - NotificationsController.Instance.DeleteNotificationRecipient(postData.NotificationId, this.UserInfo.UserID); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); - } - - return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to dismiss notification"); - } - catch (Exception exc) - { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); + NotificationsController.Instance.DeleteNotificationRecipient(requestBody.NotificationId, this.UserInfo.UserID); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success" }); } - } - /// Gets toasts for the user. - /// A response with an object that has a Toasts field. - [HttpGet] - public HttpResponseMessage GetToasts() - { - var toasts = NotificationsController.Instance.GetToasts(this.UserInfo); - IList convertedObjects = toasts.Select(this.ToExpandoObject).ToList(); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Toasts = convertedObjects.Take(3) }); + return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to dismiss notification"); } - - private object ToExpandoObject(Notification notification) + catch (Exception exc) { - return new { Subject = notification.Subject, Body = notification.Body }; + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } } + + /// Gets toasts for the user. + /// A response with an object that has a Toasts field. + [HttpGet] + public HttpResponseMessage GetToasts() + { + var toasts = NotificationsController.Instance.GetToasts(this.UserInfo); + IList convertedObjects = toasts.Select(this.ToExpandoObject).ToList(); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Toasts = convertedObjects.Take(3) }); + } + + private object ToExpandoObject(Notification notification) + { + return new { Subject = notification.Subject, Body = notification.Body }; + } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/NotificationDto.cs b/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/NotificationDto.cs new file mode 100644 index 00000000000..4ad88c31004 --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/NotificationDto.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Web.InternalServices; + +using DotNetNuke.Internal.SourceGenerators; + +/// A data transfer object with information about a notification. +[DnnDeprecated(10, 3, 3, "Use NotificationRequest")] +public partial class NotificationDTO +{ + /// Gets or sets the ID of the notification. + public int NotificationId { get; set; } + + /// Converts this instance into a . + /// A instance. + public NotificationRequest ToNotificationRequest() + { + return new NotificationRequest + { + NotificationId = this.NotificationId, + }; + } +} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/PublishPageDto.cs b/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/PublishPageDto.cs new file mode 100644 index 00000000000..d0c5e1bb202 --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/InternalServices/Obsolete/PublishPageDto.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Web.InternalServices; + +using DotNetNuke.Internal.SourceGenerators; + +/// A data transfer object with information about a request to publish the current page. +[DnnDeprecated(10, 3, 3, "Use PublishPageRequest")] +public partial class PublishPageDto +{ + /// Gets or sets a value indicating whether to publish. + public bool Publish { get; set; } + + /// Converts this instance to a . + /// A instance. + public PublishPageRequest ToPublishPageRequest() + { + return new PublishPageRequest + { + Publish = this.Publish, + }; + } +} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/PageServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/PageServiceController.cs index b4ba2585ceb..9f0fc1c01e0 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/PageServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/PageServiceController.cs @@ -2,170 +2,150 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Urls; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Services.Localization; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.Api.Internal; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for pages. +[DnnAuthorize] +[DnnPageEditor] +public partial class PageServiceController : DnnApiController { - using System; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Urls; - using DotNetNuke.Services.Localization; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.Api.Internal; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for pages. - [DnnAuthorize] - [DnnPageEditor] - public class PageServiceController : DnnApiController + private readonly IPortalController portalController; + private readonly IHostSettings hostSettings; + private readonly IHostSettingsService hostSettingsService; + private int? portalId; + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public PageServiceController() + : this(null, null, null) { - private readonly IPortalController portalController; - private readonly IHostSettings hostSettings; - private readonly IHostSettingsService hostSettingsService; - private int? portalId; - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public PageServiceController() - : this(null, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The portal controller. - /// The host settings. - /// The host settings service. - public PageServiceController(IPortalController portalController, IHostSettings hostSettings, IHostSettingsService hostSettingsService) - { - this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - } + /// Initializes a new instance of the class. + /// The portal controller. + /// The host settings. + /// The host settings service. + public PageServiceController(IPortalController portalController, IHostSettings hostSettings, IHostSettingsService hostSettingsService) + { + this.portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } - /// Gets the portal ID. - protected int PortalId + /// Gets the portal ID. + protected int PortalId + { + get { - get + if (!this.portalId.HasValue) { - if (!this.portalId.HasValue) - { - this.portalId = this.PortalSettings.ActiveTab.IsSuperTab ? -1 : this.PortalSettings.PortalId; - } - - return this.portalId.Value; + this.portalId = this.PortalSettings.ActiveTab.IsSuperTab ? -1 : this.PortalSettings.PortalId; } - } - /// Publishes a page. - /// The publish request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [DnnPagePermission] - public HttpResponseMessage PublishPage(PublishPageDto dto) - { - var tabId = this.Request.FindTabId(); - - TabPublishingController.Instance.SetTabPublishing(tabId, this.PortalId, dto.Publish); - - return this.Request.CreateResponse(HttpStatusCode.OK); + return this.portalId.Value; } + } - /// Updates a custom URL for a page. - /// The update request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage UpdateCustomUrl(SaveUrlDto dto) - { - var urlPath = dto.Path.ValueOrEmpty().TrimStart('/'); + /// Publishes a page. + /// The publish request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPagePermission] + [DnnDeprecated(10, 3, 3, "Use overload taking PublishPageRequest")] + public partial HttpResponseMessage PublishPage(PublishPageDto dto) + => this.PublishPage(dto?.ToPublishPageRequest()); + + /// Publishes a page. + /// The publish request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnPagePermission] + public HttpResponseMessage PublishPage(PublishPageRequest requestBody) + { + var tabId = this.Request.FindTabId(); - // Clean Url - var options = UrlRewriterUtils.ExtendOptionsForCustomURLs(UrlRewriterUtils.GetOptionsFromSettings(new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, this.PortalSettings.PortalId))); + TabPublishingController.Instance.SetTabPublishing(tabId, this.PortalId, requestBody.Publish); - // now clean the path - urlPath = FriendlyUrlController.CleanNameForUrl(urlPath, options, out var modified); - if (modified) - { - return this.Request.CreateResponse( - HttpStatusCode.OK, - new - { - Success = false, - ErrorMessage = Localization.GetString("CustomUrlPathCleaned.Error", Localization.GlobalResourceFile), - SuggestedUrlPath = "/" + urlPath, - }); - } + return this.Request.CreateResponse(HttpStatusCode.OK); + } - // Validate for uniqueness - urlPath = FriendlyUrlController.ValidateUrl(urlPath, -1, this.PortalSettings, out modified); - if (modified) - { - return this.Request.CreateResponse( - HttpStatusCode.OK, - new - { - Success = false, - ErrorMessage = Localization.GetString("UrlPathNotUnique.Error", Localization.GlobalResourceFile), - SuggestedUrlPath = "/" + urlPath, - }); - } + /// Updates a custom URL for a page. + /// The update request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage UpdateCustomUrl(SaveUrlDto dto) + { + var urlPath = dto.Path.ValueOrEmpty().TrimStart('/'); - var tab = this.PortalSettings.ActiveTab; - var cultureCode = LocaleController.Instance.GetLocales(this.PortalId) - .Where(l => l.Value.KeyID == dto.LocaleKey) - .Select(l => l.Value.Code) - .SingleOrDefault(); + // Clean Url + var options = UrlRewriterUtils.ExtendOptionsForCustomURLs(UrlRewriterUtils.GetOptionsFromSettings(new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, this.PortalSettings.PortalId))); - if (dto.StatusCodeKey.ToString(CultureInfo.InvariantCulture) == "200") - { - // We need to check if we are updating a current url or creating a new 200 - var tabUrl = tab.TabUrls.SingleOrDefault(t => t.SeqNum == dto.Id - && t.HttpStatus == "200"); - if (tabUrl == null) + // now clean the path + urlPath = FriendlyUrlController.CleanNameForUrl(urlPath, options, out var modified); + if (modified) + { + return this.Request.CreateResponse( + HttpStatusCode.OK, + new { - // Just create Url - tabUrl = new TabUrlInfo - { - TabId = tab.TabID, - SeqNum = dto.Id, - PortalAliasId = dto.SiteAliasKey, - PortalAliasUsage = (PortalAliasUsageType)dto.SiteAliasUsage, - QueryString = dto.QueryString.ValueOrEmpty(), - Url = dto.Path.ValueOrEmpty(), - CultureCode = cultureCode, - HttpStatus = dto.StatusCodeKey.ToString(CultureInfo.InvariantCulture), - IsSystem = dto.IsSystem, // false - }; - TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); - } - else + Success = false, + ErrorMessage = Localization.GetString("CustomUrlPathCleaned.Error", Localization.GlobalResourceFile), + SuggestedUrlPath = "/" + urlPath, + }); + } + + // Validate for uniqueness + urlPath = FriendlyUrlController.ValidateUrl(urlPath, -1, this.PortalSettings, out modified); + if (modified) + { + return this.Request.CreateResponse( + HttpStatusCode.OK, + new { - // Change the original 200 url to a redirect - tabUrl.HttpStatus = "301"; - tabUrl.SeqNum = dto.Id; - TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); - - // Add new custom url - tabUrl.Url = dto.Path.ValueOrEmpty(); - tabUrl.HttpStatus = "200"; - tabUrl.SeqNum = tab.TabUrls.Max(t => t.SeqNum) + 1; - TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); - } - } - else + Success = false, + ErrorMessage = Localization.GetString("UrlPathNotUnique.Error", Localization.GlobalResourceFile), + SuggestedUrlPath = "/" + urlPath, + }); + } + + var tab = this.PortalSettings.ActiveTab; + var cultureCode = LocaleController.Instance.GetLocales(this.PortalId) + .Where(l => l.Value.KeyID == dto.LocaleKey) + .Select(l => l.Value.Code) + .SingleOrDefault(); + + if (dto.StatusCodeKey.ToString(CultureInfo.InvariantCulture) == "200") + { + // We need to check if we are updating a current url or creating a new 200 + var tabUrl = tab.TabUrls.SingleOrDefault(t => t.SeqNum == dto.Id + && t.HttpStatus == "200"); + if (tabUrl == null) { - // Just update the url - var tabUrl = new TabUrlInfo + // Just create Url + tabUrl = new TabUrlInfo { TabId = tab.TabID, SeqNum = dto.Id, @@ -179,13 +159,43 @@ public HttpResponseMessage UpdateCustomUrl(SaveUrlDto dto) }; TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); } + else + { + // Change the original 200 url to a redirect + tabUrl.HttpStatus = "301"; + tabUrl.SeqNum = dto.Id; + TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); - var response = new + // Add new custom url + tabUrl.Url = dto.Path.ValueOrEmpty(); + tabUrl.HttpStatus = "200"; + tabUrl.SeqNum = tab.TabUrls.Max(t => t.SeqNum) + 1; + TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); + } + } + else + { + // Just update the url + var tabUrl = new TabUrlInfo { - Success = true, + TabId = tab.TabID, + SeqNum = dto.Id, + PortalAliasId = dto.SiteAliasKey, + PortalAliasUsage = (PortalAliasUsageType)dto.SiteAliasUsage, + QueryString = dto.QueryString.ValueOrEmpty(), + Url = dto.Path.ValueOrEmpty(), + CultureCode = cultureCode, + HttpStatus = dto.StatusCodeKey.ToString(CultureInfo.InvariantCulture), + IsSystem = dto.IsSystem, // false }; - - return this.Request.CreateResponse(HttpStatusCode.OK, response); + TabController.Instance.SaveTabUrl(tabUrl, this.PortalId, true); } + + var response = new + { + Success = true, + }; + + return this.Request.CreateResponse(HttpStatusCode.OK, response); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ProfileServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ProfileServiceController.cs index 2470bb95865..83aa9239bf8 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ProfileServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ProfileServiceController.cs @@ -1,160 +1,159 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Logging; +using DotNetNuke.Common; +using DotNetNuke.Common.Lists; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Urls; +using DotNetNuke.Entities.Users; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.Registration; +using DotNetNuke.Web.Api; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for a user's profile. +/// The portal controller. +/// The application status. +/// The portal group controller. +/// The host settings. +/// The host settings service. +/// The event logger. +/// The list controller. +[DnnAuthorize] +public class ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, IEventLogger eventLogger, ListController listController) + : DnnApiController { - using System; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Abstractions.Logging; - using DotNetNuke.Common; - using DotNetNuke.Common.Lists; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Urls; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Registration; - using DotNetNuke.Web.Api; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for a user's profile. + private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IPortalGroupController portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IHostSettingsService hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly ListController listController = listController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalController. Scheduled removal in v12.0.0.")] + public ProfileServiceController() + : this(null, null, null, null, null, null) + { + } + + /// Initializes a new instance of the class. + /// The portal controller. + /// The application status. + /// The portal group controller. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) + : this(portalController, appStatus, portalGroupController, null, null, null) + { + } + + /// Initializes a new instance of the class. /// The portal controller. /// The application status. /// The portal group controller. /// The host settings. /// The host settings service. /// The event logger. - /// The list controller. - [DnnAuthorize] - public class ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, IEventLogger eventLogger, ListController listController) - : DnnApiController + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with ListController. Scheduled removal in v12.0.0.")] + public ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, IEventLogger eventLogger) + : this(portalController, appStatus, portalGroupController, hostSettings, hostSettingsService, eventLogger, null) { - private readonly IPortalController portalController = portalController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IPortalGroupController portalGroupController = portalGroupController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IHostSettingsService hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly IEventLogger eventLogger = eventLogger ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - private readonly ListController listController = listController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IPortalController. Scheduled removal in v12.0.0.")] - public ProfileServiceController() - : this(null, null, null, null, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The portal controller. - /// The application status. - /// The portal group controller. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController) - : this(portalController, appStatus, portalGroupController, null, null, null) - { - } + /// Searches a registration profile. + /// The search criteria. + /// A response with a list of objects containing id and name fields. + [HttpGet] + public HttpResponseMessage Search(string q) + { + var results = RegistrationProfileController.Instance.Search(PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId), q); + return this.Request.CreateResponse( + HttpStatusCode.OK, + results.OrderBy(sr => sr) + .Select(field => new { id = field, name = field })); + } - /// Initializes a new instance of the class. - /// The portal controller. - /// The application status. - /// The portal group controller. - /// The host settings. - /// The host settings service. - /// The event logger. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with ListController. Scheduled removal in v12.0.0.")] - public ProfileServiceController(IPortalController portalController, IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, IEventLogger eventLogger) - : this(portalController, appStatus, portalGroupController, hostSettings, hostSettingsService, eventLogger, null) - { - } + /// Updates a user's vanity URL. + /// The URL. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage UpdateVanityUrl(VanityUrlDTO vanityUrl) + { + // Clean Url + var options = UrlRewriterUtils.GetOptionsFromSettings(new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, this.PortalSettings.PortalId)); + var cleanUrl = FriendlyUrlController.CleanNameForUrl(vanityUrl.Url, options, out var modified); - /// Searches a registration profile. - /// The search criteria. - /// A response with a list of objects containing id and name fields. - [HttpGet] - public HttpResponseMessage Search(string q) + if (modified) { - var results = RegistrationProfileController.Instance.Search(PortalController.GetEffectivePortalId(this.portalController, this.appStatus, this.portalGroupController, this.PortalSettings.PortalId), q); return this.Request.CreateResponse( HttpStatusCode.OK, - results.OrderBy(sr => sr) - .Select(field => new { id = field, name = field })); + new + { + Result = "warning", + Title = Localization.GetString("CleanWarningTitle", Localization.SharedResourceFile), + Message = Localization.GetString("ProfileUrlCleaned", Localization.SharedResourceFile), + SuggestedUrl = cleanUrl, + }); } - /// Updates a user's vanity URL. - /// The URL. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage UpdateVanityUrl(VanityUrlDTO vanityUrl) - { - // Clean Url - var options = UrlRewriterUtils.GetOptionsFromSettings(new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, this.PortalSettings.PortalId)); - var cleanUrl = FriendlyUrlController.CleanNameForUrl(vanityUrl.Url, options, out var modified); - - if (modified) - { - return this.Request.CreateResponse( - HttpStatusCode.OK, - new - { - Result = "warning", - Title = Localization.GetString("CleanWarningTitle", Localization.SharedResourceFile), - Message = Localization.GetString("ProfileUrlCleaned", Localization.SharedResourceFile), - SuggestedUrl = cleanUrl, - }); - } - - // Validate for uniqueness - var uniqueUrl = FriendlyUrlController.ValidateUrl(cleanUrl, -1, this.PortalSettings, out modified); - - if (modified) - { - return this.Request.CreateResponse( - HttpStatusCode.OK, - new - { - Result = "warning", - Title = Localization.GetString("DuplicateUrlWarningTitle", Localization.SharedResourceFile), - Message = Localization.GetString("ProfileUrlNotUnique", Localization.SharedResourceFile), - SuggestedUrl = uniqueUrl, - }); - } - - var user = this.PortalSettings.UserInfo; - user.VanityUrl = uniqueUrl; - UserController.UpdateUser(this.eventLogger, this.PortalSettings.PortalId, user); - - DataCache.RemoveCache(string.Format(CultureInfo.InvariantCulture, CacheController.VanityUrlLookupKey, this.PortalSettings.PortalId)); - - // Url is clean and validated so we can update the User - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } + // Validate for uniqueness + var uniqueUrl = FriendlyUrlController.ValidateUrl(cleanUrl, -1, this.PortalSettings, out modified); - /// Gets the profile property values. - /// A response with a list of values. - [DnnAuthorize] - [HttpGet] - public HttpResponseMessage ProfilePropertyValues() + if (modified) { - string searchString = HttpContext.Current.Request.Params["SearchString"].NormalizeString(); - string propertyName = HttpContext.Current.Request.Params["PropName"].NormalizeString(); - int portalId = int.Parse(HttpContext.Current.Request.Params["PortalId"], CultureInfo.InvariantCulture); - return this.Request.CreateResponse(HttpStatusCode.OK, Entities.Profile.ProfileController.SearchProfilePropertyValues(this.listController, this.hostSettings, this.portalController, this.appStatus, this.portalGroupController, portalId, propertyName, searchString)); + return this.Request.CreateResponse( + HttpStatusCode.OK, + new + { + Result = "warning", + Title = Localization.GetString("DuplicateUrlWarningTitle", Localization.SharedResourceFile), + Message = Localization.GetString("ProfileUrlNotUnique", Localization.SharedResourceFile), + SuggestedUrl = uniqueUrl, + }); } - /// A data transfer object with information about a vanity URL. - public class VanityUrlDTO - { - /// Gets or sets the URL. - public string Url { get; set; } - } + var user = this.PortalSettings.UserInfo; + user.VanityUrl = uniqueUrl; + UserController.UpdateUser(this.eventLogger, this.PortalSettings.PortalId, user); + + DataCache.RemoveCache(string.Format(CultureInfo.InvariantCulture, CacheController.VanityUrlLookupKey, this.PortalSettings.PortalId)); + + // Url is clean and validated so we can update the User + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + } + + /// Gets the profile property values. + /// A response with a list of values. + [DnnAuthorize] + [HttpGet] + public HttpResponseMessage ProfilePropertyValues() + { + string searchString = HttpContext.Current.Request.Params["SearchString"].NormalizeString(); + string propertyName = HttpContext.Current.Request.Params["PropName"].NormalizeString(); + int portalId = int.Parse(HttpContext.Current.Request.Params["PortalId"], CultureInfo.InvariantCulture); + return this.Request.CreateResponse(HttpStatusCode.OK, Entities.Profile.ProfileController.SearchProfilePropertyValues(this.listController, this.hostSettings, this.portalController, this.appStatus, this.portalGroupController, portalId, propertyName, searchString)); + } + + /// A data transfer object with information about a vanity URL. + public class VanityUrlDTO + { + /// Gets or sets the URL. + public string Url { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageDto.cs b/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageDto.cs deleted file mode 100644 index d5507f61a5a..00000000000 --- a/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageDto.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - -namespace DotNetNuke.Web.InternalServices -{ - /// A data transfer object with information about a request to publish the current page. - public class PublishPageDto - { - /// Gets or sets a value indicating whether to publish. - public bool Publish { get; set; } - } -} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageRequest.cs b/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageRequest.cs new file mode 100644 index 00000000000..ec059cf04ab --- /dev/null +++ b/DNN Platform/DotNetNuke.Web/InternalServices/PublishPageRequest.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Web.InternalServices; + +/// A data transfer object with information about a request to publish the current page. +public class PublishPageRequest +{ + /// Gets or sets a value indicating whether to publish. + public bool Publish { get; set; } +} diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/RelationshipServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/RelationshipServiceController.cs index c5c29a870b6..d5d0c9b98fd 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/RelationshipServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/RelationshipServiceController.cs @@ -2,141 +2,159 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Common; +using DotNetNuke.Entities.Users; +using DotNetNuke.Entities.Users.Social; +using DotNetNuke.Instrumentation; +using DotNetNuke.Internal.SourceGenerators; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.Social.Messaging.Internal; +using DotNetNuke.Services.Social.Notifications; +using DotNetNuke.Web.Api; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for relationships. +/// The host settings. +[DnnAuthorize] +public partial class RelationshipServiceController(IHostSettings hostSettings) + : DnnApiController { - using System; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Entities.Users; - using DotNetNuke.Entities.Users.Social; - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.Social.Messaging.Internal; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Web.Api; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for relationships. - /// The host settings. - [DnnAuthorize] - public class RelationshipServiceController(IHostSettings hostSettings) - : DnnApiController + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(RelationshipServiceController)); + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + + /// Initializes a new instance of the class. + [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public RelationshipServiceController() + : this(null) { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(RelationshipServiceController)); - private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + } - /// Initializes a new instance of the class. - [Obsolete("Deprecated in DotNetNuke 10.2.4. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public RelationshipServiceController() - : this(null) - { - } + /// Accept a friend. + /// The request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage AcceptFriend(NotificationDTO postData) + => this.AcceptFriend(postData?.ToNotificationRequest()); + + /// Accept a friend. + /// The request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage AcceptFriend(NotificationRequest requestBody) + { + var success = false; - /// Accept a friend. - /// The request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage AcceptFriend(NotificationDTO postData) + try { - var success = false; - - try + var recipient = InternalMessagingController.Instance.GetMessageRecipient(requestBody.NotificationId, this.UserInfo.UserID); + if (recipient != null) { - var recipient = InternalMessagingController.Instance.GetMessageRecipient(postData.NotificationId, this.UserInfo.UserID); - if (recipient != null) + var notification = NotificationsController.Instance.GetNotification(requestBody.NotificationId); + if (int.TryParse(notification.Context, out var userRelationshipId)) { - var notification = NotificationsController.Instance.GetNotification(postData.NotificationId); - if (int.TryParse(notification.Context, out var userRelationshipId)) + var userRelationship = RelationshipController.Instance.GetUserRelationship(userRelationshipId); + if (userRelationship != null) { - var userRelationship = RelationshipController.Instance.GetUserRelationship(userRelationshipId); - if (userRelationship != null) - { - var friend = UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, userRelationship.UserId); - FriendsController.Instance.AcceptFriend(friend); - success = true; - } + var friend = UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, userRelationship.UserId); + FriendsController.Instance.AcceptFriend(friend); + success = true; } } } - catch (Exception exc) - { - Logger.Error(exc); - } - - if (success) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } - - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + catch (Exception exc) + { + Logger.Error(exc); } - /// Follow a user who has requested to follow you. - /// The request. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage FollowBack(NotificationDTO postData) + if (success) { - var success = false; + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); + } + + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + } + + /// Follow a user who has requested to follow you. + /// The request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [DnnDeprecated(10, 3, 3, "Use overload taking NotificationRequest")] + public partial HttpResponseMessage FollowBack(NotificationDTO postData) + => this.FollowBack(postData?.ToNotificationRequest()); + + /// Follow a user who has requested to follow you. + /// The request. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage FollowBack(NotificationRequest requestBody) + { + var success = false; - try + try + { + var recipient = InternalMessagingController.Instance.GetMessageRecipient(requestBody.NotificationId, this.UserInfo.UserID); + if (recipient != null) { - var recipient = InternalMessagingController.Instance.GetMessageRecipient(postData.NotificationId, this.UserInfo.UserID); - if (recipient != null) + var notification = NotificationsController.Instance.GetNotification(requestBody.NotificationId); + if (int.TryParse(notification.Context, out var targetUserId)) { - var notification = NotificationsController.Instance.GetNotification(postData.NotificationId); - if (int.TryParse(notification.Context, out var targetUserId)) - { - var targetUser = UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, targetUserId); + var targetUser = UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, targetUserId); - if (targetUser == null) + if (targetUser == null) + { + var response = new { - var response = new - { - Message = Localization.GetExceptionMessage( - "UserDoesNotExist", - "The user you are trying to follow no longer exists."), - }; - return this.Request.CreateResponse(HttpStatusCode.InternalServerError, response); - } - - FollowersController.Instance.FollowUser(targetUser); - NotificationsController.Instance.DeleteNotificationRecipient(postData.NotificationId, this.UserInfo.UserID); - - success = true; + Message = Localization.GetExceptionMessage( + "UserDoesNotExist", + "The user you are trying to follow no longer exists."), + }; + return this.Request.CreateResponse(HttpStatusCode.InternalServerError, response); } + + FollowersController.Instance.FollowUser(targetUser); + NotificationsController.Instance.DeleteNotificationRecipient(requestBody.NotificationId, this.UserInfo.UserID); + + success = true; } } - catch (UserRelationshipExistsException exc) - { - Logger.Error(exc); - var response = new - { - Message = Localization.GetExceptionMessage( - "AlreadyFollowingUser", - "You are already following this user."), - }; - return this.Request.CreateResponse(HttpStatusCode.InternalServerError, response); - } - catch (Exception exc) - { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc.Message); - } - - if (success) + } + catch (UserRelationshipExistsException exc) + { + Logger.Error(exc); + var response = new { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); - } + Message = Localization.GetExceptionMessage( + "AlreadyFollowingUser", + "You are already following this user."), + }; + return this.Request.CreateResponse(HttpStatusCode.InternalServerError, response); + } + catch (Exception exc) + { + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc.Message); + } - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); + if (success) + { + return this.Request.CreateResponse(HttpStatusCode.OK, new { Result = "success", }); } + + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "unable to process notification"); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/SearchServiceController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/SearchServiceController.cs index 67e1925536b..edb1353920e 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/SearchServiceController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/SearchServiceController.cs @@ -2,764 +2,763 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text.RegularExpressions; +using System.Web; +using System.Web.Caching; +using System.Web.Http; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Data; +using DotNetNuke.Entities.Modules; +using DotNetNuke.Entities.Modules.Definitions; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Users; +using DotNetNuke.Services.Search.Controllers; +using DotNetNuke.Services.Search.Entities; +using DotNetNuke.Services.Search.Internals; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.InternalServices.Views.Search; + +using Microsoft.Extensions.DependencyInjection; + +/// A web API controller for searching. +[DnnAuthorize(StaticRoles = "Administrators")] +public class SearchServiceController : DnnApiController { - using System; - using System.Collections; - using System.Collections.Generic; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Text.RegularExpressions; - using System.Web; - using System.Web.Caching; - using System.Web.Http; - - using DotNetNuke.Abstractions.Application; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Data; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Modules.Definitions; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Users; - using DotNetNuke.Services.Search.Controllers; - using DotNetNuke.Services.Search.Entities; - using DotNetNuke.Services.Search.Internals; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.InternalServices.Views.Search; - - using Microsoft.Extensions.DependencyInjection; - - /// A web API controller for searching. - [DnnAuthorize(StaticRoles = "Administrators")] - public class SearchServiceController : DnnApiController + private const string ModuleInfosCacheKey = "ModuleInfos{0}"; + private const CacheItemPriority ModuleInfosCachePriority = CacheItemPriority.AboveNormal; + private const int ModuleInfosCacheTimeOut = 20; + private const string ModuleTitleCacheKey = "SearchModuleTabTitle_{0}"; + private const CacheItemPriority ModuleTitleCachePriority = CacheItemPriority.Normal; + private const int ModuleTitleCacheTimeOut = 20; + private static readonly Regex GroupedBasicViewRegex = new Regex(@"userid(/|\|=)(\d+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private readonly ISearchController searchController; + private readonly IHostSettings hostSettings; + private readonly IHostSettingsService hostSettingsService; + private readonly int htmlModuleDefinitionId; + + /// Initializes a new instance of the class. + /// The search controller. + [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public SearchServiceController(ISearchController searchController) + : this(searchController, null, null) { - private const string ModuleInfosCacheKey = "ModuleInfos{0}"; - private const CacheItemPriority ModuleInfosCachePriority = CacheItemPriority.AboveNormal; - private const int ModuleInfosCacheTimeOut = 20; - private const string ModuleTitleCacheKey = "SearchModuleTabTitle_{0}"; - private const CacheItemPriority ModuleTitleCachePriority = CacheItemPriority.Normal; - private const int ModuleTitleCacheTimeOut = 20; - private static readonly Regex GroupedBasicViewRegex = new Regex(@"userid(/|\|=)(\d+)", RegexOptions.IgnoreCase | RegexOptions.Compiled); - - private readonly ISearchController searchController; - private readonly IHostSettings hostSettings; - private readonly IHostSettingsService hostSettingsService; - private readonly int htmlModuleDefinitionId; - - /// Initializes a new instance of the class. - /// The search controller. - [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] - public SearchServiceController(ISearchController searchController) - : this(searchController, null, null) - { - } + } - /// Initializes a new instance of the class. - /// The search controller. - /// The host settings. - /// The host settings service. - public SearchServiceController(ISearchController searchController, IHostSettings hostSettings, IHostSettingsService hostSettingsService) - : this(searchController, hostSettings, hostSettingsService, ModuleDefinitionController.GetModuleDefinitionByFriendlyName("Text/HTML")?.ModuleDefID ?? -1) - { - } + /// Initializes a new instance of the class. + /// The search controller. + /// The host settings. + /// The host settings service. + public SearchServiceController(ISearchController searchController, IHostSettings hostSettings, IHostSettingsService hostSettingsService) + : this(searchController, hostSettings, hostSettingsService, ModuleDefinitionController.GetModuleDefinitionByFriendlyName("Text/HTML")?.ModuleDefID ?? -1) + { + } - /// Initializes a new instance of the class. - /// this constructor is for unit tests. - /// The search controller. - /// The host settings. - /// The host settings service. - /// The ID of the HTML module definition. - internal SearchServiceController(ISearchController searchController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, int htmlModuleDefinitionId) - { - this.searchController = searchController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); - this.htmlModuleDefinitionId = htmlModuleDefinitionId; - } + /// Initializes a new instance of the class. + /// this constructor is for unit tests. + /// The search controller. + /// The host settings. + /// The host settings service. + /// The ID of the HTML module definition. + internal SearchServiceController(ISearchController searchController, IHostSettings hostSettings, IHostSettingsService hostSettingsService, int htmlModuleDefinitionId) + { + this.searchController = searchController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.hostSettingsService = hostSettingsService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + this.htmlModuleDefinitionId = htmlModuleDefinitionId; + } - /// Previews a search. - /// The keywords. - /// The culture. - /// 0 to not use wildcards, any positive integer to force a wildcard search. - /// The portal ID. - /// A response with a list of objects. - [HttpGet] - [AllowAnonymous] - public HttpResponseMessage Preview(string keywords, string culture, int forceWild = 1, int portal = -1) + /// Previews a search. + /// The keywords. + /// The culture. + /// 0 to not use wildcards, any positive integer to force a wildcard search. + /// The portal ID. + /// A response with a list of objects. + [HttpGet] + [AllowAnonymous] + public HttpResponseMessage Preview(string keywords, string culture, int forceWild = 1, int portal = -1) + { + keywords = (keywords ?? string.Empty).Trim(); + var tags = SearchQueryStringParser.Instance.GetTags(keywords, out var cleanedKeywords); + var beginModifiedTimeUtc = SearchQueryStringParser.Instance.GetLastModifiedDate(cleanedKeywords, out cleanedKeywords); + var searchTypes = SearchQueryStringParser.Instance.GetSearchTypeList(keywords, out cleanedKeywords); + + var contentSources = this.GetSearchContentSources(searchTypes); + var settings = this.GetSearchModuleSettings(); + var searchTypeIds = GetSearchTypeIds(settings, contentSources); + var moduleDefIds = GetSearchModuleDefIds(settings, contentSources); + var portalIds = this.GetSearchPortalIds(settings, portal); + + var userSearchTypeId = SearchHelper.Instance.GetSearchTypeByName("user").SearchTypeId; + var userSearchSource = contentSources.FirstOrDefault(s => s.SearchTypeId == userSearchTypeId); + + var results = new List(); + if (portalIds.Count != 0 && searchTypeIds.Count != 0 && + (!string.IsNullOrEmpty(cleanedKeywords) || tags.Count > 0)) { - keywords = (keywords ?? string.Empty).Trim(); - var tags = SearchQueryStringParser.Instance.GetTags(keywords, out var cleanedKeywords); - var beginModifiedTimeUtc = SearchQueryStringParser.Instance.GetLastModifiedDate(cleanedKeywords, out cleanedKeywords); - var searchTypes = SearchQueryStringParser.Instance.GetSearchTypeList(keywords, out cleanedKeywords); - - var contentSources = this.GetSearchContentSources(searchTypes); - var settings = this.GetSearchModuleSettings(); - var searchTypeIds = GetSearchTypeIds(settings, contentSources); - var moduleDefIds = GetSearchModuleDefIds(settings, contentSources); - var portalIds = this.GetSearchPortalIds(settings, portal); - - var userSearchTypeId = SearchHelper.Instance.GetSearchTypeByName("user").SearchTypeId; - var userSearchSource = contentSources.FirstOrDefault(s => s.SearchTypeId == userSearchTypeId); - - var results = new List(); - if (portalIds.Count != 0 && searchTypeIds.Count != 0 && - (!string.IsNullOrEmpty(cleanedKeywords) || tags.Count > 0)) + var query = new SearchQuery { - var query = new SearchQuery - { - KeyWords = cleanedKeywords, - Tags = tags, - PortalIds = portalIds, - SearchTypeIds = searchTypeIds, - ModuleDefIds = moduleDefIds, - BeginModifiedTimeUtc = beginModifiedTimeUtc, - PageIndex = 1, - PageSize = 5, - TitleSnippetLength = 40, - BodySnippetLength = 100, - CultureCode = culture, - WildCardSearch = forceWild > 0, - }; - - try - { - results = this.GetGroupedBasicViews(query, userSearchSource, this.PortalSettings.PortalId); - } - catch (Exception ex) - { - DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); - } + KeyWords = cleanedKeywords, + Tags = tags, + PortalIds = portalIds, + SearchTypeIds = searchTypeIds, + ModuleDefIds = moduleDefIds, + BeginModifiedTimeUtc = beginModifiedTimeUtc, + PageIndex = 1, + PageSize = 5, + TitleSnippetLength = 40, + BodySnippetLength = 100, + CultureCode = culture, + WildCardSearch = forceWild > 0, + }; + + try + { + results = this.GetGroupedBasicViews(query, userSearchSource, this.PortalSettings.PortalId); + } + catch (Exception ex) + { + DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); } - - return this.Request.CreateResponse(HttpStatusCode.OK, results); } - /// Performs a search. - /// The search criteria. - /// The culture. - /// The page index. - /// The page size. - /// A value. - /// A response with an object that has results, totalHits, and more fields. - [HttpGet] - [AllowAnonymous] - public HttpResponseMessage Search(string search, string culture, int pageIndex, int pageSize, int sortOption) + return this.Request.CreateResponse(HttpStatusCode.OK, results); + } + + /// Performs a search. + /// The search criteria. + /// The culture. + /// The page index. + /// The page size. + /// A value. + /// A response with an object that has results, totalHits, and more fields. + [HttpGet] + [AllowAnonymous] + public HttpResponseMessage Search(string search, string culture, int pageIndex, int pageSize, int sortOption) + { + search = (search ?? string.Empty).Trim(); + var tags = SearchQueryStringParser.Instance.GetTags(search, out var cleanedKeywords); + var beginModifiedTimeUtc = SearchQueryStringParser.Instance.GetLastModifiedDate(cleanedKeywords, out cleanedKeywords); + var searchTypes = SearchQueryStringParser.Instance.GetSearchTypeList(cleanedKeywords, out cleanedKeywords); + + var contentSources = this.GetSearchContentSources(searchTypes); + var settings = this.GetSearchModuleSettings(); + var searchTypeIds = GetSearchTypeIds(settings, contentSources); + var moduleDefIds = GetSearchModuleDefIds(settings, contentSources); + var portalIds = this.GetSearchPortalIds(settings, -1); + var userSearchTypeId = SearchHelper.Instance.GetSearchTypeByName("user").SearchTypeId; + var maximumPageSize = this.hostSettingsService.GetInteger("Search_MaxResultPerPage", 100); + + var more = false; + var totalHits = 0; + var results = new List(); + if (portalIds.Count != 0 && searchTypeIds.Count != 0 && + (!string.IsNullOrEmpty(cleanedKeywords) || tags.Any())) { - search = (search ?? string.Empty).Trim(); - var tags = SearchQueryStringParser.Instance.GetTags(search, out var cleanedKeywords); - var beginModifiedTimeUtc = SearchQueryStringParser.Instance.GetLastModifiedDate(cleanedKeywords, out cleanedKeywords); - var searchTypes = SearchQueryStringParser.Instance.GetSearchTypeList(cleanedKeywords, out cleanedKeywords); - - var contentSources = this.GetSearchContentSources(searchTypes); - var settings = this.GetSearchModuleSettings(); - var searchTypeIds = GetSearchTypeIds(settings, contentSources); - var moduleDefIds = GetSearchModuleDefIds(settings, contentSources); - var portalIds = this.GetSearchPortalIds(settings, -1); - var userSearchTypeId = SearchHelper.Instance.GetSearchTypeByName("user").SearchTypeId; - var maximumPageSize = this.hostSettingsService.GetInteger("Search_MaxResultPerPage", 100); - - var more = false; - var totalHits = 0; - var results = new List(); - if (portalIds.Count != 0 && searchTypeIds.Count != 0 && - (!string.IsNullOrEmpty(cleanedKeywords) || tags.Any())) + if (pageSize > maximumPageSize) { - if (pageSize > maximumPageSize) - { - pageSize = maximumPageSize; - } - - var query = new SearchQuery - { - KeyWords = cleanedKeywords, - Tags = tags, - PortalIds = portalIds, - SearchTypeIds = searchTypeIds, - ModuleDefIds = moduleDefIds, - BeginModifiedTimeUtc = beginModifiedTimeUtc, - EndModifiedTimeUtc = beginModifiedTimeUtc > DateTime.MinValue ? DateTime.MaxValue : DateTime.MinValue, - PageIndex = pageIndex, - PageSize = pageSize, - SortField = (SortFields)sortOption, - TitleSnippetLength = 120, - BodySnippetLength = 300, - CultureCode = culture, - WildCardSearch = this.IsWildCardEnabledForModule(), - }; - - try - { - results = this.GetGroupedDetailViews(query, userSearchTypeId, out totalHits, out more).ToList(); - } - catch (Exception ex) - { - DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); - } + pageSize = maximumPageSize; } - return this.Request.CreateResponse(HttpStatusCode.OK, new { results, totalHits, more }); + var query = new SearchQuery + { + KeyWords = cleanedKeywords, + Tags = tags, + PortalIds = portalIds, + SearchTypeIds = searchTypeIds, + ModuleDefIds = moduleDefIds, + BeginModifiedTimeUtc = beginModifiedTimeUtc, + EndModifiedTimeUtc = beginModifiedTimeUtc > DateTime.MinValue ? DateTime.MaxValue : DateTime.MinValue, + PageIndex = pageIndex, + PageSize = pageSize, + SortField = (SortFields)sortOption, + TitleSnippetLength = 120, + BodySnippetLength = 300, + CultureCode = culture, + WildCardSearch = this.IsWildCardEnabledForModule(), + }; + + try + { + results = this.GetGroupedDetailViews(query, userSearchTypeId, out totalHits, out more).ToList(); + } + catch (Exception ex) + { + DotNetNuke.Services.Exceptions.Exceptions.LogException(ex); + } } - /// Add a synonyms group. - /// The synonyms group to add. - /// A response with an object that has Id and DuplicateWord fields. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage AddSynonymsGroup(SynonymsGroupDto synonymsGroup) - { - var synonymsGroupId = SearchHelper.Instance.AddSynonymsGroup(synonymsGroup.Tags, synonymsGroup.PortalId, synonymsGroup.Culture, out var duplicateWord); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = synonymsGroupId, DuplicateWord = duplicateWord, }); - } + return this.Request.CreateResponse(HttpStatusCode.OK, new { results, totalHits, more }); + } - /// Update a synonyms group. - /// The synonyms group to update. - /// A response with an object that has Id and DuplicateWord fields. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage UpdateSynonymsGroup(SynonymsGroupDto synonymsGroup) - { - var synonymsGroupId = SearchHelper.Instance.UpdateSynonymsGroup(synonymsGroup.Id, synonymsGroup.Tags, synonymsGroup.PortalId, synonymsGroup.Culture, out var duplicateWord); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = synonymsGroupId, DuplicateWord = duplicateWord, }); - } + /// Add a synonyms group. + /// The synonyms group to add. + /// A response with an object that has Id and DuplicateWord fields. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage AddSynonymsGroup(SynonymsGroupDto synonymsGroup) + { + var synonymsGroupId = SearchHelper.Instance.AddSynonymsGroup(synonymsGroup.Tags, synonymsGroup.PortalId, synonymsGroup.Culture, out var duplicateWord); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = synonymsGroupId, DuplicateWord = duplicateWord, }); + } - /// Deletes a synonyms group. - /// The synonyms group to delete. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage DeleteSynonymsGroup(SynonymsGroupDto synonymsGroup) - { - SearchHelper.Instance.DeleteSynonymsGroup(synonymsGroup.Id, synonymsGroup.PortalId, synonymsGroup.Culture); - return this.Request.CreateResponse(HttpStatusCode.OK); - } + /// Update a synonyms group. + /// The synonyms group to update. + /// A response with an object that has Id and DuplicateWord fields. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage UpdateSynonymsGroup(SynonymsGroupDto synonymsGroup) + { + var synonymsGroupId = SearchHelper.Instance.UpdateSynonymsGroup(synonymsGroup.Id, synonymsGroup.Tags, synonymsGroup.PortalId, synonymsGroup.Culture, out var duplicateWord); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = synonymsGroupId, DuplicateWord = duplicateWord, }); + } - /// Add search stop words. - /// The stop words to add. - /// A response with an object that has an Id field. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage AddStopWords(StopWordsDto stopWords) - { - var stopWordsId = SearchHelper.Instance.AddSearchStopWords(stopWords.Words, stopWords.PortalId, stopWords.Culture); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = stopWordsId, }); - } + /// Deletes a synonyms group. + /// The synonyms group to delete. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage DeleteSynonymsGroup(SynonymsGroupDto synonymsGroup) + { + SearchHelper.Instance.DeleteSynonymsGroup(synonymsGroup.Id, synonymsGroup.PortalId, synonymsGroup.Culture); + return this.Request.CreateResponse(HttpStatusCode.OK); + } - /// Update search stop words. - /// The stop words to update. - /// A response with an object that has an Id field. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage UpdateStopWords(StopWordsDto stopWords) - { - var stopWordsId = SearchHelper.Instance.UpdateSearchStopWords(stopWords.Id, stopWords.Words, stopWords.PortalId, stopWords.Culture); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = stopWordsId, }); - } + /// Add search stop words. + /// The stop words to add. + /// A response with an object that has an Id field. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage AddStopWords(StopWordsDto stopWords) + { + var stopWordsId = SearchHelper.Instance.AddSearchStopWords(stopWords.Words, stopWords.PortalId, stopWords.Culture); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = stopWordsId, }); + } - /// Delete search stop words. - /// The stop words to delete. - /// A response indicating success. - [HttpPost] - [ValidateAntiForgeryToken] - [SupportedModules("SearchAdmin")] - public HttpResponseMessage DeleteStopWords(StopWordsDto stopWords) - { - SearchHelper.Instance.DeleteSearchStopWords(stopWords.Id, stopWords.PortalId, stopWords.Culture); - return this.Request.CreateResponse(HttpStatusCode.OK); - } + /// Update search stop words. + /// The stop words to update. + /// A response with an object that has an Id field. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage UpdateStopWords(StopWordsDto stopWords) + { + var stopWordsId = SearchHelper.Instance.UpdateSearchStopWords(stopWords.Id, stopWords.Words, stopWords.PortalId, stopWords.Culture); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Id = stopWordsId, }); + } - /// Gets grouped detail views. - /// The search query. - /// The ID of the user search type. - /// The total number of hits. - /// Whether there is more. - /// A list of instances. - internal IEnumerable GetGroupedDetailViews(SearchQuery searchQuery, int userSearchTypeId, out int totalHits, out bool more) - { - var searchResults = this.searchController.SiteSearch(searchQuery); - totalHits = searchResults.TotalHits; - more = totalHits > searchQuery.PageSize * searchQuery.PageIndex; + /// Delete search stop words. + /// The stop words to delete. + /// A response indicating success. + [HttpPost] + [ValidateAntiForgeryToken] + [SupportedModules("SearchAdmin")] + public HttpResponseMessage DeleteStopWords(StopWordsDto stopWords) + { + SearchHelper.Instance.DeleteSearchStopWords(stopWords.Id, stopWords.PortalId, stopWords.Culture); + return this.Request.CreateResponse(HttpStatusCode.OK); + } + + /// Gets grouped detail views. + /// The search query. + /// The ID of the user search type. + /// The total number of hits. + /// Whether there is more. + /// A list of instances. + internal IEnumerable GetGroupedDetailViews(SearchQuery searchQuery, int userSearchTypeId, out int totalHits, out bool more) + { + var searchResults = this.searchController.SiteSearch(searchQuery); + totalHits = searchResults.TotalHits; + more = totalHits > searchQuery.PageSize * searchQuery.PageIndex; - var groups = new List(); - var tabGroups = new Dictionary>(); + var groups = new List(); + var tabGroups = new Dictionary>(); - foreach (var result in searchResults.Results) + foreach (var result in searchResults.Results) + { + ////var key = result.TabId + result.Url; + var key = result.Url; + if (!tabGroups.ContainsKey(key)) { - ////var key = result.TabId + result.Url; - var key = result.Url; - if (!tabGroups.ContainsKey(key)) + tabGroups.Add(key, new List { result }); + } + else + { + // when the result is a user search type, we should only show one result + // and if duplicate, we should also reduce the totalHit number. + if (result.SearchTypeId != userSearchTypeId || + tabGroups[key].All(r => r.Url != result.Url)) { - tabGroups.Add(key, new List { result }); + tabGroups[key].Add(result); } else { - // when the result is a user search type, we should only show one result - // and if duplicate, we should also reduce the totalHit number. - if (result.SearchTypeId != userSearchTypeId || - tabGroups[key].All(r => r.Url != result.Url)) - { - tabGroups[key].Add(result); - } - else - { - totalHits--; - } + totalHits--; } } + } - var showFriendlyTitle = - this.ActiveModule == null || - !this.ActiveModule.ModuleSettings.ContainsKey("ShowFriendlyTitle") || - Convert.ToBoolean(this.ActiveModule.ModuleSettings["ShowFriendlyTitle"], CultureInfo.InvariantCulture); - foreach (var results in tabGroups.Values) - { - var group = new GroupedDetailView(); + var showFriendlyTitle = + this.ActiveModule == null || + !this.ActiveModule.ModuleSettings.ContainsKey("ShowFriendlyTitle") || + Convert.ToBoolean(this.ActiveModule.ModuleSettings["ShowFriendlyTitle"], CultureInfo.InvariantCulture); + foreach (var results in tabGroups.Values) + { + var group = new GroupedDetailView(); - // first entry - var first = results[0]; - @group.Title = showFriendlyTitle ? GetFriendlyTitle(first) : first.Title; - @group.DocumentUrl = first.Url; + // first entry + var first = results[0]; + @group.Title = showFriendlyTitle ? GetFriendlyTitle(first) : first.Title; + @group.DocumentUrl = first.Url; - // Find a different title for multiple entries with same url - if (results.Count > 1) + // Find a different title for multiple entries with same url + if (results.Count > 1) + { + if (first.TabId > 0) { - if (first.TabId > 0) - { - var tab = TabController.Instance.GetTab(first.TabId, first.PortalId, false); - if (tab != null) - { - @group.Title = showFriendlyTitle && !string.IsNullOrEmpty(tab.Title) ? tab.Title : tab.TabName; - } - } - else if (first.ModuleId > 0) + var tab = TabController.Instance.GetTab(first.TabId, first.PortalId, false); + if (tab != null) { - var tabTitle = GetTabTitleFromModuleId(this.hostSettings, first.ModuleId); - if (!string.IsNullOrEmpty(tabTitle)) - { - @group.Title = tabTitle; - } + @group.Title = showFriendlyTitle && !string.IsNullOrEmpty(tab.Title) ? tab.Title : tab.TabName; } } - else if (first.ModuleDefId > 0 && first.ModuleDefId == this.htmlModuleDefinitionId) + else if (first.ModuleId > 0) { - // special handling for Html module var tabTitle = GetTabTitleFromModuleId(this.hostSettings, first.ModuleId); if (!string.IsNullOrEmpty(tabTitle)) { @group.Title = tabTitle; - if (first.Title != "Enter Title" && first.Title != "Text/HTML") - { - @group.Title += $" > {first.Title}"; - } - - first.Title = @group.Title; } } - - foreach (var result in results) + } + else if (first.ModuleDefId > 0 && first.ModuleDefId == this.htmlModuleDefinitionId) + { + // special handling for Html module + var tabTitle = GetTabTitleFromModuleId(this.hostSettings, first.ModuleId); + if (!string.IsNullOrEmpty(tabTitle)) { - var title = showFriendlyTitle ? GetFriendlyTitle(result) : result.Title; - var detail = new DetailedView + @group.Title = tabTitle; + if (first.Title != "Enter Title" && first.Title != "Text/HTML") { - Title = title != null && title.Contains("<") ? HttpUtility.HtmlEncode(title) : title, - DocumentTypeName = InternalSearchController.Instance.GetSearchDocumentTypeDisplayName(result), - DocumentUrl = result.Url, - Snippet = result.Snippet, - Description = result.Description, - DisplayModifiedTime = result.DisplayModifiedTime, - Tags = result.Tags.ToList(), - AuthorProfileUrl = result.AuthorUserId > 0 ? Globals.UserProfileURL(result.AuthorUserId) : string.Empty, - AuthorName = result.AuthorName, - }; - @group.Results.Add(detail); + @group.Title += $" > {first.Title}"; + } + + first.Title = @group.Title; } + } - groups.Add(@group); + foreach (var result in results) + { + var title = showFriendlyTitle ? GetFriendlyTitle(result) : result.Title; + var detail = new DetailedView + { + Title = title != null && title.Contains("<") ? HttpUtility.HtmlEncode(title) : title, + DocumentTypeName = InternalSearchController.Instance.GetSearchDocumentTypeDisplayName(result), + DocumentUrl = result.Url, + Snippet = result.Snippet, + Description = result.Description, + DisplayModifiedTime = result.DisplayModifiedTime, + Tags = result.Tags.ToList(), + AuthorProfileUrl = result.AuthorUserId > 0 ? Globals.UserProfileURL(result.AuthorUserId) : string.Empty, + AuthorName = result.AuthorName, + }; + @group.Results.Add(detail); } - return groups; + groups.Add(@group); } - /// Gets grouped basic views. - /// The query. - /// The user search source. - /// The portal ID. - /// A list of instances. - internal List GetGroupedBasicViews(SearchQuery query, SearchContentSource userSearchSource, int portalId) - { - var results = new List(); - var previews = this.GetBasicViews(query, out _); + return groups; + } - foreach (var preview in previews) + /// Gets grouped basic views. + /// The query. + /// The user search source. + /// The portal ID. + /// A list of instances. + internal List GetGroupedBasicViews(SearchQuery query, SearchContentSource userSearchSource, int portalId) + { + var results = new List(); + var previews = this.GetBasicViews(query, out _); + + foreach (var preview in previews) + { + // if the document type is user, then try to add user pic into preview's custom attributes. + if (userSearchSource != null && preview.DocumentTypeName == userSearchSource.LocalizedName) { - // if the document type is user, then try to add user pic into preview's custom attributes. - if (userSearchSource != null && preview.DocumentTypeName == userSearchSource.LocalizedName) + var match = GroupedBasicViewRegex.Match(preview.DocumentUrl); + if (match.Success) { - var match = GroupedBasicViewRegex.Match(preview.DocumentUrl); - if (match.Success) + var userid = Convert.ToInt32(match.Groups[2].Value, CultureInfo.InvariantCulture); + var user = UserController.Instance.GetUserById(portalId, userid); + if (user != null) { - var userid = Convert.ToInt32(match.Groups[2].Value, CultureInfo.InvariantCulture); - var user = UserController.Instance.GetUserById(portalId, userid); - if (user != null) - { - preview.Attributes.Add("Avatar", user.Profile.PhotoURL); - } + preview.Attributes.Add("Avatar", user.Profile.PhotoURL); } } + } - var groupedResult = results.SingleOrDefault(g => g.DocumentTypeName == preview.DocumentTypeName); - if (groupedResult != null) + var groupedResult = results.SingleOrDefault(g => g.DocumentTypeName == preview.DocumentTypeName); + if (groupedResult != null) + { + if (!groupedResult.Results.Any(r => string.Equals(r.DocumentUrl, preview.DocumentUrl, StringComparison.Ordinal))) { - if (!groupedResult.Results.Any(r => string.Equals(r.DocumentUrl, preview.DocumentUrl, StringComparison.Ordinal))) + groupedResult.Results.Add(new BasicView { - groupedResult.Results.Add(new BasicView - { - Title = preview.Title.Contains("<") ? HttpUtility.HtmlEncode(preview.Title) : preview.Title, - Snippet = preview.Snippet, - Description = preview.Description, - DocumentUrl = preview.DocumentUrl, - Attributes = preview.Attributes, - }); - } - } - else - { - results.Add(new GroupedBasicView(preview)); + Title = preview.Title.Contains("<") ? HttpUtility.HtmlEncode(preview.Title) : preview.Title, + Snippet = preview.Snippet, + Description = preview.Description, + DocumentUrl = preview.DocumentUrl, + Attributes = preview.Attributes, + }); } } - - return results; + else + { + results.Add(new GroupedBasicView(preview)); + } } - /// Gets basic views. - /// The search query. - /// The total number of hits. - /// A sequence of instances. - internal IEnumerable GetBasicViews(SearchQuery searchQuery, out int totalHits) + return results; + } + + /// Gets basic views. + /// The search query. + /// The total number of hits. + /// A sequence of instances. + internal IEnumerable GetBasicViews(SearchQuery searchQuery, out int totalHits) + { + var sResult = this.searchController.SiteSearch(searchQuery); + totalHits = sResult.TotalHits; + var showFriendlyTitle = this.GetBooleanSetting("ShowFriendlyTitle", true); + var showDescription = this.GetBooleanSetting("ShowDescription", true); + var showSnippet = this.GetBooleanSetting("ShowSnippet", true); + var maxDescriptionLength = this.GetIntegerSetting("MaxDescriptionLength", 100); + + return sResult.Results.Select(result => { - var sResult = this.searchController.SiteSearch(searchQuery); - totalHits = sResult.TotalHits; - var showFriendlyTitle = this.GetBooleanSetting("ShowFriendlyTitle", true); - var showDescription = this.GetBooleanSetting("ShowDescription", true); - var showSnippet = this.GetBooleanSetting("ShowSnippet", true); - var maxDescriptionLength = this.GetIntegerSetting("MaxDescriptionLength", 100); - - return sResult.Results.Select(result => + var description = result.Description; + if (!string.IsNullOrEmpty(description) && description.Length > maxDescriptionLength) { - var description = result.Description; - if (!string.IsNullOrEmpty(description) && description.Length > maxDescriptionLength) - { - description = description.Substring(0, maxDescriptionLength) + "..."; - } + description = description.Substring(0, maxDescriptionLength) + "..."; + } - return new BasicView - { - Title = this.GetTitle(result, showFriendlyTitle), - DocumentTypeName = InternalSearchController.Instance.GetSearchDocumentTypeDisplayName(result), - DocumentUrl = result.Url, - Snippet = showSnippet ? result.Snippet : string.Empty, - Description = showDescription ? description : string.Empty, - }; - }); - } + return new BasicView + { + Title = this.GetTitle(result, showFriendlyTitle), + DocumentTypeName = InternalSearchController.Instance.GetSearchDocumentTypeDisplayName(result), + DocumentUrl = result.Url, + Snippet = showSnippet ? result.Snippet : string.Empty, + Description = showDescription ? description : string.Empty, + }; + }); + } + + private static ArrayList GetModulesByDefinition(IHostSettings hostSettings, int portalId, string friendlyName) + { + var cacheKey = string.Format(CultureInfo.InvariantCulture, ModuleInfosCacheKey, portalId); + return CBO.GetCachedObject( + hostSettings, + new CacheItemArgs(cacheKey, ModuleInfosCacheTimeOut, ModuleInfosCachePriority), + _ => CBO.FillCollection(DataProvider.Instance().GetModuleByDefinition(portalId, friendlyName), typeof(ModuleInfo))); + } - private static ArrayList GetModulesByDefinition(IHostSettings hostSettings, int portalId, string friendlyName) + private static List GetSearchTypeIds(Hashtable settings, IEnumerable searchContentSources) + { + var list = new List(); + var configuredList = new List(); + var scopeForFilters = Convert.ToString(settings["ScopeForFilters"], CultureInfo.InvariantCulture); + if (!string.IsNullOrEmpty(scopeForFilters)) { - var cacheKey = string.Format(CultureInfo.InvariantCulture, ModuleInfosCacheKey, portalId); - return CBO.GetCachedObject( - hostSettings, - new CacheItemArgs(cacheKey, ModuleInfosCacheTimeOut, ModuleInfosCachePriority), - _ => CBO.FillCollection(DataProvider.Instance().GetModuleByDefinition(portalId, friendlyName), typeof(ModuleInfo))); + configuredList = scopeForFilters.Split('|').ToList(); } - private static List GetSearchTypeIds(Hashtable settings, IEnumerable searchContentSources) + // check content source in configured list or not + foreach (var contentSource in searchContentSources) { - var list = new List(); - var configuredList = new List(); - var scopeForFilters = Convert.ToString(settings["ScopeForFilters"], CultureInfo.InvariantCulture); - if (!string.IsNullOrEmpty(scopeForFilters)) + if (contentSource.IsPrivate) { - configuredList = scopeForFilters.Split('|').ToList(); + continue; } - // check content source in configured list or not - foreach (var contentSource in searchContentSources) + if (configuredList.Count > 0) { - if (contentSource.IsPrivate) - { - continue; - } - - if (configuredList.Count > 0) - { - if (configuredList.Any(l => l.Contains(contentSource.LocalizedName))) - { - // in configured list - list.Add(contentSource.SearchTypeId); - } - } - else + if (configuredList.Any(l => l.Contains(contentSource.LocalizedName))) { + // in configured list list.Add(contentSource.SearchTypeId); } } + else + { + list.Add(contentSource.SearchTypeId); + } + } + + return list.Distinct().ToList(); + } - return list.Distinct().ToList(); + private static List GetSearchModuleDefIds(Hashtable settings, IEnumerable searchContentSources) + { + var list = new List(); + var configuredList = new List(); + var scopeForFilters = Convert.ToString(settings["ScopeForFilters"], CultureInfo.InvariantCulture); + if (!string.IsNullOrEmpty(scopeForFilters)) + { + configuredList = scopeForFilters.Split('|').ToList(); } - private static List GetSearchModuleDefIds(Hashtable settings, IEnumerable searchContentSources) + // check content source in configured list or not + foreach (var contentSource in searchContentSources) { - var list = new List(); - var configuredList = new List(); - var scopeForFilters = Convert.ToString(settings["ScopeForFilters"], CultureInfo.InvariantCulture); - if (!string.IsNullOrEmpty(scopeForFilters)) + if (contentSource.IsPrivate) { - configuredList = scopeForFilters.Split('|').ToList(); + continue; } - // check content source in configured list or not - foreach (var contentSource in searchContentSources) + if (configuredList.Count > 0) { - if (contentSource.IsPrivate) + if (configuredList.Any(l => l.Contains(contentSource.LocalizedName)) && contentSource.ModuleDefinitionId > 0) { - continue; + // in configured list + list.Add(contentSource.ModuleDefinitionId); } - - if (configuredList.Count > 0) - { - if (configuredList.Any(l => l.Contains(contentSource.LocalizedName)) && contentSource.ModuleDefinitionId > 0) - { - // in configured list - list.Add(contentSource.ModuleDefinitionId); - } - } - else + } + else + { + if (contentSource.ModuleDefinitionId > 0) { - if (contentSource.ModuleDefinitionId > 0) - { - list.Add(contentSource.ModuleDefinitionId); - } + list.Add(contentSource.ModuleDefinitionId); } } - - return list; } - private static string GetFriendlyTitle(SearchResult result) - { - if (result.Keywords.TryGetValue("title", out var title) && !string.IsNullOrEmpty(title)) - { - return title; - } - - return result.Title; - } + return list; + } - private static string GetTabTitleFromModuleId(IHostSettings hostSettings, int moduleId) + private static string GetFriendlyTitle(SearchResult result) + { + if (result.Keywords.TryGetValue("title", out var title) && !string.IsNullOrEmpty(title)) { - // no manual clearing of the cache exists; let it just expire - var cacheKey = string.Format(CultureInfo.InvariantCulture, ModuleTitleCacheKey, moduleId); - - return CBO.GetCachedObject( - hostSettings, - new CacheItemArgs(cacheKey, ModuleTitleCacheTimeOut, ModuleTitleCachePriority, moduleId), - GetTabTitleCallBack); + return title; } - private static object GetTabTitleCallBack(CacheItemArgs cacheItemArgs) - { - var moduleId = (int)cacheItemArgs.ParamList[0]; - var moduleInfo = ModuleController.Instance.GetModule(moduleId, Null.NullInteger, true); - if (moduleInfo != null) - { - var tab = moduleInfo.ParentTab; + return result.Title; + } - return !string.IsNullOrEmpty(tab.Title) ? tab.Title : tab.TabName; - } + private static string GetTabTitleFromModuleId(IHostSettings hostSettings, int moduleId) + { + // no manual clearing of the cache exists; let it just expire + var cacheKey = string.Format(CultureInfo.InvariantCulture, ModuleTitleCacheKey, moduleId); - return string.Empty; - } + return CBO.GetCachedObject( + hostSettings, + new CacheItemArgs(cacheKey, ModuleTitleCacheTimeOut, ModuleTitleCachePriority, moduleId), + GetTabTitleCallBack); + } - private bool IsWildCardEnabledForModule() + private static object GetTabTitleCallBack(CacheItemArgs cacheItemArgs) + { + var moduleId = (int)cacheItemArgs.ParamList[0]; + var moduleInfo = ModuleController.Instance.GetModule(moduleId, Null.NullInteger, true); + if (moduleInfo != null) { - var searchModuleSettings = this.GetSearchModuleSettings(); - var enableWildSearch = true; - if (!string.IsNullOrEmpty(Convert.ToString(searchModuleSettings["EnableWildSearch"], CultureInfo.InvariantCulture))) - { - enableWildSearch = Convert.ToBoolean(searchModuleSettings["EnableWildSearch"], CultureInfo.InvariantCulture); - } + var tab = moduleInfo.ParentTab; - return enableWildSearch; + return !string.IsNullOrEmpty(tab.Title) ? tab.Title : tab.TabName; } - private ModuleInfo GetSearchModule() - { - var arrModules = GetModulesByDefinition(this.hostSettings, this.PortalSettings.PortalId, "Search Results"); - ModuleInfo findModule = null; - if (arrModules.Count > 1) - { - findModule = arrModules.Cast().FirstOrDefault(searchModule => searchModule.CultureCode == this.PortalSettings.CultureCode); - } + return string.Empty; + } - return findModule ?? (arrModules.Count > 0 ? (ModuleInfo)arrModules[0] : null); + private bool IsWildCardEnabledForModule() + { + var searchModuleSettings = this.GetSearchModuleSettings(); + var enableWildSearch = true; + if (!string.IsNullOrEmpty(Convert.ToString(searchModuleSettings["EnableWildSearch"], CultureInfo.InvariantCulture))) + { + enableWildSearch = Convert.ToBoolean(searchModuleSettings["EnableWildSearch"], CultureInfo.InvariantCulture); } - private Hashtable GetSearchModuleSettings() - { - if (this.ActiveModule != null && this.ActiveModule.ModuleDefinition.FriendlyName == "Search Results") - { - return this.ActiveModule.ModuleSettings; - } + return enableWildSearch; + } - var searchModule = this.GetSearchModule(); - return searchModule?.ModuleSettings; + private ModuleInfo GetSearchModule() + { + var arrModules = GetModulesByDefinition(this.hostSettings, this.PortalSettings.PortalId, "Search Results"); + ModuleInfo findModule = null; + if (arrModules.Count > 1) + { + findModule = arrModules.Cast().FirstOrDefault(searchModule => searchModule.CultureCode == this.PortalSettings.CultureCode); } - private bool GetBooleanSetting(string settingName, bool defaultValue) + return findModule ?? (arrModules.Count > 0 ? (ModuleInfo)arrModules[0] : null); + } + + private Hashtable GetSearchModuleSettings() + { + if (this.ActiveModule != null && this.ActiveModule.ModuleDefinition.FriendlyName == "Search Results") { - if (this.PortalSettings == null) - { - return defaultValue; - } + return this.ActiveModule.ModuleSettings; + } - var settings = this.GetSearchModuleSettings(); - if (settings == null || !settings.ContainsKey(settingName)) - { - return defaultValue; - } + var searchModule = this.GetSearchModule(); + return searchModule?.ModuleSettings; + } - return Convert.ToBoolean(settings[settingName], CultureInfo.InvariantCulture); + private bool GetBooleanSetting(string settingName, bool defaultValue) + { + if (this.PortalSettings == null) + { + return defaultValue; } - private int GetIntegerSetting(string settingName, int defaultValue) + var settings = this.GetSearchModuleSettings(); + if (settings == null || !settings.ContainsKey(settingName)) { - if (this.PortalSettings == null) - { - return defaultValue; - } + return defaultValue; + } - var settings = this.GetSearchModuleSettings(); - if (settings == null || !settings.ContainsKey(settingName)) - { - return defaultValue; - } + return Convert.ToBoolean(settings[settingName], CultureInfo.InvariantCulture); + } - var settingValue = Convert.ToString(settings[settingName], CultureInfo.InvariantCulture); - if (!string.IsNullOrEmpty(settingValue) && Regex.IsMatch(settingValue, "^\\d+$")) - { - return Convert.ToInt32(settingValue, CultureInfo.InvariantCulture); - } + private int GetIntegerSetting(string settingName, int defaultValue) + { + if (this.PortalSettings == null) + { + return defaultValue; + } + var settings = this.GetSearchModuleSettings(); + if (settings == null || !settings.ContainsKey(settingName)) + { return defaultValue; } - private List GetSearchPortalIds(Hashtable settings, int portalId) + var settingValue = Convert.ToString(settings[settingName], CultureInfo.InvariantCulture); + if (!string.IsNullOrEmpty(settingValue) && Regex.IsMatch(settingValue, "^\\d+$")) { - var list = new List(); - var scopeForPortals = Convert.ToString(settings["ScopeForPortals"], CultureInfo.InvariantCulture); - if (!string.IsNullOrEmpty(scopeForPortals)) - { - list = scopeForPortals.Split('|').Select(s => Convert.ToInt32(s, CultureInfo.InvariantCulture)).ToList(); - } + return Convert.ToInt32(settingValue, CultureInfo.InvariantCulture); + } - if (portalId == -1) - { - portalId = this.PortalSettings.ActiveTab.PortalID; - } + return defaultValue; + } - if (portalId > -1 && !list.Contains(portalId)) - { - list.Add(portalId); - } + private List GetSearchPortalIds(Hashtable settings, int portalId) + { + var list = new List(); + var scopeForPortals = Convert.ToString(settings["ScopeForPortals"], CultureInfo.InvariantCulture); + if (!string.IsNullOrEmpty(scopeForPortals)) + { + list = scopeForPortals.Split('|').Select(s => Convert.ToInt32(s, CultureInfo.InvariantCulture)).ToList(); + } - // Add Host - var userInfo = this.UserInfo; - if (userInfo.IsSuperUser) - { - list.Add(-1); - } + if (portalId == -1) + { + portalId = this.PortalSettings.ActiveTab.PortalID; + } - return list; + if (portalId > -1 && !list.Contains(portalId)) + { + list.Add(portalId); } - private List GetSearchContentSources(IList typesList) + // Add Host + var userInfo = this.UserInfo; + if (userInfo.IsSuperUser) { - var sources = new List(); - var list = InternalSearchController.Instance.GetSearchContentSourceList(this.PortalSettings.PortalId); + list.Add(-1); + } - if (typesList.Any()) - { - foreach (var contentSources in typesList.Select(t1 => list.Where(src => string.Equals(src.LocalizedName, t1, StringComparison.OrdinalIgnoreCase)))) - { - sources.AddRange(contentSources); - } - } - else + return list; + } + + private List GetSearchContentSources(IList typesList) + { + var sources = new List(); + var list = InternalSearchController.Instance.GetSearchContentSourceList(this.PortalSettings.PortalId); + + if (typesList.Any()) + { + foreach (var contentSources in typesList.Select(t1 => list.Where(src => string.Equals(src.LocalizedName, t1, StringComparison.OrdinalIgnoreCase)))) { - // no types filter specified, add all available content sources - sources.AddRange(list); + sources.AddRange(contentSources); } - - return sources; } + else + { + // no types filter specified, add all available content sources + sources.AddRange(list); + } + + return sources; + } - private string GetTitle(SearchResult result, bool showFriendlyTitle = false) + private string GetTitle(SearchResult result, bool showFriendlyTitle = false) + { + if (result.ModuleDefId > 0 && result.ModuleDefId == this.htmlModuleDefinitionId) { - if (result.ModuleDefId > 0 && result.ModuleDefId == this.htmlModuleDefinitionId) + // special handling for Html module + var tabTitle = GetTabTitleFromModuleId(this.hostSettings, result.ModuleId); + if (!string.IsNullOrEmpty(tabTitle)) { - // special handling for Html module - var tabTitle = GetTabTitleFromModuleId(this.hostSettings, result.ModuleId); - if (!string.IsNullOrEmpty(tabTitle)) + if (result.Title != "Enter Title" && result.Title != "Text/HTML") { - if (result.Title != "Enter Title" && result.Title != "Text/HTML") - { - return $"{tabTitle} > {result.Title}"; - } - - return tabTitle; + return $"{tabTitle} > {result.Title}"; } - } - return showFriendlyTitle ? GetFriendlyTitle(result) : result.Title; + return tabTitle; + } } - /// A data transfer object with information about a synonyms group. - public class SynonymsGroupDto - { - /// Gets or sets the ID. - public int Id { get; set; } + return showFriendlyTitle ? GetFriendlyTitle(result) : result.Title; + } - /// Gets or sets the tags. - public string Tags { get; set; } + /// A data transfer object with information about a synonyms group. + public class SynonymsGroupDto + { + /// Gets or sets the ID. + public int Id { get; set; } - /// Gets or sets the portal ID. - public int PortalId { get; set; } + /// Gets or sets the tags. + public string Tags { get; set; } - /// Gets or sets the culture. - public string Culture { get; set; } - } + /// Gets or sets the portal ID. + public int PortalId { get; set; } - /// A data transfer object with information about stop words. - public class StopWordsDto - { - /// Gets or sets the ID. - public int Id { get; set; } + /// Gets or sets the culture. + public string Culture { get; set; } + } + + /// A data transfer object with information about stop words. + public class StopWordsDto + { + /// Gets or sets the ID. + public int Id { get; set; } - /// Gets or sets the words. - public string Words { get; set; } + /// Gets or sets the words. + public string Words { get; set; } - /// Gets or sets the portal ID. - public int PortalId { get; set; } + /// Gets or sets the portal ID. + public int PortalId { get; set; } - /// Gets or sets the culture. - public string Culture { get; set; } - } + /// Gets or sets the culture. + public string Culture { get; set; } } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/ServiceRouteMapper.cs b/DNN Platform/DotNetNuke.Web/InternalServices/ServiceRouteMapper.cs index 4e8308e2ab1..79bd8c377a3 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/ServiceRouteMapper.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/ServiceRouteMapper.cs @@ -2,23 +2,22 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using DotNetNuke.Web.Api; + +/// A web API service route mapper for internal services. +public class ServiceRouteMapper : IServiceRouteMapper { - using DotNetNuke.Web.Api; + private static readonly string[] Namespaces = ["DotNetNuke.Web.InternalServices",]; - /// A web API service route mapper for internal services. - public class ServiceRouteMapper : IServiceRouteMapper + /// + public void RegisterRoutes(IMapRoute mapRouteManager) { - private static readonly string[] Namespaces = ["DotNetNuke.Web.InternalServices",]; - - /// - public void RegisterRoutes(IMapRoute mapRouteManager) - { - mapRouteManager.MapHttpRoute( - "InternalServices", - "default", - "{controller}/{action}", - Namespaces); - } + mapRouteManager.MapHttpRoute( + "InternalServices", + "default", + "{controller}/{action}", + Namespaces); } } diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/UserFileController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/UserFileController.cs index 86a56d97ecc..034477a39b9 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/UserFileController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/UserFileController.cs @@ -2,171 +2,170 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace DotNetNuke.Web.InternalServices +namespace DotNetNuke.Web.InternalServices; + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using DotNetNuke.Entities.Icons; +using DotNetNuke.Instrumentation; +using DotNetNuke.Services.FileSystem; +using DotNetNuke.Services.Localization; +using DotNetNuke.Web.Api; + +/// A web API controller for user files. +public class UserFileController : DnnApiController { - using System; - using System.Collections.Generic; - using System.Globalization; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using DotNetNuke.Entities.Icons; - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.FileSystem; - using DotNetNuke.Services.Localization; - using DotNetNuke.Web.Api; - - /// A web API controller for user files. - public class UserFileController : DnnApiController + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(UserFileController)); + private static readonly char[] FileExtensionSeparator = [',',]; + private static readonly HashSet ImageExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { "jpg", "png", "gif", "jpe", "jpeg", "tiff", }; + private readonly IFolderManager folderManager = FolderManager.Instance; + + /// Gets the items in the user's folder. + /// A response with a list of objects (containing the following fields: id, name, folder, parentId, thumb_url, type, size, modified, and children). + [DnnAuthorize] + [HttpGet] + public HttpResponseMessage GetItems() { - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(UserFileController)); - private static readonly char[] FileExtensionSeparator = [',',]; - private static readonly HashSet ImageExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) { "jpg", "png", "gif", "jpe", "jpeg", "tiff", }; - private readonly IFolderManager folderManager = FolderManager.Instance; - - /// Gets the items in the user's folder. - /// A response with a list of objects (containing the following fields: id, name, folder, parentId, thumb_url, type, size, modified, and children). - [DnnAuthorize] - [HttpGet] - public HttpResponseMessage GetItems() - { - return this.GetItems(null); - } + return this.GetItems(null); + } - /// Gets the items in the user's folder. - /// A comma-delimited list of file extensions. - /// A response with a list of objects (containing the following fields: id, name, folder, parentId, thumb_url, type, size, modified, and children). - [DnnAuthorize] - [HttpGet] - public HttpResponseMessage GetItems(string fileExtensions) + /// Gets the items in the user's folder. + /// A comma-delimited list of file extensions. + /// A response with a list of objects (containing the following fields: id, name, folder, parentId, thumb_url, type, size, modified, and children). + [DnnAuthorize] + [HttpGet] + public HttpResponseMessage GetItems(string fileExtensions) + { + try { - try - { - var userFolder = this.folderManager.GetUserFolder(this.UserInfo); - var extensions = new List(); - - if (!string.IsNullOrEmpty(fileExtensions)) - { - fileExtensions = fileExtensions.ToLowerInvariant(); - extensions.AddRange(fileExtensions.Split(FileExtensionSeparator, StringSplitOptions.RemoveEmptyEntries)); - } + var userFolder = this.folderManager.GetUserFolder(this.UserInfo); + var extensions = new List(); - var folderStructure = new - { - id = userFolder.FolderID, - name = Localization.GetString("UserFolderTitle.Text", Localization.SharedResourceFile), - folder = true, - parentId = 0, - thumb_url = default(string), - type = default(string), - size = default(string), - modified = default(string), - children = this.GetChildren(userFolder, extensions), - }; - - return this.Request.CreateResponse(HttpStatusCode.OK, new List { folderStructure }); - } - catch (Exception exc) + if (!string.IsNullOrEmpty(fileExtensions)) { - Logger.Error(exc); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); + fileExtensions = fileExtensions.ToLowerInvariant(); + extensions.AddRange(fileExtensions.Split(FileExtensionSeparator, StringSplitOptions.RemoveEmptyEntries)); } - } - private static string GetModifiedTime(DateTime dateTime) + var folderStructure = new + { + id = userFolder.FolderID, + name = Localization.GetString("UserFolderTitle.Text", Localization.SharedResourceFile), + folder = true, + parentId = 0, + thumb_url = default(string), + type = default(string), + size = default(string), + modified = default(string), + children = this.GetChildren(userFolder, extensions), + }; + + return this.Request.CreateResponse(HttpStatusCode.OK, new List { folderStructure }); + } + catch (Exception exc) { - return string.Format(CultureInfo.CurrentCulture, "{0:MMM} {0:dd}, {0:yyyy} at {0:t}", dateTime); + Logger.Error(exc); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exc); } + } + + private static string GetModifiedTime(DateTime dateTime) + { + return string.Format(CultureInfo.CurrentCulture, "{0:MMM} {0:dd}, {0:yyyy} at {0:t}", dateTime); + } + + private static string GetTypeName(IFileInfo file) + { + return file.ContentType == null + ? string.Empty + : (file.ContentType.StartsWith("image/", StringComparison.Ordinal) + ? file.ContentType.Replace("image/", string.Empty) + : (file.Extension != null ? file.Extension.ToLowerInvariant() : string.Empty)); + } + + private static bool IsImageFile(string relativePath) + { + var extension = relativePath.Substring(relativePath.LastIndexOf(".", StringComparison.Ordinal) + 1); + return ImageExtensions.Contains(extension); + } - private static string GetTypeName(IFileInfo file) + private static string GetFileSize(int sizeInBytes) + { + var size = sizeInBytes / 1024; + var biggerThanAMegabyte = size > 1024; + if (biggerThanAMegabyte) { - return file.ContentType == null - ? string.Empty - : (file.ContentType.StartsWith("image/", StringComparison.Ordinal) - ? file.ContentType.Replace("image/", string.Empty) - : (file.Extension != null ? file.Extension.ToLowerInvariant() : string.Empty)); + size = size / 1024; } - private static bool IsImageFile(string relativePath) + return size.ToString(CultureInfo.InvariantCulture) + (biggerThanAMegabyte ? "Mb" : "k"); + } + + private string GetThumbUrl(IFileInfo file) + { + if (IsImageFile(file.RelativePath)) { - var extension = relativePath.Substring(relativePath.LastIndexOf(".", StringComparison.Ordinal) + 1); - return ImageExtensions.Contains(extension); + return FileManager.Instance.GetUrl(file); } - private static string GetFileSize(int sizeInBytes) + var fileIcon = IconController.IconURL("Ext" + file.Extension, "32x32"); + if (!System.IO.File.Exists(this.Request.GetHttpContext().Server.MapPath(fileIcon))) { - var size = sizeInBytes / 1024; - var biggerThanAMegabyte = size > 1024; - if (biggerThanAMegabyte) - { - size = size / 1024; - } - - return size.ToString(CultureInfo.InvariantCulture) + (biggerThanAMegabyte ? "Mb" : "k"); + fileIcon = IconController.IconURL("File", "32x32"); } - private string GetThumbUrl(IFileInfo file) - { - if (IsImageFile(file.RelativePath)) - { - return FileManager.Instance.GetUrl(file); - } + return fileIcon; + } - var fileIcon = IconController.IconURL("Ext" + file.Extension, "32x32"); - if (!System.IO.File.Exists(this.Request.GetHttpContext().Server.MapPath(fileIcon))) - { - fileIcon = IconController.IconURL("File", "32x32"); - } + private List GetChildren(IFolderInfo folder, ICollection extensions) + { + var everything = new List(); - return fileIcon; - } + var folders = this.folderManager.GetFolders(folder); - private List GetChildren(IFolderInfo folder, ICollection extensions) + foreach (var currentFolder in folders) { - var everything = new List(); + everything.Add(new + { + id = currentFolder.FolderID, + name = currentFolder.DisplayName ?? currentFolder.FolderName, + folder = true, + parentId = folder.FolderID, + thumb_url = default(string), + type = default(string), + size = default(string), + modified = default(string), + children = this.GetChildren(currentFolder, extensions), + }); + } - var folders = this.folderManager.GetFolders(folder); + var files = this.folderManager.GetFiles(folder); - foreach (var currentFolder in folders) + foreach (var file in files) + { + // list is empty or contains the file extension in question + if (extensions.Count == 0 || extensions.Contains(file.Extension.ToLowerInvariant())) { everything.Add(new { - id = currentFolder.FolderID, - name = currentFolder.DisplayName ?? currentFolder.FolderName, - folder = true, - parentId = folder.FolderID, - thumb_url = default(string), - type = default(string), - size = default(string), - modified = default(string), - children = this.GetChildren(currentFolder, extensions), + id = file.FileId, + name = file.FileName, + folder = false, + parentId = file.FolderId, + thumb_url = this.GetThumbUrl(file), + type = GetTypeName(file), + size = GetFileSize(file.Size), + modified = GetModifiedTime(file.LastModificationTime), + children = default(List), }); } - - var files = this.folderManager.GetFiles(folder); - - foreach (var file in files) - { - // list is empty or contains the file extension in question - if (extensions.Count == 0 || extensions.Contains(file.Extension.ToLowerInvariant())) - { - everything.Add(new - { - id = file.FileId, - name = file.FileName, - folder = false, - parentId = file.FolderId, - thumb_url = this.GetThumbUrl(file), - type = GetTypeName(file), - size = GetFileSize(file.Size), - modified = GetModifiedTime(file.LastModificationTime), - children = default(List), - }); - } - } - - return everything; } + + return everything; } } diff --git a/DNN Platform/Library/Security/Permissions/PermissionProvider.cs b/DNN Platform/Library/Security/Permissions/PermissionProvider.cs index 0dee7eb3568..5fa73dec4b2 100644 --- a/DNN Platform/Library/Security/Permissions/PermissionProvider.cs +++ b/DNN Platform/Library/Security/Permissions/PermissionProvider.cs @@ -425,7 +425,7 @@ public virtual bool HasModuleAccess(SecurityAccessLevel accessLevel, string perm bool isAuthorized = false; UserInfo userInfo = UserController.Instance.GetCurrentUserInfo(); TabInfo tab = TabController.Instance.GetTab(moduleConfiguration.TabID, moduleConfiguration.PortalID, false); - if (userInfo != null && userInfo.IsSuperUser) + if (userInfo is { IsSuperUser: true, }) { isAuthorized = true; } @@ -447,7 +447,7 @@ public virtual bool HasModuleAccess(SecurityAccessLevel accessLevel, string perm isAuthorized = TabPermissionController.CanAddContentToPage(tab); break; case SecurityAccessLevel.Edit: - if (!((moduleConfiguration.IsShared && moduleConfiguration.IsShareableViewOnly) && TabPermissionController.CanAddContentToPage(tab))) + if (!(moduleConfiguration.IsShared && moduleConfiguration.IsShareableViewOnly && TabPermissionController.CanAddContentToPage(tab))) { if (string.IsNullOrEmpty(permissionKey)) { @@ -457,14 +457,7 @@ public virtual bool HasModuleAccess(SecurityAccessLevel accessLevel, string perm if (TabPermissionController.CanAddContentToPage(tab)) { // Need to check for Deny Edit at the Module Level - if (permissionKey == "CONTENT") - { - isAuthorized = !this.IsDeniedModulePermission(moduleConfiguration, permissionKey); - } - else - { - isAuthorized = true; - } + isAuthorized = !this.IsDeniedModulePermission(moduleConfiguration, permissionKey); } else { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/XssCleaner.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/XssCleaner.cs index 1c5c7ecabf8..342ee80355d 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/XssCleaner.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/XssCleaner.cs @@ -2,47 +2,120 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace Dnn.PersonaBar.Pages.Components +namespace Dnn.PersonaBar.Pages.Components; + +using Dnn.PersonaBar.Library.Dto.Tabs; +using Dnn.PersonaBar.Pages.Services.Dto; +using DotNetNuke.Security; + +/// Cleans input values. +public static class XssCleaner { - using Dnn.PersonaBar.Pages.Services.Dto; - using DotNetNuke.Security; + /// Cleans input. + /// The input to clean. + public static void Clean(this PageSettings input) + { + input.Title = Clean(input.Title); + input.Description = Clean(input.Description); + input.Name = Clean(input.Name); + input.Keywords = Clean(input.Keywords); + input.Tags = Clean(input.Tags); + input.Url = Clean(input.Url); + input.PageType = Clean(input.PageType); + input.Alias = Clean(input.Alias); + input.LocalizedName = Clean(input.LocalizedName); + input.PageStyleSheet = Clean(input.PageStyleSheet); + } + + /// Cleans input. + /// The input to clean. + public static void Clean(this BulkPage input) + { + input.BulkPages = Clean(input.BulkPages); + input.Keywords = Clean(input.Keywords); + input.Tags = Clean(input.Tags); + } - public static class XssCleaner + /// Cleans input. + /// The input to clean. + public static void Clean(this PageTemplate input) { - public static void Clean(this PageSettings input) + input.Description = Clean(input.Description); + input.Name = Clean(input.Name); + } + + /// Cleans input. + /// The input to clean. + public static void Clean(this DnnPagesRequest input) + { + foreach (var locale in input.Locales) { - input.Title = Clean(input.Title); - input.Description = Clean(input.Description); - input.Name = Clean(input.Name); - input.Keywords = Clean(input.Keywords); - input.Tags = Clean(input.Tags); - input.Url = Clean(input.Url); - input.PageType = Clean(input.PageType); - input.Alias = Clean(input.Alias); - input.LocalizedName = Clean(input.LocalizedName); - input.PageStyleSheet = Clean(input.PageStyleSheet); + locale.Clean(); } - public static void Clean(this BulkPage input) + foreach (var page in input.Pages) { - input.BulkPages = Clean(input.BulkPages); - input.Keywords = Clean(input.Keywords); - input.Tags = Clean(input.Tags); + page.Clean(); } - public static void Clean(this PageTemplate input) + foreach (var module in input.Modules) { - input.Description = Clean(input.Description); - input.Name = Clean(input.Name); + module.Clean(); } + } - public static string Clean( - string input, -#pragma warning disable CS0618 // Type or member is obsolete - PortalSecurity.FilterFlag filterFlag = PortalSecurity.FilterFlag.NoMarkup) -#pragma warning restore CS0618 // Type or member is obsolete + /// Cleans input. + /// The input to clean. + public static void Clean(this LocaleInfoDto input) + { + input.CultureCode = Clean(input.CultureCode); + } + + /// Cleans input. + /// The input to clean. + public static void Clean(this DnnPageDto input) + { + input.Title = Clean(input.Title); + input.Description = Clean(input.Description); + input.TabName = Clean(input.TabName); + input.LocalResourceFile = Clean(input.LocalResourceFile); + input.CultureCode = Clean(input.CultureCode); + input.PageUrl = Clean(input.PageUrl); + input.Path = Clean(input.Path); + input.Position = Clean(input.Position); + } + + /// Cleans input. + /// The input to clean. + public static void Clean(this DnnModulesRequest input) + { + foreach (var module in input.Modules) { - return PortalSecurity.Instance.InputFilter(input, filterFlag); + module.Clean(); } } + + /// Cleans input. + /// The input to clean. + public static void Clean(this DnnModuleDto input) + { + input.CultureCode = Clean(input.CultureCode); + input.DefaultTabName = Clean(input.DefaultTabName); + input.LocalResourceFile = Clean(input.LocalResourceFile); + input.ModuleInfoHelp = Clean(input.ModuleInfoHelp); + input.ModuleTitle = Clean(input.ModuleTitle); + } + + /// Cleans input. + /// The input to clean. + /// The filter to clean with with. + /// The clean input. + public static string Clean( + string input, +#pragma warning disable CS0618 // Type or member is obsolete + PortalSecurity.FilterFlag filterFlag = PortalSecurity.FilterFlag.NoMarkup) +#pragma warning restore CS0618 // Type or member is obsolete + { + return PortalSecurity.Instance.InputFilter(input, filterFlag); + } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Themes/ThemesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Themes/ThemesController.cs index b0d107a1c1d..b11916465ca 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Themes/ThemesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Themes/ThemesController.cs @@ -1,674 +1,682 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace Dnn.PersonaBar.Themes.Components +namespace Dnn.PersonaBar.Themes.Components; + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; +using System.Xml; + +using Dnn.PersonaBar.Themes.Components.DTO; + +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Users; +using DotNetNuke.Framework; +using DotNetNuke.Instrumentation; +using DotNetNuke.Services.Exceptions; +using DotNetNuke.UI.Skins; + +using Microsoft.Extensions.DependencyInjection; + +using Image = System.Drawing.Image; + +/// The default implementation. +public class ThemesController : ServiceLocator, IThemesController { - using System; - using System.Collections; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using System.Xml; - - using Dnn.PersonaBar.Themes.Components.DTO; - using DotNetNuke.Common; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Users; - using DotNetNuke.Framework; - using DotNetNuke.Instrumentation; - using DotNetNuke.Services.Exceptions; - using DotNetNuke.UI.Skins; - - using Image = System.Drawing.Image; - - public class ThemesController : ServiceLocator, IThemesController - { - internal static readonly IList ImageExtensions = new List() { ".jpg", ".png", ".jpeg" }; + /// The image extensions. + internal static readonly IList ImageExtensions = [".jpg", ".png", ".jpeg",]; - internal static readonly IList DefaultLayoutNames = new List() { "Default", "2-Col", "Home", "Index", "Main" }; - internal static readonly IList DefaultContainerNames = new List() { "Title-h2", "NoTitle", "Main", "Default" }; - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ThemesController)); + /// The default theme layout names. + internal static readonly IList DefaultLayoutNames = ["Default", "2-Col", "Home", "Index", "Main",]; - private static readonly object ThreadLocker = new object(); + /// The default container names. + internal static readonly IList DefaultContainerNames = ["Title-h2", "NoTitle", "Main", "Default",]; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(ThemesController)); + private static readonly object ThreadLocker = new object(); - /// - public IList GetLayouts(PortalSettings portalSettings, ThemeLevel level) - { - var themes = new List(); - if ((level & ThemeLevel.Site) == ThemeLevel.Site) - { - themes.AddRange(GetThemes(ThemeType.Skin, Path.Combine(portalSettings.HomeDirectoryMapPath, SkinController.RootSkin))); - } + private readonly IHostSettings hostSettings = Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IApplicationStatusInfo appStatus = Globals.GetCurrentServiceProvider().GetRequiredService(); - if ((level & ThemeLevel.SiteSystem) == ThemeLevel.SiteSystem) - { - themes.AddRange(GetThemes(ThemeType.Skin, Path.Combine(portalSettings.HomeSystemDirectoryMapPath, SkinController.RootSkin))); - } - - if ((level & ThemeLevel.Global) == ThemeLevel.Global) - { - themes.AddRange(GetThemes(ThemeType.Skin, Path.Combine(Globals.HostMapPath, SkinController.RootSkin))); - } + /// + public IList GetLayouts(PortalSettings portalSettings, ThemeLevel level) + { + var themes = new List(); + if ((level & ThemeLevel.Site) == ThemeLevel.Site) + { + themes.AddRange(this.GetThemes(ThemeType.Skin, Path.Combine(portalSettings.HomeDirectoryMapPath, SkinController.RootSkin))); + } - return themes; + if ((level & ThemeLevel.SiteSystem) == ThemeLevel.SiteSystem) + { + themes.AddRange(this.GetThemes(ThemeType.Skin, Path.Combine(portalSettings.HomeSystemDirectoryMapPath, SkinController.RootSkin))); } - /// - public IList GetContainers(PortalSettings portalSettings, ThemeLevel level) + if ((level & ThemeLevel.Global) == ThemeLevel.Global) { - var themes = new List(); - if ((level & ThemeLevel.Site) == ThemeLevel.Site) - { - themes.AddRange(GetThemes(ThemeType.Container, Path.Combine(portalSettings.HomeDirectoryMapPath, SkinController.RootContainer))); - } + themes.AddRange(this.GetThemes(ThemeType.Skin, Path.Combine(Globals.HostMapPath, SkinController.RootSkin))); + } - if ((level & ThemeLevel.SiteSystem) == ThemeLevel.SiteSystem) - { - themes.AddRange(GetThemes(ThemeType.Container, Path.Combine(portalSettings.HomeSystemDirectoryMapPath, SkinController.RootContainer))); - } + return themes; + } - if ((level & ThemeLevel.Global) == ThemeLevel.Global) - { - themes.AddRange(GetThemes(ThemeType.Container, Path.Combine(Globals.HostMapPath, SkinController.RootContainer))); - } + /// + public IList GetContainers(PortalSettings portalSettings, ThemeLevel level) + { + var themes = new List(); + if ((level & ThemeLevel.Site) == ThemeLevel.Site) + { + themes.AddRange(this.GetThemes(ThemeType.Container, Path.Combine(portalSettings.HomeDirectoryMapPath, SkinController.RootContainer))); + } - return themes; + if ((level & ThemeLevel.SiteSystem) == ThemeLevel.SiteSystem) + { + themes.AddRange(this.GetThemes(ThemeType.Container, Path.Combine(portalSettings.HomeSystemDirectoryMapPath, SkinController.RootContainer))); } - /// - public IList GetThemeFiles(PortalSettings portalSettings, ThemeInfo theme) + if ((level & ThemeLevel.Global) == ThemeLevel.Global) { - var themePath = Path.Combine(Globals.ApplicationMapPath, theme.Path); - var themeFiles = new List(); + themes.AddRange(this.GetThemes(ThemeType.Container, Path.Combine(Globals.HostMapPath, SkinController.RootContainer))); + } - if (Directory.Exists(themePath)) - { - bool fallbackSkin; - if (theme.Type == ThemeType.Skin) - { - fallbackSkin = IsFallbackSkin(themePath); - } - else - { - fallbackSkin = IsFallbackContainer(themePath); - } + return themes; + } - var strSkinType = themePath.IndexOf(Globals.HostMapPath, StringComparison.OrdinalIgnoreCase) != -1 ? "G" : "L"; + /// + public IList GetThemeFiles(PortalSettings portalSettings, ThemeInfo theme) + { + var themePath = Path.Combine(this.appStatus.ApplicationMapPath, theme.Path); + var themeFiles = new List(); - var canDeleteSkin = SkinController.CanDeleteSkin(themePath, portalSettings.HomeDirectoryMapPath); - var arrFiles = Directory.GetFiles(themePath, "*.ascx"); + if (Directory.Exists(themePath)) + { + var fallbackSkin = theme.Type == ThemeType.Skin ? this.IsFallbackSkin(themePath) : this.IsFallbackContainer(themePath); - foreach (var strFile in arrFiles) - { - var file = strFile.ToLowerInvariant(); + var strSkinType = themePath.IndexOf(Globals.HostMapPath, StringComparison.OrdinalIgnoreCase) != -1 ? "G" : "L"; - var themeFile = new ThemeFileInfo(); - themeFile.ThemeName = theme.PackageName; - themeFile.Type = theme.Type; - themeFile.Level = theme.Level; + var canDeleteSkin = SkinController.CanDeleteSkin(this.hostSettings, themePath, portalSettings.HomeDirectoryMapPath); + var arrFiles = Directory.GetFiles(themePath, "*.ascx"); - var imagePath = string.Empty; - foreach (var ext in ImageExtensions) - { - var path = Path.ChangeExtension(file, ext); - if (File.Exists(path)) - { - imagePath = path; - break; - } - } + foreach (var strFile in arrFiles) + { + var file = strFile.ToLowerInvariant(); - if (!string.IsNullOrEmpty(imagePath)) + var themeFile = new ThemeFileInfo(); + themeFile.ThemeName = theme.PackageName; + themeFile.Type = theme.Type; + themeFile.Level = theme.Level; + + var imagePath = string.Empty; + foreach (var ext in ImageExtensions) + { + var path = Path.ChangeExtension(file, ext); + if (File.Exists(path)) { - themeFile.Thumbnail = CreateThumbnail(imagePath); + imagePath = path; + break; } - - themeFile.Name = Path.GetFileNameWithoutExtension(file); - themeFile.Path = FormatThemePath(portalSettings, themePath, Path.GetFileName(strFile), theme.Type); - themeFile.CanDelete = (UserController.Instance.GetCurrentUserInfo().IsSuperUser || strSkinType == "L") - && (!fallbackSkin && canDeleteSkin); - - themeFiles.Add(themeFile); } - } - - return themeFiles; - } - /// - public ThemeFileInfo GetThemeFile(PortalSettings portalSettings, string filePath, ThemeType type) - { - var themeName = SkinController.FormatSkinPath(filePath) - .Substring(filePath.IndexOf("/", StringComparison.OrdinalIgnoreCase) + 1) - .Replace("/", string.Empty); - var themeLevel = GetThemeLevel(filePath); + if (!string.IsNullOrEmpty(imagePath)) + { + themeFile.Thumbnail = this.CreateThumbnail(imagePath); + } - var themeInfo = (type == ThemeType.Skin ? this.GetLayouts(portalSettings, ThemeLevel.All) - : this.GetContainers(portalSettings, ThemeLevel.All)) - .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == themeLevel); + themeFile.Name = Path.GetFileNameWithoutExtension(file); + themeFile.Path = FormatThemePath(portalSettings, themePath, Path.GetFileName(strFile), theme.Type); + themeFile.CanDelete = (UserController.Instance.GetCurrentUserInfo().IsSuperUser || strSkinType == "L") && !fallbackSkin && canDeleteSkin; - if (themeInfo != null) - { - return this.GetThemeFiles(portalSettings, themeInfo).FirstOrDefault(f => (f.Path + ".ascx").Equals(filePath, StringComparison.OrdinalIgnoreCase)); + themeFiles.Add(themeFile); } - - return null; } - /// - public void ApplyTheme(int portalId, ThemeFileInfo themeFile, ApplyThemeScope scope) - { - var skinPath = themeFile.Path + ".ascx"; + return themeFiles; + } - switch (themeFile.Type) - { - case ThemeType.Container: - if ((scope & ApplyThemeScope.Site) == ApplyThemeScope.Site) - { - SkinController.SetSkin(SkinController.RootContainer, portalId, SkinType.Portal, skinPath); - } + /// + public ThemeFileInfo GetThemeFile(PortalSettings portalSettings, string filePath, ThemeType type) + { + var themeName = SkinController.FormatSkinPath(filePath) + .Substring(filePath.IndexOf("/", StringComparison.OrdinalIgnoreCase) + 1) + .Replace("/", string.Empty); + var themeLevel = GetThemeLevel(filePath); - if ((scope & ApplyThemeScope.Edit) == ApplyThemeScope.Edit) - { - SkinController.SetSkin(SkinController.RootContainer, portalId, SkinType.Admin, skinPath); - } + var themeInfo = (type == ThemeType.Skin ? this.GetLayouts(portalSettings, ThemeLevel.All) + : this.GetContainers(portalSettings, ThemeLevel.All)) + .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == themeLevel); - break; - case ThemeType.Skin: - if ((scope & ApplyThemeScope.Site) == ApplyThemeScope.Site) - { - SkinController.SetSkin(SkinController.RootSkin, portalId, SkinType.Portal, skinPath); - } + if (themeInfo != null) + { + return this.GetThemeFiles(portalSettings, themeInfo).FirstOrDefault(f => (f.Path + ".ascx").Equals(filePath, StringComparison.OrdinalIgnoreCase)); + } - if ((scope & ApplyThemeScope.Edit) == ApplyThemeScope.Edit) - { - SkinController.SetSkin(SkinController.RootSkin, portalId, SkinType.Admin, skinPath); - } + return null; + } - DataCache.ClearPortalCache(portalId, true); - break; - } - } + /// + public void ApplyTheme(int portalId, ThemeFileInfo themeFile, ApplyThemeScope scope) + { + var skinPath = $"{themeFile.Path}.ascx"; - /// - public void ApplyDefaultTheme(PortalSettings portalSettings, string themeName, ThemeLevel level) + switch (themeFile.Type) { - var skin = this.GetLayouts(portalSettings, ThemeLevel.All) - .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); - if (skin != null) - { - var skinFile = this.GetThemeFiles(portalSettings, skin).FirstOrDefault(t => t.Path == skin.DefaultThemeFile); - if (skinFile != null) + case ThemeType.Container: + if ((scope & ApplyThemeScope.Site) == ApplyThemeScope.Site) { - this.ApplyTheme(portalSettings.PortalId, skinFile, ApplyThemeScope.Site | ApplyThemeScope.Edit); + SkinController.SetSkin(SkinController.RootContainer, portalId, SkinType.Portal, skinPath); } - } - var container = this.GetContainers(portalSettings, ThemeLevel.All) - .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); - if (container != null) - { - var containerFile = this.GetThemeFiles(portalSettings, container).FirstOrDefault(t => t.Path == container.DefaultThemeFile); - if (containerFile != null) + if ((scope & ApplyThemeScope.Edit) == ApplyThemeScope.Edit) { - this.ApplyTheme(portalSettings.PortalId, containerFile, ApplyThemeScope.Site | ApplyThemeScope.Edit); + SkinController.SetSkin(SkinController.RootContainer, portalId, SkinType.Admin, skinPath); } - } - } - /// - public void DeleteTheme(PortalSettings portalSettings, ThemeFileInfo themeFile) - { - var themePath = SkinController.FormatSkinSrc(themeFile.Path, portalSettings); - var user = UserController.Instance.GetCurrentUserInfo(); + break; + case ThemeType.Skin: + if ((scope & ApplyThemeScope.Site) == ApplyThemeScope.Site) + { + SkinController.SetSkin(SkinController.RootSkin, portalId, SkinType.Portal, skinPath); + } - if (!user.IsSuperUser && themePath.IndexOf("\\portals\\_default\\", StringComparison.OrdinalIgnoreCase) != Null.NullInteger) - { - throw new SecurityException("NoPermission"); - } + if ((scope & ApplyThemeScope.Edit) == ApplyThemeScope.Edit) + { + SkinController.SetSkin(SkinController.RootSkin, portalId, SkinType.Admin, skinPath); + } - File.Delete(Path.Combine(Globals.ApplicationMapPath, themePath)); - DataCache.ClearPortalCache(portalSettings.PortalId, true); + DataCache.ClearPortalCache(portalId, true); + break; } + } - /// - public void DeleteThemePackage(PortalSettings portalSettings, ThemeInfo theme) + /// + public void ApplyDefaultTheme(PortalSettings portalSettings, string themeName, ThemeLevel level) + { + var skin = this.GetLayouts(portalSettings, ThemeLevel.All) + .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); + if (skin != null) { - var themePath = Path.Combine(Globals.ApplicationMapPath, theme.Path); - var user = UserController.Instance.GetCurrentUserInfo(); - - if (!user.IsSuperUser && themePath.IndexOf(@"\portals\_default\", StringComparison.OrdinalIgnoreCase) != Null.NullInteger) + var skinFile = this.GetThemeFiles(portalSettings, skin).FirstOrDefault(t => t.Path == skin.DefaultThemeFile); + if (skinFile != null) { - throw new SecurityException("NoPermission"); + this.ApplyTheme(portalSettings.PortalId, skinFile, ApplyThemeScope.Site | ApplyThemeScope.Edit); } + } - if (theme.Type == ThemeType.Skin) - { - var skinPackage = SkinController.GetSkinPackage(portalSettings.PortalId, theme.PackageName, "Skin"); - if (skinPackage != null) - { - throw new InvalidOperationException("UsePackageUninstall"); - } - - if (Directory.Exists(themePath)) - { - Globals.DeleteFolderRecursive(themePath); - } - - if (Directory.Exists(themePath.Replace($@"\{SkinController.RootSkin.ToLowerInvariant()}\", $@"\{SkinController.RootContainer}\"))) - { - Globals.DeleteFolderRecursive(themePath.Replace($@"\{SkinController.RootSkin.ToLowerInvariant()}\", $@"\{SkinController.RootContainer}\")); - } - } - else if (theme.Type == ThemeType.Container) + var container = this.GetContainers(portalSettings, ThemeLevel.All) + .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); + if (container != null) + { + var containerFile = this.GetThemeFiles(portalSettings, container).FirstOrDefault(t => t.Path == container.DefaultThemeFile); + if (containerFile != null) { - var skinPackage = SkinController.GetSkinPackage(portalSettings.PortalId, theme.PackageName, "Container"); - if (skinPackage != null) - { - throw new InvalidOperationException("UsePackageUninstall"); - } - - if (Directory.Exists(themePath)) - { - Globals.DeleteFolderRecursive(themePath); - } + this.ApplyTheme(portalSettings.PortalId, containerFile, ApplyThemeScope.Site | ApplyThemeScope.Edit); } } + } - /// - public void UpdateTheme(PortalSettings portalSettings, UpdateThemeInfo updateTheme) - { - var themePath = SkinController.FormatSkinSrc(updateTheme.Path + ".ascx", portalSettings); - themePath = Path.Combine(Globals.ApplicationMapPath, themePath.TrimStart('/')); + /// + public void DeleteTheme(PortalSettings portalSettings, ThemeFileInfo themeFile) + { + var themePath = SkinController.FormatSkinSrc(themeFile.Path, portalSettings); + var user = UserController.Instance.GetCurrentUserInfo(); - var objStreamReader = File.OpenText(themePath); - var strSkin = objStreamReader.ReadToEnd(); - objStreamReader.Close(); - var strTag = $"", intOpenTag, StringComparison.Ordinal); - var strAttribute = updateTheme.Setting; - var intStartAttribute = strSkin.IndexOf(strAttribute, intOpenTag, StringComparison.OrdinalIgnoreCase); - string strValue = updateTheme.Value; - if (intStartAttribute != -1 && intStartAttribute < intCloseTag) - { - // remove attribute - var intEndAttribute = strSkin.IndexOf("\" ", intStartAttribute, StringComparison.Ordinal); - strSkin = strSkin.Substring(0, intStartAttribute) + strSkin.Substring(intEndAttribute + 2); - } + if (!user.IsSuperUser && themePath.IndexOf("\\portals\\_default\\", StringComparison.OrdinalIgnoreCase) != Null.NullInteger) + { + throw new SecurityException("NoPermission"); + } - // add attribute - strSkin = strSkin.Insert(intOpenTag + strTag.Length, $" {strAttribute}=\"{strValue}\""); + File.Delete(Path.Combine(this.appStatus.ApplicationMapPath, themePath)); + DataCache.ClearPortalCache(portalSettings.PortalId, true); + } - File.SetAttributes(themePath, FileAttributes.Normal); - var objStream = File.CreateText(themePath); - objStream.WriteLine(strSkin); - objStream.Close(); + /// + public void DeleteThemePackage(PortalSettings portalSettings, ThemeInfo theme) + { + var themePath = Path.Combine(this.appStatus.ApplicationMapPath, theme.Path); + var user = UserController.Instance.GetCurrentUserInfo(); - UpdateManifest(portalSettings, updateTheme); - } + if (!user.IsSuperUser && themePath.IndexOf(@"\portals\_default\", StringComparison.OrdinalIgnoreCase) != Null.NullInteger) + { + throw new SecurityException("NoPermission"); } - /// - public void ParseTheme(PortalSettings portalSettings, ThemeInfo theme, ParseType parseType) + if (theme.Type == ThemeType.Skin) { - var strRootPath = Null.NullString; - switch (theme.Level) + var skinPackage = SkinController.GetSkinPackage(portalSettings.PortalId, theme.PackageName, "Skin"); + if (skinPackage != null) { - case ThemeLevel.Global: // global - strRootPath = Globals.HostMapPath; - break; - case ThemeLevel.Site: // local - strRootPath = portalSettings.HomeDirectoryMapPath; - break; + throw new InvalidOperationException("UsePackageUninstall"); } - var objSkinFiles = new SkinFileProcessor(strRootPath, theme.Type == ThemeType.Container ? SkinController.RootContainer : SkinController.RootSkin, theme.PackageName); - var arrSkinFiles = new ArrayList(); - - var strFolder = Path.Combine(Globals.ApplicationMapPath, theme.Path); - if (Directory.Exists(strFolder)) + if (Directory.Exists(themePath)) { - var arrFiles = Directory.GetFiles(strFolder); - foreach (var strFile in arrFiles) - { - switch (Path.GetExtension(strFile)) - { - case ".htm": - case ".html": - case ".css": - if (strFile.IndexOf(Globals.glbAboutPage, StringComparison.CurrentCultureIgnoreCase) < 0) - { - arrSkinFiles.Add(strFile); - } - - break; - case ".ascx": - if (File.Exists(strFile.Replace(".ascx", ".htm")) == false && File.Exists(strFile.Replace(".ascx", ".html")) == false) - { - arrSkinFiles.Add(strFile); - } - - break; - } - } + Globals.DeleteFolderRecursive(themePath); } - switch (parseType) + if (Directory.Exists(themePath.Replace($@"\{SkinController.RootSkin.ToLowerInvariant()}\", $@"\{SkinController.RootContainer}\"))) { - case ParseType.Localized: // localized - objSkinFiles.ProcessList(arrSkinFiles, SkinParser.Localized); - break; - case ParseType.Portable: // portable - objSkinFiles.ProcessList(arrSkinFiles, SkinParser.Portable); - break; + Globals.DeleteFolderRecursive(themePath.Replace($@"\{SkinController.RootSkin.ToLowerInvariant()}\", $@"\{SkinController.RootContainer}\")); } } - - internal static string CreateThumbnail(string strImage) + else if (theme.Type == ThemeType.Container) { - var imageFileName = Path.GetFileName(strImage); - if (string.IsNullOrEmpty(imageFileName) || imageFileName.StartsWith("thumbnail_", StringComparison.OrdinalIgnoreCase)) + var skinPackage = SkinController.GetSkinPackage(portalSettings.PortalId, theme.PackageName, "Container"); + if (skinPackage != null) + { + throw new InvalidOperationException("UsePackageUninstall"); + } + + if (Directory.Exists(themePath)) { - strImage = strImage.Substring(Globals.ApplicationMapPath.Length); - strImage = strImage.Replace(@"\", "/"); - return strImage; + Globals.DeleteFolderRecursive(themePath); } + } + } - var strThumbnail = strImage.Replace(Path.GetFileName(strImage), "thumbnail_" + imageFileName); + /// + public void UpdateTheme(PortalSettings portalSettings, UpdateThemeInfo updateTheme) + { + var themePath = SkinController.FormatSkinSrc(updateTheme.Path + ".ascx", portalSettings); + themePath = Path.Combine(this.appStatus.ApplicationMapPath, themePath.TrimStart('/')); + + var objStreamReader = File.OpenText(themePath); + var strSkin = objStreamReader.ReadToEnd(); + objStreamReader.Close(); + var strTag = $"", intOpenTag, StringComparison.Ordinal); + var strAttribute = updateTheme.Setting; + var intStartAttribute = strSkin.IndexOf(strAttribute, intOpenTag, StringComparison.OrdinalIgnoreCase); + var strValue = updateTheme.Value; + if (intStartAttribute != -1 && intStartAttribute < intCloseTag) + { + // remove attribute + var intEndAttribute = strSkin.IndexOf("\" ", intStartAttribute, StringComparison.Ordinal); + strSkin = strSkin.Substring(0, intStartAttribute) + strSkin.Substring(intEndAttribute + 2); + } + + // add attribute + strAttribute = HttpUtility.HtmlAttributeEncode(strAttribute); + strValue = HttpUtility.HtmlAttributeEncode(strValue); + strSkin = strSkin.Insert(intOpenTag + strTag.Length, $" {strAttribute}=\"{strValue}\""); + + File.SetAttributes(themePath, FileAttributes.Normal); + var objStream = File.CreateText(themePath); + objStream.WriteLine(strSkin); + objStream.Close(); + + UpdateManifest(portalSettings, updateTheme); + } + + /// + public void ParseTheme(PortalSettings portalSettings, ThemeInfo theme, ParseType parseType) + { + var strRootPath = theme.Level switch + { + ThemeLevel.Global => // global + Globals.HostMapPath, + ThemeLevel.Site => // local + portalSettings.HomeDirectoryMapPath, + _ => Null.NullString, + }; + + var objSkinFiles = new SkinFileProcessor(strRootPath, theme.Type == ThemeType.Container ? SkinController.RootContainer : SkinController.RootSkin, theme.PackageName); + var arrSkinFiles = new ArrayList(); + + var strFolder = Path.Combine(this.appStatus.ApplicationMapPath, theme.Path); + if (Directory.Exists(strFolder)) + { + var arrFiles = Directory.GetFiles(strFolder); + foreach (var strFile in arrFiles) { - lock (ThreadLocker) + switch (Path.GetExtension(strFile)) { - if (NeedCreateThumbnail(strThumbnail, strImage)) - { - const int intSize = 150; // size of the thumbnail - try + case ".htm": + case ".html": + case ".css": + if (strFile.IndexOf(Globals.glbAboutPage, StringComparison.CurrentCultureIgnoreCase) < 0) { - var objImage = Image.FromFile(strImage); - - // scale the image to prevent distortion - int intHeight; - int intWidth; - double dblScale; - if (objImage.Height > objImage.Width) - { - // The height was larger, so scale the width - dblScale = (double)intSize / objImage.Height; - intHeight = intSize; - intWidth = Convert.ToInt32(objImage.Width * dblScale); - } - else - { - // The width was larger, so scale the height - dblScale = (double)intSize / objImage.Width; - intWidth = intSize; - intHeight = Convert.ToInt32(objImage.Height * dblScale); - } - - // create the thumbnail image - var objThumbnail = objImage.GetThumbnailImage(intWidth, intHeight, null, IntPtr.Zero); - - // delete the old file ( if it exists ) - if (File.Exists(strThumbnail)) - { - File.Delete(strThumbnail); - } - - // save the thumbnail image - objThumbnail.Save(strThumbnail, objImage.RawFormat); - - // set the file attributes - File.SetAttributes(strThumbnail, FileAttributes.Normal); - File.SetLastWriteTime(strThumbnail, File.GetLastWriteTime(strImage)); - - // tidy up - objImage.Dispose(); - objThumbnail.Dispose(); + arrSkinFiles.Add(strFile); } - catch (Exception ex) + + break; + case ".ascx": + if (!File.Exists(strFile.Replace(".ascx", ".htm")) && !File.Exists(strFile.Replace(".ascx", ".html"))) { - // problem creating thumbnail - Logger.Error(ex); + arrSkinFiles.Add(strFile); } - } + + break; } } + } - strThumbnail = strThumbnail.Substring(Globals.ApplicationMapPath.Length); - strThumbnail = strThumbnail.Replace(@"\", "/"); + switch (parseType) + { + case ParseType.Localized: // localized + objSkinFiles.ProcessList(arrSkinFiles, SkinParser.Localized); + break; + case ParseType.Portable: // portable + objSkinFiles.ProcessList(arrSkinFiles, SkinParser.Portable); + break; + } + } - // return thumbnail filename - return strThumbnail; + /// Gets the for the given . + /// The file path to the theme. + /// The value. + internal static ThemeLevel GetThemeLevel(string themeFilePath) + { + themeFilePath = themeFilePath.Replace(@"\", "/"); + if (!string.IsNullOrEmpty(Globals.ApplicationPath) + && !themeFilePath.StartsWith("[", StringComparison.Ordinal) + && !themeFilePath.StartsWith(Globals.ApplicationPath, StringComparison.InvariantCultureIgnoreCase)) + { + var needSlash = !Globals.ApplicationPath.EndsWith("/", StringComparison.Ordinal) && !themeFilePath.StartsWith("/", StringComparison.Ordinal); + themeFilePath = $"{Globals.ApplicationPath}{(needSlash ? "/" : string.Empty)}{themeFilePath}"; } - internal static ThemeLevel GetThemeLevel(string themeFilePath) + if (themeFilePath.IndexOf(Globals.HostPath.TrimStart('/'), StringComparison.OrdinalIgnoreCase) > Null.NullInteger + || themeFilePath.StartsWith("[G]", StringComparison.OrdinalIgnoreCase)) { - themeFilePath = themeFilePath.Replace(@"\", "/"); - if (!string.IsNullOrEmpty(Globals.ApplicationPath) - && !themeFilePath.StartsWith("[", StringComparison.Ordinal) - && !themeFilePath.StartsWith(Globals.ApplicationPath, StringComparison.InvariantCultureIgnoreCase)) - { - var needSlash = !Globals.ApplicationPath.EndsWith("/", StringComparison.Ordinal) && !themeFilePath.StartsWith("/", StringComparison.Ordinal); - themeFilePath = $"{Globals.ApplicationPath}{(needSlash ? "/" : string.Empty)}{themeFilePath}"; - } + return ThemeLevel.Global; + } - if (themeFilePath.IndexOf(Globals.HostPath.TrimStart('/'), StringComparison.OrdinalIgnoreCase) > Null.NullInteger - || themeFilePath.StartsWith("[G]", StringComparison.OrdinalIgnoreCase)) - { - return ThemeLevel.Global; - } - else if ((PortalSettings.Current != null && - themeFilePath.IndexOf(PortalSettings.Current.HomeSystemDirectory.TrimStart('/'), StringComparison.OrdinalIgnoreCase) > Null.NullInteger) - || themeFilePath.StartsWith("[S]", StringComparison.OrdinalIgnoreCase)) - { - return ThemeLevel.SiteSystem; - } - else - { - return ThemeLevel.Site; - } + if ((PortalSettings.Current != null && + themeFilePath.IndexOf(PortalSettings.Current.HomeSystemDirectory.TrimStart('/'), StringComparison.OrdinalIgnoreCase) > Null.NullInteger) + || themeFilePath.StartsWith("[S]", StringComparison.OrdinalIgnoreCase)) + { + return ThemeLevel.SiteSystem; } - protected override Func GetFactory() + return ThemeLevel.Site; + } + + /// Creates a thumbnail version of the theme image. + /// The path to the theme image. + /// The path to the thumbnail image. + internal string CreateThumbnail(string strImage) + { + var imageFileName = Path.GetFileName(strImage); + if (string.IsNullOrEmpty(imageFileName) || imageFileName.StartsWith("thumbnail_", StringComparison.OrdinalIgnoreCase)) { - return () => new ThemesController(); + strImage = strImage.Substring(this.appStatus.ApplicationMapPath.Length); + strImage = strImage.Replace(@"\", "/"); + return strImage; } - private static List GetThemes(ThemeType type, string strRoot) + var strThumbnail = strImage.Replace(Path.GetFileName(strImage), "thumbnail_" + imageFileName); + + if (NeedCreateThumbnail(strThumbnail, strImage)) { - var themes = new List(); - if (Directory.Exists(strRoot)) + lock (ThreadLocker) { - foreach (var strFolder in Directory.GetDirectories(strRoot)) + if (NeedCreateThumbnail(strThumbnail, strImage)) { - var strName = strFolder.Substring(strFolder.LastIndexOf(@"\", StringComparison.Ordinal) + 1); - if (strName != "_default") + const int intSize = 150; // size of the thumbnail + try { - var themePath = strFolder.Replace(Globals.ApplicationMapPath, string.Empty).TrimStart('\\').ToLowerInvariant(); - var isFallback = type == ThemeType.Skin ? IsFallbackSkin(themePath) : IsFallbackContainer(themePath); - var canDelete = !isFallback && SkinController.CanDeleteSkin(strFolder, PortalSettings.Current.HomeDirectoryMapPath); - var defaultThemeFile = GetDefaultThemeFileName(themePath, type); - themes.Add(new ThemeInfo() + var objImage = Image.FromFile(strImage); + + // scale the image to prevent distortion + int intHeight; + int intWidth; + double dblScale; + if (objImage.Height > objImage.Width) { - PackageName = strName, - Type = type, - Path = themePath, - DefaultThemeFile = FormatThemePath(PortalSettings.Current, strFolder, defaultThemeFile, type), - Thumbnail = GetThumbnail(themePath, defaultThemeFile), - CanDelete = canDelete, - }); + // The height was larger, so scale the width + dblScale = (double)intSize / objImage.Height; + intHeight = intSize; + intWidth = Convert.ToInt32(objImage.Width * dblScale); + } + else + { + // The width was larger, so scale the height + dblScale = (double)intSize / objImage.Width; + intWidth = intSize; + intHeight = Convert.ToInt32(objImage.Height * dblScale); + } + + // create the thumbnail image + var objThumbnail = objImage.GetThumbnailImage(intWidth, intHeight, null, IntPtr.Zero); + + // delete the old file ( if it exists ) + if (File.Exists(strThumbnail)) + { + File.Delete(strThumbnail); + } + + // save the thumbnail image + objThumbnail.Save(strThumbnail, objImage.RawFormat); + + // set the file attributes + File.SetAttributes(strThumbnail, FileAttributes.Normal); + File.SetLastWriteTime(strThumbnail, File.GetLastWriteTime(strImage)); + + // tidy up + objImage.Dispose(); + objThumbnail.Dispose(); + } + catch (Exception ex) + { + // problem creating thumbnail + Logger.Error(ex); } } } - - return themes; } - private static string GetDefaultThemeFileName(string themePath, ThemeType type) + strThumbnail = strThumbnail.Substring(this.appStatus.ApplicationMapPath.Length); + strThumbnail = strThumbnail.Replace(@"\", "/"); + + // return thumbnail filename + return strThumbnail; + } + + /// + protected override Func GetFactory() + { + return () => new ThemesController(); + } + + private static bool NeedCreateThumbnail(string thumbnailPath, string imagePath) + { + return !File.Exists(thumbnailPath) || File.GetLastWriteTime(thumbnailPath) != File.GetLastWriteTime(imagePath); + } + + private static string FormatThemePath(PortalSettings portalSettings, string themePath, string fileName, ThemeType type) + { + var filePath = Path.Combine(themePath, fileName); + var lowercasePath = filePath.ToLowerInvariant(); + var strRootSkin = type == ThemeType.Skin ? SkinController.RootSkin : SkinController.RootContainer; + + var strSkinType = themePath.IndexOf(Globals.HostMapPath, StringComparison.OrdinalIgnoreCase) != -1 ? "G" : "L"; + if (themePath.IndexOf(portalSettings.HomeSystemDirectoryMapPath, StringComparison.OrdinalIgnoreCase) > -1) { - var themeFiles = new List(); - var folderPath = Path.Combine(Globals.ApplicationMapPath, themePath); - themeFiles.AddRange(Directory.GetFiles(folderPath, "*.ascx")); + strSkinType = "S"; + } - var defaultFile = themeFiles.FirstOrDefault(i => - { - var fileName = Path.GetFileNameWithoutExtension(i); - return type == ThemeType.Skin ? DefaultLayoutNames.Contains(fileName, StringComparer.OrdinalIgnoreCase) - : DefaultContainerNames.Contains(fileName, StringComparer.OrdinalIgnoreCase); - }); + var strUrl = lowercasePath.Substring(filePath.IndexOf($@"\{strRootSkin}\", StringComparison.OrdinalIgnoreCase)) + .Replace(".ascx", string.Empty) + .Replace(@"\", "/") + .TrimStart('/'); - if (string.IsNullOrEmpty(defaultFile)) - { - defaultFile = themeFiles.FirstOrDefault(); - } + return $"[{strSkinType}]{strUrl}"; + } - return !string.IsNullOrEmpty(defaultFile) ? Path.GetFileName(defaultFile) : string.Empty; + private static void UpdateManifest(PortalSettings portalSettings, UpdateThemeInfo updateTheme) + { + var themePath = SkinController.FormatSkinSrc(updateTheme.Path, portalSettings); + if (!File.Exists(themePath.Replace(".ascx", ".htm"))) + { + return; } - private static string GetThumbnail(string themePath, string themeFileName) + var strFile = themePath.Replace(".ascx", ".xml"); + if (!File.Exists(strFile)) { - var folderPath = Path.Combine(Globals.ApplicationMapPath, themePath); - var filePath = Path.Combine(folderPath, themeFileName); - var imagePath = string.Empty; - foreach (var ext in ImageExtensions) - { - var path = Path.ChangeExtension(filePath, ext); - if (File.Exists(path)) - { - imagePath = path; - break; - } - } + strFile = strFile.Replace(Path.GetFileName(strFile), "skin.xml"); + } - return !string.IsNullOrEmpty(imagePath) ? CreateThumbnail(imagePath) : string.Empty; + var xmlDoc = new XmlDocument { XmlResolver = null }; + try + { + using var manifestReader = XmlReader.Create(strFile, new XmlReaderSettings { XmlResolver = null, }); + xmlDoc.Load(manifestReader); + } + catch + { + using var objectsReader = XmlReader.Create(new StringReader(""), new XmlReaderSettings { XmlResolver = null, }); + xmlDoc.Load(objectsReader); } - private static bool NeedCreateThumbnail(string thumbnailPath, string imagePath) + var xmlToken = xmlDoc.DocumentElement?.CreateNavigator().SelectSingleNode(XmlUtils.CreateXPathExpression("descendant::Object[Token='[$token]']", new KeyValuePair("token", updateTheme.Token))); + if (xmlToken == null) { - return !File.Exists(thumbnailPath) || File.GetLastWriteTime(thumbnailPath) != File.GetLastWriteTime(imagePath); + // add token + string strToken = $"[{updateTheme.Token}]"; + xmlToken = xmlDoc.CreateElement("Object").CreateNavigator(); + xmlToken.InnerXml = strToken; + xmlDoc.SelectSingleNode("Objects")?.CreateNavigator().AppendChild(xmlToken); + xmlToken = xmlDoc.DocumentElement?.CreateNavigator().SelectSingleNode(XmlUtils.CreateXPathExpression("descendant::Object[Token='[$token]']", new KeyValuePair("token", updateTheme.Token))); } - private static bool IsFallbackContainer(string skinPath) + var strValue = updateTheme.Value; + + var blnUpdate = false; + var settings = xmlToken?.Select(".//Settings/Setting"); + if (settings is not null) { - var strDefaultContainerPath = (Globals.HostMapPath + SkinController.RootContainer + SkinDefaults.GetSkinDefaults(SkinDefaultType.SkinInfo).Folder).Replace("/", @"\"); - if (strDefaultContainerPath.EndsWith(@"\", StringComparison.Ordinal)) + foreach (XmlNode xmlSetting in settings) { - strDefaultContainerPath = strDefaultContainerPath.Substring(0, strDefaultContainerPath.Length - 1); + if (xmlSetting.SelectSingleNode("Name")?.InnerText == updateTheme.Setting) + { + xmlSetting.SelectSingleNode("Value")?.InnerText = strValue; + blnUpdate = true; + } } + } - return skinPath.IndexOf(strDefaultContainerPath, StringComparison.CurrentCultureIgnoreCase) != -1; + if (!blnUpdate) + { + var strSetting = $"{updateTheme.Setting}{strValue}"; + var xmlSetting = xmlDoc.CreateElement("Setting"); + xmlSetting.InnerXml = strSetting; + xmlToken.SelectSingleNode("Settings").AppendChild(xmlSetting.CreateNavigator()); } - private static bool IsFallbackSkin(string skinPath) + try { - var strDefaultSkinPath = (Globals.HostMapPath + SkinController.RootSkin + SkinDefaults.GetSkinDefaults(SkinDefaultType.SkinInfo).Folder).Replace("/", @"\"); - if (strDefaultSkinPath.EndsWith(@"\", StringComparison.Ordinal)) + if (File.Exists(strFile)) { - strDefaultSkinPath = strDefaultSkinPath.Substring(0, strDefaultSkinPath.Length - 1); + File.SetAttributes(strFile, FileAttributes.Normal); } - return skinPath.Equals(strDefaultSkinPath, StringComparison.OrdinalIgnoreCase); + var objStream = File.CreateText(strFile); + objStream.WriteLine(xmlDoc.InnerXml.Replace("><", ">" + Environment.NewLine + "<")); + objStream.Close(); } - - private static string FormatThemePath(PortalSettings portalSettings, string themePath, string fileName, ThemeType type) + catch (Exception ex) { - var filePath = Path.Combine(themePath, fileName); - var lowercasePath = filePath.ToLowerInvariant(); - var strRootSkin = type == ThemeType.Skin ? SkinController.RootSkin : SkinController.RootContainer; + Logger.Error(ex); + } + } - var strSkinType = themePath.IndexOf(Globals.HostMapPath, StringComparison.OrdinalIgnoreCase) != -1 ? "G" : "L"; - if (themePath.IndexOf(portalSettings.HomeSystemDirectoryMapPath, StringComparison.OrdinalIgnoreCase) > -1) - { - strSkinType = "S"; - } + private List GetThemes(ThemeType type, string strRoot) + { + if (!Directory.Exists(strRoot)) + { + return []; + } - var strUrl = lowercasePath.Substring(filePath.IndexOf($@"\{strRootSkin}\", StringComparison.OrdinalIgnoreCase)) - .Replace(".ascx", string.Empty) - .Replace(@"\", "/") - .TrimStart('/'); + return ( + from strFolder in Directory.GetDirectories(strRoot) + let strName = strFolder.Substring(strFolder.LastIndexOf(@"\", StringComparison.Ordinal) + 1) + where strName != "_default" + let themePath = strFolder.Replace(this.appStatus.ApplicationMapPath, string.Empty).TrimStart('\\').ToLowerInvariant() + let isFallback = type == ThemeType.Skin ? this.IsFallbackSkin(themePath) : this.IsFallbackContainer(themePath) + let canDelete = !isFallback && SkinController.CanDeleteSkin(this.hostSettings, strFolder, PortalSettings.Current.HomeDirectoryMapPath) + let defaultThemeFile = this.GetDefaultThemeFileName(themePath, type) + select new ThemeInfo + { + PackageName = strName, + Type = type, + Path = themePath, + DefaultThemeFile = FormatThemePath(PortalSettings.Current, strFolder, defaultThemeFile, type), + Thumbnail = this.GetThumbnail(themePath, defaultThemeFile), + CanDelete = canDelete, + }).ToList(); + } - return $"[{strSkinType}]{strUrl}"; - } + private string GetDefaultThemeFileName(string themePath, ThemeType type) + { + var themeFiles = new List(); + var folderPath = Path.Combine(this.appStatus.ApplicationMapPath, themePath); + themeFiles.AddRange(Directory.GetFiles(folderPath, "*.ascx")); - private static void UpdateManifest(PortalSettings portalSettings, UpdateThemeInfo updateTheme) + var defaultFile = themeFiles.FirstOrDefault(i => { - var themePath = SkinController.FormatSkinSrc(updateTheme.Path, portalSettings); - if (File.Exists(themePath.Replace(".ascx", ".htm"))) - { - var strFile = themePath.Replace(".ascx", ".xml"); - if (!File.Exists(strFile)) - { - strFile = strFile.Replace(Path.GetFileName(strFile), "skin.xml"); - } + var fileName = Path.GetFileNameWithoutExtension(i); + return type == ThemeType.Skin ? DefaultLayoutNames.Contains(fileName, StringComparer.OrdinalIgnoreCase) + : DefaultContainerNames.Contains(fileName, StringComparer.OrdinalIgnoreCase); + }); - var xmlDoc = new XmlDocument { XmlResolver = null }; - try - { - using var manifestReader = XmlReader.Create(strFile, new XmlReaderSettings { XmlResolver = null, }); - xmlDoc.Load(manifestReader); - } - catch - { - using var objectsReader = XmlReader.Create(new StringReader(""), new XmlReaderSettings { XmlResolver = null, }); - xmlDoc.Load(objectsReader); - } + if (string.IsNullOrEmpty(defaultFile)) + { + defaultFile = themeFiles.FirstOrDefault(); + } - var xmlToken = xmlDoc.DocumentElement?.CreateNavigator().SelectSingleNode(XmlUtils.CreateXPathExpression("descendant::Object[Token='[$token]']", new KeyValuePair("token", updateTheme.Token))); - if (xmlToken == null) - { - // add token - string strToken = $"[{updateTheme.Token}]"; - xmlToken = xmlDoc.CreateElement("Object").CreateNavigator(); - xmlToken.InnerXml = strToken; - xmlDoc.SelectSingleNode("Objects")?.CreateNavigator().AppendChild(xmlToken); - xmlToken = xmlDoc.DocumentElement?.CreateNavigator().SelectSingleNode(XmlUtils.CreateXPathExpression("descendant::Object[Token='[$token]']", new KeyValuePair("token", updateTheme.Token))); - } + return !string.IsNullOrEmpty(defaultFile) ? Path.GetFileName(defaultFile) : string.Empty; + } - var strValue = updateTheme.Value; + private string GetThumbnail(string themePath, string themeFileName) + { + var folderPath = Path.Combine(this.appStatus.ApplicationMapPath, themePath); + var filePath = Path.Combine(folderPath, themeFileName); + var imagePath = string.Empty; + foreach (var ext in ImageExtensions) + { + var path = Path.ChangeExtension(filePath, ext); + if (File.Exists(path)) + { + imagePath = path; + break; + } + } - var blnUpdate = false; - var settings = xmlToken?.Select(".//Settings/Setting"); - if (settings is not null) - { - foreach (XmlNode xmlSetting in settings) - { - if (xmlSetting.SelectSingleNode("Name")?.InnerText == updateTheme.Setting) - { - xmlSetting.SelectSingleNode("Value")?.InnerText = strValue; - blnUpdate = true; - } - } - } + return !string.IsNullOrEmpty(imagePath) ? this.CreateThumbnail(imagePath) : string.Empty; + } - if (!blnUpdate) - { - var strSetting = $"{updateTheme.Setting}{strValue}"; - var xmlSetting = xmlDoc.CreateElement("Setting"); - xmlSetting.InnerXml = strSetting; - xmlToken.SelectSingleNode("Settings").AppendChild(xmlSetting.CreateNavigator()); - } + private bool IsFallbackContainer(string skinPath) + { + var strDefaultContainerPath = (Globals.HostMapPath + SkinController.RootContainer + SkinDefaults.GetSkinDefaults(this.hostSettings, SkinDefaultType.SkinInfo).Folder).Replace("/", @"\"); + if (strDefaultContainerPath.EndsWith(@"\", StringComparison.Ordinal)) + { + strDefaultContainerPath = strDefaultContainerPath.Substring(0, strDefaultContainerPath.Length - 1); + } - try - { - if (File.Exists(strFile)) - { - File.SetAttributes(strFile, FileAttributes.Normal); - } + return skinPath.IndexOf(strDefaultContainerPath, StringComparison.CurrentCultureIgnoreCase) != -1; + } - var objStream = File.CreateText(strFile); - objStream.WriteLine(xmlDoc.InnerXml.Replace("><", ">" + Environment.NewLine + "<")); - objStream.Close(); - } - catch (Exception ex) - { - Logger.Error(ex); - } - } + private bool IsFallbackSkin(string skinPath) + { + var strDefaultSkinPath = (Globals.HostMapPath + SkinController.RootSkin + SkinDefaults.GetSkinDefaults(this.hostSettings, SkinDefaultType.SkinInfo).Folder).Replace("/", @"\"); + if (strDefaultSkinPath.EndsWith(@"\", StringComparison.Ordinal)) + { + strDefaultSkinPath = strDefaultSkinPath.Substring(0, strDefaultSkinPath.Length - 1); } + + return skinPath.Equals(strDefaultSkinPath, StringComparison.OrdinalIgnoreCase); } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/PagesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/PagesController.cs index d9b17737cfa..6f7a8e2dcaf 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/PagesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/PagesController.cs @@ -1,1430 +1,1450 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information -namespace Dnn.PersonaBar.Pages.Services +namespace Dnn.PersonaBar.Pages.Services; + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +using Dnn.PersonaBar.Library; +using Dnn.PersonaBar.Library.Attributes; +using Dnn.PersonaBar.Library.Dto.Tabs; +using Dnn.PersonaBar.Pages.Components; +using Dnn.PersonaBar.Pages.Components.Dto; +using Dnn.PersonaBar.Pages.Components.Exceptions; +using Dnn.PersonaBar.Pages.Components.Security; +using Dnn.PersonaBar.Pages.Services.Dto; +using Dnn.PersonaBar.Themes.Components; +using Dnn.PersonaBar.Themes.Components.DTO; +using DotNetNuke.Abstractions; +using DotNetNuke.Abstractions.Application; +using DotNetNuke.Abstractions.Security; +using DotNetNuke.Common; +using DotNetNuke.Common.Utilities; +using DotNetNuke.Entities.Content.Workflow; +using DotNetNuke.Entities.Modules; +using DotNetNuke.Entities.Portals; +using DotNetNuke.Entities.Tabs; +using DotNetNuke.Entities.Tabs.TabVersions; +using DotNetNuke.Entities.Users; +using DotNetNuke.Instrumentation; +using DotNetNuke.Security.Permissions; +using DotNetNuke.Services.Localization; +using DotNetNuke.Services.OutputCache; +using DotNetNuke.Services.Social.Notifications; +using DotNetNuke.Web.Api; +using DotNetNuke.Web.UI.WebControls; + +using Microsoft.Extensions.DependencyInjection; + +using Localization = Dnn.PersonaBar.Pages.Components.Localization; + +/// API controller for the Pages persona bar module. +[MenuPermission(MenuName = "Dnn.Pages")] +[DnnExceptionFilter] +public class PagesController( + INavigationManager navigationManager, + IPagesController pagesController, + ITemplateController templateController, + IHostSettings hostSettings, + IApplicationStatusInfo appStatus, + ICryptographyProvider cryptographyProvider) + : PersonaBarApiController { - using System; - using System.Collections.Generic; - using System.Globalization; - using System.Linq; - using System.Net; - using System.Net.Http; - using System.Web.Http; - - using Dnn.PersonaBar.Library; - using Dnn.PersonaBar.Library.Attributes; - using Dnn.PersonaBar.Library.Dto.Tabs; - using Dnn.PersonaBar.Pages.Components; - using Dnn.PersonaBar.Pages.Components.Dto; - using Dnn.PersonaBar.Pages.Components.Exceptions; - using Dnn.PersonaBar.Pages.Components.Security; - using Dnn.PersonaBar.Pages.Services.Dto; - using Dnn.PersonaBar.Themes.Components; - using Dnn.PersonaBar.Themes.Components.DTO; - using DotNetNuke.Abstractions; - using DotNetNuke.Common.Utilities; - using DotNetNuke.Entities.Content.Workflow; - using DotNetNuke.Entities.Modules; - using DotNetNuke.Entities.Portals; - using DotNetNuke.Entities.Tabs; - using DotNetNuke.Entities.Tabs.TabVersions; - using DotNetNuke.Entities.Users; - using DotNetNuke.Instrumentation; - using DotNetNuke.Security.Permissions; - using DotNetNuke.Services.Localization; - using DotNetNuke.Services.OutputCache; - using DotNetNuke.Services.Social.Notifications; - using DotNetNuke.Web.Api; - using DotNetNuke.Web.UI.WebControls; - - using Localization = Dnn.PersonaBar.Pages.Components.Localization; - - /// API controller for the Pages persona bar module. - [MenuPermission(MenuName = "Dnn.Pages")] - [DnnExceptionFilter] - public class PagesController : PersonaBarApiController + private const string LocalResourceFile = Library.Constants.PersonaBarRelativePath + "Modules/Dnn.Pages/App_LocalResources/Pages.resx"; + private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(PagesController)); + + private readonly IPagesController pagesController = pagesController; + private readonly ITemplateController templateController = templateController; + private readonly IHostSettings hostSettings = hostSettings ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly IApplicationStatusInfo appStatus = appStatus ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly ICryptographyProvider cryptographyProvider = cryptographyProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + + private readonly IBulkPagesController bulkPagesController = BulkPagesController.Instance; + private readonly IThemesController themesController = ThemesController.Instance; + private readonly IDefaultPortalThemeController defaultPortalThemeController = DefaultPortalThemeController.Instance; + private readonly ITabController tabController = TabController.Instance; + private readonly ILocaleController localeController = LocaleController.Instance; + private readonly ISecurityService securityService = SecurityService.Instance; + private readonly IWorkflowManager workflowManager = WorkflowManager.Instance; + + /// Initializes a new instance of the class. + /// the navigation manager to provide navigation features. + /// The pages controller. + /// The template controller. + [Obsolete("Deprecated in DotNetNuke 10.3.3. Please use overload with IHostSettings. Scheduled removal in v12.0.0.")] + public PagesController(INavigationManager navigationManager, IPagesController pagesController, ITemplateController templateController) + : this(navigationManager, pagesController, templateController, null, null, null) { - private const string LocalResourceFile = Library.Constants.PersonaBarRelativePath + "Modules/Dnn.Pages/App_LocalResources/Pages.resx"; - private static readonly ILog Logger = LoggerSource.Instance.GetLogger(typeof(PagesController)); - private readonly IPagesController pagesController; - - private readonly IBulkPagesController bulkPagesController; - private readonly IThemesController themesController; - private readonly ITemplateController templateController; - private readonly IDefaultPortalThemeController defaultPortalThemeController; - - private readonly ITabController tabController; - private readonly ILocaleController localeController; - private readonly ISecurityService securityService; - private readonly IWorkflowManager workflowManager; - - /// Initializes a new instance of the class. - /// the navigation manager to provide navigation features. - /// The pages controller. - /// The template controller. - public PagesController(INavigationManager navigationManager, IPagesController pagesController, ITemplateController templateController) - { - this.NavigationManager = navigationManager; - - this.pagesController = pagesController; - this.themesController = ThemesController.Instance; - this.bulkPagesController = BulkPagesController.Instance; - this.templateController = templateController; - this.defaultPortalThemeController = DefaultPortalThemeController.Instance; - - this.tabController = TabController.Instance; - this.localeController = LocaleController.Instance; - this.securityService = SecurityService.Instance; - this.workflowManager = WorkflowManager.Instance; - } - - /// Gets the Navigation Manager that provides navigation features. - protected INavigationManager NavigationManager { get; } - - /// GET: api/Pages/GetPageDetails - /// Get detail of a page. - /// The page (tab) id. - /// The page details. - [HttpGet] - public HttpResponseMessage GetPageDetails(int pageId) - { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } + } - try - { - var page = this.pagesController.GetPageSettings(pageId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { page, new DnnFileUploadOptions().ValidationCode }); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound, new { Message = "Page doesn't exists." }); - } - } + /// Gets the Navigation Manager that provides navigation features. + protected INavigationManager NavigationManager { get; } = navigationManager; - /// GET: api/Pages/GetCustomUrls - /// Get custom Urls of a page. - /// The page (tab) id. - /// A list of custom urls. - [HttpGet] - public HttpResponseMessage GetCustomUrls(int pageId) + /// GET: api/Pages/GetPageDetails + /// Get detail of a page. + /// The page (tab) id. + /// The page details. + [HttpGet] + public HttpResponseMessage GetPageDetails(int pageId) + { + if (!this.securityService.CanManagePage(pageId)) { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } + return this.GetForbiddenResponse(); + } - return this.Request.CreateResponse(HttpStatusCode.OK, this.pagesController.GetPageUrls(pageId)); + try + { + var page = this.pagesController.GetPageSettings(pageId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { page, new DnnFileUploadOptions(this.hostSettings, this.appStatus, this.cryptographyProvider).ValidationCode, }); + } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound, new { Message = "Page doesn't exists.", }); } + } - /// Creates a custom url for SEO purposes. - /// DTO. - /// Information about success or failure as well as a possible error message and a new url suggestion. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage CreateCustomUrl(SeoUrl dto) + /// GET: api/Pages/GetCustomUrls + /// Get custom Urls of a page. + /// The page (tab) id. + /// A list of custom urls. + [HttpGet] + public HttpResponseMessage GetCustomUrls(int pageId) + { + if (!this.securityService.CanManagePage(pageId)) { - if (!this.securityService.CanManagePage(dto.TabId)) - { - return this.GetForbiddenResponse(); - } + return this.GetForbiddenResponse(); + } - var result = this.pagesController.CreateCustomUrl(dto); + return this.Request.CreateResponse(HttpStatusCode.OK, this.pagesController.GetPageUrls(pageId)); + } - return this.Request.CreateResponse( - HttpStatusCode.OK, - new - { - result.Id, - result.Success, - result.ErrorMessage, - result.SuggestedUrlPath, - }); - } - - /// Updates a custom url. - /// DTO. - /// the id, if the call succeeded or faile, a possible error message and a possible new url suggestion. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage UpdateCustomUrl(SeoUrl dto) - { - if (!this.securityService.CanManagePage(dto.TabId)) - { - return this.GetForbiddenResponse(); - } + /// Creates a custom url for SEO purposes. + /// DTO. + /// Information about success or failure as well as a possible error message and a new url suggestion. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage CreateCustomUrl(SeoUrl dto) + { + if (!this.securityService.CanManagePage(dto.TabId)) + { + return this.GetForbiddenResponse(); + } - var result = this.pagesController.UpdateCustomUrl(dto); + var result = this.pagesController.CreateCustomUrl(dto); - return this.Request.CreateResponse(HttpStatusCode.OK, new + return this.Request.CreateResponse( + HttpStatusCode.OK, + new { result.Id, result.Success, result.ErrorMessage, result.SuggestedUrlPath, }); + } + + /// Updates a custom url. + /// DTO. + /// the id, if the call succeeded or failed, a possible error message and a possible new url suggestion. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage UpdateCustomUrl(SeoUrl dto) + { + if (!this.securityService.CanManagePage(dto.TabId)) + { + return this.GetForbiddenResponse(); } - /// Deletes a custom URL. - /// DTO. - /// A value indicating if the call succeeded. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage DeleteCustomUrl(UrlIdDto dto) + var result = this.pagesController.UpdateCustomUrl(dto); + + return this.Request.CreateResponse(HttpStatusCode.OK, new { - if (!this.securityService.CanManagePage(dto.TabId)) - { - return this.GetForbiddenResponse(); - } + result.Id, + result.Success, + result.ErrorMessage, + result.SuggestedUrlPath, + }); + } - this.pagesController.DeleteCustomUrl(dto); + /// Deletes a custom URL. + /// DTO. + /// A value indicating if the call succeeded. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage DeleteCustomUrl(UrlIdDto dto) + { + if (!this.securityService.CanManagePage(dto.TabId)) + { + return this.GetForbiddenResponse(); + } - var response = new - { - Success = true, - }; + this.pagesController.DeleteCustomUrl(dto); - return this.Request.CreateResponse(HttpStatusCode.OK, response); + var response = new + { + Success = true, + }; + + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } + + /// GET: api/Pages/GetPageList + /// Gets the list of pages for a given parent page. + /// The page (tab) id for the parent. + /// An optional search string. + /// A list of pages. + [HttpGet] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] + public HttpResponseMessage GetPageList(int parentId = -1, string searchKey = "") + { + var adminTabId = this.PortalSettings.AdminTabId; + var tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, this.PortalSettings.PortalId, adminTabId, false, true, false, true); + var pages = + from page in this.pagesController.GetPageList(this.PortalSettings, parentId, searchKey) + select Converters.ConvertToPageItem(page, tabs); + return this.Request.CreateResponse(HttpStatusCode.OK, pages); + } + + /// GET: api/Pages/SearchPages + /// Searches for pages. + /// The search string. + /// The type of page. + /// The page tags. + /// The publish status of the page. + /// The publish start date. + /// The publish end date. + /// The workflow id for the page. + /// What index of the pages paging to return. + /// How many pages to return per paging page. + /// Paged list of pages. + [HttpGet] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] + public HttpResponseMessage SearchPages( + string searchKey = "", + string pageType = "", + string tags = "", + string publishStatus = "All", + string publishDateStart = "", + string publishDateEnd = "", + int workflowId = -1, + int pageIndex = -1, + int pageSize = -1) + { + var adminTabId = this.PortalSettings.AdminTabId; + var tabs = TabController.GetPortalTabs(this.hostSettings, this.appStatus, this.PortalSettings.PortalId, adminTabId, false, true, false, true); + var pages = + from p in this.pagesController.SearchPages(out var totalRecords, searchKey, pageType, tags, publishStatus, publishDateStart, publishDateEnd, workflowId, pageIndex, pageSize) + select Converters.ConvertToPageItem(p, tabs); + var response = new + { + Success = true, + Results = pages, + TotalResults = totalRecords, + }; + return this.Request.CreateResponse(HttpStatusCode.OK, response); + } + + /// Gets the pages hierarchy. + /// The page (tab) id. + /// The page hierarchy. + [HttpGet] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage GetPageHierarchy(int pageId) + { + try + { + var paths = this.pagesController.GetPageHierarchy(pageId); + return this.Request.CreateResponse(HttpStatusCode.OK, paths); + } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound); } + } - /// GET: api/Pages/GetPageList - /// Gets the list of pages for a given parent page. - /// The page (tab) id for the parent. - /// An optional search string. - /// A list of pages. - [HttpGet] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] - public HttpResponseMessage GetPageList(int parentId = -1, string searchKey = "") + /// Moves a page to another place in the hierarchy. + /// DTO. + /// A status and information about the page at its new location. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage MovePage(PageMoveRequest request) + { + if (!this.securityService.CanManagePage(request.PageId) + || !this.securityService.CanManagePage(request.ParentId) + || !this.securityService.CanManagePage(request.RelatedPageId) + || !this.securityService.CanManagePage(TabController.Instance.GetTab(request.RelatedPageId, this.PortalId)?.ParentId ?? -1)) { - var adminTabId = this.PortalSettings.AdminTabId; - var tabs = TabController.GetPortalTabs(this.PortalSettings.PortalId, adminTabId, false, true, false, true); - var pages = from p in this.pagesController.GetPageList(this.PortalSettings, parentId, searchKey) - select Converters.ConvertToPageItem(p, tabs); - return this.Request.CreateResponse(HttpStatusCode.OK, pages); + return this.GetForbiddenResponse(); } - /// GET: api/Pages/SearchPages - /// Searches for pages. - /// The search string. - /// The type of page. - /// The page tags. - /// The publish status of the page. - /// The publish start date. - /// The publish end date. - /// The workflow id for the page. - /// What index of the pages paging to return. - /// How many pages to return per paging page. - /// Paged list of pages. - [HttpGet] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] - public HttpResponseMessage SearchPages( - string searchKey = "", - string pageType = "", - string tags = "", - string publishStatus = "All", - string publishDateStart = "", - string publishDateEnd = "", - int workflowId = -1, - int pageIndex = -1, - int pageSize = -1) - { - int totalRecords; - var adminTabId = this.PortalSettings.AdminTabId; - var tabs = TabController.GetPortalTabs(this.PortalSettings.PortalId, adminTabId, false, true, false, true); - var pages = from p in this.pagesController.SearchPages(out totalRecords, searchKey, pageType, tags, publishStatus, publishDateStart, publishDateEnd, workflowId, pageIndex, pageSize) - select Converters.ConvertToPageItem(p, tabs); - var response = new - { - Success = true, - Results = pages, - TotalResults = totalRecords, - }; - return this.Request.CreateResponse(HttpStatusCode.OK, response); + try + { + var tab = this.pagesController.MovePage(request); + var tabs = TabController.GetPortalTabs( + this.hostSettings, + this.appStatus, + this.PortalSettings.PortalId, + Null.NullInteger, + false, + true, + false, + true); + var pageItem = Converters.ConvertToPageItem(tab, tabs); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, Page = pageItem, }); + } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound); + } + catch (PageException ex) + { + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Message, }); } + } - /// Gets the pages hierarchy. - /// The page (tab) id. - /// The page hierarchy. - [HttpGet] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage GetPageHierarchy(int pageId) + /// Deletes a page. + /// The page to delete, DTO. + /// Should the page be hard-deleted or not. + /// The status of the page deletion. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage DeletePage(PageItem page, [FromUri] bool hardDelete = false) + { + if (!this.securityService.CanDeletePage(page.Id)) { - try - { - var paths = this.pagesController.GetPageHierarchy(pageId); - return this.Request.CreateResponse(HttpStatusCode.OK, paths); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound); - } + return this.GetForbiddenResponse(); } - /// Moves a page to another place in the hierarchy. - /// DTO. - /// A status and information about the page at it's new location. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage MovePage(PageMoveRequest request) + try { - if (!this.securityService.CanManagePage(request.PageId) - || !this.securityService.CanManagePage(request.ParentId) - || !this.securityService.CanManagePage(request.RelatedPageId) - || !this.securityService.CanManagePage(TabController.Instance.GetTab(request.RelatedPageId, this.PortalId)?.ParentId ?? -1)) - { - return this.GetForbiddenResponse(); - } + this.pagesController.DeletePage(page, hardDelete, this.PortalSettings); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, }); + } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound); + } + } - try - { - var tab = this.pagesController.MovePage(request); - var tabs = TabController.GetPortalTabs( - this.PortalSettings.PortalId, - Null.NullInteger, - false, - true, - false, - true); - var pageItem = Converters.ConvertToPageItem(tab, tabs); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, Page = pageItem }); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound); - } - catch (PageException ex) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Message }); - } + /// Deletes a module from a page. + /// The module to delete, DTO. + /// A status code or an error. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage DeletePageModule(PageModuleItem module) + { + if (!this.securityService.CanManagePage(module.PageId)) + { + return this.GetForbiddenResponse(); } - /// Deletes a page. - /// The page to delete, DTO. - /// Should the page be hard-deleted or not. - /// The status of the page deletion. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage DeletePage(PageItem page, [FromUri] bool hardDelete = false) + try { - if (!this.securityService.CanDeletePage(page.Id)) - { - return this.GetForbiddenResponse(); - } + this.pagesController.DeleteTabModule(module.PageId, module.ModuleId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, }); + } + catch (PageModuleNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound); + } + } - try - { - this.pagesController.DeletePage(page, hardDelete, this.PortalSettings); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0 }); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound); - } + /// Copies the theme from a page to descendent pages. + /// . + /// The status of the request. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage CopyThemeToDescendantPages(CopyThemeRequest copyTheme) + { + if (!this.securityService.CanManagePage(copyTheme.PageId)) + { + return this.GetForbiddenResponse(); } - /// Deletes a module from a page. - /// The module to delete, DTO. - /// A status code or an error. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage DeletePageModule(PageModuleItem module) + this.pagesController.CopyThemeToDescendantPages(copyTheme.PageId, copyTheme.Theme); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, }); + } + + /// Copies permissions from a page to the descendent pages. + /// DTO. + /// The status of the operation. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage CopyPermissionsToDescendantPages(CopyPermissionsRequest copyPermissions) + { + if (!this.securityService.CanAdminPage(copyPermissions.PageId)) { - if (!this.securityService.CanManagePage(module.PageId)) - { - return this.GetForbiddenResponse(); - } + return this.GetForbiddenResponse(); + } - try - { - this.pagesController.DeleteTabModule(module.PageId, module.ModuleId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0 }); - } - catch (PageModuleNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound); - } + try + { + this.pagesController.CopyPermissionsToDescendantPages(copyPermissions.PageId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0, }); } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound); + } + catch (PermissionsNotMetException) + { + return this.Request.CreateResponse(HttpStatusCode.Forbidden); + } + } - /// Copies the theme from a page to descendend pages. - /// . - /// The status of the request. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage CopyThemeToDescendantPages(CopyThemeRequest copyTheme) + /// Sets a page in edit mode. + /// the page (tab) ID. + /// Sets a cookie for edit mode on the specified page then returns a success message. + [HttpPost] + public HttpResponseMessage EditModeForPage([FromUri] int id) + { + if (!TabPermissionController.CanAddContentToPage(TabController.Instance.GetTab(id, this.PortalId))) { - if (!this.securityService.CanManagePage(copyTheme.PageId)) - { - return this.GetForbiddenResponse(); - } + return this.GetForbiddenResponse(); + } + + this.pagesController.EditModeForPage(id, this.UserInfo.UserID); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } - this.pagesController.CopyThemeToDescendantPages(copyTheme.PageId, copyTheme.Theme); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0 }); + /// Saves the page details. + /// The new page settings, DTO. + /// The new page details. + [HttpPost] + [ValidateAntiForgeryToken] + public HttpResponseMessage SavePageDetails(PageSettings pageSettings) + { + if (!this.securityService.CanSavePageDetails(pageSettings)) + { + return this.GetForbiddenResponse(); } - /// Copies permissions from a page to the descendent pages. - /// DTO. - /// The status of the operation. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage CopyPermissionsToDescendantPages(CopyPermissionsRequest copyPermissions) + try { - if (!this.securityService.CanAdminPage(copyPermissions.PageId)) - { - return this.GetForbiddenResponse(); - } + pageSettings.Clean(); + var tab = this.pagesController.SavePageDetails(this.PortalSettings, pageSettings); + var tabs = TabController.GetPortalTabs( + this.hostSettings, + this.appStatus, + this.PortalSettings.PortalId, + Null.NullInteger, + false, + true, + false, + true); - try - { - this.pagesController.CopyPermissionsToDescendantPages(copyPermissions.PageId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 0 }); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound); - } - catch (PermissionsNotMetException) + return this.Request.CreateResponse(HttpStatusCode.OK, new { - return this.Request.CreateResponse(HttpStatusCode.Forbidden); - } + Status = 0, + Page = Converters.ConvertToPageItem(tab, tabs), + }); } + catch (PageNotFoundException) + { + return this.Request.CreateResponse(HttpStatusCode.NotFound, new { Message = "Page doesn't exists.", }); + } + catch (PageValidationException ex) + { + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message, }); + } + } + + /// Gets the default page settings. + /// The page (tab) id. + /// The page default settings. + [HttpGet] + public HttpResponseMessage GetDefaultSettings(int pageId = 0) + { + var settings = this.pagesController.GetDefaultSettings(pageId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { page = settings, new DnnFileUploadOptions(this.hostSettings, this.appStatus, this.cryptographyProvider).ValidationCode }); + } - /// Sets a page in edit mode. - /// the page (tab) id. - /// Sets a cookie for edit mode on the specified page then returns a success message. - [HttpPost] - public HttpResponseMessage EditModeForPage([FromUri] int id) + /// Gets the list of cache providers. + /// List of cache providers. + [HttpGet] + public HttpResponseMessage GetCacheProviderList() + { + var providers = + from p in OutputCachingProvider.GetProviderList() + select p.Key; + return this.Request.CreateResponse(HttpStatusCode.OK, providers); + } + + /// Gets the available themes. + /// Available themes. + [HttpGet] + public HttpResponseMessage GetThemes() + { + var themes = this.themesController.GetLayouts(this.PortalSettings, ThemeLevel.All); + + var defaultTheme = this.GetDefaultPortalTheme(); + var defaultPortalThemeName = defaultTheme?.ThemeName; + var defaultPortalThemeLevel = defaultTheme?.Level; + var defaultPortalLayout = this.defaultPortalThemeController.GetDefaultPortalLayout(); + var defaultPortalContainer = this.defaultPortalThemeController.GetDefaultPortalContainer(); + + return this.Request.CreateResponse(HttpStatusCode.OK, new { - if (!TabPermissionController.CanAddContentToPage(TabController.Instance.GetTab(id, this.PortalId))) - { - return this.GetForbiddenResponse(); - } + themes, + defaultPortalThemeName, + defaultPortalThemeLevel, + defaultPortalLayout, + defaultPortalContainer, + }); + } - this.pagesController.EditModeForPage(id, this.UserInfo.UserID); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + /// Gets the theme files for a given theme. + /// The name of the theme. + /// The level of the theme, . + /// Returns a list of available layouts and containers for each theme. + [HttpGet] + public HttpResponseMessage GetThemeFiles(string themeName, ThemeLevel level) + { + var themeLayout = this.themesController.GetLayouts(this.PortalSettings, level) + .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); + var themeContainer = this.themesController.GetContainers(this.PortalSettings, level) + .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); + + return this.Request.CreateResponse(HttpStatusCode.OK, new + { + layouts = themeLayout == null ? new List() : this.themesController.GetThemeFiles(this.PortalSettings, themeLayout), + containers = themeContainer == null ? new List() : this.themesController.GetThemeFiles(this.PortalSettings, themeContainer), + }); + } + + /// Save bulk pages (Add multiple pages). + /// DTO. + /// A status code and the result of adding the multiple pages. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage SaveBulkPages(BulkPage bulkPage) + { + if (!this.securityService.IsPageAdminUser()) + { + return this.GetForbiddenResponse(); } - /// Saves the page details. - /// The new page settings, DTO. - /// The new page details. - [HttpPost] - [ValidateAntiForgeryToken] - public HttpResponseMessage SavePageDetails(PageSettings pageSettings) + try { - if (!this.securityService.CanSavePageDetails(pageSettings)) - { - return this.GetForbiddenResponse(); - } + bulkPage.Clean(); + var bulkPageResponse = this.bulkPagesController.AddBulkPages(bulkPage, validateOnly: false); - try - { - pageSettings.Clean(); - var tab = this.pagesController.SavePageDetails(this.PortalSettings, pageSettings); - var tabs = TabController.GetPortalTabs( - this.PortalSettings.PortalId, - Null.NullInteger, - false, - true, - false, - true); - - return this.Request.CreateResponse(HttpStatusCode.OK, new - { - Status = 0, - Page = Converters.ConvertToPageItem(tab, tabs), - }); - } - catch (PageNotFoundException) - { - return this.Request.CreateResponse(HttpStatusCode.NotFound, new { Message = "Page doesn't exists." }); - } - catch (PageValidationException ex) + return this.Request.CreateResponse(HttpStatusCode.OK, new { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message }); - } + Status = 0, + Response = bulkPageResponse, + }); } - - /// Gets the default page settings. - /// The page (tab) id. - /// The page default settings. - [HttpGet] - public HttpResponseMessage GetDefaultSettings(int pageId = 0) + catch (PageValidationException ex) { - var settings = this.pagesController.GetDefaultSettings(pageId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { page = settings, new DnnFileUploadOptions().ValidationCode }); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message, }); } + } - /// Gets the list of cache providers. - /// List of cache providers. - [HttpGet] - public HttpResponseMessage GetCacheProviderList() + /// Validates if bulk pages (Add multiple pages) information is valid. + /// DTO. + /// A status code and the result of the bulk pages check. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage PreSaveBulkPagesValidate(BulkPage bulkPage) + { + if (!this.securityService.IsPageAdminUser()) { - var providers = from p in OutputCachingProvider.GetProviderList() select p.Key; - return this.Request.CreateResponse(HttpStatusCode.OK, providers); + return this.GetForbiddenResponse(); } - /// Gets the available themes. - /// Available themes. - [HttpGet] - public HttpResponseMessage GetThemes() + try { - var themes = this.themesController.GetLayouts(this.PortalSettings, ThemeLevel.All); - - var defaultTheme = this.GetDefaultPortalTheme(); - var defaultPortalThemeName = defaultTheme?.ThemeName; - var defaultPortalThemeLevel = defaultTheme?.Level; - var defaultPortalLayout = this.defaultPortalThemeController.GetDefaultPortalLayout(); - var defaultPortalContainer = this.defaultPortalThemeController.GetDefaultPortalContainer(); + bulkPage.Clean(); + var bulkPageResponse = this.bulkPagesController.AddBulkPages(bulkPage, validateOnly: true); return this.Request.CreateResponse(HttpStatusCode.OK, new { - themes, - defaultPortalThemeName, - defaultPortalThemeLevel, - defaultPortalLayout, - defaultPortalContainer, + Status = 0, + Response = bulkPageResponse, }); } + catch (PageValidationException ex) + { + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message, }); + } + } + + /// Saves a page as a template. + /// DTO. + /// The status of the operation with a possible error message. + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage SavePageAsTemplate(PageTemplate pageTemplate) + { + if (!this.securityService.CanExportPage(pageTemplate.TabId)) + { + return this.GetForbiddenResponse(); + } - /// Gets the theme files for a given theme. - /// The name of the theme. - /// The level of the theme, . - /// Returns a list of available layouts and containers for each theme. - [HttpGet] - public HttpResponseMessage GetThemeFiles(string themeName, ThemeLevel level) + try { - var themeLayout = this.themesController.GetLayouts(this.PortalSettings, level) - .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); - var themeContainer = this.themesController.GetContainers(this.PortalSettings, level) - .FirstOrDefault(t => t.PackageName.Equals(themeName, StringComparison.OrdinalIgnoreCase) && t.Level == level); + pageTemplate.Clean(); + var templateFilename = this.templateController.SaveAsTemplate(pageTemplate); + var response = string.Format(CultureInfo.CurrentCulture, Localization.GetString("ExportedMessage"), templateFilename); return this.Request.CreateResponse(HttpStatusCode.OK, new { - layouts = themeLayout == null ? new List() : this.themesController.GetThemeFiles(this.PortalSettings, themeLayout), - containers = themeContainer == null ? new List() : this.themesController.GetThemeFiles(this.PortalSettings, themeContainer), + Status = 0, + Response = response, }); } + catch (TemplateException ex) + { + return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Message, }); + } + } - /// Save bulk pages (Add multiple pages). - /// DTO. - /// A status code and the result of adding the multiple pages. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage SaveBulkPages(BulkPage bulkPage) + /// Makes a localized pages neutral. + /// The page (tab) id. + /// A success status or an exception. + /// POST /api/personabar/pages/MakePageNeutral?tabId=123 . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage MakePageNeutral([FromUri] int pageId) + { + try { - if (!this.securityService.IsPageAdminUser()) + if (!this.securityService.CanManagePage(pageId)) { return this.GetForbiddenResponse(); } - try - { - bulkPage.Clean(); - var bulkPageResponse = this.bulkPagesController.AddBulkPages(bulkPage, validateOnly: false); - - return this.Request.CreateResponse(HttpStatusCode.OK, new - { - Status = 0, - Response = bulkPageResponse, - }); - } - catch (PageValidationException ex) + if (this.tabController.GetTabsByPortal(this.PortalId).WithParentId(pageId).Count > 0) { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message }); + return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, LocalizeString("MakeNeutral.ErrorMessage")); } + + var defaultLocale = this.localeController.GetDefaultLocale(this.PortalId); + this.tabController.ConvertTabToNeutralLanguage(this.PortalId, pageId, defaultLocale.Code, true); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); } + catch (Exception ex) + { + const string ErrorMessage = "An unexpected error occurred while trying to make this page neutral, please consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); + } + } - /// Validates if bulk pages (Add multiple pages) information is valid. - /// DTO. - /// A status code and the result of the bulk pages check. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage PreSaveBulkPagesValidate(BulkPage bulkPage) + /// Makes a neutral page localizable. + /// the page (tab) id. + /// A status code or an error message. + /// POST /api/personabar/pages/MakePageTranslatable?tabId=123 . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage MakePageTranslatable([FromUri] int pageId) + { + try { - if (!this.securityService.IsPageAdminUser()) + if (!this.securityService.CanManagePage(pageId)) { return this.GetForbiddenResponse(); } - try - { - bulkPage.Clean(); - var bulkPageResponse = this.bulkPagesController.AddBulkPages(bulkPage, validateOnly: true); - - return this.Request.CreateResponse(HttpStatusCode.OK, new - { - Status = 0, - Response = bulkPageResponse, - }); - } - catch (PageValidationException ex) + var currentTab = this.tabController.GetTab(pageId, this.PortalId, false); + if (currentTab == null) { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Field, ex.Message }); + return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTab"); } + + var defaultLocale = this.localeController.GetDefaultLocale(this.PortalId); + this.tabController.LocalizeTab(currentTab, defaultLocale, true); + this.tabController.AddMissingLanguagesWithWarnings(this.PortalId, pageId); + this.tabController.ClearCache(this.PortalId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } + catch (Exception ex) + { + const string ErrorMessage = "An unexpected error occurred while trying to make this page translatable."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - /// Saves a page as a template. - /// DTO. - /// The status of the operation with a possible error message. - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage SavePageAsTemplate(PageTemplate pageTemplate) + /// Adds all missing languages to a page. + /// The page (tab) id. + /// A status code or an exception message. + /// POST /api/personabar/pages/AddMissingLanguages?tabId=123 . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage AddMissingLanguages([FromUri] int pageId) + { + try { - if (!this.securityService.CanExportPage(pageTemplate.TabId)) + if (!this.securityService.CanManagePage(pageId)) { return this.GetForbiddenResponse(); } - try - { - pageTemplate.Clean(); - var templateFilename = this.templateController.SaveAsTemplate(pageTemplate); - var response = string.Format(CultureInfo.CurrentCulture, Localization.GetString("ExportedMessage"), templateFilename); - - return this.Request.CreateResponse(HttpStatusCode.OK, new - { - Status = 0, - Response = response, - }); - } - catch (TemplateException ex) - { - return this.Request.CreateResponse(HttpStatusCode.OK, new { Status = 1, ex.Message }); - } + bool allLanguagesAdded = this.tabController.AddMissingLanguagesWithWarnings(this.PortalId, pageId); + this.tabController.ClearCache(this.PortalId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, AllLanguagesAdded = allLanguagesAdded }); } - - /// Makes a localized pages neutral. - /// The page (tab) id. - /// A success status or an exception. - /// POST /api/personabar/pages/MakePageNeutral?tabId=123 . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage MakePageNeutral([FromUri] int pageId) + catch (Exception ex) { - try - { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } - - if (this.tabController.GetTabsByPortal(this.PortalId).WithParentId(pageId).Count > 0) - { - return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, LocalizeString("MakeNeutral.ErrorMessage")); - } + const string ErrorMessage = "An unexpected error occurred while trying to add missing languages to this page, consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); + } + } - var defaultLocale = this.localeController.GetDefaultLocale(this.PortalId); - this.tabController.ConvertTabToNeutralLanguage(this.PortalId, pageId, defaultLocale.Code, true); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - } - catch (Exception ex) + /// Notifies the translators with a comment. + /// DTO. + /// A status code and a message. + /// POST /api/personabar/pages/NotifyTranslators . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage NotifyTranslators(TranslatorsComment comment) + { + try + { + if (!this.securityService.CanManagePage(comment.TabId)) { - var errorMessage = "An unexpected error occurred while trying to make this page neutral, please consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + return this.GetForbiddenResponse(); } - } - /// Makes a neutral page localizable. - /// the page (tab) id. - /// A status code or an error message. - /// POST /api/personabar/pages/MakePageTranslatable?tabId=123 . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage MakePageTranslatable([FromUri] int pageId) - { - try + // loop through all localized version of this page + var currentTab = this.tabController.GetTab(comment.TabId, this.PortalId, false); + foreach (var localizedTab in currentTab.LocalizedTabs.Values) { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } + var users = new Dictionary(); + + // Give default translators for this language and administrators permissions + this.tabController.GiveTranslatorRoleEditRights(localizedTab, users); - var currentTab = this.tabController.GetTab(pageId, this.PortalId, false); - if (currentTab == null) + // Send Messages to all the translators of new content + foreach (var translator in users.Values.Where(user => user.UserID != this.PortalSettings.AdministratorId)) { - return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTab"); + this.AddTranslationSubmittedNotification(localizedTab, translator, comment.Text); } - - var defaultLocale = this.localeController.GetDefaultLocale(this.PortalId); - this.tabController.LocalizeTab(currentTab, defaultLocale, true); - this.tabController.AddMissingLanguagesWithWarnings(this.PortalId, pageId); - this.tabController.ClearCache(this.PortalId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - } - catch (Exception ex) - { - var errorMessage = "An unexpected error occurred while trying to make this page translatable."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); } - } - /// Adds all missing languages to a page. - /// The page (tab) id. - /// A status code or an exception message. - /// POST /api/personabar/pages/AddMissingLanguages?tabId=123 . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage AddMissingLanguages([FromUri] int pageId) + var msgToUser = LocalizeString("TranslationMessageConfirmMessage.Text"); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Message = msgToUser }); + } + catch (Exception ex) { - try - { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } - - bool allLanguagesAdded = this.tabController.AddMissingLanguagesWithWarnings(this.PortalId, pageId); - this.tabController.ClearCache(this.PortalId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, AllLanguagesAdded = allLanguagesAdded }); - } - catch (Exception ex) - { - var errorMessage = "An unexpected error occurred while trying to add missing languages to this page, consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); - } + const string ErrorMessage = "An unexpected error occurred while trying to notify the translators, please consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - /// Notifies the translators with a comment. - /// DTO. - /// A status code and a message. - /// POST /api/personabar/pages/NotifyTranslators . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage NotifyTranslators(TranslatorsComment comment) + /// + /// Gets the view data that used to be in the old ControlBar's localization tab + /// under Page Settings ( /{page}/ctl/Tab/action/edit/activeTab/settingTab ). + /// + /// The ID of the tab to get localization for. + /// Information about localiz. + /// /api/personabar/pages/GetTabLocalization?pageId=123. + [HttpGet] + public HttpResponseMessage GetTabLocalization(int pageId) + { + try { - try + if (!this.securityService.CanManagePage(pageId)) { - if (!this.securityService.CanManagePage(comment.TabId)) - { - return this.GetForbiddenResponse(); - } - - // loop through all localized version of this page - var currentTab = this.tabController.GetTab(comment.TabId, this.PortalId, false); - foreach (var localizedTab in currentTab.LocalizedTabs.Values) - { - var users = new Dictionary(); - - // Give default translators for this language and administrators permissions - this.tabController.GiveTranslatorRoleEditRights(localizedTab, users); - - // Send Messages to all the translators of new content - foreach (var translator in users.Values.Where(user => user.UserID != this.PortalSettings.AdministratorId)) - { - this.AddTranslationSubmittedNotification(localizedTab, translator, comment.Text); - } - } - - var msgToUser = LocalizeString("TranslationMessageConfirmMessage.Text"); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Message = msgToUser }); + return this.GetForbiddenResponse(); } - catch (Exception ex) + + var currentTab = this.tabController.GetTab(pageId, this.PortalId, false); + var locales = new List(); + var pages = new DnnPagesDto(locales); + if (!currentTab.IsNeutralCulture) { - var errorMessage = "An unexpected error occurred while trying to notify the translators, please consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + pages = this.GetNonLocalizedPages(pageId); } - } - /// - /// Gets the view data that used to be in the old ControlBar's localization tab - /// under Page Settings ( /{page}/ctl/Tab/action/edit/activeTab/settingTab ). - /// - /// The ID of the tab to get localization for. - /// Information about localiz. - /// /api/personabar/pages/GetTabLocalization?pageId=123. - [HttpGet] - public HttpResponseMessage GetTabLocalization(int pageId) + return this.Request.CreateResponse(HttpStatusCode.OK, pages); + } + catch (Exception ex) { - try - { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } - - var currentTab = this.tabController.GetTab(pageId, this.PortalId, false); - var locales = new List(); - var pages = new DnnPagesDto(locales); - if (!currentTab.IsNeutralCulture) - { - pages = this.GetNonLocalizedPages(pageId); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, pages); - } - catch (Exception ex) - { - var errorMessage = "An unexpected error occurrfed trying to get this page localization, consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); - } + const string ErrorMessage = "An unexpected error occurred trying to get this page localization, consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - /// Updates the page (tab) localization. - /// DTO. - /// A status code or an exception message. - /// POST /api/personabar/pages/UpdateTabLocalization . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage UpdateTabLocalization(DnnPagesRequest request) + /// Updates the page (tab) localization. + /// DTO. + /// A status code or an exception message. + /// POST /api/personabar/pages/UpdateTabLocalization . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage UpdateTabLocalization(DnnPagesRequest request) + { + try { - try + if (request.Pages.Any(x => x.TabId > 0 && !this.securityService.CanManagePage(x.TabId))) { - if (request.Pages.Any(x => x.TabId > 0 && !this.securityService.CanManagePage(x.TabId))) - { - return this.GetForbiddenResponse(); - } - - this.SaveNonLocalizedPages(request); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - } - catch (Exception ex) - { - var errorMessage = "An unexpected error occurred trying to update the page localization, please consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + return this.GetForbiddenResponse(); } - } - /// Restores a deleted module on a page (tab). - /// The TabModule id. - /// A success message or an exception message. - /// POST /api/personabar/pages/RestoreModule?tabModuleId=123 . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage RestoreModule(int tabModuleId) + request.Clean(); + this.SaveNonLocalizedPages(request); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } + catch (Exception ex) { - try - { - var module = ModuleController.Instance.GetTabModule(tabModuleId); - if (!this.securityService.CanManagePage(module.TabID)) - { - return this.GetForbiddenResponse(); - } - - var moduleController = ModuleController.Instance; - var moduleInfo = moduleController.GetTabModule(tabModuleId); - if (moduleInfo == null) - { - return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTabModule"); - } - - moduleController.RestoreModule(moduleInfo); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - } - catch (Exception ex) - { - var errorMessage = "An unexpected error occurred while trying to restore the module onto that page."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); - } + const string ErrorMessage = "An unexpected error occurred trying to update the page localization, please consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - /// Deletes a module from a page (tab). - /// The TabModuleId. - /// A status message or an error message. - /// POST /api/personabar/pages/DeleteModule?tabModuleId=123 . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage DeleteModule(int tabModuleId) + /// Restores a deleted module on a page (tab). + /// The TabModule id. + /// A success message or an exception message. + /// POST /api/personabar/pages/RestoreModule?tabModuleId=123 . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage RestoreModule(int tabModuleId) + { + try { - try + var module = ModuleController.Instance.GetTabModule(tabModuleId); + if (!this.securityService.CanManagePage(module.TabID)) { - var module = ModuleController.Instance.GetTabModule(tabModuleId); - if (!this.securityService.CanManagePage(module.TabID)) - { - return this.GetForbiddenResponse(); - } - - var moduleController = ModuleController.Instance; - var moduleInfo = moduleController.GetTabModule(tabModuleId); - if (moduleInfo == null) - { - return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTabModule"); - } - - moduleController.DeleteTabModule(moduleInfo.TabID, moduleInfo.ModuleID, false); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + return this.GetForbiddenResponse(); } - catch (Exception ex) + + var moduleController = ModuleController.Instance; + var moduleInfo = moduleController.GetTabModule(tabModuleId); + if (moduleInfo == null) { - var errorMessage = "An unexpected error occurred while trying to delete the module, consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTabModule"); } + + moduleController.RestoreModule(moduleInfo); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } + catch (Exception ex) + { + const string ErrorMessage = "An unexpected error occurred while trying to restore the module onto that page."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - /// Gets ContentLocalizationEnabled. - /// A value indicating if content localization is enabled. - /// GET /api/personabar/pages/GetContentLocalizationEnabled. - [HttpGet] - public HttpResponseMessage GetContentLocalizationEnabled() + /// Deletes a module from a page (tab). + /// The TabModuleId. + /// A status message or an error message. + /// POST /api/personabar/pages/DeleteModule?tabModuleId=123 . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage DeleteModule(int tabModuleId) + { + try { - try + var module = ModuleController.Instance.GetTabModule(tabModuleId); + if (!this.securityService.CanManagePage(module.TabID)) { - if (!TabPermissionController.CanManagePage()) - { - return this.GetForbiddenResponse(); - } - - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, this.PortalSettings.ContentLocalizationEnabled }); + return this.GetForbiddenResponse(); } - catch (Exception ex) + + var moduleController = ModuleController.Instance; + var moduleInfo = moduleController.GetTabModule(tabModuleId); + if (moduleInfo == null) { - var errorMessage = "An unexpected error occurred while trying to find if content localization is enabled"; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + return this.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "InvalidTabModule"); } - } - /// Gets GetCachedItemCount. - /// The cache profider. - /// The page (tab) id. - /// Caching information. - /// GET /api/personabar/pages/GetCachedItemCount. - [HttpGet] - public HttpResponseMessage GetCachedItemCount(string cacheProvider, int pageId) + moduleController.DeleteTabModule(moduleInfo.TabID, moduleInfo.ModuleID, false); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); + } + catch (Exception ex) { - try - { - if (!TabPermissionController.CanManagePage()) - { - return this.GetForbiddenResponse(); - } + const string ErrorMessage = "An unexpected error occurred while trying to delete the module, consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); + } + } - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Count = OutputCachingProvider.Instance(cacheProvider).GetItemCount(pageId) }); - } - catch (Exception ex) + /// Gets ContentLocalizationEnabled. + /// A value indicating if content localization is enabled. + /// GET /api/personabar/pages/GetContentLocalizationEnabled. + [HttpGet] + public HttpResponseMessage GetContentLocalizationEnabled() + { + try + { + if (!TabPermissionController.CanManagePage()) { - var errorMessage = "An unexpected error occurred trying to get the cached items count, please consult the logs for more details."; - Logger.Error(errorMessage, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, errorMessage); + return this.GetForbiddenResponse(); } - } - /// Clears the page cache for a given page. - /// The cache provider to clear the cache for. - /// The page (tab) id. - /// A status code or an error message. - /// POST /api/personabar/pages/ClearCache . - [HttpPost] - [ValidateAntiForgeryToken] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] - public HttpResponseMessage ClearCache([FromUri] string cacheProvider, [FromUri] int pageId) + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, this.PortalSettings.ContentLocalizationEnabled }); + } + catch (Exception ex) { - try - { - if (!this.securityService.CanManagePage(pageId)) - { - return this.GetForbiddenResponse(); - } + const string ErrorMessage = "An unexpected error occurred while trying to find if content localization is enabled"; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); + } + } - OutputCachingProvider.Instance(cacheProvider).Remove(pageId); - return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); - } - catch (Exception ex) + /// Gets GetCachedItemCount. + /// The cache profider. + /// The page (tab) id. + /// Caching information. + /// GET /api/personabar/pages/GetCachedItemCount. + [HttpGet] + public HttpResponseMessage GetCachedItemCount(string cacheProvider, int pageId) + { + try + { + if (!TabPermissionController.CanManagePage()) { - var message = "An unexpected error occurred while trying to clear the cache for this page, see logs for more details."; - Logger.Error(message, ex); - return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, message); + return this.GetForbiddenResponse(); } - } - /// Gets the workflows. - /// List of portal workflows. - /// GET /api/personabar/pages/GetWorkflows. - [HttpGet] - [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] - public HttpResponseMessage GetWorkflows() - { - var workflows = this.workflowManager.GetWorkflows(this.PortalSettings.PortalId).Select(w => new { workflowId = w.WorkflowID, workflowName = w.WorkflowName }); - return this.Request.CreateResponse(HttpStatusCode.OK, workflows); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Count = OutputCachingProvider.Instance(cacheProvider).GetItemCount(pageId) }); } - - private static string LocalizeString(string key) + catch (Exception ex) { - return DotNetNuke.Services.Localization.Localization.GetString(key, LocalResourceFile); + const string ErrorMessage = "An unexpected error occurred trying to get the cached items count, please consult the logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); } + } - private static void EnableTabVersioningAndWorkflow(TabInfo tab) + /// Clears the page cache for a given page. + /// The cache provider to clear the cache for. + /// The page (tab) id. + /// A status code or an error message. + /// POST /api/personabar/pages/ClearCache . + [HttpPost] + [ValidateAntiForgeryToken] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "Edit")] + public HttpResponseMessage ClearCache([FromUri] string cacheProvider, [FromUri] int pageId) + { + try { - var tabVersionSettings = TabVersionSettings.Instance; - var tabWorkflowSettings = TabWorkflowSettings.Instance; - - if (tabVersionSettings.IsVersioningEnabled(tab.PortalID)) + if (!this.securityService.CanManagePage(pageId)) { - tabVersionSettings.SetEnabledVersioningForTab(tab.TabID, true); + return this.GetForbiddenResponse(); } - if (tabWorkflowSettings.IsWorkflowEnabled(tab.PortalID)) - { - tabWorkflowSettings.SetWorkflowEnabled(tab.PortalID, tab.TabID, true); - } + OutputCachingProvider.Instance(cacheProvider).Remove(pageId); + return this.Request.CreateResponse(HttpStatusCode.OK, new { Success = true, }); } - - private static void DisableTabVersioningAndWorkflow(TabInfo tab) + catch (Exception ex) { - var tabVersionSettings = TabVersionSettings.Instance; - var tabWorkflowSettings = TabWorkflowSettings.Instance; + const string ErrorMessage = "An unexpected error occurred while trying to clear the cache for this page, see logs for more details."; + Logger.Error(ErrorMessage, ex); + return this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ErrorMessage); + } + } - if (tabVersionSettings.IsVersioningEnabled(tab.PortalID)) - { - tabVersionSettings.SetEnabledVersioningForTab(tab.TabID, false); - } + /// Gets the workflows. + /// List of portal workflows. + /// GET /api/personabar/pages/GetWorkflows. + [HttpGet] + [AdvancedPermission(MenuName = "Dnn.Pages", Permission = "VIEW_PAGE_LIST,VIEW")] + public HttpResponseMessage GetWorkflows() + { + var workflows = this.workflowManager.GetWorkflows(this.PortalSettings.PortalId).Select(w => new { workflowId = w.WorkflowID, workflowName = w.WorkflowName }); + return this.Request.CreateResponse(HttpStatusCode.OK, workflows); + } - if (tabWorkflowSettings.IsWorkflowEnabled(tab.PortalID)) - { - tabWorkflowSettings.SetWorkflowEnabled(tab.PortalID, tab.TabID, false); - } + private static string LocalizeString(string key) + { + return DotNetNuke.Services.Localization.Localization.GetString(key, LocalResourceFile); + } + + private static void EnableTabVersioningAndWorkflow(TabInfo tab) + { + var tabVersionSettings = TabVersionSettings.Instance; + var tabWorkflowSettings = TabWorkflowSettings.Instance; + + if (tabVersionSettings.IsVersioningEnabled(tab.PortalID)) + { + tabVersionSettings.SetEnabledVersioningForTab(tab.TabID, true); } - private DnnPagesDto GetNonLocalizedPages(int tabId) + if (tabWorkflowSettings.IsWorkflowEnabled(tab.PortalID)) { - var currentTab = this.tabController.GetTab(tabId, this.PortalId, false); + tabWorkflowSettings.SetWorkflowEnabled(tab.PortalID, tab.TabID, true); + } + } - // Unique id of default language page - var uniqueId = currentTab.DefaultLanguageGuid != Null.NullGuid - ? currentTab.DefaultLanguageGuid - : currentTab.UniqueId; + private static void DisableTabVersioningAndWorkflow(TabInfo tab) + { + var tabVersionSettings = TabVersionSettings.Instance; + var tabWorkflowSettings = TabWorkflowSettings.Instance; - // get all non admin pages and not deleted - var allPages = this.tabController.GetTabsByPortal(this.PortalId).Values.Where( - t => t.TabID != this.PortalSettings.AdminTabId && (Null.IsNull(t.ParentId) || t.ParentId != this.PortalSettings.AdminTabId)); - allPages = allPages.Where(t => t.IsDeleted == false); + if (tabVersionSettings.IsVersioningEnabled(tab.PortalID)) + { + tabVersionSettings.SetEnabledVersioningForTab(tab.TabID, false); + } - // get all localized pages of current page - var tabInfos = allPages as IList ?? allPages.ToList(); - var localizedPages = tabInfos.Where( - t => t.DefaultLanguageGuid == uniqueId || t.UniqueId == uniqueId).OrderBy(t => t.DefaultLanguageGuid).ToList(); - Dictionary localizedTabs = null; + if (tabWorkflowSettings.IsWorkflowEnabled(tab.PortalID)) + { + tabWorkflowSettings.SetWorkflowEnabled(tab.PortalID, tab.TabID, false); + } + } - // we are going to build up a list of locales - // this is a bit more involved, since we want the default language to be first. - // also, we do not want to add any locales the user has no access to - var locales = new List(); - var localeController = new LocaleController(); - var localeDict = localeController.GetLocales(this.PortalId); - if (localeDict.Count == 0) + private DnnPagesDto GetNonLocalizedPages(int tabId) + { + var currentTab = this.tabController.GetTab(tabId, this.PortalId, false); + + // Unique id of default language page + var uniqueId = currentTab.DefaultLanguageGuid != Null.NullGuid + ? currentTab.DefaultLanguageGuid + : currentTab.UniqueId; + + // get all non admin pages and not deleted + var allPages = this.tabController.GetTabsByPortal(this.PortalId).Values.Where( + t => t.TabID != this.PortalSettings.AdminTabId && (Null.IsNull(t.ParentId) || t.ParentId != this.PortalSettings.AdminTabId)); + allPages = allPages.Where(t => t.IsDeleted == false); + + // get all localized pages of current page + var tabInfos = allPages as IList ?? allPages.ToList(); + var localizedPages = tabInfos.Where( + t => t.DefaultLanguageGuid == uniqueId || t.UniqueId == uniqueId).OrderBy(t => t.DefaultLanguageGuid).ToList(); + Dictionary localizedTabs = null; + + // we are going to build up a list of locales + // this is a bit more involved, since we want the default language to be first. + // also, we do not want to add any locales the user has no access to + var locales = new List(); + var localeDict = this.localeController.GetLocales(this.PortalId); + if (localeDict.Count == 0) + { + locales.Add(new LocaleInfoDto(string.Empty)); + } + else + { + if (localizedPages.Count == 1 && localizedPages.First().CultureCode == string.Empty) { + // locale neutral page locales.Add(new LocaleInfoDto(string.Empty)); } + else if (localizedPages.Count == 1 && localizedPages.First().CultureCode != this.PortalSettings.DefaultLanguage) + { + var first = localizedPages.First(); + locales.Add(new LocaleInfoDto(first.CultureCode)); + } else { - if (localizedPages.Count == 1 && localizedPages.First().CultureCode == string.Empty) - { - // locale neutral page - locales.Add(new LocaleInfoDto(string.Empty)); - } - else if (localizedPages.Count == 1 && localizedPages.First().CultureCode != this.PortalSettings.DefaultLanguage) + // force sort order, so first add default language + locales.Add(new LocaleInfoDto(this.PortalSettings.DefaultLanguage)); + + // build up a list of localized tabs. + // depending on whether the selected page is in the default language + // we will add the localized tabs from the current page + // or from the defaultlanguage page + if (currentTab.CultureCode == this.PortalSettings.DefaultLanguage) { - var first = localizedPages.First(); - locales.Add(new LocaleInfoDto(first.CultureCode)); + localizedTabs = currentTab.LocalizedTabs; } else { - // force sort order, so first add default language - locales.Add(new LocaleInfoDto(this.PortalSettings.DefaultLanguage)); - - // build up a list of localized tabs. - // depending on whether or not the selected page is in the default langauge - // we will add the localized tabs from the current page - // or from the defaultlanguage page - if (currentTab.CultureCode == this.PortalSettings.DefaultLanguage) - { - localizedTabs = currentTab.LocalizedTabs; - } - else + // selected page is not in default language + // add localizedtabs from defaultlanguage page + if (currentTab.DefaultLanguageTab != null) { - // selected page is not in default language - // add localizedtabs from defaultlanguage page - if (currentTab.DefaultLanguageTab != null) - { - localizedTabs = currentTab.DefaultLanguageTab.LocalizedTabs; - } + localizedTabs = currentTab.DefaultLanguageTab.LocalizedTabs; } + } - if (localizedTabs != null) - { - // only add locales from tabs the user has at least view permissions to. - // we will handle the edit permissions at a later stage - locales.AddRange( - from localizedTab in localizedTabs - where TabPermissionController.CanViewPage(localizedTab.Value) - select new LocaleInfoDto(localizedTab.Value.CultureCode)); - } + if (localizedTabs != null) + { + // only add locales from tabs the user has at least view permissions to. + // we will handle the edit permissions at a later stage + locales.AddRange( + from localizedTab in localizedTabs + where TabPermissionController.CanViewPage(localizedTab.Value) + select new LocaleInfoDto(localizedTab.Value.CultureCode)); } } + } - var dnnPages = new DnnPagesDto(locales) - { - HasMissingLanguages = this.tabController.HasMissingLanguages(this.PortalId, tabId), - }; + var dnnPages = new DnnPagesDto(locales) + { + HasMissingLanguages = this.tabController.HasMissingLanguages(this.PortalId, tabId), + }; - // filter the list of localized pages to only those that have a culture we want to see - var viewableLocalizedPages = localizedPages.Where( - localizedPage => locales.Find(locale => locale.CultureCode == localizedPage.CultureCode) != null).ToList(); + // filter the list of localized pages to only those that have a culture we want to see + var viewableLocalizedPages = localizedPages.Where( + localizedPage => locales.Find(locale => locale.CultureCode == localizedPage.CultureCode) != null).ToList(); - foreach (var tabInfo in viewableLocalizedPages) + foreach (var tabInfo in viewableLocalizedPages) + { + var localTabInfo = tabInfo; + var dnnPage = dnnPages.Page(localTabInfo.CultureCode); + if (!TabPermissionController.CanViewPage(tabInfo)) + { + dnnPages.RemoveLocale(localTabInfo.CultureCode); + dnnPages.Pages.Remove(dnnPage); + break; + } + + dnnPage.TabId = localTabInfo.TabID; + dnnPage.TabName = localTabInfo.TabName; + dnnPage.Title = localTabInfo.Title; + dnnPage.Description = localTabInfo.Description; + dnnPage.Path = localTabInfo.TabPath.Substring(0, localTabInfo.TabPath.LastIndexOf("//", StringComparison.Ordinal)).Replace("//", string.Empty); + dnnPage.HasChildren = this.tabController.GetTabsByPortal(this.PortalId).WithParentId(tabInfo.TabID).Count != 0; + dnnPage.CanAdminPage = TabPermissionController.CanAdminPage(tabInfo); + dnnPage.CanViewPage = TabPermissionController.CanViewPage(tabInfo); + dnnPage.LocalResourceFile = LocalResourceFile; + dnnPage.PageUrl = this.NavigationManager.NavigateURL(localTabInfo.TabID, false, this.PortalSettings, string.Empty, localTabInfo.CultureCode); + dnnPage.IsSpecial = TabController.IsSpecialTab(localTabInfo.TabID, localTabInfo.PortalID); + + // calculate position in the form of 1.3.2... + var siblingTabs = tabInfos.Where(t => (t.ParentId == localTabInfo.ParentId && t.CultureCode == localTabInfo.CultureCode) || t.CultureCode == null).OrderBy(t => t.TabOrder).ToList(); + dnnPage.Position = (siblingTabs.IndexOf(localTabInfo) + 1).ToString(CultureInfo.InvariantCulture); + var parentTabId = localTabInfo.ParentId; + while (parentTabId > 0) + { + var parentTab = tabInfos.Single(t => t.TabID == parentTabId); + var id = parentTabId; + siblingTabs = tabInfos.Where(t => (t.ParentId == id && t.CultureCode == localTabInfo.CultureCode) || t.CultureCode == null).OrderBy(t => t.TabOrder).ToList(); + dnnPage.Position = (siblingTabs.IndexOf(localTabInfo) + 1).ToString(CultureInfo.InvariantCulture) + "." + dnnPage.Position; + parentTabId = parentTab.ParentId; + } + + dnnPage.DefaultLanguageGuid = localTabInfo.DefaultLanguageGuid; + dnnPage.IsTranslated = localTabInfo.IsTranslated; + dnnPage.IsPublished = this.tabController.IsTabPublished(localTabInfo); + + // generate modules information + var moduleController = ModuleController.Instance; + foreach (var moduleInfo in moduleController.GetTabModules(localTabInfo.TabID).Values) { - var localTabInfo = tabInfo; - var dnnPage = dnnPages.Page(localTabInfo.CultureCode); - if (!TabPermissionController.CanViewPage(tabInfo)) - { - dnnPages.RemoveLocale(localTabInfo.CultureCode); - dnnPages.Pages.Remove(dnnPage); - break; - } + var guid = moduleInfo.DefaultLanguageGuid == Null.NullGuid ? moduleInfo.UniqueId : moduleInfo.DefaultLanguageGuid; - dnnPage.TabId = localTabInfo.TabID; - dnnPage.TabName = localTabInfo.TabName; - dnnPage.Title = localTabInfo.Title; - dnnPage.Description = localTabInfo.Description; - dnnPage.Path = localTabInfo.TabPath.Substring(0, localTabInfo.TabPath.LastIndexOf("//", StringComparison.Ordinal)).Replace("//", string.Empty); - dnnPage.HasChildren = this.tabController.GetTabsByPortal(this.PortalId).WithParentId(tabInfo.TabID).Count != 0; - dnnPage.CanAdminPage = TabPermissionController.CanAdminPage(tabInfo); - dnnPage.CanViewPage = TabPermissionController.CanViewPage(tabInfo); - dnnPage.LocalResourceFile = LocalResourceFile; - dnnPage.PageUrl = this.NavigationManager.NavigateURL(localTabInfo.TabID, false, this.PortalSettings, string.Empty, localTabInfo.CultureCode); - dnnPage.IsSpecial = TabController.IsSpecialTab(localTabInfo.TabID, localTabInfo.PortalID); - - // calculate position in the form of 1.3.2... - var siblingTabs = tabInfos.Where(t => (t.ParentId == localTabInfo.ParentId && t.CultureCode == localTabInfo.CultureCode) || t.CultureCode == null).OrderBy(t => t.TabOrder).ToList(); - dnnPage.Position = (siblingTabs.IndexOf(localTabInfo) + 1).ToString(CultureInfo.InvariantCulture); - var parentTabId = localTabInfo.ParentId; - while (parentTabId > 0) + var dnnModules = dnnPages.Module(guid); // modules of each language + var dnnModule = dnnModules.Module(localTabInfo.CultureCode); + + // detect error : 2 modules with same uniqueId on the same page + dnnModule.LocalResourceFile = LocalResourceFile; + if (dnnModule.TabModuleId > 0) { - var parentTab = tabInfos.Single(t => t.TabID == parentTabId); - var id = parentTabId; - siblingTabs = tabInfos.Where(t => (t.ParentId == id && t.CultureCode == localTabInfo.CultureCode) || t.CultureCode == null).OrderBy(t => t.TabOrder).ToList(); - dnnPage.Position = (siblingTabs.IndexOf(localTabInfo) + 1).ToString(CultureInfo.InvariantCulture) + "." + dnnPage.Position; - parentTabId = parentTab.ParentId; + dnnModule.ErrorDuplicateModule = true; + dnnPages.ErrorExists = true; + continue; } - dnnPage.DefaultLanguageGuid = localTabInfo.DefaultLanguageGuid; - dnnPage.IsTranslated = localTabInfo.IsTranslated; - dnnPage.IsPublished = this.tabController.IsTabPublished(localTabInfo); - - // generate modules information - var moduleController = ModuleController.Instance; - foreach (var moduleInfo in moduleController.GetTabModules(localTabInfo.TabID).Values) + dnnModule.ModuleTitle = moduleInfo.ModuleTitle; + dnnModule.DefaultLanguageGuid = moduleInfo.DefaultLanguageGuid; + dnnModule.TabId = localTabInfo.TabID; + dnnModule.TabModuleId = moduleInfo.TabModuleID; + dnnModule.ModuleId = moduleInfo.ModuleID; + dnnModule.CanAdminModule = ModulePermissionController.CanAdminModule(moduleInfo); + dnnModule.CanViewModule = ModulePermissionController.CanViewModule(moduleInfo); + dnnModule.IsDeleted = moduleInfo.IsDeleted; + if (moduleInfo.DefaultLanguageGuid != Null.NullGuid) { - var guid = moduleInfo.DefaultLanguageGuid == Null.NullGuid ? moduleInfo.UniqueId : moduleInfo.DefaultLanguageGuid; - - var dnnModules = dnnPages.Module(guid); // modules of each language - var dnnModule = dnnModules.Module(localTabInfo.CultureCode); - - // detect error : 2 modules with same uniqueId on the same page - dnnModule.LocalResourceFile = LocalResourceFile; - if (dnnModule.TabModuleId > 0) - { - dnnModule.ErrorDuplicateModule = true; - dnnPages.ErrorExists = true; - continue; - } - - dnnModule.ModuleTitle = moduleInfo.ModuleTitle; - dnnModule.DefaultLanguageGuid = moduleInfo.DefaultLanguageGuid; - dnnModule.TabId = localTabInfo.TabID; - dnnModule.TabModuleId = moduleInfo.TabModuleID; - dnnModule.ModuleId = moduleInfo.ModuleID; - dnnModule.CanAdminModule = ModulePermissionController.CanAdminModule(moduleInfo); - dnnModule.CanViewModule = ModulePermissionController.CanViewModule(moduleInfo); - dnnModule.IsDeleted = moduleInfo.IsDeleted; - if (moduleInfo.DefaultLanguageGuid != Null.NullGuid) + var defaultLanguageModule = moduleController.GetModuleByUniqueID(moduleInfo.DefaultLanguageGuid); + if (defaultLanguageModule != null) { - var defaultLanguageModule = moduleController.GetModuleByUniqueID(moduleInfo.DefaultLanguageGuid); - if (defaultLanguageModule != null) + dnnModule.DefaultModuleId = defaultLanguageModule.ModuleID; + if (defaultLanguageModule.ParentTab.UniqueId != moduleInfo.ParentTab.DefaultLanguageGuid) { - dnnModule.DefaultModuleId = defaultLanguageModule.ModuleID; - if (defaultLanguageModule.ParentTab.UniqueId != moduleInfo.ParentTab.DefaultLanguageGuid) - { - dnnModule.DefaultTabName = defaultLanguageModule.ParentTab.TabName; - } + dnnModule.DefaultTabName = defaultLanguageModule.ParentTab.TabName; } } + } - dnnModule.SetModuleInfoHelp(); - dnnModule.IsTranslated = moduleInfo.IsTranslated; - dnnModule.IsLocalized = moduleInfo.IsLocalized; + dnnModule.SetModuleInfoHelp(); + dnnModule.IsTranslated = moduleInfo.IsTranslated; + dnnModule.IsLocalized = moduleInfo.IsLocalized; - dnnModule.IsShared = this.tabController.GetTabsByModuleID(moduleInfo.ModuleID).Values.Count(t => t.CultureCode == moduleInfo.CultureCode) > 1; + dnnModule.IsShared = this.tabController.GetTabsByModuleID(moduleInfo.ModuleID).Values.Count(t => t.CultureCode == moduleInfo.CultureCode) > 1; - // detect error : the default language module is on an other page - dnnModule.ErrorDefaultOnOtherTab = moduleInfo.DefaultLanguageGuid != Null.NullGuid && moduleInfo.DefaultLanguageModule == null; + // detect error : the default language module is on an other page + dnnModule.ErrorDefaultOnOtherTab = moduleInfo.DefaultLanguageGuid != Null.NullGuid && moduleInfo.DefaultLanguageModule == null; - // detect error : different culture on tab and module - dnnModule.ErrorCultureOfModuleNotCultureOfTab = moduleInfo.CultureCode != localTabInfo.CultureCode; + // detect error : different culture on tab and module + dnnModule.ErrorCultureOfModuleNotCultureOfTab = moduleInfo.CultureCode != localTabInfo.CultureCode; - dnnPages.ErrorExists |= dnnModule.ErrorDefaultOnOtherTab || dnnModule.ErrorCultureOfModuleNotCultureOfTab; - } + dnnPages.ErrorExists |= dnnModule.ErrorDefaultOnOtherTab || dnnModule.ErrorCultureOfModuleNotCultureOfTab; } - - return dnnPages; } - private void SaveNonLocalizedPages(DnnPagesRequest pages) + return dnnPages; + } + + private void SaveNonLocalizedPages(DnnPagesRequest pages) + { + // check all pages + foreach (var page in pages.Pages) { - // check all pages - foreach (var page in pages.Pages) + var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); + if (tabInfo == null || + (tabInfo.TabName == page.TabName && + tabInfo.Title == page.Title && + tabInfo.Description == page.Description)) { - var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); - if (tabInfo != null && - (tabInfo.TabName != page.TabName || - tabInfo.Title != page.Title || - tabInfo.Description != page.Description)) - { - tabInfo.TabName = page.TabName; - tabInfo.Title = page.Title; - tabInfo.Description = page.Description; - this.tabController.UpdateTab(tabInfo); - } + continue; } - var tabsToPublish = new List(); - var moduleTranslateOverrides = new Dictionary(); - var moduleController = ModuleController.Instance; + tabInfo.TabName = page.TabName; + tabInfo.Title = page.Title; + tabInfo.Description = page.Description; + this.tabController.UpdateTab(tabInfo); + } + + var tabsToPublish = new List(); + var moduleTranslateOverrides = new Dictionary(); + var moduleController = ModuleController.Instance; - // manage all actions we need to take for all modules on all pages - foreach (var modulesCollection in pages.Modules) + // manage all actions we need to take for all modules on all pages + foreach (var modulesCollection in pages.Modules) + { + foreach (var moduleDto in modulesCollection.Modules) { - foreach (var moduleDto in modulesCollection.Modules) + var tabModule = moduleController.GetTabModule(moduleDto.TabModuleId); + if (tabModule != null) { - var tabModule = moduleController.GetTabModule(moduleDto.TabModuleId); - if (tabModule != null) + if (tabModule.ModuleTitle != moduleDto.ModuleTitle) + { + tabModule.ModuleTitle = moduleDto.ModuleTitle; + moduleController.UpdateModule(tabModule); + } + + if (tabModule.DefaultLanguageGuid != Null.NullGuid && + tabModule.IsLocalized != moduleDto.IsLocalized) { - if (tabModule.ModuleTitle != moduleDto.ModuleTitle) + var locale = this.localeController.GetLocale(tabModule.CultureCode); + if (moduleDto.IsLocalized) { - tabModule.ModuleTitle = moduleDto.ModuleTitle; - moduleController.UpdateModule(tabModule); + moduleController.LocalizeModule(tabModule, locale); } - - if (tabModule.DefaultLanguageGuid != Null.NullGuid && - tabModule.IsLocalized != moduleDto.IsLocalized) + else { - var locale = this.localeController.GetLocale(tabModule.CultureCode); - if (moduleDto.IsLocalized) - { - moduleController.LocalizeModule(tabModule, locale); - } - else - { - moduleController.DeLocalizeModule(tabModule); - } + moduleController.DeLocalizeModule(tabModule); } + } - bool moduleTranslateOverride; - moduleTranslateOverrides.TryGetValue(tabModule.TabID, out moduleTranslateOverride); + moduleTranslateOverrides.TryGetValue(tabModule.TabID, out var moduleTranslateOverride); - if (!moduleTranslateOverride && tabModule.IsTranslated != moduleDto.IsTranslated) - { - moduleController.UpdateTranslationStatus(tabModule, moduleDto.IsTranslated); - } + if (!moduleTranslateOverride && tabModule.IsTranslated != moduleDto.IsTranslated) + { + moduleController.UpdateTranslationStatus(tabModule, moduleDto.IsTranslated); } - else if (moduleDto.CopyModule) + } + else if (moduleDto.CopyModule) + { + // find the first existing module on the line + foreach (var moduleToCopyFrom in modulesCollection.Modules) { - // find the first existing module on the line - foreach (var moduleToCopyFrom in modulesCollection.Modules) + if (moduleToCopyFrom.ModuleId <= 0) + { + continue; + } + + var toTabInfo = this.GetLocalizedTab(moduleToCopyFrom.TabId, moduleDto.CultureCode); + var miCopy = moduleController.GetTabModule(moduleToCopyFrom.TabModuleId); + if (miCopy.DefaultLanguageGuid == Null.NullGuid) + { + // default + DisableTabVersioningAndWorkflow(toTabInfo); + moduleController.CopyModule(miCopy, toTabInfo, Null.NullString, true); + EnableTabVersioningAndWorkflow(toTabInfo); + var localizedModule = moduleController.GetModule(miCopy.ModuleID, toTabInfo.TabID, false); + moduleController.LocalizeModule(localizedModule, LocaleController.Instance.GetLocale(localizedModule.CultureCode)); + } + else + { + var miCopyDefault = moduleController.GetModuleByUniqueID(miCopy.DefaultLanguageGuid); + moduleController.CopyModule(miCopyDefault, toTabInfo, Null.NullString, true); + } + + if (moduleDto == modulesCollection.Modules.First()) { - if (moduleToCopyFrom.ModuleId > 0) + // default language + var miDefault = moduleController.GetModule(miCopy.ModuleID, pages.Pages.First().TabId, false); + foreach (var page in pages.Pages.Skip(1)) { - var toTabInfo = this.GetLocalizedTab(moduleToCopyFrom.TabId, moduleDto.CultureCode); - var miCopy = moduleController.GetTabModule(moduleToCopyFrom.TabModuleId); - if (miCopy.DefaultLanguageGuid == Null.NullGuid) - { - // default - DisableTabVersioningAndWorkflow(toTabInfo); - moduleController.CopyModule(miCopy, toTabInfo, Null.NullString, true); - EnableTabVersioningAndWorkflow(toTabInfo); - var localizedModule = moduleController.GetModule(miCopy.ModuleID, toTabInfo.TabID, false); - moduleController.LocalizeModule(localizedModule, LocaleController.Instance.GetLocale(localizedModule.CultureCode)); - } - else + var moduleInfo = moduleController.GetModule(miCopy.ModuleID, page.TabId, false); + if (moduleInfo == null) { - var miCopyDefault = moduleController.GetModuleByUniqueID(miCopy.DefaultLanguageGuid); - moduleController.CopyModule(miCopyDefault, toTabInfo, Null.NullString, true); + continue; } - if (moduleDto == modulesCollection.Modules.First()) + if (miDefault != null) { - // default language - var miDefault = moduleController.GetModule(miCopy.ModuleID, pages.Pages.First().TabId, false); - foreach (var page in pages.Pages.Skip(1)) - { - var moduleInfo = moduleController.GetModule(miCopy.ModuleID, page.TabId, false); - if (moduleInfo != null) - { - if (miDefault != null) - { - moduleInfo.DefaultLanguageGuid = miDefault.UniqueId; - } - - moduleController.UpdateModule(moduleInfo); - } - } + moduleInfo.DefaultLanguageGuid = miDefault.UniqueId; } - break; + moduleController.UpdateModule(moduleInfo); } } + + break; } } } + } + + foreach (var page in pages.Pages) + { + var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); + if (tabInfo == null) + { + continue; + } - foreach (var page in pages.Pages) + var moduleTranslateOverride = false; + if (!tabInfo.IsDefaultLanguage) { - var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); - if (tabInfo != null) + if (tabInfo.IsTranslated != page.IsTranslated) { - var moduleTranslateOverride = false; - if (!tabInfo.IsDefaultLanguage) + this.tabController.UpdateTranslationStatus(tabInfo, page.IsTranslated); + if (page.IsTranslated) { - if (tabInfo.IsTranslated != page.IsTranslated) - { - this.tabController.UpdateTranslationStatus(tabInfo, page.IsTranslated); - if (page.IsTranslated) - { - moduleTranslateOverride = true; - var tabModules = moduleController.GetTabModules(tabInfo.TabID) - .Where(moduleKvp => - moduleKvp.Value.DefaultLanguageModule != null && - moduleKvp.Value.LocalizedVersionGuid != moduleKvp.Value.DefaultLanguageModule.LocalizedVersionGuid); - - foreach (var moduleKvp in tabModules) - { - moduleController.UpdateTranslationStatus(moduleKvp.Value, true); - } - } - } + moduleTranslateOverride = true; + var tabModules = moduleController.GetTabModules(tabInfo.TabID) + .Where(moduleKvp => + moduleKvp.Value.DefaultLanguageModule != null && + moduleKvp.Value.LocalizedVersionGuid != moduleKvp.Value.DefaultLanguageModule.LocalizedVersionGuid); - if (page.IsPublished) + foreach (var moduleKvp in tabModules) { - tabsToPublish.Add(tabInfo); + moduleController.UpdateTranslationStatus(moduleKvp.Value, true); } } - - moduleTranslateOverrides.Add(page.TabId, moduleTranslateOverride); } - } - // if we have tabs to publish, do it. - // marks all modules as translated, marks page as translated - foreach (var tabInfo in tabsToPublish) - { - // First mark all modules as translated - foreach (var module in moduleController.GetTabModules(tabInfo.TabID).Values) + if (page.IsPublished) { - moduleController.UpdateTranslationStatus(module, true); + tabsToPublish.Add(tabInfo); } + } - // Second mark tab as translated - this.tabController.UpdateTranslationStatus(tabInfo, true); + moduleTranslateOverrides.Add(page.TabId, moduleTranslateOverride); + } - // Third publish Tab (update Permissions) - this.tabController.PublishTab(tabInfo); + // if we have tabs to publish, do it. + // marks all modules as translated, marks page as translated + foreach (var tabInfo in tabsToPublish) + { + // First mark all modules as translated + foreach (var module in moduleController.GetTabModules(tabInfo.TabID).Values) + { + moduleController.UpdateTranslationStatus(module, true); } - // manage translated status of tab. In order to do that, we need to check if all modules on the page are translated - var tabTranslatedStatus = true; - foreach (var page in pages.Pages) - { - var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); - if (tabInfo != null) - { - if (tabInfo.ChildModules.Any(moduleKvp => !moduleKvp.Value.IsTranslated)) - { - tabTranslatedStatus = false; - } + // Second mark tab as translated + this.tabController.UpdateTranslationStatus(tabInfo, true); - if (tabTranslatedStatus && !tabInfo.IsTranslated) - { - this.tabController.UpdateTranslationStatus(tabInfo, true); - } - } - } + // Third publish Tab (update Permissions) + this.tabController.PublishTab(tabInfo); } - private void AddTranslationSubmittedNotification(TabInfo tabInfo, UserInfo translator, string comment) + // manage translated status of tab. In order to do that, we need to check if all modules on the page are translated + var tabTranslatedStatus = true; + foreach (var page in pages.Pages) { - var notificationsController = NotificationsController.Instance; - var notificationType = notificationsController.GetNotificationType("TranslationSubmitted"); - var subject = LocalizeString("NewContentMessage.Subject"); - var body = string.Format( - CultureInfo.CurrentCulture, - LocalizeString("NewContentMessage.Body"), - tabInfo.TabName, - this.NavigationManager.NavigateURL(tabInfo.TabID, false, this.PortalSettings, Null.NullString, tabInfo.CultureCode), - comment); + var tabInfo = this.tabController.GetTab(page.TabId, this.PortalId, true); + if (tabInfo == null) + { + continue; + } - var sender = UserController.GetUserById(this.PortalSettings.PortalId, this.PortalSettings.AdministratorId); - var notification = new Notification + if (tabInfo.ChildModules.Any(moduleKvp => !moduleKvp.Value.IsTranslated)) { - NotificationTypeID = notificationType.NotificationTypeId, - Subject = subject, - Body = body, - IncludeDismissAction = true, - SenderUserID = sender.UserID, - }; + tabTranslatedStatus = false; + } - notificationsController.SendNotification(notification, this.PortalSettings.PortalId, null, new List { translator }); + if (tabTranslatedStatus && !tabInfo.IsTranslated) + { + this.tabController.UpdateTranslationStatus(tabInfo, true); + } } + } - private HttpResponseMessage GetForbiddenResponse() + private void AddTranslationSubmittedNotification(TabInfo tabInfo, UserInfo translator, string comment) + { + var notificationsController = NotificationsController.Instance; + var notificationType = notificationsController.GetNotificationType("TranslationSubmitted"); + var subject = LocalizeString("NewContentMessage.Subject"); + var body = string.Format( + CultureInfo.CurrentCulture, + LocalizeString("NewContentMessage.Body"), + tabInfo.TabName, + this.NavigationManager.NavigateURL(tabInfo.TabID, false, this.PortalSettings, Null.NullString, tabInfo.CultureCode), + comment); + + var sender = UserController.GetUserById(this.hostSettings, this.PortalSettings.PortalId, this.PortalSettings.AdministratorId); + var notification = new Notification { - return this.Request.CreateResponse(HttpStatusCode.Forbidden, new { Message = "The user is not allowed to access this method." }); - } + NotificationTypeID = notificationType.NotificationTypeId, + Subject = subject, + Body = body, + IncludeDismissAction = true, + SenderUserID = sender.UserID, + }; + + notificationsController.SendNotification(notification, this.PortalSettings.PortalId, null, new List { translator, }); + } - private ThemeFileInfo GetDefaultPortalTheme() - { - var layoutSrc = this.defaultPortalThemeController.GetDefaultPortalLayout(); - if (string.IsNullOrWhiteSpace(layoutSrc)) - { - return null; - } + private HttpResponseMessage GetForbiddenResponse() + { + return this.Request.CreateResponse(HttpStatusCode.Forbidden, new { Message = "The user is not allowed to access this method.", }); + } - var layout = this.themesController.GetThemeFile(PortalSettings.Current, layoutSrc, ThemeType.Skin); - return layout; + private ThemeFileInfo GetDefaultPortalTheme() + { + var layoutSrc = this.defaultPortalThemeController.GetDefaultPortalLayout(); + if (string.IsNullOrWhiteSpace(layoutSrc)) + { + return null; } - private TabInfo GetLocalizedTab(int tabId, string cultureCode) - { - var currentTab = this.tabController.GetTab(tabId, this.PortalId, false); + var layout = this.themesController.GetThemeFile(PortalSettings.Current, layoutSrc, ThemeType.Skin); + return layout; + } - // Unique id of default language page - var uniqueId = currentTab.DefaultLanguageGuid != Null.NullGuid - ? currentTab.DefaultLanguageGuid - : currentTab.UniqueId; + private TabInfo GetLocalizedTab(int tabId, string cultureCode) + { + var currentTab = this.tabController.GetTab(tabId, this.PortalId, false); - // get all non admin pages and not deleted - var allPages = this.tabController.GetTabsByPortal(this.PortalId).Values.Where( - t => t.TabID != this.PortalSettings.AdminTabId && (Null.IsNull(t.ParentId) || t.ParentId != this.PortalSettings.AdminTabId)); - allPages = allPages.Where(t => t.IsDeleted == false); + // Unique id of default language page + var uniqueId = currentTab.DefaultLanguageGuid != Null.NullGuid + ? currentTab.DefaultLanguageGuid + : currentTab.UniqueId; - // get all localized pages of current page - var tabInfos = allPages as IList ?? allPages.ToList(); - return tabInfos.SingleOrDefault(t => (t.DefaultLanguageGuid == uniqueId || t.UniqueId == uniqueId) && t.CultureCode == cultureCode); - } + // get all non admin pages and not deleted + var allPages = this.tabController.GetTabsByPortal(this.PortalId).Values.Where( + t => t.TabID != this.PortalSettings.AdminTabId && (Null.IsNull(t.ParentId) || t.ParentId != this.PortalSettings.AdminTabId)); + allPages = allPages.Where(t => t.IsDeleted == false); + + // get all localized pages of current page + var tabInfos = allPages as IList ?? allPages.ToList(); + return tabInfos.SingleOrDefault(t => (t.DefaultLanguageGuid == uniqueId || t.UniqueId == uniqueId) && t.CultureCode == cultureCode); } } diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/DTO/Tabs/LocaleInfoDto.cs b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/DTO/Tabs/LocaleInfoDto.cs index 7aff78c6861..44e7aa5ebe0 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/DTO/Tabs/LocaleInfoDto.cs +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/DTO/Tabs/LocaleInfoDto.cs @@ -17,7 +17,7 @@ public LocaleInfoDto(string cultureCode) : $"/images/Flags/{cultureCode}.gif"; } - public string CultureCode { get; } + public string CultureCode { get; set; } public string Icon { get; } } From 72237476cdb5e099964a9e488d1a2f08558efae5 Mon Sep 17 00:00:00 2001 From: Roman M Date: Sat, 6 Jun 2026 21:10:08 -0800 Subject: [PATCH 016/109] Add folder icon to Site Assets root node in Resource Manager. Fixes #7311 --- .../dnn-rm-folder-list/dnn-rm-folder-list.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.tsx b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.tsx index 222fcc15671..8bdd86ff5cb 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.tsx +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.tsx @@ -45,7 +45,8 @@ export class DnnRmFolderList { state.pageSize, state.sortField, state.sortOrder); - this.rootItem = await this.itemsClient.getFolderItem(state.settings.HomeFolderId) + this.rootItem = await this.itemsClient.getFolderItem(state.settings.HomeFolderId); + this.rootItem.iconUrl = await this.itemsClient.getFolderIconUrl(state.settings.HomeFolderId); } catch (error) { alert(error); } @@ -88,6 +89,13 @@ export class DnnRmFolderList { this.rootItemContextMenu.open(e as PointerEvent).catch(console.error); }} > + {/* reusing code from dnn-rm-folder-list-item.tsx */} + {this.rootItem?.iconUrl != null && this.rootItem.iconUrl.length > 0 + ? + {state.settings.HomeFolderName} + : + + } {state.settings.HomeFolderName} this.rootItemContextMenu = el} From eb1276f514ab9fb383447977f5bc992168724044 Mon Sep 17 00:00:00 2001 From: Roman M Date: Sun, 7 Jun 2026 10:23:52 -0800 Subject: [PATCH 017/109] reusing css from child element on the root --- .../dnn-rm-folder-list/dnn-rm-folder-list.scss | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.scss b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.scss index 02f3a669491..79efe3fe025 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.scss +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/src/components/dnn-rm-folder-list/dnn-rm-folder-list.scss @@ -5,10 +5,13 @@ } button{ - padding:0; - margin:0; - background-color: transparent; + display: flex; + align-items: center; border: none; + padding: 0; + margin: 0; + background-color: transparent; + gap: 0.5em; cursor: pointer; } From 3b29b60f086154e271ae0ea53ef9d3346357b33b Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:09:28 +0200 Subject: [PATCH 018/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 622a2cdb82b..8d1fa3b5299 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -56,8 +56,7 @@ public static string DecodeParameter(string value) return Encoding.UTF8.GetString(arrBytes); } -#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved - /// Decrypts an encrypted value generated via . Decrypted using the current portal's . + /// Decrypts an encrypted value generated via . Decrypted using the current portal's . /// The encrypted value. /// The decrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] From cc87fbf288b4afe5554fb0808ba8cd7577ef1f2e Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:09:37 +0200 Subject: [PATCH 019/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 8d1fa3b5299..24573fe9cc8 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -60,7 +60,6 @@ public static string DecodeParameter(string value) /// The encrypted value. /// The decrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] -#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved public static partial string DecryptParameter(string value) => DecryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); From d40577cb22aa795f42450ac7d840d75d11c5737c Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:09:46 +0200 Subject: [PATCH 020/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 24573fe9cc8..76041a52d0e 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -63,8 +63,7 @@ public static string DecodeParameter(string value) public static partial string DecryptParameter(string value) => DecryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); -#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved - /// Decrypts an encrypted value generated via . Decrypted using the current portal's . + /// Decrypts an encrypted value generated via . Decrypted using the current portal's . /// The cryptography provider. /// The encrypted value. /// The decrypted value. From 6aa8bb5ba7e9fc6ecf42a35ed22fdba65017d233 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:09:54 +0200 Subject: [PATCH 021/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 76041a52d0e..aa6032202eb 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -68,7 +68,6 @@ public static partial string DecryptParameter(string value) /// The encrypted value. /// The decrypted value. public static string DecryptParameter(ICryptographyProvider cryptographyProvider, string value) -#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved => DecryptParameter(cryptographyProvider, value, PortalController.Instance.GetCurrentSettings().GUID.ToString()); /// Decrypts an encrypted value generated via . From ea55281623ec3aefdcd268615c676312145241e1 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:10:02 +0200 Subject: [PATCH 022/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index aa6032202eb..d12ab1f26a3 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -108,8 +108,7 @@ public static string EncodeParameter(string value) return toEncode.ToString(); } -#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved - /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . + /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . /// The value to encrypt. /// The encrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] From 513207cfd89f6d4a2db5bef115fbfc3785f8ee40 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:10:10 +0200 Subject: [PATCH 023/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index d12ab1f26a3..84ca325cc98 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -112,7 +112,6 @@ public static string EncodeParameter(string value) /// The value to encrypt. /// The encrypted value. [DnnDeprecated(10, 2, 2, "Use overload taking ICryptographyProvider")] -#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved public static partial string EncryptParameter(string value) => EncryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); From 91e6ec7f0c801fe627fa0ea11e0be703f2e17802 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:10:19 +0200 Subject: [PATCH 024/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 84ca325cc98..287428e449b 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -121,7 +121,6 @@ public static partial string EncryptParameter(string value) /// The value to encrypt. /// The encrypted value. public static string EncryptParameter(ICryptographyProvider cryptographyProvider, string value) -#pragma warning restore CS1574 // XML comment has cref attribute that could not be resolved => EncryptParameter(cryptographyProvider, value, PortalController.Instance.GetCurrentSettings().GUID.ToString()); /// Encrypt a parameter for placing in a URL. From 3dd954bcddfe11070db5bd7117e3e762645e78c8 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Tue, 9 Jun 2026 09:10:28 +0200 Subject: [PATCH 025/109] Update DNN Platform/Library/Common/Utilities/UrlUtils.cs Co-authored-by: Brian Dukes --- DNN Platform/Library/Common/Utilities/UrlUtils.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index 287428e449b..dbbf26a8821 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -115,8 +115,7 @@ public static string EncodeParameter(string value) public static partial string EncryptParameter(string value) => EncryptParameter(Globals.GetCurrentServiceProvider().GetRequiredService(), value); -#pragma warning disable CS1574 // XML comment has cref attribute that could not be resolved - /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . + /// Encrypt a parameter for placing in a URL. Encrypted using the current portal's . /// The cryptography provider. /// The value to encrypt. /// The encrypted value. From eb1adee2c443e0cddbbc8f870d7ad3b61e755609 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 22:23:39 +0000 Subject: [PATCH 026/109] Bump github/codeql-action from 4.36.0 to 4.36.1 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.0 to 4.36.1. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/7211b7c8077ea37d8641b6271f6a365a22a5fbfa...87557b9c84dde89fdd9b10e88954ac2f4248e463) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.36.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/ossf-scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index 8e0742f4ce7..f6f172de509 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -58,6 +58,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: "github/codeql-action/upload-sarif@7211b7c8077ea37d8641b6271f6a365a22a5fbfa" # v4.36.0 + uses: "github/codeql-action/upload-sarif@87557b9c84dde89fdd9b10e88954ac2f4248e463" # v4.36.1 with: sarif_file: "results.sarif" From d5c1ce4161232281c6b4e06d02697bfe64798089 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jun 2026 22:24:24 +0000 Subject: [PATCH 027/109] Bump actions/checkout from 6.0.2 to 6.0.3 Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/browserslist-update-db.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/dependency-review.yml | 2 +- .github/workflows/image-actions.yml | 2 +- .github/workflows/ossf-scorecard.yml | 2 +- .github/workflows/zizmor.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/browserslist-update-db.yml b/.github/workflows/browserslist-update-db.yml index 04709151be8..80fa70ca969 100644 --- a/.github/workflows/browserslist-update-db.yml +++ b/.github/workflows/browserslist-update-db.yml @@ -19,7 +19,7 @@ jobs: pull-requests: "write" # creates a pull request if there's an update steps: - name: "Checkout repository" - uses: "actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd" # v6.0.2 + uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63b74acabe7..986d40f2ce3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,7 +73,7 @@ jobs: "RUN_TESTS=${{ inputs.RUN_TESTS || env.RUN_TESTS }}" >> $env:GITHUB_ENV; - name: "Checkout" - uses: "actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd" # v6.0.2 + uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 with: fetch-depth: 0 # include all history for GitVersion diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 0efd04421e2..caee7d8a3dc 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -19,6 +19,6 @@ jobs: contents: "read" steps: - name: "Checkout Repository" - uses: "actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd" # v6.0.2 + uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 - name: "Dependency Review" uses: "actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294" # v5.0.0 diff --git a/.github/workflows/image-actions.yml b/.github/workflows/image-actions.yml index 56e77b4aaf2..f962eb3f440 100644 --- a/.github/workflows/image-actions.yml +++ b/.github/workflows/image-actions.yml @@ -36,7 +36,7 @@ jobs: contents: "read" steps: - name: "Checkout Repo" - uses: "actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd" # v6.0.2 + uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 with: persist-credentials: false diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index f6f172de509..320dd05dfe3 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: "Checkout code" - uses: "actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd" # v6.0.2 + uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 with: persist-credentials: false diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 6e468e6f623..221aa95f73f 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -28,7 +28,7 @@ jobs: actions: read # Only needed for private repos. Needed for upload-sarif to read workflow run info. steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: persist-credentials: false From 448e5654caed226784ec3125c02ceb59e3455955 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 22:24:00 +0000 Subject: [PATCH 028/109] Bump github/codeql-action from 4.36.1 to 4.36.2 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.36.1 to 4.36.2. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/87557b9c84dde89fdd9b10e88954ac2f4248e463...8aad20d150bbac5944a9f9d289da16a4b0d87c1e) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.36.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/ossf-scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index 320dd05dfe3..bb4ab8aa710 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -58,6 +58,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard (optional). # Commenting out will disable upload of results to your repo's Code Scanning dashboard - name: "Upload to code-scanning" - uses: "github/codeql-action/upload-sarif@87557b9c84dde89fdd9b10e88954ac2f4248e463" # v4.36.1 + uses: "github/codeql-action/upload-sarif@8aad20d150bbac5944a9f9d289da16a4b0d87c1e" # v4.36.2 with: sarif_file: "results.sarif" From 3f402691f3ddcecb82b89ec91bf4a680285416fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 17:03:23 +0000 Subject: [PATCH 029/109] Bump the nuget group with 1 update Bumps System.Net.Http from 4.1.0 to 4.3.4 --- updated-dependencies: - dependency-name: System.Net.Http dependency-version: 4.3.4 dependency-type: direct:production dependency-group: nuget ... Signed-off-by: dependabot[bot] --- Directory.Packages.props | 1 + 1 file changed, 1 insertion(+) diff --git a/Directory.Packages.props b/Directory.Packages.props index afcb82c9b3e..86b5787d23b 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -59,6 +59,7 @@ + From 289b6097c86f4eccf1271ef9b291723354643743 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:33:34 -0500 Subject: [PATCH 030/109] Bump Yarn from 4.13.0 to 4.16.0 --- .yarnrc.yml | 6 +++++- package.json | 2 +- yarn.lock | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.yarnrc.yml b/.yarnrc.yml index f787d935d16..101fcaa7250 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,8 +1,12 @@ +approvedGitRepositories: [] + compressionLevel: mixed +enableScripts: false + nodeLinker: node-modules -npmMinimalAgeGate: "1d" +npmMinimalAgeGate: 1d npmPreapprovedPackages: - "@dnncommunity/dnn-elements" diff --git a/package.json b/package.json index cf735c1d86c..a4df2e55333 100644 --- a/package.json +++ b/package.json @@ -45,5 +45,5 @@ "resolutions": { "@types/ws": "8.5.4" }, - "packageManager": "yarn@4.13.0" + "packageManager": "yarn@4.16.0+sha512.5374c94eb4ef6aa8188fb112f20c1aa6569f248d676c5e576e1fd2a1a4d8d87a96df65d9dfe1c2a0252cbe38bda46cf18d955005b81b43cc7607a5c9d56fd2b6" } diff --git a/yarn.lock b/yarn.lock index ea86b72495f..5e36183953e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 8 + version: 10 cacheKey: 10 "@acemir/cssom@npm:^0.9.28": From 16b03366e465991bea7c59ba19757591c4231c3a Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:34:10 -0500 Subject: [PATCH 031/109] Bump lodash from 4.17.23 to 4.18.1 --- yarn.lock | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5e36183953e..30eafb043ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11294,20 +11294,13 @@ __metadata: languageName: node linkType: hard -"lodash@npm:4.18.1": +"lodash@npm:4.18.1, lodash@npm:^4.17.10, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.2.1": version: 4.18.1 resolution: "lodash@npm:4.18.1" checksum: 10/306fea53dfd39dad1f03d45ba654a2405aebd35797b673077f401edb7df2543623dc44b9effbb98f69b32152295fff725a4cec99c684098947430600c6af0c3f languageName: node linkType: hard -"lodash@npm:^4.17.10, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21, lodash@npm:^4.2.1": - version: 4.17.23 - resolution: "lodash@npm:4.17.23" - checksum: 10/82504c88250f58da7a5a4289f57a4f759c44946c005dd232821c7688b5fcfbf4a6268f6a6cdde4b792c91edd2f3b5398c1d2a0998274432cff76def48735e233 - languageName: node - linkType: hard - "log-symbols@npm:^4.0.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" From 9ad98d61c115923e75cee48ae1d698c4cc43c273 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:45:13 -0500 Subject: [PATCH 032/109] Bump brace-expansion from 1.1.12 to 1.1.15 from 2.0.2 to 2.1.1 --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 30eafb043ba..239d44562e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5319,21 +5319,21 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.12 - resolution: "brace-expansion@npm:1.1.12" + version: 1.1.15 + resolution: "brace-expansion@npm:1.1.15" dependencies: balanced-match: "npm:^1.0.0" concat-map: "npm:0.0.1" - checksum: 10/12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 + checksum: 10/f2a950034e670523cc186da61aabe3beab74b1b8a7c74a756bf6b172dad1917312f255d9ec46906c9f0cab530868095d8c143918576930dd0e1323c3803850f1 languageName: node linkType: hard "brace-expansion@npm:^2.0.1, brace-expansion@npm:^2.0.2": - version: 2.0.2 - resolution: "brace-expansion@npm:2.0.2" + version: 2.1.1 + resolution: "brace-expansion@npm:2.1.1" dependencies: balanced-match: "npm:^1.0.0" - checksum: 10/01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 + checksum: 10/4681c533dc4e6c77b3ad795b38683d297fd03c739a17bfb2a338529fa7dcf4540683a79dcd662905f4c5b0db7cfda18daafcd18dd1bbf7c3b076fe0c9c3487eb languageName: node linkType: hard From 2936a4d028e594b1e536c77a7b20e60689d6d489 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:46:01 -0500 Subject: [PATCH 033/109] Bump yaml from 2.8.0 to 2.9.0 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 239d44562e1..470f6a4f7b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17848,11 +17848,11 @@ __metadata: linkType: hard "yaml@npm:^2.4.2, yaml@npm:^2.6.0": - version: 2.8.0 - resolution: "yaml@npm:2.8.0" + version: 2.9.0 + resolution: "yaml@npm:2.9.0" bin: yaml: bin.mjs - checksum: 10/7d4bd9c10d0e467601f496193f2ac254140f8e36f96f5ff7f852b9ce37974168eb7354f4c36dc8837dde527a2043d004b6aff48818ec24a69ab2dd3c6b6c381c + checksum: 10/9a95e8e08651c3d292ab6a5befeb5f57b76801caa097c75bb45c9a70ce19c1b11f57e87a6ef84a579ea070ed2c2c8ac541c88c0ae684d544d5f42c7e77d11b7b languageName: node linkType: hard From b3c5dfbec3ab634a25fc55be94281af8ac80674f Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:46:55 -0500 Subject: [PATCH 034/109] Bump ws from 8.20.1 to 8.21.0 --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 470f6a4f7b9..17d7fd23667 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17753,8 +17753,8 @@ __metadata: linkType: hard "ws@npm:^8.18.0, ws@npm:^8.18.3": - version: 8.20.1 - resolution: "ws@npm:8.20.1" + version: 8.21.0 + resolution: "ws@npm:8.21.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -17763,7 +17763,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/8c4d2b06dc65381b6bfab1f2e584275dabd30a99a5ce058b4dc76f3d03fad1921cef3a21d8f53127d30a808cfd1864aa2fe6890a5d43359f682457315baec873 + checksum: 10/088411956432c8f876158409d5a285cb9ad1382f593391f51d3a599bd0a5b277f876609ebd00fc3596321c4a4c9064d6fffe1ebad960e8ea7fd9ae25324f35c2 languageName: node linkType: hard From 78112afce10ea5916a43c7712187f21e50d5a318 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:52:11 -0500 Subject: [PATCH 035/109] Bump rsbuild Bump @rsbuild/core from 1.7.3 to 1.7.5 Bump @rsbuild/plugin-less from 1.6.2 to 1.6.4 --- .../ClientSide/AdminLogs.Web/package.json | 4 +- .../ClientSide/Bundle.Web/package.json | 4 +- .../ClientSide/Dnn.React.Common/package.json | 4 +- .../ClientSide/Extensions.Web/package.json | 4 +- .../ClientSide/Licensing.Web/package.json | 4 +- .../ClientSide/Pages.Web/package.json | 4 +- .../ClientSide/Prompt.Web/package.json | 4 +- .../ClientSide/Roles.Web/package.json | 4 +- .../ClientSide/Security.Web/package.json | 4 +- .../ClientSide/Seo.Web/package.json | 4 +- .../ClientSide/Servers.Web/package.json | 4 +- .../ClientSide/SiteGroups.Web/package.json | 4 +- .../SiteImportExport.Web/package.json | 4 +- .../ClientSide/SiteSettings.Web/package.json | 4 +- .../ClientSide/Sites.Web/package.json | 4 +- .../Sites.Web/src/_exportables/package.json | 4 +- .../ClientSide/TaskScheduler.Web/package.json | 4 +- .../ClientSide/Themes.Web/package.json | 4 +- .../ClientSide/Users.Web/package.json | 4 +- .../Users.Web/src/_exportables/package.json | 4 +- .../ClientSide/Vocabularies.Web/package.json | 4 +- yarn.lock | 233 +++++++++--------- 22 files changed, 162 insertions(+), 155 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 3f56964fb8f..defc702d10b 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index a4788074956..125bda086f2 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -9,8 +9,8 @@ "lint": "eslint --fix" }, "devDependencies": { - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.20", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 53e92c65054..01a7fb086cb 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -47,8 +47,8 @@ }, "devDependencies": { "@eslint/compat": "^2.0.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "@storybook/addon-docs": "10.4.1", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index 2a55b8306b2..2b3fc5d8ec3 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index 705c2f6de5c..a4ff32e9df0 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "2.2.3", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index ccdd3ae9648..6978d266a3c 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -19,8 +19,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "@types/knockout": "^3.4.77", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index 195930225cc..1bd85060a52 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -11,8 +11,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "2.2.3", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index 014ca7f17f2..fffc3679285 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "^2.2.3", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 5f36d995d69..78247ac2855 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index 9cee947bd42..bc78d725d83 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 0215fc390e8..2c8db2e7db3 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "@types/react": "^19.2.2", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 1d515993027..16ebb28c53a 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "eslint": "10.2.1", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 1c228c6219f..90bb5365c30 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 670b7979a38..20e967a3126 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -12,8 +12,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "2.2.3", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index d3fbb7b73d1..a19a0f24330 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "eslint": "10.2.1", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index 6c6d7afcab5..0433960b34b 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -12,8 +12,8 @@ "license": "UNLICENSED", "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.20", diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 10b69c34010..0df68f3cd99 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "2.2.3", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index 207bee3ee43..7dbb83b0106 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 0b8f69ff7aa..08c88338c82 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -11,8 +11,8 @@ "lint": "eslint --fix" }, "devDependencies": { - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "eslint": "10.2.1", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 1f9ab11488f..18a6f3f22fb 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -12,8 +12,8 @@ "license": "UNLICENSED", "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.20", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 13cab5d9b46..37d03670407 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@dnnsoftware/dnn-react-common": "10.3.3", - "@rsbuild/core": "^1.7.3", - "@rsbuild/plugin-less": "^1.6.2", + "@rsbuild/core": "^1.7.5", + "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "array.prototype.find": "2.2.3", diff --git a/yarn.lock b/yarn.lock index 17d7fd23667..148a0e97bf0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -516,8 +516,8 @@ __metadata: resolution: "@dnnsoftware/dnn-react-common@workspace:Dnn.AdminExperience/ClientSide/Dnn.React.Common" dependencies: "@eslint/compat": "npm:^2.0.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" "@storybook/addon-docs": "npm:10.4.1" @@ -2941,35 +2941,35 @@ __metadata: languageName: node linkType: hard -"@rsbuild/core@npm:^1.7.3": - version: 1.7.3 - resolution: "@rsbuild/core@npm:1.7.3" +"@rsbuild/core@npm:^1.7.5": + version: 1.7.5 + resolution: "@rsbuild/core@npm:1.7.5" dependencies: - "@rspack/core": "npm:~1.7.5" + "@rspack/core": "npm:~1.7.10" "@rspack/lite-tapable": "npm:~1.1.0" - "@swc/helpers": "npm:^0.5.18" + "@swc/helpers": "npm:^0.5.20" core-js: "npm:~3.47.0" jiti: "npm:^2.6.1" bin: rsbuild: bin/rsbuild.js - checksum: 10/f28946b9a1c9b49ce2094c3d7356799af49accaf2238abe74aef20217a387406d51719e5e3a2e6323fbb9d49c5df42306bdb76cbe7fd05ec135dfaaa98148c77 + checksum: 10/5b2991ad60418572e770169b67a72af84212ad4ea5a209743e9eeaf26d3c0ecc574cdfc79951b4bd934b42babffc3218a657c7e888c174bfdde85140a2ea5ae3 languageName: node linkType: hard -"@rsbuild/plugin-less@npm:^1.6.2": - version: 1.6.2 - resolution: "@rsbuild/plugin-less@npm:1.6.2" +"@rsbuild/plugin-less@npm:^1.6.4": + version: 1.6.4 + resolution: "@rsbuild/plugin-less@npm:1.6.4" dependencies: deepmerge: "npm:^4.3.1" - less: "npm:^4.6.3" - less-loader: "npm:^12.3.2" - reduce-configs: "npm:^1.1.1" + less: "npm:^4.6.4" + less-loader: "npm:^12.3.3" + reduce-configs: "npm:^1.1.2" peerDependencies: "@rsbuild/core": ^1.3.0 || ^2.0.0-0 peerDependenciesMeta: "@rsbuild/core": optional: true - checksum: 10/fa1c1cdb60b920504b9353a7c30a5f0a72ee0a196cf6892995f419cf8824cc2d21dfefb5588e9cfe8cd205a8295c1a136b8bd39395627e174a0e1dac92f12b03 + checksum: 10/c6297ae095baae976b9c569512ac15ed27c8f209c6f0e05e34e2e367f0077390063991928f248891c6b38e1e1b36418b53a3cef7531e9cb61dd3782d346534ea languageName: node linkType: hard @@ -3024,92 +3024,92 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-darwin-arm64@npm:1.7.9" +"@rspack/binding-darwin-arm64@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-darwin-arm64@npm:1.7.11" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-darwin-x64@npm:1.7.9" +"@rspack/binding-darwin-x64@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-darwin-x64@npm:1.7.11" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.7.9" +"@rspack/binding-linux-arm64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.7.11" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.7.9" +"@rspack/binding-linux-arm64-musl@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.7.11" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.7.9" +"@rspack/binding-linux-x64-gnu@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.7.11" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-linux-x64-musl@npm:1.7.9" +"@rspack/binding-linux-x64-musl@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-linux-x64-musl@npm:1.7.11" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-wasm32-wasi@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-wasm32-wasi@npm:1.7.9" +"@rspack/binding-wasm32-wasi@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-wasm32-wasi@npm:1.7.11" dependencies: "@napi-rs/wasm-runtime": "npm:1.0.7" conditions: cpu=wasm32 languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.7.9" +"@rspack/binding-win32-arm64-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.7.11" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.7.9" +"@rspack/binding-win32-ia32-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.7.11" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.7.9" +"@rspack/binding-win32-x64-msvc@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.7.11" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.7.9": - version: 1.7.9 - resolution: "@rspack/binding@npm:1.7.9" +"@rspack/binding@npm:1.7.11": + version: 1.7.11 + resolution: "@rspack/binding@npm:1.7.11" dependencies: - "@rspack/binding-darwin-arm64": "npm:1.7.9" - "@rspack/binding-darwin-x64": "npm:1.7.9" - "@rspack/binding-linux-arm64-gnu": "npm:1.7.9" - "@rspack/binding-linux-arm64-musl": "npm:1.7.9" - "@rspack/binding-linux-x64-gnu": "npm:1.7.9" - "@rspack/binding-linux-x64-musl": "npm:1.7.9" - "@rspack/binding-wasm32-wasi": "npm:1.7.9" - "@rspack/binding-win32-arm64-msvc": "npm:1.7.9" - "@rspack/binding-win32-ia32-msvc": "npm:1.7.9" - "@rspack/binding-win32-x64-msvc": "npm:1.7.9" + "@rspack/binding-darwin-arm64": "npm:1.7.11" + "@rspack/binding-darwin-x64": "npm:1.7.11" + "@rspack/binding-linux-arm64-gnu": "npm:1.7.11" + "@rspack/binding-linux-arm64-musl": "npm:1.7.11" + "@rspack/binding-linux-x64-gnu": "npm:1.7.11" + "@rspack/binding-linux-x64-musl": "npm:1.7.11" + "@rspack/binding-wasm32-wasi": "npm:1.7.11" + "@rspack/binding-win32-arm64-msvc": "npm:1.7.11" + "@rspack/binding-win32-ia32-msvc": "npm:1.7.11" + "@rspack/binding-win32-x64-msvc": "npm:1.7.11" dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -3131,23 +3131,23 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 10/2a723c2fdcd322b3d2229825640d4174fc82e009c87c5b5ca1d4b400477731f57b799dde74a1bc81a7207d0dce75f9c956443684986b0d673d8e44e8a5470398 + checksum: 10/750e779db78376a29275e22a20eb0342feb487ece923f433432c6c0f5348bb6a3ed015c32a8150cd61ad48e3a63ec664fe0bde376d40bfefc00eb17c969fea2d languageName: node linkType: hard -"@rspack/core@npm:~1.7.5": - version: 1.7.9 - resolution: "@rspack/core@npm:1.7.9" +"@rspack/core@npm:~1.7.10": + version: 1.7.11 + resolution: "@rspack/core@npm:1.7.11" dependencies: "@module-federation/runtime-tools": "npm:0.22.0" - "@rspack/binding": "npm:1.7.9" + "@rspack/binding": "npm:1.7.11" "@rspack/lite-tapable": "npm:1.1.0" peerDependencies: "@swc/helpers": ">=0.5.1" peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/f75ddd35d1ba8daae5c41b9a839a81999bc09043bff4741750f1fca03ea60862d19d57019758a94dbf0b9a0a2b97c18f6e1e06962b279f93a815fbe5ca9fae57 + checksum: 10/52a999c6bebe511495b05dbee4bd4400fe5575ed3d417f81b86109d385babebe0f4d80a8498c8ffe4d545dbe7afd2fa92066e1ef38ea75871d5550dbfbf66b73 languageName: node linkType: hard @@ -3638,12 +3638,12 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:^0.5.18": - version: 0.5.19 - resolution: "@swc/helpers@npm:0.5.19" +"@swc/helpers@npm:^0.5.20": + version: 0.5.23 + resolution: "@swc/helpers@npm:0.5.23" dependencies: tslib: "npm:^2.8.0" - checksum: 10/3fd365fb3265f97e1241bcbcea9bfa5e15e03c630424e1b54597e00d30be2c271cb0c74f45e1739c6bc5ae892647302fab412de5138941aa96e66aebf4586700 + checksum: 10/899c9761e827d5bf504bd02067596cfe59ad6c7d6b6f0691a2fb05acf3e6c2954ddece7e15d4a6a81e8d95c81500652e6abec326c6c9bbb50bc3e2141696de43 languageName: node linkType: hard @@ -4661,8 +4661,8 @@ __metadata: resolution: "admin-logs@workspace:Dnn.AdminExperience/ClientSide/AdminLogs.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" @@ -6861,8 +6861,8 @@ __metadata: resolution: "dnn-sitegroups@workspace:Dnn.AdminExperience/ClientSide/SiteGroups.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" eslint: "npm:10.2.1" @@ -6881,8 +6881,8 @@ __metadata: resolution: "dnn-sites-list-view@workspace:Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" @@ -6905,8 +6905,8 @@ __metadata: resolution: "dnn-users-exportables@workspace:Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" @@ -8238,8 +8238,8 @@ __metadata: resolution: "export-bundle@workspace:Dnn.AdminExperience/ClientSide/Bundle.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" @@ -8277,8 +8277,8 @@ __metadata: resolution: "extensions@workspace:Dnn.AdminExperience/ClientSide/Extensions.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" @@ -10837,9 +10837,9 @@ __metadata: languageName: node linkType: hard -"less-loader@npm:^12.3.2": - version: 12.3.2 - resolution: "less-loader@npm:12.3.2" +"less-loader@npm:^12.3.3": + version: 12.3.3 + resolution: "less-loader@npm:12.3.3" peerDependencies: "@rspack/core": 0.x || ^1.0.0 || ^2.0.0-0 less: ^3.5.0 || ^4.0.0 @@ -10849,11 +10849,11 @@ __metadata: optional: true webpack: optional: true - checksum: 10/9018d0dae852d99370b7202b548b34334b1a069123bae3717b20143290f17fb639da4f6fd9894b659e100af603f03d1eb74922d6b761e8ba91d1f758d692459a + checksum: 10/915c194b53816959d6fbeee248fd89eb21e597a415c4d4e24c909a95e25968cedda01d8e6da0f3751f7e5f36cc39309c04024058b17a1db36e1124d5c933b63e languageName: node linkType: hard -"less@npm:4.6.4, less@npm:^4.6.3": +"less@npm:4.6.4, less@npm:^4.6.4": version: 4.6.4 resolution: "less@npm:4.6.4" dependencies: @@ -10935,8 +10935,8 @@ __metadata: resolution: "licensing@workspace:Dnn.AdminExperience/ClientSide/Licensing.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:2.2.3" @@ -12685,8 +12685,8 @@ __metadata: resolution: "pages@workspace:Dnn.AdminExperience/ClientSide/Pages.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" "@types/knockout": "npm:^3.4.77" @@ -13558,8 +13558,8 @@ __metadata: resolution: "prompt@workspace:Dnn.AdminExperience/ClientSide/Prompt.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:2.2.3" @@ -14411,6 +14411,13 @@ __metadata: languageName: node linkType: hard +"reduce-configs@npm:^1.1.2": + version: 1.1.2 + resolution: "reduce-configs@npm:1.1.2" + checksum: 10/68dbd2350cefc71dfbc0b4d028a51876391313c580d4330801290ccd36aff42980b2e8a0045aa7796901f9c5bfe82b86b1b41de8386299c13ac0df89b45e6d77 + languageName: node + linkType: hard + "redux-devtools-dock-monitor@npm:1.2.0, redux-devtools-dock-monitor@npm:^1.2.0": version: 1.2.0 resolution: "redux-devtools-dock-monitor@npm:1.2.0" @@ -14759,8 +14766,8 @@ __metadata: resolution: "roles@workspace:Dnn.AdminExperience/ClientSide/Roles.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:^2.2.3" @@ -15243,8 +15250,8 @@ __metadata: resolution: "security-settings@workspace:Dnn.AdminExperience/ClientSide/Security.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" @@ -15349,8 +15356,8 @@ __metadata: resolution: "seo@workspace:Dnn.AdminExperience/ClientSide/Seo.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" @@ -15407,8 +15414,8 @@ __metadata: resolution: "servers@workspace:Dnn.AdminExperience/ClientSide/Servers.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" "@types/react": "npm:^19.2.2" @@ -15623,8 +15630,8 @@ __metadata: resolution: "site-import-export@workspace:Dnn.AdminExperience/ClientSide/SiteImportExport.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" @@ -15658,8 +15665,8 @@ __metadata: resolution: "site-settings@workspace:Dnn.AdminExperience/ClientSide/SiteSettings.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:2.2.3" @@ -15692,8 +15699,8 @@ __metadata: resolution: "sites@workspace:Dnn.AdminExperience/ClientSide/Sites.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" eslint: "npm:10.2.1" @@ -16466,8 +16473,8 @@ __metadata: resolution: "task-scheduler@workspace:Dnn.AdminExperience/ClientSide/TaskScheduler.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:2.2.3" @@ -16494,8 +16501,8 @@ __metadata: resolution: "taxonomy@workspace:Dnn.AdminExperience/ClientSide/Vocabularies.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" array.prototype.find: "npm:2.2.3" @@ -16554,8 +16561,8 @@ __metadata: resolution: "themes@workspace:Dnn.AdminExperience/ClientSide/Themes.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" @@ -17323,8 +17330,8 @@ __metadata: resolution: "users@workspace:Dnn.AdminExperience/ClientSide/Users.Web" dependencies: "@dnnsoftware/dnn-react-common": "npm:10.3.3" - "@rsbuild/core": "npm:^1.7.3" - "@rsbuild/plugin-less": "npm:^1.6.2" + "@rsbuild/core": "npm:^1.7.5" + "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" eslint: "npm:10.2.1" From dc3294884ecf30e5ed03f05df92e8b48a55dfb94 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:53:48 -0500 Subject: [PATCH 036/109] Bump stencil Bump @stencil/core from 4.43.3 to 4.43.5 Bump @stencil/eslint-plugin from 1.2.0 to 1.3.1 --- .../ResourceManager.Web/package.json | 4 ++-- .../ClientSide/Styles.Web/package.json | 4 ++-- yarn.lock | 24 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index efa2d4a6ab2..e517298f08c 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -30,8 +30,8 @@ "devDependencies": { "@dnncommunity/dnn-elements": "^0.29.2", "@eslint/js": "^9.39.4", - "@stencil/core": "^4.43.3", - "@stencil/eslint-plugin": "^1.2.0", + "@stencil/core": "^4.43.5", + "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@stencil/store": "^2.2.2", "@types/node": "^24.9.0", diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index 97ef7d8e45c..5639445b337 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -27,11 +27,11 @@ "lint": "eslint --fix" }, "dependencies": { - "@stencil/core": "^4.43.3" + "@stencil/core": "^4.43.5" }, "devDependencies": { "@dnncommunity/dnn-elements": "^0.29.2", - "@stencil/eslint-plugin": "^1.2.0", + "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@types/node": "^24.9.0", "@typescript-eslint/eslint-plugin": "^8.57.2", diff --git a/yarn.lock b/yarn.lock index 148a0e97bf0..e8d0f4a4cb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3278,9 +3278,9 @@ __metadata: languageName: node linkType: hard -"@stencil/core@npm:^4.43.3": - version: 4.43.3 - resolution: "@stencil/core@npm:4.43.3" +"@stencil/core@npm:^4.43.5": + version: 4.43.5 + resolution: "@stencil/core@npm:4.43.5" dependencies: "@rollup/rollup-darwin-arm64": "npm:4.44.0" "@rollup/rollup-darwin-x64": "npm:4.44.0" @@ -3309,13 +3309,13 @@ __metadata: optional: true bin: stencil: bin/stencil - checksum: 10/7f9ef5d1ee80040554239eb9b1e1f5e5febcdcdfab52570acd1a405e4290139fe70e3f9beecb92081a50ec00f6c55460ff0d74b80f89934da33c24f1d71884b3 + checksum: 10/e4edcc9e981c76675b83a14745cc80f0b685aee2aea4398a3f929feaa1d5f277d65331ef0dbc5cb2cdcb1d305b8116923e67d1d0d95c8d449f51c488910b6b0c languageName: node linkType: hard -"@stencil/eslint-plugin@npm:^1.2.0": - version: 1.2.0 - resolution: "@stencil/eslint-plugin@npm:1.2.0" +"@stencil/eslint-plugin@npm:^1.3.1": + version: 1.3.1 + resolution: "@stencil/eslint-plugin@npm:1.3.1" dependencies: eslint-utils: "npm:^3.0.0" jsdom: "npm:^27.0.1" @@ -3326,7 +3326,7 @@ __metadata: eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 eslint-plugin-react: ^7.37.4 typescript: ^4.9.4 || ^5.0.0 - checksum: 10/24afef8e31def142940baab04e3f00d4c7a651a8079ee0f80d7dd048fda2f73825f776e1e6f4a58714cef3606e4c5c64fbffe37dbbcd06890006f3814b3da524 + checksum: 10/40a975814916581991a76ca8d8cc59e98330771a24a50e4e81e7fa2c59edb972c8da135b1b205526f13d05b74af76b7f8d9d42f5b1381f673d0cbeb17db59322 languageName: node linkType: hard @@ -6843,8 +6843,8 @@ __metadata: dependencies: "@dnncommunity/dnn-elements": "npm:^0.29.2" "@eslint/js": "npm:^9.39.4" - "@stencil/core": "npm:^4.43.3" - "@stencil/eslint-plugin": "npm:^1.2.0" + "@stencil/core": "npm:^4.43.5" + "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" "@stencil/store": "npm:^2.2.2" "@types/node": "npm:^24.9.0" @@ -16325,8 +16325,8 @@ __metadata: resolution: "styles@workspace:Dnn.AdminExperience/ClientSide/Styles.Web" dependencies: "@dnncommunity/dnn-elements": "npm:^0.29.2" - "@stencil/core": "npm:^4.43.3" - "@stencil/eslint-plugin": "npm:^1.2.0" + "@stencil/core": "npm:^4.43.5" + "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" "@types/node": "npm:^24.9.0" "@typescript-eslint/eslint-plugin": "npm:^8.57.2" From 87194fc97c2a06246609cef7317b74c855db160a Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:54:21 -0500 Subject: [PATCH 037/109] Bump @eslint/compat from 2.0.3 to 2.1.0 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 21 ++++++------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 01a7fb086cb..f4d5c249c09 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -46,7 +46,7 @@ "throttle-debounce": "^5.0.2" }, "devDependencies": { - "@eslint/compat": "^2.0.3", + "@eslint/compat": "^2.1.0", "@rsbuild/core": "^1.7.5", "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", diff --git a/yarn.lock b/yarn.lock index e8d0f4a4cb6..635c6f18773 100644 --- a/yarn.lock +++ b/yarn.lock @@ -515,7 +515,7 @@ __metadata: version: 0.0.0-use.local resolution: "@dnnsoftware/dnn-react-common@workspace:Dnn.AdminExperience/ClientSide/Dnn.React.Common" dependencies: - "@eslint/compat": "npm:^2.0.3" + "@eslint/compat": "npm:^2.1.0" "@rsbuild/core": "npm:^1.7.5" "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" @@ -981,17 +981,17 @@ __metadata: languageName: node linkType: hard -"@eslint/compat@npm:^2.0.3": - version: 2.0.3 - resolution: "@eslint/compat@npm:2.0.3" +"@eslint/compat@npm:^2.1.0": + version: 2.1.0 + resolution: "@eslint/compat@npm:2.1.0" dependencies: - "@eslint/core": "npm:^1.1.1" + "@eslint/core": "npm:^1.2.1" peerDependencies: eslint: ^8.40 || 9 || 10 peerDependenciesMeta: eslint: optional: true - checksum: 10/9f1fba334228c4e5f181b49d1ed15c395a54aacde63066c21642553182cc1fd4b258b2d2fccc8d1717ea7b23dfa017e3a26c91ef0c482a5b769b57136e9fe9a6 + checksum: 10/e868afc209242b168e287ede744f52c4158cec3fb61dd269d88df919ee812f1d08ec09075bb74d2e130a4f8fc1768bbb2fd151d3da43e88987c3df1633255190 languageName: node linkType: hard @@ -1015,15 +1015,6 @@ __metadata: languageName: node linkType: hard -"@eslint/core@npm:^1.1.1": - version: 1.1.1 - resolution: "@eslint/core@npm:1.1.1" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10/e847dd70b4398ba9e732ff50cc14a47114531d6e746c345278998881e6714ca665a1af0056694a18e48d87adec77c5b595b5badde1e55f6671ed5afe731701f7 - languageName: node - linkType: hard - "@eslint/core@npm:^1.2.1": version: 1.2.1 resolution: "@eslint/core@npm:1.2.1" From ea18d08c262391cefe58fafb721299a18fb53abb Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:55:48 -0500 Subject: [PATCH 038/109] Bump storybook from 10.3.3 to 10.4.2 Bump storybook-react-rsbuild from 3.3.2 to 3.3.4 Bump @storybook/addon-docs from 10.4.1 to 10.4.2 Bump @storybook/addon-onboarding from 10.3.3 to 10.4.2 --- .../ClientSide/Dnn.React.Common/package.json | 8 +- yarn.lock | 843 ++++++++++++++---- 2 files changed, 687 insertions(+), 164 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index f4d5c249c09..f6a27e83d5e 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -51,8 +51,8 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", - "@storybook/addon-docs": "10.4.1", - "@storybook/addon-onboarding": "10.3.3", + "@storybook/addon-docs": "10.4.2", + "@storybook/addon-onboarding": "10.4.2", "create-react-class": "^15.7.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", @@ -72,8 +72,8 @@ "react-dom": "^16.14.0", "react-hot-loader": "^4.13.1", "react-test-renderer": "^17.0.2", - "storybook": "10.3.3", - "storybook-react-rsbuild": "^3.3.2", + "storybook": "10.4.2", + "storybook-react-rsbuild": "^3.3.4", "typescript": "^5.9.3" }, "peerDependencies": { diff --git a/yarn.lock b/yarn.lock index 635c6f18773..fb1af7ee5c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -520,8 +520,8 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" - "@storybook/addon-docs": "npm:10.4.1" - "@storybook/addon-onboarding": "npm:10.3.3" + "@storybook/addon-docs": "npm:10.4.2" + "@storybook/addon-onboarding": "npm:10.4.2" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" dompurify: "npm:^3.3.3" @@ -559,8 +559,8 @@ __metadata: react-widgets: "npm:^5.8.6" redux-undo: "npm:^1.0.0-beta9" scroll: "npm:^3.0.1" - storybook: "npm:10.3.3" - storybook-react-rsbuild: "npm:^3.3.2" + storybook: "npm:10.4.2" + storybook-react-rsbuild: "npm:^3.3.4" throttle-debounce: "npm:^5.0.2" typescript: "npm:^5.9.3" peerDependencies: @@ -571,6 +571,26 @@ __metadata: languageName: unknown linkType: soft +"@emnapi/core@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/core@npm:1.10.0" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10/d32f386084e64deaf2609aabb8295d1ad5af6144d0f46d2060b76cc53f1f3b486df54bec9b0f33c37d85a3822e1193ebcd4e3deb4a5f0e4cd650aa2ffc631715 + languageName: node + linkType: hard + +"@emnapi/core@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/core@npm:1.9.2" + dependencies: + "@emnapi/wasi-threads": "npm:1.2.1" + tslib: "npm:^2.4.0" + checksum: 10/32084861f306b405f10f3ae13d1a49fa75650bdaaa40704892c397856815fe5d3781670d2662806d39c2d8a19bb62826dd7b870a79858f7be77500d9d0d3d91a + languageName: node + linkType: hard + "@emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.7.1": version: 1.9.0 resolution: "@emnapi/core@npm:1.9.0" @@ -581,6 +601,24 @@ __metadata: languageName: node linkType: hard +"@emnapi/runtime@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/runtime@npm:1.10.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/d21083d07fa0c2da171c142e78ef986b66b07d45b06accc0bcaf49fcc61bb4dbc10e1c1760813070165b9f49b054376a931045347f21c0f42ff1eb2d2040faac + languageName: node + linkType: hard + +"@emnapi/runtime@npm:1.9.2": + version: 1.9.2 + resolution: "@emnapi/runtime@npm:1.9.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/de123d6b7acdbe34bf997523be761e5ae6d8f9b3967b72e8e50ff7dd1791a2a0d2b9fb0d7d92230b0738502980ea6f947189b7c1f47814ff666515a55c6fff48 + languageName: node + linkType: hard + "@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.7.1": version: 1.9.0 resolution: "@emnapi/runtime@npm:1.9.0" @@ -599,6 +637,15 @@ __metadata: languageName: node linkType: hard +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/57cd4292be81c05d26aa886d68a9e4c449ff666e8503fed6463dfc6b64a4e4213f03c152d53296b7cda32840271e38cd33347332070658f01befeb9bf4e59f36 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.27.4": version: 0.27.4 resolution: "@esbuild/aix-ppc64@npm:0.27.4" @@ -1783,106 +1830,106 @@ __metadata: languageName: node linkType: hard -"@jsonjoy.com/fs-core@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-core@npm:4.56.11" +"@jsonjoy.com/fs-core@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-core@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" thingies: "npm:^2.5.0" peerDependencies: tslib: 2 - checksum: 10/46adecf53d79246eed43503e999f3068b38d6c5b209e305c5b6ca55cfbb68fd2780a2fe3ddc2de3535c51a6db76e4acaca67dc127d1ce54399cf786a5ccbd4ca + checksum: 10/b41df62364871c7b7e27a474204a062a1d7309b1ce5191827bb6826c7a3ed92e9b2fa6e72c590acbe99c29d1ccb0351e210e6039f9296c2ffcc07b31a202a868 languageName: node linkType: hard -"@jsonjoy.com/fs-fsa@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-fsa@npm:4.56.11" +"@jsonjoy.com/fs-fsa@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-fsa@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-core": "npm:4.56.11" - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" + "@jsonjoy.com/fs-core": "npm:4.57.6" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" thingies: "npm:^2.5.0" peerDependencies: tslib: 2 - checksum: 10/ed322ec4596f0b385d17dfeca6f2e1c2de51aa7c356f092700ad7b8930816f27f7f49234ba5eb544f03d173ea3cf5f9509597a5c64f0c03d2c4c456b751e2a16 + checksum: 10/d1af5e6982620d4c8d3cbbf335bc217b695a654598c7eb3ddb39f61bfba6a2e4766baab7650bde516f22f4040c4282e6ed21f68613e4958abf0dbb6decab6ec0 languageName: node linkType: hard -"@jsonjoy.com/fs-node-builtins@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-node-builtins@npm:4.56.11" +"@jsonjoy.com/fs-node-builtins@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-node-builtins@npm:4.57.6" peerDependencies: tslib: 2 - checksum: 10/04ca8c56cd3b883149b42cce5d9376d18445a071b6d88c5366f930c2ba93505a7d708ad8f5af1a15e691dd87ffb971048b906450287d5faf363472ced43ea884 + checksum: 10/ad32e47c2c73c6fb8e7183c21069418dc4b7f5c7329f1f2a8c3d2fb5d52095891074de89ea1cae1398e925228124aae62386d110df0239140aaf168e7c299904 languageName: node linkType: hard -"@jsonjoy.com/fs-node-to-fsa@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.56.11" +"@jsonjoy.com/fs-node-to-fsa@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-fsa": "npm:4.56.11" - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" + "@jsonjoy.com/fs-fsa": "npm:4.57.6" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" peerDependencies: tslib: 2 - checksum: 10/e4e8b6ea18969665925b97055cb06636fbd74e5025cd126280ede2245ba2efe328146e0b7a5e45c45a64175dc74231caa982de4dda51bffb061c028c931f2fad + checksum: 10/2193bf7a03ddf618ed5b7683ebca257b3160a02012f6e0029ede6b2199f1f03fb8863bf239dff1ac1662d18be978baaa542c3af1b5ffa1a3e3e4adf88c7cd607 languageName: node linkType: hard -"@jsonjoy.com/fs-node-utils@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-node-utils@npm:4.56.11" +"@jsonjoy.com/fs-node-utils@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-node-utils@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" peerDependencies: tslib: 2 - checksum: 10/72ca92de077c34d26c935b1ec6011de587bc2f382e822d9e57c76318d506f3c40f5075d04ede666b59d45e275e577ea77032a10b48161483040f3e3f7c381232 + checksum: 10/47f7f04a45b86a896d2878cff05e2d257c6dea5bb48f942541d1946f60b6407e8d82617a5422ef4f6157730ed571b313da2dce7570811189219d387e81358fd3 languageName: node linkType: hard -"@jsonjoy.com/fs-node@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-node@npm:4.56.11" +"@jsonjoy.com/fs-node@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-node@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-core": "npm:4.56.11" - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" - "@jsonjoy.com/fs-print": "npm:4.56.11" - "@jsonjoy.com/fs-snapshot": "npm:4.56.11" + "@jsonjoy.com/fs-core": "npm:4.57.6" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" + "@jsonjoy.com/fs-print": "npm:4.57.6" + "@jsonjoy.com/fs-snapshot": "npm:4.57.6" glob-to-regex.js: "npm:^1.0.0" thingies: "npm:^2.5.0" peerDependencies: tslib: 2 - checksum: 10/a6a7e84de467d644bd2b23f34afaf61e93eb05245f40325a067403d2af5b4b22adce806639b80ff0f8431049dda706a803e6f73f2bf944d73a1ad78ac04bbd15 + checksum: 10/477f1fbdd526cada69df3b660a66746251d04481078c53da0de8f853f3eeaaab877c84bd81b508abed5b06089a9fdb6fbb12d725db5a44115767be5948baa2e7 languageName: node linkType: hard -"@jsonjoy.com/fs-print@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-print@npm:4.56.11" +"@jsonjoy.com/fs-print@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-print@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" tree-dump: "npm:^1.1.0" peerDependencies: tslib: 2 - checksum: 10/352fb4932c0ed44b5fb148b253754748b6d3e9859452ef1b03cebb6b9601e9f84336ef0932ca4de9687b2f3ec703083d4572c7bf2036537f787673229c3ed68b + checksum: 10/86107978fdc36562b7b4bf01d65c7f0a5a50329d7eb8e07dab8fde579fa07dd8568ae247fe1f17eac6c965b51e248457fbb57d82ff94fbb5be3ff1c4033ecfa4 languageName: node linkType: hard -"@jsonjoy.com/fs-snapshot@npm:4.56.11": - version: 4.56.11 - resolution: "@jsonjoy.com/fs-snapshot@npm:4.56.11" +"@jsonjoy.com/fs-snapshot@npm:4.57.6": + version: 4.57.6 + resolution: "@jsonjoy.com/fs-snapshot@npm:4.57.6" dependencies: "@jsonjoy.com/buffers": "npm:^17.65.0" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" "@jsonjoy.com/json-pack": "npm:^17.65.0" "@jsonjoy.com/util": "npm:^17.65.0" peerDependencies: tslib: 2 - checksum: 10/97665962c5bf609720ac2913111da540235fa8aed52241e017da16ae2ac0228ae9e1938906d51e61f85fdaa0511c46db22b3c8212c9ba77a0ae4082cd20e4d57 + checksum: 10/1b264e92a7084f0e740becdbbf63d93097ae809b02e4bd256f69c466a86f7e046f6cd7b68897acaacb425f453ebb1fac72ef1c8b7833e305a27564b303484033 languageName: node linkType: hard @@ -2087,6 +2134,18 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.1.4 + resolution: "@napi-rs/wasm-runtime@npm:1.1.4" + dependencies: + "@tybys/wasm-util": "npm:^0.10.1" + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10/1db3dc7eeb981306b09360487bd8ce4dfa5588d273bd8ea9f07dccca1b4ade57b675414180fc9bb66966c6c50b17208b0263194993e2f7f92cc7af28bda4d1af + languageName: node + linkType: hard + "@npmcli/agent@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/agent@npm:3.0.0" @@ -2556,6 +2615,150 @@ __metadata: languageName: node linkType: hard +"@oxc-parser/binding-android-arm-eabi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.127.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-android-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-android-arm64@npm:0.127.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-arm64@npm:0.127.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-darwin-x64@npm:0.127.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-freebsd-x64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-freebsd-x64@npm:0.127.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.127.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.127.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.127.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.127.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.127.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.127.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.127.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-gnu@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-musl@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.127.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-openharmony-arm64@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.127.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-wasm32-wasi@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.127.0" + dependencies: + "@emnapi/core": "npm:1.9.2" + "@emnapi/runtime": "npm:1.9.2" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.127.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-x64-msvc@npm:0.127.0": + version: 0.127.0 + resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.127.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@oxc-project/types@npm:=0.122.0": version: 0.122.0 resolution: "@oxc-project/types@npm:0.122.0" @@ -2563,6 +2766,150 @@ __metadata: languageName: node linkType: hard +"@oxc-project/types@npm:^0.127.0": + version: 0.127.0 + resolution: "@oxc-project/types@npm:0.127.0" + checksum: 10/f154f4720367186aed63a16fb1395f9039d4e6872265fe9e6b5eacc02fb2b948f9ea6c5f85efd3a015ea28aa8c31232b7a8301218ae28651659e46dd0c4f2031 + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm-eabi@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-android-arm-eabi@npm:11.20.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-android-arm64@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-android-arm64@npm:11.20.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-arm64@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-darwin-arm64@npm:11.20.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-darwin-x64@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-darwin-x64@npm:11.20.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-freebsd-x64@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-freebsd-x64@npm:11.20.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-arm-gnueabihf@npm:11.20.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm-musleabihf@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-arm-musleabihf@npm:11.20.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-gnu@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-arm64-gnu@npm:11.20.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-arm64-musl@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-arm64-musl@npm:11.20.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-ppc64-gnu@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-ppc64-gnu@npm:11.20.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-gnu@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-riscv64-gnu@npm:11.20.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-riscv64-musl@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-riscv64-musl@npm:11.20.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-s390x-gnu@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-s390x-gnu@npm:11.20.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-gnu@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-x64-gnu@npm:11.20.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-resolver/binding-linux-x64-musl@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-linux-x64-musl@npm:11.20.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-resolver/binding-openharmony-arm64@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-openharmony-arm64@npm:11.20.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-wasm32-wasi@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-wasm32-wasi@npm:11.20.0" + dependencies: + "@emnapi/core": "npm:1.10.0" + "@emnapi/runtime": "npm:1.10.0" + "@napi-rs/wasm-runtime": "npm:^1.1.4" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-arm64-msvc@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-win32-arm64-msvc@npm:11.20.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-resolver/binding-win32-x64-msvc@npm:11.20.0": + version: 11.20.0 + resolution: "@oxc-resolver/binding-win32-x64-msvc@npm:11.20.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@parcel/watcher-android-arm64@npm:2.5.1": version: 2.5.1 resolution: "@parcel/watcher-android-arm64@npm:2.5.1" @@ -2998,20 +3345,20 @@ __metadata: languageName: node linkType: hard -"@rsbuild/plugin-type-check@npm:^1.3.3": - version: 1.3.4 - resolution: "@rsbuild/plugin-type-check@npm:1.3.4" +"@rsbuild/plugin-type-check@npm:^1.3.4": + version: 1.3.6 + resolution: "@rsbuild/plugin-type-check@npm:1.3.6" dependencies: deepmerge: "npm:^4.3.1" json5: "npm:^2.2.3" - reduce-configs: "npm:^1.1.1" - ts-checker-rspack-plugin: "npm:^1.3.0" + reduce-configs: "npm:^1.1.2" + ts-checker-rspack-plugin: "npm:^1.3.1" peerDependencies: - "@rsbuild/core": ^1.0.0 || ^2.0.0-0 + "@rsbuild/core": ^1.0.0 || ^2.0.0 peerDependenciesMeta: "@rsbuild/core": optional: true - checksum: 10/8b70c91c8da74da6729a1bc46cfc9104d5921ef05e7779c30edf4c678d6346d7917d284696b3ce020518e8b564f07bd81ce66b476acc411719554f9f44fe3f52 + checksum: 10/d43b56b79584f9f9187c570a875ead74811a122772f96c98e5594f8d9444c84d4311dce53b7edfcd8a18c99713597d0c7f3bef894e465961ce1af989436a7683 languageName: node linkType: hard @@ -3142,13 +3489,20 @@ __metadata: languageName: node linkType: hard -"@rspack/lite-tapable@npm:1.1.0, @rspack/lite-tapable@npm:^1.1.0, @rspack/lite-tapable@npm:~1.1.0": +"@rspack/lite-tapable@npm:1.1.0, @rspack/lite-tapable@npm:~1.1.0": version: 1.1.0 resolution: "@rspack/lite-tapable@npm:1.1.0" checksum: 10/41ff73fe5e1b8dccaad746c9c1bd36dd67649e1ad35776f311b5ba94333a397704e11158579e25a6a7e677c51abe35e66987b1b000faef48d4e4ad2470fea150 languageName: node linkType: hard +"@rspack/lite-tapable@npm:^1.1.1": + version: 1.1.2 + resolution: "@rspack/lite-tapable@npm:1.1.2" + checksum: 10/3c2893308641c6e5aed919b061e704920162a0cb4f2e635b410d3e45a50c20b57d600b6445143c518a1d3d66b8d53b5d194601db5da356460c8d05eade30a70a + languageName: node + linkType: hard + "@rspack/plugin-react-refresh@npm:^1.6.1": version: 1.6.1 resolution: "@rspack/plugin-react-refresh@npm:1.6.1" @@ -3341,45 +3695,45 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:10.4.1": - version: 10.4.1 - resolution: "@storybook/addon-docs@npm:10.4.1" +"@storybook/addon-docs@npm:10.4.2": + version: 10.4.2 + resolution: "@storybook/addon-docs@npm:10.4.2" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:10.4.1" + "@storybook/csf-plugin": "npm:10.4.2" "@storybook/icons": "npm:^2.0.2" - "@storybook/react-dom-shim": "npm:10.4.1" + "@storybook/react-dom-shim": "npm:10.4.2" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.1 + storybook: ^10.4.2 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/fca5f745305addea4e452c43d15fe741eb4be1305c607df4239cdefc5b89e433c5f53748ff46de7bdbb61d16fb0f178ac2fe6c8902b0d7d24d94dc50d7b0f8bf + checksum: 10/592685928bcdcebc35e9e9dab5c14230115713f1c2636923709b001ad714609c3d18b1d0b18b205546ab0808880795315fb4c5ec8b9a34106a6d0797dd1fd93f languageName: node linkType: hard -"@storybook/addon-onboarding@npm:10.3.3": - version: 10.3.3 - resolution: "@storybook/addon-onboarding@npm:10.3.3" +"@storybook/addon-onboarding@npm:10.4.2": + version: 10.4.2 + resolution: "@storybook/addon-onboarding@npm:10.4.2" peerDependencies: - storybook: ^10.3.3 - checksum: 10/4021718d05fca37663c232ada54a03a2248ff35dcd28826101c0dd62fb9264df731213c3bd01804e9ffcc9a00d92a1e0569d11d42a2b6c1d4e0704ec4a062c86 + storybook: ^10.4.2 + checksum: 10/0350125acf46483e168a660972d056df4054d5f23e88c26ddc46a3b5880a734a884c186cbfa9697b8a06c0c5f7de0b60e4bc0725d2127f57b80654038d69e6fe languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.4.1": - version: 10.4.1 - resolution: "@storybook/csf-plugin@npm:10.4.1" +"@storybook/csf-plugin@npm:10.4.2": + version: 10.4.2 + resolution: "@storybook/csf-plugin@npm:10.4.2" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.4.1 + storybook: ^10.4.2 vite: "*" webpack: "*" peerDependenciesMeta: @@ -3391,7 +3745,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10/f0eed41eaee31fe8c5774fc338f14f4b3fdc2fc301f4124ad5e6c421f9066cec47db7036eb8a5921a96a11fd5d885fc5cc4c219b0de66488cd5511b443bb9507 + checksum: 10/e27bb2f21ae727f95df8e2e9c2f16f29382e046fa37ed2b6dcb55c178a055847f8d23ed9973d0d9eb2db30fcfc976b2526403c913b83c99bb170fcc05f9a9bc4 languageName: node linkType: hard @@ -3402,16 +3756,6 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^2.0.1": - version: 2.0.1 - resolution: "@storybook/icons@npm:2.0.1" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/04ffa285f4defc611def51f82492688bc49f6f4e8ce4e7ba5c99a1c1410b7e8820b5da65c33610a497df2409de7b48fae399052c5cacab6a4a4a9b48a36ebfd5 - languageName: node - linkType: hard - "@storybook/icons@npm:^2.0.2": version: 2.0.2 resolution: "@storybook/icons@npm:2.0.2" @@ -3440,52 +3784,47 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:10.3.0": - version: 10.3.0 - resolution: "@storybook/react-dom-shim@npm:10.3.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.0 - checksum: 10/a90729ccc3f6d96b0443c22ea1ae6934699de9d535e00a97a39cc8b16c9381a594cd15c6230dd4bd703441be1eb62a56f14f8763538a6f58ac3da7b2686e9c62 - languageName: node - linkType: hard - -"@storybook/react-dom-shim@npm:10.4.1": - version: 10.4.1 - resolution: "@storybook/react-dom-shim@npm:10.4.1" +"@storybook/react-dom-shim@npm:10.4.2": + version: 10.4.2 + resolution: "@storybook/react-dom-shim@npm:10.4.2" peerDependencies: "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.1 + storybook: ^10.4.2 peerDependenciesMeta: "@types/react": optional: true "@types/react-dom": optional: true - checksum: 10/704d895680d3ef6f4fc9d6393a1cb696fb0fbba3938ca500584b57df800bdfa325c920fd2a227493ffa76472a2e87e09074add99d027989684a161d08feabacd + checksum: 10/c9372988275733e5b5fc009e866a5d95a39026c9d7eb3ef4c8234066a049f7772871cc6b5f8abc07f5932752eca7739da1d04e740122b26a79d1299c7c854097 languageName: node linkType: hard -"@storybook/react@npm:^10.2.17": - version: 10.3.0 - resolution: "@storybook/react@npm:10.3.0" +"@storybook/react@npm:^10.3.5": + version: 10.4.2 + resolution: "@storybook/react@npm:10.4.2" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:10.3.0" + "@storybook/react-dom-shim": "npm:10.4.2" react-docgen: "npm:^8.0.2" react-docgen-typescript: "npm:^2.2.2" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.3.0 + storybook: ^10.4.2 typescript: ">= 4.9.x" peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true typescript: optional: true - checksum: 10/db2950ac275c427dfde38b8f992acb7c81fc1c2f1950a046d63777299d74bb235c3bdabd1556adffd9494524098cc727b7973596bb3a8d9167168057d046720a + checksum: 10/4e1a90058fc02ac4fb91750a1619f3a578a55e829dfef8e38da63e6c9af36e7fc17f86a3e54ee5e2d8d91698eb80db3cb22383e88e537c2987bbba69ca04c1b5 languageName: node linkType: hard @@ -4542,6 +4881,13 @@ __metadata: languageName: node linkType: hard +"@webcontainer/env@npm:^1.1.1": + version: 1.1.1 + resolution: "@webcontainer/env@npm:1.1.1" + checksum: 10/c3cd2c207bc2948dce91fa900aa1c6541832075021b720bda01043596359142bc7dd75670608aa7b6f5075d6ae63748a0f90b24e554e1a04ee69b968551eef66 + languageName: node + linkType: hard + "@yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" @@ -8547,7 +8893,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.0.0, fs-extra@npm:^11.2.0, fs-extra@npm:^11.3.3": +"fs-extra@npm:^11.0.0, fs-extra@npm:^11.2.0": version: 11.3.4 resolution: "fs-extra@npm:11.3.4" dependencies: @@ -8558,6 +8904,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.3.5": + version: 11.3.5 + resolution: "fs-extra@npm:11.3.5" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 10/dc8408818eec8b03efad8742d079ecab749a2f7bc9f208e429b447fcac7632fae52e09312d6d42218efe7e2efa97f03ff232d639ade4aa7fcd8c00ebe9ad0c0c + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -11487,18 +11844,18 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^4.56.10": - version: 4.56.11 - resolution: "memfs@npm:4.56.11" +"memfs@npm:^4.57.3": + version: 4.57.6 + resolution: "memfs@npm:4.57.6" dependencies: - "@jsonjoy.com/fs-core": "npm:4.56.11" - "@jsonjoy.com/fs-fsa": "npm:4.56.11" - "@jsonjoy.com/fs-node": "npm:4.56.11" - "@jsonjoy.com/fs-node-builtins": "npm:4.56.11" - "@jsonjoy.com/fs-node-to-fsa": "npm:4.56.11" - "@jsonjoy.com/fs-node-utils": "npm:4.56.11" - "@jsonjoy.com/fs-print": "npm:4.56.11" - "@jsonjoy.com/fs-snapshot": "npm:4.56.11" + "@jsonjoy.com/fs-core": "npm:4.57.6" + "@jsonjoy.com/fs-fsa": "npm:4.57.6" + "@jsonjoy.com/fs-node": "npm:4.57.6" + "@jsonjoy.com/fs-node-builtins": "npm:4.57.6" + "@jsonjoy.com/fs-node-to-fsa": "npm:4.57.6" + "@jsonjoy.com/fs-node-utils": "npm:4.57.6" + "@jsonjoy.com/fs-print": "npm:4.57.6" + "@jsonjoy.com/fs-snapshot": "npm:4.57.6" "@jsonjoy.com/json-pack": "npm:^1.11.0" "@jsonjoy.com/util": "npm:^1.9.0" glob-to-regex.js: "npm:^1.0.1" @@ -11507,7 +11864,7 @@ __metadata: tslib: "npm:^2.0.0" peerDependencies: tslib: 2 - checksum: 10/2d99bce59dee0f5c96a039851892e39c09c1eee11d8978cf37dbb93462d706d842d6a5b0b3d5081d47f19883ed4b6d973c8086301a9155b098b80d66c3e79cb7 + checksum: 10/c0ad44206287b8e98c0c0ceb50d2928f6186cf33b5db1bcef62da45b6b520b5dc239bd0037f993242b0621a2f035b961725a9aa2dd054fafca79a3f7d7957038 languageName: node linkType: hard @@ -12470,6 +12827,142 @@ __metadata: languageName: node linkType: hard +"oxc-parser@npm:^0.127.0": + version: 0.127.0 + resolution: "oxc-parser@npm:0.127.0" + dependencies: + "@oxc-parser/binding-android-arm-eabi": "npm:0.127.0" + "@oxc-parser/binding-android-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-arm64": "npm:0.127.0" + "@oxc-parser/binding-darwin-x64": "npm:0.127.0" + "@oxc-parser/binding-freebsd-x64": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-arm64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-riscv64-musl": "npm:0.127.0" + "@oxc-parser/binding-linux-s390x-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-gnu": "npm:0.127.0" + "@oxc-parser/binding-linux-x64-musl": "npm:0.127.0" + "@oxc-parser/binding-openharmony-arm64": "npm:0.127.0" + "@oxc-parser/binding-wasm32-wasi": "npm:0.127.0" + "@oxc-parser/binding-win32-arm64-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-ia32-msvc": "npm:0.127.0" + "@oxc-parser/binding-win32-x64-msvc": "npm:0.127.0" + "@oxc-project/types": "npm:^0.127.0" + dependenciesMeta: + "@oxc-parser/binding-android-arm-eabi": + optional: true + "@oxc-parser/binding-android-arm64": + optional: true + "@oxc-parser/binding-darwin-arm64": + optional: true + "@oxc-parser/binding-darwin-x64": + optional: true + "@oxc-parser/binding-freebsd-x64": + optional: true + "@oxc-parser/binding-linux-arm-gnueabihf": + optional: true + "@oxc-parser/binding-linux-arm-musleabihf": + optional: true + "@oxc-parser/binding-linux-arm64-gnu": + optional: true + "@oxc-parser/binding-linux-arm64-musl": + optional: true + "@oxc-parser/binding-linux-ppc64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-musl": + optional: true + "@oxc-parser/binding-linux-s390x-gnu": + optional: true + "@oxc-parser/binding-linux-x64-gnu": + optional: true + "@oxc-parser/binding-linux-x64-musl": + optional: true + "@oxc-parser/binding-openharmony-arm64": + optional: true + "@oxc-parser/binding-wasm32-wasi": + optional: true + "@oxc-parser/binding-win32-arm64-msvc": + optional: true + "@oxc-parser/binding-win32-ia32-msvc": + optional: true + "@oxc-parser/binding-win32-x64-msvc": + optional: true + checksum: 10/1d2e2124b0bcf47c59721f6c340920008423f0f46bc44a5b03a5e83820cf8a21705ccdd615a979717e5a83080cb07294f3c2a17eab3fc486de481ba1d55b44c6 + languageName: node + linkType: hard + +"oxc-resolver@npm:^11.19.1": + version: 11.20.0 + resolution: "oxc-resolver@npm:11.20.0" + dependencies: + "@oxc-resolver/binding-android-arm-eabi": "npm:11.20.0" + "@oxc-resolver/binding-android-arm64": "npm:11.20.0" + "@oxc-resolver/binding-darwin-arm64": "npm:11.20.0" + "@oxc-resolver/binding-darwin-x64": "npm:11.20.0" + "@oxc-resolver/binding-freebsd-x64": "npm:11.20.0" + "@oxc-resolver/binding-linux-arm-gnueabihf": "npm:11.20.0" + "@oxc-resolver/binding-linux-arm-musleabihf": "npm:11.20.0" + "@oxc-resolver/binding-linux-arm64-gnu": "npm:11.20.0" + "@oxc-resolver/binding-linux-arm64-musl": "npm:11.20.0" + "@oxc-resolver/binding-linux-ppc64-gnu": "npm:11.20.0" + "@oxc-resolver/binding-linux-riscv64-gnu": "npm:11.20.0" + "@oxc-resolver/binding-linux-riscv64-musl": "npm:11.20.0" + "@oxc-resolver/binding-linux-s390x-gnu": "npm:11.20.0" + "@oxc-resolver/binding-linux-x64-gnu": "npm:11.20.0" + "@oxc-resolver/binding-linux-x64-musl": "npm:11.20.0" + "@oxc-resolver/binding-openharmony-arm64": "npm:11.20.0" + "@oxc-resolver/binding-wasm32-wasi": "npm:11.20.0" + "@oxc-resolver/binding-win32-arm64-msvc": "npm:11.20.0" + "@oxc-resolver/binding-win32-x64-msvc": "npm:11.20.0" + dependenciesMeta: + "@oxc-resolver/binding-android-arm-eabi": + optional: true + "@oxc-resolver/binding-android-arm64": + optional: true + "@oxc-resolver/binding-darwin-arm64": + optional: true + "@oxc-resolver/binding-darwin-x64": + optional: true + "@oxc-resolver/binding-freebsd-x64": + optional: true + "@oxc-resolver/binding-linux-arm-gnueabihf": + optional: true + "@oxc-resolver/binding-linux-arm-musleabihf": + optional: true + "@oxc-resolver/binding-linux-arm64-gnu": + optional: true + "@oxc-resolver/binding-linux-arm64-musl": + optional: true + "@oxc-resolver/binding-linux-ppc64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-gnu": + optional: true + "@oxc-resolver/binding-linux-riscv64-musl": + optional: true + "@oxc-resolver/binding-linux-s390x-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-gnu": + optional: true + "@oxc-resolver/binding-linux-x64-musl": + optional: true + "@oxc-resolver/binding-openharmony-arm64": + optional: true + "@oxc-resolver/binding-wasm32-wasi": + optional: true + "@oxc-resolver/binding-win32-arm64-msvc": + optional: true + "@oxc-resolver/binding-win32-x64-msvc": + optional: true + checksum: 10/920c70a96ac9fef6efb6a32932127b68cb7c8be6bbc34dcb7072cddf6a14d39b8360a3366b82816289e97303b67294d26faaf953d8324709234cf50106d09719 + languageName: node + linkType: hard + "p-finally@npm:^1.0.0": version: 1.0.0 resolution: "p-finally@npm:1.0.0" @@ -13866,7 +14359,7 @@ __metadata: languageName: node linkType: hard -"react-docgen@npm:^8.0.2": +"react-docgen@npm:^8.0.2, react-docgen@npm:^8.0.3": version: 8.0.3 resolution: "react-docgen@npm:8.0.3" dependencies: @@ -14395,13 +14888,6 @@ __metadata: languageName: node linkType: hard -"reduce-configs@npm:^1.1.1": - version: 1.1.1 - resolution: "reduce-configs@npm:1.1.1" - checksum: 10/aa11df7e3d3efb949b0286e641487f3b8c3e90edddb6483559a6d3dbbcb32ad259b38ffceff16e1db1f6753e192dffd0803b6dd291f66c2d437c510fed79a091 - languageName: node - linkType: hard - "reduce-configs@npm:^1.1.2": version: 1.1.2 resolution: "reduce-configs@npm:1.1.2" @@ -14648,7 +15134,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.1, resolve@npm:^1.22.11, resolve@npm:^1.22.4": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -14661,6 +15147,20 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.22.12": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/1d2a081e4b7198e2a70abd7bbbf8aea5380c2d074b6c870035aab50ebfb7312b6492b3588e752faef83a75147862a3d3e09b222bc9afd536804181fd3a515ef9 + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" @@ -14674,7 +15174,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: @@ -14687,6 +15187,20 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^1.22.12#optional!builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/f80ad2c2b6820331cbe079198a184ffce322cfeca140065118066276bc08b03d5fa2c1ce652aeb584ec74050d1f656f46f034cc0dd9300452c5ab7866907f8c0 + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" @@ -15985,18 +16499,18 @@ __metadata: languageName: node linkType: hard -"storybook-builder-rsbuild@npm:3.3.2": - version: 3.3.2 - resolution: "storybook-builder-rsbuild@npm:3.3.2" +"storybook-builder-rsbuild@npm:3.3.4": + version: 3.3.4 + resolution: "storybook-builder-rsbuild@npm:3.3.4" dependencies: - "@rsbuild/plugin-type-check": "npm:^1.3.3" + "@rsbuild/plugin-type-check": "npm:^1.3.4" "@vitest/mocker": "npm:3.2.4" browser-assert: "npm:^1.2.1" case-sensitive-paths-webpack-plugin: "npm:^2.4.0" cjs-module-lexer: "npm:^2.2.0" constants-browserify: "npm:^1.0.0" es-module-lexer: "npm:^1.7.0" - fs-extra: "npm:^11.3.3" + fs-extra: "npm:^11.3.5" magic-string: "npm:^0.30.21" path-browserify: "npm:^1.0.1" picocolors: "npm:^1.1.1" @@ -16011,7 +16525,7 @@ __metadata: "@rsbuild/core": ^1.5.0 || ^2.0.0-0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.1.0 + storybook: ^10.3.5 peerDependenciesMeta: react: optional: true @@ -16019,61 +16533,70 @@ __metadata: optional: true typescript: optional: true - checksum: 10/023e9b210d9e9cdf3fa9fe790799d095ca198f64ac941465497cbdf2a51ad244aaaa561357c76f7d925311eec52335074a64f69746a61a575e4705aa763537ec + checksum: 10/31431ce52b3f39741ef6382f5c3fe40a74c020975a40da1e9649df6f40574224bdb8ae1d573c111e6c1aa133bca07f5861cca9adb7898bda205c33b37665aba6 languageName: node linkType: hard -"storybook-react-rsbuild@npm:^3.3.2": - version: 3.3.2 - resolution: "storybook-react-rsbuild@npm:3.3.2" +"storybook-react-rsbuild@npm:^3.3.4": + version: 3.3.4 + resolution: "storybook-react-rsbuild@npm:3.3.4" dependencies: "@rollup/pluginutils": "npm:^5.3.0" - "@storybook/react": "npm:^10.2.17" + "@storybook/react": "npm:^10.3.5" "@storybook/react-docgen-typescript-plugin": "npm:^1.0.1" find-up: "npm:^5.0.0" magic-string: "npm:^0.30.21" - react-docgen: "npm:^8.0.2" + react-docgen: "npm:^8.0.3" react-docgen-typescript: "npm:^2.4.0" - resolve: "npm:^1.22.11" - storybook-builder-rsbuild: "npm:3.3.2" + resolve: "npm:^1.22.12" + storybook-builder-rsbuild: "npm:3.3.4" tsconfig-paths: "npm:^4.2.0" peerDependencies: "@rsbuild/core": ^1.5.0 || ^2.0.0-0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.1.0 + storybook: ^10.3.5 typescript: ">= 4.2.x" peerDependenciesMeta: typescript: optional: true - checksum: 10/f13a0d1a61505b8bd595128ea947727ab6f87572e7be892b7f3f748f4ef92f05c8a4abd24e29a3313aaf5a0d60677b95fd3e03c5b2f99ba1a6b352096035709d + checksum: 10/5800e411afb92ce0ae98e9d0a42cc240fe6daf86fd52d8911e4dc791e4031c2168ecdf5df08b234e13b9d9191758edc3a0dbc88ef3ae98e0e0fb2081981e2cbb languageName: node linkType: hard -"storybook@npm:10.3.3": - version: 10.3.3 - resolution: "storybook@npm:10.3.3" +"storybook@npm:10.4.2": + version: 10.4.2 + resolution: "storybook@npm:10.4.2" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^2.0.1" + "@storybook/icons": "npm:^2.0.2" "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" + "@webcontainer/env": "npm:^1.1.1" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" open: "npm:^10.2.0" + oxc-parser: "npm:^0.127.0" + oxc-resolver: "npm:^11.19.1" recast: "npm:^0.23.5" semver: "npm:^7.7.3" use-sync-external-store: "npm:^1.5.0" ws: "npm:^8.18.0" peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 prettier: ^2 || ^3 + vite-plus: ^0.1.15 peerDependenciesMeta: + "@types/react": + optional: true prettier: optional: true + vite-plus: + optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10/031b71d97bb8fdb695095e38f172556f36a0748c8ff6762fed64ab0e9a7036fd8a4ae40142c394b1028d053b4edb5949b43734eb737b628c2a60996756cbd0dc + checksum: 10/d92be1bb48bdd8bf804b3f8f02ca274d160b47bf62c35b7a9652d0391c3cc00a7a634ccd1c555b531afd4f009d0467015be52dcc1641cca54d93c870d44bf1c1 languageName: node linkType: hard @@ -16804,21 +17327,21 @@ __metadata: languageName: node linkType: hard -"ts-checker-rspack-plugin@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-checker-rspack-plugin@npm:1.3.0" +"ts-checker-rspack-plugin@npm:^1.3.1": + version: 1.3.2 + resolution: "ts-checker-rspack-plugin@npm:1.3.2" dependencies: - "@rspack/lite-tapable": "npm:^1.1.0" + "@rspack/lite-tapable": "npm:^1.1.1" chokidar: "npm:^3.6.0" - memfs: "npm:^4.56.10" + memfs: "npm:^4.57.3" picocolors: "npm:^1.1.1" peerDependencies: - "@rspack/core": ^1.0.0 || ^2.0.0-0 + "@rspack/core": ^1.0.0 || ^2.0.0 typescript: ">=3.8.0" peerDependenciesMeta: "@rspack/core": optional: true - checksum: 10/dfd19f2c210b8c6ee2255a6a6c7db30bcff08cb4664982f3c3edfc21ee78017b25ad1ce074e1a5ee9f7551291d4302debc53856d24dfcef1ca26209a9d997c18 + checksum: 10/0a7b7b1f882c080e09573cc2f96ea74ce4c5b3164912ac28191558ceed1bc215b66a50aed11a1db5a37325d50a0f26406df07e928f53a508c8b32fb3d06d504b languageName: node linkType: hard From d4742647f889a3b3b599e6c0fa8fe26b0e269cff Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:57:37 -0500 Subject: [PATCH 039/109] Bump typescript-eslint from 8.57.2 to 8.60.1 Bump @typescript-eslint/utils from 8.57.2 to 8.60.1 Bump @typescript-eslint/eslint-plugin from 8.57.2 to 8.60.1 Bump @typescript-eslint/parser from 8.57.2 to 8.60.1 --- .../ResourceManager.Web/package.json | 4 +- .../ClientSide/Styles.Web/package.json | 6 +- yarn.lock | 183 +++++++++--------- 3 files changed, 96 insertions(+), 97 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index e517298f08c..f2c4d8a03a6 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -35,10 +35,10 @@ "@stencil/sass": "^3.2.3", "@stencil/store": "^2.2.2", "@types/node": "^24.9.0", - "@typescript-eslint/utils": "^8.57.2", + "@typescript-eslint/utils": "^8.60.1", "eslint": "^10.2.1", "jiti": "^2.6.1", "typescript": "^5.9.3", - "typescript-eslint": "^8.57.2" + "typescript-eslint": "^8.60.1" } } diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index 5639445b337..b30a9c9bfb0 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -34,10 +34,10 @@ "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@types/node": "^24.9.0", - "@typescript-eslint/eslint-plugin": "^8.57.2", - "@typescript-eslint/parser": "^8.57.2", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", "eslint": "^10.2.1", "jiti": "^2.6.1", - "typescript-eslint": "^8.57.2" + "typescript-eslint": "^8.60.1" } } diff --git a/yarn.lock b/yarn.lock index fb1af7ee5c4..3051741eab5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4441,55 +4441,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.57.2, @typescript-eslint/eslint-plugin@npm:^8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/eslint-plugin@npm:8.57.2" +"@typescript-eslint/eslint-plugin@npm:8.60.1, @typescript-eslint/eslint-plugin@npm:^8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.60.1" dependencies: "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.57.2" - "@typescript-eslint/type-utils": "npm:8.57.2" - "@typescript-eslint/utils": "npm:8.57.2" - "@typescript-eslint/visitor-keys": "npm:8.57.2" + "@typescript-eslint/scope-manager": "npm:8.60.1" + "@typescript-eslint/type-utils": "npm:8.60.1" + "@typescript-eslint/utils": "npm:8.60.1" + "@typescript-eslint/visitor-keys": "npm:8.60.1" ignore: "npm:^7.0.5" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - "@typescript-eslint/parser": ^8.57.2 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10/0735281c26b1e9b3b9ccce3b872ef9eedcfbbffa6b766470de55735cd7a796b064376189378a65c19c62fa59f24187cecb563fb56d194129673be5cd8d3949e9 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/parser@npm:8.57.2" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.57.2" - "@typescript-eslint/types": "npm:8.57.2" - "@typescript-eslint/typescript-estree": "npm:8.57.2" - "@typescript-eslint/visitor-keys": "npm:8.57.2" - debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.5.0" peerDependencies: + "@typescript-eslint/parser": ^8.60.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10/c9a8a03767ac1b1e8d0bee938fb636b30b7043a776d20353b37be32011ed2b174aa906c27b574fe90bbc48d0235320a4339fb5868f02f5a262a58531e244e1f8 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/f3633bb2700bc32299578baeaf6650418656229be256147ba9d1ab09b34ef2b7fed83804ef4d2439e9189dbdcb89399d67bc8fea55262be6caa32114be048538 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^8.57.2": - version: 8.58.0 - resolution: "@typescript-eslint/parser@npm:8.58.0" +"@typescript-eslint/parser@npm:8.60.1, @typescript-eslint/parser@npm:^8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/parser@npm:8.60.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.58.0" - "@typescript-eslint/types": "npm:8.58.0" - "@typescript-eslint/typescript-estree": "npm:8.58.0" - "@typescript-eslint/visitor-keys": "npm:8.58.0" + "@typescript-eslint/scope-manager": "npm:8.60.1" + "@typescript-eslint/types": "npm:8.60.1" + "@typescript-eslint/typescript-estree": "npm:8.60.1" + "@typescript-eslint/visitor-keys": "npm:8.60.1" debug: "npm:^4.4.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10/0498e593b14841023b7495544637acaca84807de1ac17174fa9331af61ba35791da919e16680c6897002b4a843d5f0fe812c460a28a65fca7e3ae8e5971baf7a + checksum: 10/f9c484c4a3897015328f328a1c6ee778d113dd134201f635c0421cb72efe6e63f3a68524aff0df6e19e76ff93daf5cabd946e67f12f10dddcf19bda534aa68dc languageName: node linkType: hard @@ -4506,16 +4490,16 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/project-service@npm:8.58.0" +"@typescript-eslint/project-service@npm:8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/project-service@npm:8.60.1" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.58.0" - "@typescript-eslint/types": "npm:^8.58.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.60.1" + "@typescript-eslint/types": "npm:^8.60.1" debug: "npm:^4.4.3" peerDependencies: typescript: ">=4.8.4 <6.1.0" - checksum: 10/fab2601f76b2df61b09e3b7ff364d0e17e6d80e65e84e8a8d11f6a0813748bed3912da098659d00f46b1f277d462bd7529157182b72b5e2e0b41ee6176a0edd7 + checksum: 10/fec693dd79c3a1e6a24091127a37af4eb9d9cee8192cf2a434adae48543eadff834bc0623b5b563c8b592b250bc080570f9e7b42807252ea898442c525beeee9 languageName: node linkType: hard @@ -4529,13 +4513,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/scope-manager@npm:8.58.0" +"@typescript-eslint/scope-manager@npm:8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/scope-manager@npm:8.60.1" dependencies: - "@typescript-eslint/types": "npm:8.58.0" - "@typescript-eslint/visitor-keys": "npm:8.58.0" - checksum: 10/97293f1215faa785a3c1ee8d630591db9dcd5fb6bdcdd0b2e818c80478d41e59a05003fb33000530780dc466fb8cf662352932080ee7406c4aaac72af4000541 + "@typescript-eslint/types": "npm:8.60.1" + "@typescript-eslint/visitor-keys": "npm:8.60.1" + checksum: 10/7228c110410ff8cfc01e96d8f17c986f8b4dd447fe3a3291baaab8fe946026ccdf0291865f788f18cf538ab49bfc067fe797708b6b8590104a65f7e69f921cc5 languageName: node linkType: hard @@ -4548,28 +4532,28 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.58.0, @typescript-eslint/tsconfig-utils@npm:^8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.58.0" +"@typescript-eslint/tsconfig-utils@npm:8.60.1, @typescript-eslint/tsconfig-utils@npm:^8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.60.1" peerDependencies: typescript: ">=4.8.4 <6.1.0" - checksum: 10/4f47212c0e26e6b06e97044ec5e483007d5145ef6b205393a0b43cbc0b385c75c14ba5749d01cf7d1ff100332c2cf1d336f060f7d2191bb67fb892bb4446afaa + checksum: 10/afc78b19b856a71dc4e493f931ae44e1a91dc6441a14cb92e4063db880892f3874768f9d347d4b2f45362f2090e4455407c70f42027d77ddc85d6cba95cdb76c languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/type-utils@npm:8.57.2" +"@typescript-eslint/type-utils@npm:8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/type-utils@npm:8.60.1" dependencies: - "@typescript-eslint/types": "npm:8.57.2" - "@typescript-eslint/typescript-estree": "npm:8.57.2" - "@typescript-eslint/utils": "npm:8.57.2" + "@typescript-eslint/types": "npm:8.60.1" + "@typescript-eslint/typescript-estree": "npm:8.60.1" + "@typescript-eslint/utils": "npm:8.60.1" debug: "npm:^4.4.3" - ts-api-utils: "npm:^2.4.0" + ts-api-utils: "npm:^2.5.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10/9df6b587143b2dd3f9fc17dab74e877013cc3ce21a7266af6d85bef05b4602103aa2c0d612a69f479225b67f089dad2a92f8ebbd474a9df0a256caeaa5aa165b + typescript: ">=4.8.4 <6.1.0" + checksum: 10/6f426263be597063831bf308e52328e8d387af5db955a09cb85fde1c72f5b1b36a365133b9c9a74330e5e948e59bf9a9b82605f4c9c4e3bf9b6cb7f4c37e4b18 languageName: node linkType: hard @@ -4580,10 +4564,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.58.0, @typescript-eslint/types@npm:^8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/types@npm:8.58.0" - checksum: 10/c68eac0bc25812fdbb2ed4a121e42bfca9f24f3c6be95f6a9c4e7b9af767f1bcfacd6d496e358166143e0a1801dc7d042ce1b5e69946ac2768d9114ff6b8d375 +"@typescript-eslint/types@npm:8.60.1, @typescript-eslint/types@npm:^8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/types@npm:8.60.1" + checksum: 10/c603417e621b5b1263c2f60fad9e202d560fd07fce7f40e9a356c0530e5eaf0ff1a9af865237bf93aa18a5a4e2f034ee0cce0fe6c070f08df33e35a099bdea47 languageName: node linkType: hard @@ -4606,14 +4590,14 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.58.0" +"@typescript-eslint/typescript-estree@npm:8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.60.1" dependencies: - "@typescript-eslint/project-service": "npm:8.58.0" - "@typescript-eslint/tsconfig-utils": "npm:8.58.0" - "@typescript-eslint/types": "npm:8.58.0" - "@typescript-eslint/visitor-keys": "npm:8.58.0" + "@typescript-eslint/project-service": "npm:8.60.1" + "@typescript-eslint/tsconfig-utils": "npm:8.60.1" + "@typescript-eslint/types": "npm:8.60.1" + "@typescript-eslint/visitor-keys": "npm:8.60.1" debug: "npm:^4.4.3" minimatch: "npm:^10.2.2" semver: "npm:^7.7.3" @@ -4621,11 +4605,26 @@ __metadata: ts-api-utils: "npm:^2.5.0" peerDependencies: typescript: ">=4.8.4 <6.1.0" - checksum: 10/4d6c4175e8a4d5c097393d161016836cc322f090c3f69fd751f5bbc25afce64df9ea0c97cee8b36ac060e06dc2cca2a4de7a0c7e04e19727cc4bd98ab3291fed + checksum: 10/9c3a56266aadf589bc6e770cd04cb3f55b1ee1507dcacda61866408c656ae4462aa7e11baf39eb939bc4d1e3b843cf58e60f3ebdeb3e75f042ff0f6fb39c311b languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.57.2, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0, @typescript-eslint/utils@npm:^8.57.2": +"@typescript-eslint/utils@npm:8.60.1, @typescript-eslint/utils@npm:^8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/utils@npm:8.60.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.60.1" + "@typescript-eslint/types": "npm:8.60.1" + "@typescript-eslint/typescript-estree": "npm:8.60.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/a75f8714995b6280b4c15ca957bbc6634862453461111e4a2a07b8bc72b51a504484a9b957fc5b7a646c4bf09f1e414a0c52cd3b6798c42fb8c4de83b1b5a364 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0": version: 8.57.2 resolution: "@typescript-eslint/utils@npm:8.57.2" dependencies: @@ -4650,13 +4649,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.58.0": - version: 8.58.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.58.0" +"@typescript-eslint/visitor-keys@npm:8.60.1": + version: 8.60.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.60.1" dependencies: - "@typescript-eslint/types": "npm:8.58.0" + "@typescript-eslint/types": "npm:8.60.1" eslint-visitor-keys: "npm:^5.0.0" - checksum: 10/50b0779e19079dedf3723323a4dfa398c639b3da48f2fcf071c22ca69342e03592f1726d68ea59b9b5a51f14ab112eabc5c93fd2579c84b02a3320042ae20066 + checksum: 10/6d120b4a790477ae0291e69f6457686c71b929cc40519148f6b6c7fbc09604b15821ae8cf1005aa23acec5105b4016db256a68d68f30eda8d6c24d4fdb0ede86 languageName: node linkType: hard @@ -7185,11 +7184,11 @@ __metadata: "@stencil/sass": "npm:^3.2.3" "@stencil/store": "npm:^2.2.2" "@types/node": "npm:^24.9.0" - "@typescript-eslint/utils": "npm:^8.57.2" + "@typescript-eslint/utils": "npm:^8.60.1" eslint: "npm:^10.2.1" jiti: "npm:^2.6.1" typescript: "npm:^5.9.3" - typescript-eslint: "npm:^8.57.2" + typescript-eslint: "npm:^8.60.1" languageName: unknown linkType: soft @@ -16843,11 +16842,11 @@ __metadata: "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" "@types/node": "npm:^24.9.0" - "@typescript-eslint/eslint-plugin": "npm:^8.57.2" - "@typescript-eslint/parser": "npm:^8.57.2" + "@typescript-eslint/eslint-plugin": "npm:^8.60.1" + "@typescript-eslint/parser": "npm:^8.60.1" eslint: "npm:^10.2.1" jiti: "npm:^2.6.1" - typescript-eslint: "npm:^8.57.2" + typescript-eslint: "npm:^8.60.1" languageName: unknown linkType: soft @@ -17538,18 +17537,18 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.57.2": - version: 8.57.2 - resolution: "typescript-eslint@npm:8.57.2" +"typescript-eslint@npm:^8.60.1": + version: 8.60.1 + resolution: "typescript-eslint@npm:8.60.1" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.57.2" - "@typescript-eslint/parser": "npm:8.57.2" - "@typescript-eslint/typescript-estree": "npm:8.57.2" - "@typescript-eslint/utils": "npm:8.57.2" + "@typescript-eslint/eslint-plugin": "npm:8.60.1" + "@typescript-eslint/parser": "npm:8.60.1" + "@typescript-eslint/typescript-estree": "npm:8.60.1" + "@typescript-eslint/utils": "npm:8.60.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10/3318365ec367c3fba225a055bb582b12f0c21cf5449309503320fe09658a1498d707bde87c8fc603bc8d439c3e953f0f048f996368eb0f59a6db534a4a54491e + typescript: ">=4.8.4 <6.1.0" + checksum: 10/e12091ab2540b817c76b0ec6aad92e341f810310bec2b24bc95780aee106049c05363998f6ea52ed066130c8afc41dca1627f56e4c1df1dd519f4d4ca0ce4910 languageName: node linkType: hard From 9d5a637b22520dfacb66326777df9950d1cdacbd Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:58:25 -0500 Subject: [PATCH 040/109] Bump vite from 8.0.2 to 8.0.16 Bump @vitejs/plugin-react from 6.0.1 to 6.0.2 --- .../Dnn.ContactList.SpaReact/package.json | 4 +- yarn.lock | 238 +++++++++--------- 2 files changed, 128 insertions(+), 114 deletions(-) diff --git a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json index 729dee88c45..c00b90d1741 100644 --- a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json +++ b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json @@ -17,8 +17,8 @@ "devDependencies": { "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^6.0.1", + "@vitejs/plugin-react": "^6.0.2", "typescript": "^5.9.3", - "vite": "^8.0.2" + "vite": "^8.0.16" } } diff --git a/yarn.lock b/yarn.lock index 3051741eab5..6b66eace60c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -591,7 +591,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0, @emnapi/core@npm:^1.7.1": +"@emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0": version: 1.9.0 resolution: "@emnapi/core@npm:1.9.0" dependencies: @@ -619,7 +619,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0, @emnapi/runtime@npm:^1.7.1": +"@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0": version: 1.9.0 resolution: "@emnapi/runtime@npm:1.9.0" dependencies: @@ -2123,17 +2123,6 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.1": - version: 1.1.1 - resolution: "@napi-rs/wasm-runtime@npm:1.1.1" - dependencies: - "@emnapi/core": "npm:^1.7.1" - "@emnapi/runtime": "npm:^1.7.1" - "@tybys/wasm-util": "npm:^0.10.1" - checksum: 10/080e7f2aefb84e09884d21c650a2cbafdf25bfd2634693791b27e36eec0ddaa3c1656a943f8c913ac75879a0b04e68f8a827897ee655ab54a93169accf05b194 - languageName: node - linkType: hard - "@napi-rs/wasm-runtime@npm:^1.1.4": version: 1.1.4 resolution: "@napi-rs/wasm-runtime@npm:1.1.4" @@ -2759,10 +2748,10 @@ __metadata: languageName: node linkType: hard -"@oxc-project/types@npm:=0.122.0": - version: 0.122.0 - resolution: "@oxc-project/types@npm:0.122.0" - checksum: 10/2b33895c7701a595d10b9c7b0927222954becc4c6cbde7a7b582e9524828937368baacba1cbb6e3c33bc9a18e0a35435ffff6c53f511762ae872d55d3e993a8c +"@oxc-project/types@npm:=0.133.0": + version: 0.133.0 + resolution: "@oxc-project/types@npm:0.133.0" + checksum: 10/de44f653a9e0c0267309122f1f184120c6869af4382218a6bf4a320c5150743eb00b5e8641b04917666281995ed0fe6381561922a48a28082a75bb122acf3ac6 languageName: node linkType: hard @@ -3086,124 +3075,119 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.12" +"@rolldown/binding-android-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-android-arm64@npm:1.0.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.12" +"@rolldown/binding-darwin-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.12" +"@rolldown/binding-darwin-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.12" +"@rolldown/binding-freebsd-x64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.3" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.12" +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.12" +"@rolldown/binding-linux-arm64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.12" +"@rolldown/binding-linux-arm64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.12" +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.12" +"@rolldown/binding-linux-s390x-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.12" +"@rolldown/binding-linux-x64-gnu@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.12" +"@rolldown/binding-linux-x64-musl@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.12" +"@rolldown/binding-openharmony-arm64@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.3" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.12" +"@rolldown/binding-wasm32-wasi@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.3" dependencies: - "@napi-rs/wasm-runtime": "npm:^1.1.1" + "@emnapi/core": "npm:1.10.0" + "@emnapi/runtime": "npm:1.10.0" + "@napi-rs/wasm-runtime": "npm:^1.1.4" conditions: cpu=wasm32 languageName: node linkType: hard -"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.12" +"@rolldown/binding-win32-arm64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.12" +"@rolldown/binding-win32-x64-msvc@npm:1.0.3": + version: 1.0.3 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.12" - checksum: 10/6ce1601849b3095a2b6e57074c1f8a661eba67ebf65cf9afdf894d903302318247ddb69ab6cbc621e7f582408af301ea0523ed59ddb9a4ef3ea97f3d7002683e - languageName: node - linkType: hard - -"@rolldown/pluginutils@npm:1.0.0-rc.7": - version: 1.0.0-rc.7 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.7" - checksum: 10/92853a53b75d665da0b4cc3f855c87e606dda6b8d55e929fd08b4428b68ea833afbb140ba25c6c1f9856a739e419fd2929ef15ac0fd05b44e904705be34efe1f +"@rolldown/pluginutils@npm:^1.0.0": + version: 1.0.1 + resolution: "@rolldown/pluginutils@npm:1.0.1" + checksum: 10/4e95cf9ce23d75e5aa03ea0249cd86f7d1e21f83fbf6f8520e4edd8a251ba1b82c4ba9bc13cd24b6c4661daec6225b06e6d35c64c604e731b230b2a49af47d05 languageName: node linkType: hard @@ -4801,11 +4785,11 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^6.0.1": - version: 6.0.1 - resolution: "@vitejs/plugin-react@npm:6.0.1" +"@vitejs/plugin-react@npm:^6.0.2": + version: 6.0.2 + resolution: "@vitejs/plugin-react@npm:6.0.2" dependencies: - "@rolldown/pluginutils": "npm:1.0.0-rc.7" + "@rolldown/pluginutils": "npm:^1.0.0" peerDependencies: "@rolldown/plugin-babel": ^0.1.7 || ^0.2.0 babel-plugin-react-compiler: ^1.0.0 @@ -4815,7 +4799,7 @@ __metadata: optional: true babel-plugin-react-compiler: optional: true - checksum: 10/a525799252fa6c12bf9a0a367b17dfc3d5e8e02ec0b5b81554db9d97b764c554be6b0686e3dd385b0ac0350f0c023120ce712d79feedd99fa2cb854b7cd1e960 + checksum: 10/4b3693e94c1907aac699df34fa71c8d5d53228b110f7520dcaca56c96c7127772e806147fa9d2f15edfc64cdefbe13b28c4c71e058601f7311d303ad435701c6 languageName: node linkType: hard @@ -7293,12 +7277,12 @@ __metadata: dependencies: "@types/react": "npm:^18.3.5" "@types/react-dom": "npm:^18.3.0" - "@vitejs/plugin-react": "npm:^6.0.1" + "@vitejs/plugin-react": "npm:^6.0.2" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-router: "npm:^7.13.1" typescript: "npm:^5.9.3" - vite: "npm:^8.0.2" + vite: "npm:^8.0.16" languageName: unknown linkType: soft @@ -12164,6 +12148,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 10/6eec280694e2088d18fb802b1e3bfc4578e27b665b7ecfbe36c7356612fea2f814277056e671e2a1529dff551588a652efdc0bfa39f8a3185bc2247be311872e + languageName: node + linkType: hard + "nanoid@npm:^5.1.7": version: 5.1.7 resolution: "nanoid@npm:5.1.7" @@ -13936,6 +13929,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.15": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" + dependencies: + nanoid: "npm:^3.3.12" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/d02ad19eb1e0fa53a1229ee6d53807eb88f903f2b9a8cac66993367f3ac7dd3b97238c783a54ccbf4145f82f6ca9a5cbd58f089846285d759c8a3259fbea8318 + languageName: node + linkType: hard + "prefix-style@npm:2.0.1": version: 2.0.1 resolution: "prefix-style@npm:2.0.1" @@ -15292,27 +15296,27 @@ __metadata: languageName: unknown linkType: soft -"rolldown@npm:1.0.0-rc.12": - version: 1.0.0-rc.12 - resolution: "rolldown@npm:1.0.0-rc.12" - dependencies: - "@oxc-project/types": "npm:=0.122.0" - "@rolldown/binding-android-arm64": "npm:1.0.0-rc.12" - "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.12" - "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.12" - "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-s390x-gnu": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.12" - "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.12" - "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.12" - "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.12" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.12" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.12" - "@rolldown/pluginutils": "npm:1.0.0-rc.12" +"rolldown@npm:1.0.3": + version: 1.0.3 + resolution: "rolldown@npm:1.0.3" + dependencies: + "@oxc-project/types": "npm:=0.133.0" + "@rolldown/binding-android-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-arm64": "npm:1.0.3" + "@rolldown/binding-darwin-x64": "npm:1.0.3" + "@rolldown/binding-freebsd-x64": "npm:1.0.3" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.3" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.3" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.3" + "@rolldown/binding-linux-x64-musl": "npm:1.0.3" + "@rolldown/binding-openharmony-arm64": "npm:1.0.3" + "@rolldown/binding-wasm32-wasi": "npm:1.0.3" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.3" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.3" + "@rolldown/pluginutils": "npm:^1.0.0" dependenciesMeta: "@rolldown/binding-android-arm64": optional: true @@ -15345,8 +15349,8 @@ __metadata: "@rolldown/binding-win32-x64-msvc": optional: true bin: - rolldown: bin/cli.mjs - checksum: 10/b8cc0d9df80b495a57b63d69a16a5566c600162046edd407f335a6d27e5b6618a2d88d63e82c4e77a1447d18edcc6900696e041c33236ef38ab51d33cf5da2fe + rolldown: ./bin/cli.mjs + checksum: 10/4dbe2c055104c47c15c051b713068cf4660acd473841904d3f7118f730922b2e498176610a45826cbc1ffe36842a29a076385d3bfcd5acb0f7ef8ad06b8feefb languageName: node linkType: hard @@ -17164,6 +17168,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.17": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.4" + checksum: 10/f85e8a217d675c3f78d5f0ad25ea4557e7e023ed13ddc2b014da10bd0312eea53a34cd52356af07ccdff777f1243012547656282a4ca70936f68bf5065fbaa71 + languageName: node + linkType: hard + "tinyrainbow@npm:^2.0.0": version: 2.0.0 resolution: "tinyrainbow@npm:2.0.0" @@ -17948,19 +17962,19 @@ __metadata: languageName: node linkType: hard -"vite@npm:^8.0.2": - version: 8.0.5 - resolution: "vite@npm:8.0.5" +"vite@npm:^8.0.16": + version: 8.0.16 + resolution: "vite@npm:8.0.16" dependencies: fsevents: "npm:~2.3.3" lightningcss: "npm:^1.32.0" picomatch: "npm:^4.0.4" - postcss: "npm:^8.5.8" - rolldown: "npm:1.0.0-rc.12" - tinyglobby: "npm:^0.2.15" + postcss: "npm:^8.5.15" + rolldown: "npm:1.0.3" + tinyglobby: "npm:^0.2.17" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 - "@vitejs/devtools": ^0.1.0 + "@vitejs/devtools": ^0.1.18 esbuild: ^0.27.0 || ^0.28.0 jiti: ">=1.21.0" less: ^4.0.0 @@ -18001,7 +18015,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/eca1ddd6309193a80a8c82607e672df3fecff88d3639382c6eaaf4c3094accd0412c16e2f1cc4a25c835f055133325eaa0355e484d4c253ffb015a7d83d68250 + checksum: 10/a5d91d26f6110672a292a06ca161af9a58279fe9d27106c8c0afb725a942b0b47091c440c3b1e7ebc8e0fe901f64ac6a2ffee3cdae2f899339686dbecd0c0266 languageName: node linkType: hard From 9a31537b0fd3e25f08026b5149043a090c358bfc Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 10:58:51 -0500 Subject: [PATCH 041/109] Bump zip-lib from 1.3.1 to 1.3.4 --- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 28 +++++++++--------------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index e0b91261fcb..a573d49efa5 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -28,7 +28,7 @@ "sass-embedded": "^1.98.0", "tsx": "^4.21.0", "typescript": "^5.9.3", - "zip-lib": "^1.3.1" + "zip-lib": "^1.3.4" }, "browserslist": [ "last 2 versions", diff --git a/yarn.lock b/yarn.lock index 6b66eace60c..b8122988b95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5150,7 +5150,7 @@ __metadata: sass-embedded: "npm:^1.98.0" tsx: "npm:^4.21.0" typescript: "npm:^5.9.3" - zip-lib: "npm:^1.3.1" + zip-lib: "npm:^1.3.4" languageName: unknown linkType: soft @@ -5784,13 +5784,6 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10/06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -18434,13 +18427,12 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^3.2.1": - version: 3.2.1 - resolution: "yauzl@npm:3.2.1" +"yauzl@npm:^3.3.1": + version: 3.4.0 + resolution: "yauzl@npm:3.4.0" dependencies: - buffer-crc32: "npm:~0.2.3" pend: "npm:~1.2.0" - checksum: 10/15dfae75fbfe59c6a1b7a2cb27a995cda0ee70549d32d6b19937e84897436170f169f6bbefc34b9e9beb9c9114a1b8a8a40e7687a907909a19681ebcbf35a1f3 + checksum: 10/76c1ca208478135dcd0b9f8baaa2e40a761652e0ec793c5a6bdeb973118f9720adc487f388e8394b4cfb73ae1976083ff58be4ea0ec60e060ffc9cf232db2c0a languageName: node linkType: hard @@ -18467,12 +18459,12 @@ __metadata: languageName: node linkType: hard -"zip-lib@npm:^1.3.1": - version: 1.3.1 - resolution: "zip-lib@npm:1.3.1" +"zip-lib@npm:^1.3.4": + version: 1.3.4 + resolution: "zip-lib@npm:1.3.4" dependencies: - yauzl: "npm:^3.2.1" + yauzl: "npm:^3.3.1" yazl: "npm:^3.3.1" - checksum: 10/5f9a3988fc02545f3b3c19ab10cab9726bb91e625bff409fbcc001605356bb233b488a76673449386676acd649fe940aee813e3da3584d945c0b43c51d8c028d + checksum: 10/fd6c6b052f06131ea4efb843414d2538b1f5764b19054d5e43bbdae797110fdfdcdb958e6062e42d97dcc99e2c8ed6e7f55f8f50dee7cb1c6ac82f6271aebf26 languageName: node linkType: hard From d693b191fa06089f3b9522d913de849b8cea9d5b Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:00:14 -0500 Subject: [PATCH 042/109] Bump @types packages --- DNN Platform/Dnn.ClientSide/package.json | 2 +- .../ResourceManager.Web/package.json | 2 +- .../Dnn.ContactList.SpaReact/package.json | 4 +- DNN Platform/Skins/Aperture/package.json | 4 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 4 +- .../ClientSide/Styles.Web/package.json | 2 +- yarn.lock | 84 ++++++++++--------- 8 files changed, 55 insertions(+), 49 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 033e3b5a6ed..0a83aadd577 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -17,7 +17,7 @@ "not dead" ], "devDependencies": { - "@types/node": "^24.9.0", + "@types/node": "^25.9.2", "@types/postcss-import": "^14.0.3", "autoprefixer": "^10.4.27", "chokidar": "^4.0.3", diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index f2c4d8a03a6..35cef334190 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -34,7 +34,7 @@ "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@stencil/store": "^2.2.2", - "@types/node": "^24.9.0", + "@types/node": "^25.9.2", "@typescript-eslint/utils": "^8.60.1", "eslint": "^10.2.1", "jiti": "^2.6.1", diff --git a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json index c00b90d1741..14129529257 100644 --- a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json +++ b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json @@ -15,8 +15,8 @@ "react-router": "^7.13.1" }, "devDependencies": { - "@types/react": "^18.3.5", - "@types/react-dom": "^18.3.0", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "typescript": "^5.9.3", "vite": "^8.0.16" diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index a573d49efa5..2e0db4d65e8 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -14,8 +14,8 @@ "normalize.css": "^8.0.1" }, "devDependencies": { - "@types/browser-sync": "^2.29.0", - "@types/node": "^24.9.0", + "@types/browser-sync": "^2.29.1", + "@types/node": "^25.9.2", "@types/postcss-import": "^14.0.3", "browser-sync": "^3.0.4", "chokidar": "^4.0.3", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 6978d266a3c..f8b42484319 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -23,7 +23,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", - "@types/knockout": "^3.4.77", + "@types/knockout": "^3.4.79", "@types/redux": "3.6.31", "create-react-class": "^15.7.0", "enzyme": "^3.11.0", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 2c8db2e7db3..802c234686e 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -14,8 +14,8 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", "@types/redux": "^3.6.31", "create-react-class": "^15.7.0", "dayjs": "^1.11.20", diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index b30a9c9bfb0..fda028ff492 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -33,7 +33,7 @@ "@dnncommunity/dnn-elements": "^0.29.2", "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", - "@types/node": "^24.9.0", + "@types/node": "^25.9.2", "@typescript-eslint/eslint-plugin": "^8.60.1", "@typescript-eslint/parser": "^8.60.1", "eslint": "^10.2.1", diff --git a/yarn.lock b/yarn.lock index b8122988b95..efc1cb176aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4067,15 +4067,15 @@ __metadata: languageName: node linkType: hard -"@types/browser-sync@npm:^2.29.0": - version: 2.29.0 - resolution: "@types/browser-sync@npm:2.29.0" +"@types/browser-sync@npm:^2.29.1": + version: 2.29.1 + resolution: "@types/browser-sync@npm:2.29.1" dependencies: "@types/micromatch": "npm:^2" "@types/node": "npm:*" "@types/serve-static": "npm:*" chokidar: "npm:^3.0.0" - checksum: 10/90ca672de942fcf6d65b9c527bed6b8bc77a945ec62bf401778029a0c82476518c46e9988b3535192e201113c001abf05ca752a9a91c6b084cfdfbbfc71caf17 + checksum: 10/4f7ddccc7a1a8599fcc18e6c710307188e923a0e570fbd60e62b03944f362d783615d40662f52178380be6d8629473fd1191e86e2305509d07ca39361c47000e languageName: node linkType: hard @@ -4206,10 +4206,10 @@ __metadata: languageName: node linkType: hard -"@types/knockout@npm:^3.4.77": - version: 3.4.77 - resolution: "@types/knockout@npm:3.4.77" - checksum: 10/0b3ec7d0151ac5dbd4ecaf6579f46c341a3a08b6a92c90acad7a82fdff6962179fd1680640a8aa571d95076e5259c2ef1732bd3314cd6277afd8ae619b6d8dfe +"@types/knockout@npm:^3.4.79": + version: 3.4.79 + resolution: "@types/knockout@npm:3.4.79" + checksum: 10/858132cd469458c0a49708b14bba8052f5f3aa7d692819ec364d0d60fbad9557e0e9993800e6109ff80a5272d247e47585bbd78d02430f5d2445788cbf6292a7 languageName: node linkType: hard @@ -4259,7 +4259,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:^24.9.0": +"@types/node@npm:*, @types/node@npm:>=10.0.0": version: 24.9.0 resolution: "@types/node@npm:24.9.0" dependencies: @@ -4268,6 +4268,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^25.9.2": + version: 25.9.2 + resolution: "@types/node@npm:25.9.2" + dependencies: + undici-types: "npm:>=7.24.0 <7.24.7" + checksum: 10/4ec76a3c9d51866cea5c6a5b17d52a2113b387e7fa812303bf20cc2949ff5e2b2bafcdef693c21ff8235d370ec2807961dc1075eb6bbea661916a5bbd84b6511 + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.4 resolution: "@types/normalize-package-data@npm:2.4.4" @@ -4291,28 +4300,19 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.7.3": +"@types/prop-types@npm:^15.7.3": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" checksum: 10/31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 languageName: node linkType: hard -"@types/react-dom@npm:^18.3.0": - version: 18.3.7 - resolution: "@types/react-dom@npm:18.3.7" - peerDependencies: - "@types/react": ^18.0.0 - checksum: 10/317569219366d487a3103ba1e5e47154e95a002915fdcf73a44162c48fe49c3a57fcf7f57fc6979e70d447112681e6b13c6c3c1df289db8b544df4aab2d318f3 - languageName: node - linkType: hard - -"@types/react-dom@npm:^19.2.2": - version: 19.2.2 - resolution: "@types/react-dom@npm:19.2.2" +"@types/react-dom@npm:^19.2.3": + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" peerDependencies: "@types/react": ^19.2.0 - checksum: 10/73d5671e57ab73cb3f2acd7992faee8f90d5b4d155b972e76e91fa13e5871ebb5e224960b05039d57ea502cb3370746eb98beda5fa44e9712b4aee52653c237a + checksum: 10/616c4a8aee250ea05fb1e7b98e7e00475dd3a6c1c30d7be18b4b93caba832f4203106b3a496a6b147e5acc2da14575eca47bce234c633bca1f8430ef8ffb234a languageName: node linkType: hard @@ -4325,7 +4325,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:>=16.9.11, @types/react@npm:^19.2.2": +"@types/react@npm:*, @types/react@npm:>=16.9.11": version: 19.2.2 resolution: "@types/react@npm:19.2.2" dependencies: @@ -4334,13 +4334,12 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.3.5": - version: 18.3.27 - resolution: "@types/react@npm:18.3.27" +"@types/react@npm:^19.2.17": + version: 19.2.17 + resolution: "@types/react@npm:19.2.17" dependencies: - "@types/prop-types": "npm:*" csstype: "npm:^3.2.2" - checksum: 10/90155820a2af315cad1ff47df695f3f2f568c12ad641a7805746a6a9a9aa6c40b1374e819e50d39afe0e375a6b9160a73176cbdb4e09807262bc6fcdc06e67db + checksum: 10/8debb092bd0bb9c99176a31824c7587c27c775a6526b60060e7b9e8dc2af53aee2ffadc7a1e3845953792437db5699d34a9054e198c9d4e54a74728ff47c6725 languageName: node linkType: hard @@ -5135,8 +5134,8 @@ __metadata: version: 0.0.0-use.local resolution: "aperture@workspace:DNN Platform/Skins/Aperture" dependencies: - "@types/browser-sync": "npm:^2.29.0" - "@types/node": "npm:^24.9.0" + "@types/browser-sync": "npm:^2.29.1" + "@types/node": "npm:^25.9.2" "@types/postcss-import": "npm:^14.0.3" browser-sync: "npm:^3.0.4" chokidar: "npm:^4.0.3" @@ -7160,7 +7159,7 @@ __metadata: "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" "@stencil/store": "npm:^2.2.2" - "@types/node": "npm:^24.9.0" + "@types/node": "npm:^25.9.2" "@typescript-eslint/utils": "npm:^8.60.1" eslint: "npm:^10.2.1" jiti: "npm:^2.6.1" @@ -7246,7 +7245,7 @@ __metadata: version: 0.0.0-use.local resolution: "dnn.clientside@workspace:DNN Platform/Dnn.ClientSide" dependencies: - "@types/node": "npm:^24.9.0" + "@types/node": "npm:^25.9.2" "@types/postcss-import": "npm:^14.0.3" autoprefixer: "npm:^10.4.27" chokidar: "npm:^4.0.3" @@ -7268,8 +7267,8 @@ __metadata: version: 0.0.0-use.local resolution: "dnn.contactlist.spareact@workspace:DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact" dependencies: - "@types/react": "npm:^18.3.5" - "@types/react-dom": "npm:^18.3.0" + "@types/react": "npm:^19.2.17" + "@types/react-dom": "npm:^19.2.3" "@vitejs/plugin-react": "npm:^6.0.2" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" @@ -13158,7 +13157,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" - "@types/knockout": "npm:^3.4.77" + "@types/knockout": "npm:^3.4.79" "@types/redux": "npm:3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" @@ -15919,8 +15918,8 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" - "@types/react": "npm:^19.2.2" - "@types/react-dom": "npm:^19.2.2" + "@types/react": "npm:^19.2.17" + "@types/react-dom": "npm:^19.2.3" "@types/redux": "npm:^3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.20" @@ -16838,7 +16837,7 @@ __metadata: "@stencil/core": "npm:^4.43.5" "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" - "@types/node": "npm:^24.9.0" + "@types/node": "npm:^25.9.2" "@typescript-eslint/eslint-plugin": "npm:^8.60.1" "@typescript-eslint/parser": "npm:^8.60.1" eslint: "npm:^10.2.1" @@ -17640,6 +17639,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:>=7.24.0 <7.24.7": + version: 7.24.6 + resolution: "undici-types@npm:7.24.6" + checksum: 10/defc9538b952e3c15b8526596c591f7c1f0c7605ad27a2b7feddbea7ef2e3003f3eda2cdb051a3cb1a2185e3893100fd9cb925c799db99d48131ea63b5233d10 + languageName: node + linkType: hard + "undici-types@npm:~7.16.0": version: 7.16.0 resolution: "undici-types@npm:7.16.0" From 59d949cc6d11c6fbd270dd71f9738c4e77d36fc7 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:00:43 -0500 Subject: [PATCH 043/109] Bump autoprefixer from 10.4.27 to 10.5.0 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- yarn.lock | 63 ++++++++++++++++++++---- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 0a83aadd577..7845ccc36c1 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@types/node": "^25.9.2", "@types/postcss-import": "^14.0.3", - "autoprefixer": "^10.4.27", + "autoprefixer": "^10.5.0", "chokidar": "^4.0.3", "cssnano": "^7.1.3", "esbuild": "^0.28.0", diff --git a/yarn.lock b/yarn.lock index efc1cb176aa..3e11d41d916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5412,12 +5412,12 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.27": - version: 10.4.27 - resolution: "autoprefixer@npm:10.4.27" +"autoprefixer@npm:^10.5.0": + version: 10.5.0 + resolution: "autoprefixer@npm:10.5.0" dependencies: - browserslist: "npm:^4.28.1" - caniuse-lite: "npm:^1.0.30001774" + browserslist: "npm:^4.28.2" + caniuse-lite: "npm:^1.0.30001787" fraction.js: "npm:^5.3.4" picocolors: "npm:^1.1.1" postcss-value-parser: "npm:^4.2.0" @@ -5425,7 +5425,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/5dd9ec57cc1c2af556e10d6c76d082f66d23275671b8b125f6c1d33ba7d9a984d80d3fb4fab7b5e092ac1a34f3aa5a131a392f131f5924029c3cb82faea15b0c + checksum: 10/3398a70ad57dfeb4fc1dd6b344c99ab996002780cd777af853de0bcc442c0f31d8c3fc9ab3ba018a2f0d34f0c102ce7b75ad35bb5d7b50f2792a3b62899189b2 languageName: node linkType: hard @@ -5560,6 +5560,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.10.12": + version: 2.10.34 + resolution: "baseline-browser-mapping@npm:2.10.34" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10/d0f2e4792b04b2f305e60ca5bf591fa92a2ee39125d8d8e39959e06d8ea68832a026782acd71050f27e44dc676e2de621c87aa698a47976b4e82ce735cd70fc1 + languageName: node + linkType: hard + "baseline-browser-mapping@npm:^2.9.0": version: 2.10.33 resolution: "baseline-browser-mapping@npm:2.10.33" @@ -5760,6 +5769,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.28.2": + version: 4.28.2 + resolution: "browserslist@npm:4.28.2" + dependencies: + baseline-browser-mapping: "npm:^2.10.12" + caniuse-lite: "npm:^1.0.30001782" + electron-to-chromium: "npm:^1.5.328" + node-releases: "npm:^2.0.36" + update-browserslist-db: "npm:^1.2.3" + bin: + browserslist: cli.js + checksum: 10/cff88386e5b5ba5614c9063bd32ef94865bba22b6a381844c7d09ea1eea62a2247e7106e516abdbfda6b75b9986044c991dfe45f92f10add5ad63dccc07589ec + languageName: node + linkType: hard + "bs-recipes@npm:1.3.4": version: 1.3.4 resolution: "bs-recipes@npm:1.3.4" @@ -5948,13 +5972,20 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001759, caniuse-lite@npm:^1.0.30001774": +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001759": version: 1.0.30001793 resolution: "caniuse-lite@npm:1.0.30001793" checksum: 10/5a1ac39f2f174e86d8320f394a5dfbeab98041722b13d02a21fe47afc2723bc754ea3716a1f276f8462bcbbc3016e82e6f155ebde0881e537af463b5eac1816b languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001782, caniuse-lite@npm:^1.0.30001787": + version: 1.0.30001797 + resolution: "caniuse-lite@npm:1.0.30001797" + checksum: 10/30d34d8ede7a99cedec5489cb7a4fc75b0d641afcc436d2b0986aaf9beb056d3f15391e6a08b06b0bd8a84c64793ac8197005b14a96412514706a5715be98796 + languageName: node + linkType: hard + "case-sensitive-paths-webpack-plugin@npm:^2.4.0": version: 2.4.0 resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" @@ -7247,7 +7278,7 @@ __metadata: dependencies: "@types/node": "npm:^25.9.2" "@types/postcss-import": "npm:^14.0.3" - autoprefixer: "npm:^10.4.27" + autoprefixer: "npm:^10.5.0" chokidar: "npm:^4.0.3" cssnano: "npm:^7.1.3" esbuild: "npm:^0.28.0" @@ -7484,6 +7515,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.328": + version: 1.5.368 + resolution: "electron-to-chromium@npm:1.5.368" + checksum: 10/2a046854c08256f9b8f7e6615ef71c36a32c1b438fc1048caa1553929d7e9c518a135066d4a226ea2394d42fb336ef01a09fe5270dd72702a1b9fab33d45a53d + languageName: node + linkType: hard + "emittery@npm:^0.13.1": version: 0.13.1 resolution: "emittery@npm:0.13.1" @@ -12316,6 +12354,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.36": + version: 2.0.47 + resolution: "node-releases@npm:2.0.47" + checksum: 10/6ba88359ea4a653bcb428c7ac47a3b9093d0fe873d0fbda8b6714df6d1829630769d1c737d5938458af6a101b4bb7c70bcf7e38f36db469a17a348261d26f822 + languageName: node + linkType: hard + "nopt@npm:^8.0.0": version: 8.1.0 resolution: "nopt@npm:8.1.0" @@ -17799,7 +17844,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.2.0": +"update-browserslist-db@npm:^1.2.0, update-browserslist-db@npm:^1.2.3": version: 1.2.3 resolution: "update-browserslist-db@npm:1.2.3" dependencies: From 0cb37ad346c1468c929019e14913e4109f61f8c8 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:01:12 -0500 Subject: [PATCH 044/109] Bump cssnano from 7.1.3 to 7.1.9 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 412 ++++++++++++----------- 3 files changed, 209 insertions(+), 207 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 7845ccc36c1..ba34bb2f3d2 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -21,7 +21,7 @@ "@types/postcss-import": "^14.0.3", "autoprefixer": "^10.5.0", "chokidar": "^4.0.3", - "cssnano": "^7.1.3", + "cssnano": "^7.1.9", "esbuild": "^0.28.0", "eslint": "^10.2.1", "modern-normalize": "^3.0.1", diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 2e0db4d65e8..18ea581b2e0 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -19,7 +19,7 @@ "@types/postcss-import": "^14.0.3", "browser-sync": "^3.0.4", "chokidar": "^4.0.3", - "cssnano": "^7.1.3", + "cssnano": "^7.1.9", "glob": "^13.0.6", "postcss": "^8.5.8", "postcss-banner": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index 3e11d41d916..12780e5ded2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -442,6 +442,13 @@ __metadata: languageName: node linkType: hard +"@colordx/core@npm:^5.4.3": + version: 5.4.3 + resolution: "@colordx/core@npm:5.4.3" + checksum: 10/3a26146cc3ce9e1ab51d428142e7c307cd023c7660b6d604297122661cfc57ebe0c2cfcfd156ccef1a47a9d153da640017827afd67e223dd5b6a24958a908dc0 + languageName: node + linkType: hard + "@csstools/color-helpers@npm:^6.0.2": version: 6.0.2 resolution: "@csstools/color-helpers@npm:6.0.2" @@ -5139,7 +5146,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" browser-sync: "npm:^3.0.4" chokidar: "npm:^4.0.3" - cssnano: "npm:^7.1.3" + cssnano: "npm:^7.1.9" glob: "npm:^13.0.6" normalize.css: "npm:^8.0.1" postcss: "npm:^8.5.8" @@ -5754,7 +5761,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.5, browserslist@npm:^4.28.1": +"browserslist@npm:^4.0.0, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -6314,13 +6321,6 @@ __metadata: languageName: node linkType: hard -"colord@npm:^2.9.3": - version: 2.9.3 - resolution: "colord@npm:2.9.3" - checksum: 10/907a4506d7307e2f580b471b581e992181ed75ab0c6925ece9ca46d88161d2fc50ed15891cd0556d0d9321237ca75afc9d462e4c050b939ef88428517f047f30 - languageName: node - linkType: hard - "colorjs.io@npm:^0.5.0": version: 0.5.2 resolution: "colorjs.io@npm:0.5.2" @@ -6744,64 +6744,64 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^7.0.11": - version: 7.0.11 - resolution: "cssnano-preset-default@npm:7.0.11" +"cssnano-preset-default@npm:^7.0.17": + version: 7.0.17 + resolution: "cssnano-preset-default@npm:7.0.17" dependencies: - browserslist: "npm:^4.28.1" + browserslist: "npm:^4.28.2" css-declaration-sorter: "npm:^7.2.0" - cssnano-utils: "npm:^5.0.1" + cssnano-utils: "npm:^5.0.3" postcss-calc: "npm:^10.1.1" - postcss-colormin: "npm:^7.0.6" - postcss-convert-values: "npm:^7.0.9" - postcss-discard-comments: "npm:^7.0.6" - postcss-discard-duplicates: "npm:^7.0.2" - postcss-discard-empty: "npm:^7.0.1" - postcss-discard-overridden: "npm:^7.0.1" - postcss-merge-longhand: "npm:^7.0.5" - postcss-merge-rules: "npm:^7.0.8" - postcss-minify-font-values: "npm:^7.0.1" - postcss-minify-gradients: "npm:^7.0.1" - postcss-minify-params: "npm:^7.0.6" - postcss-minify-selectors: "npm:^7.0.6" - postcss-normalize-charset: "npm:^7.0.1" - postcss-normalize-display-values: "npm:^7.0.1" - postcss-normalize-positions: "npm:^7.0.1" - postcss-normalize-repeat-style: "npm:^7.0.1" - postcss-normalize-string: "npm:^7.0.1" - postcss-normalize-timing-functions: "npm:^7.0.1" - postcss-normalize-unicode: "npm:^7.0.6" - postcss-normalize-url: "npm:^7.0.1" - postcss-normalize-whitespace: "npm:^7.0.1" - postcss-ordered-values: "npm:^7.0.2" - postcss-reduce-initial: "npm:^7.0.6" - postcss-reduce-transforms: "npm:^7.0.1" - postcss-svgo: "npm:^7.1.1" - postcss-unique-selectors: "npm:^7.0.5" + postcss-colormin: "npm:^7.0.10" + postcss-convert-values: "npm:^7.0.12" + postcss-discard-comments: "npm:^7.0.8" + postcss-discard-duplicates: "npm:^7.0.4" + postcss-discard-empty: "npm:^7.0.3" + postcss-discard-overridden: "npm:^7.0.3" + postcss-merge-longhand: "npm:^7.0.7" + postcss-merge-rules: "npm:^7.0.11" + postcss-minify-font-values: "npm:^7.0.3" + postcss-minify-gradients: "npm:^7.0.5" + postcss-minify-params: "npm:^7.0.9" + postcss-minify-selectors: "npm:^7.1.2" + postcss-normalize-charset: "npm:^7.0.3" + postcss-normalize-display-values: "npm:^7.0.3" + postcss-normalize-positions: "npm:^7.0.4" + postcss-normalize-repeat-style: "npm:^7.0.4" + postcss-normalize-string: "npm:^7.0.3" + postcss-normalize-timing-functions: "npm:^7.0.3" + postcss-normalize-unicode: "npm:^7.0.9" + postcss-normalize-url: "npm:^7.0.3" + postcss-normalize-whitespace: "npm:^7.0.3" + postcss-ordered-values: "npm:^7.0.4" + postcss-reduce-initial: "npm:^7.0.9" + postcss-reduce-transforms: "npm:^7.0.3" + postcss-svgo: "npm:^7.1.3" + postcss-unique-selectors: "npm:^7.0.7" peerDependencies: - postcss: ^8.4.32 - checksum: 10/2588c46d507be6970684108ef861e16da285d4be44f58fc533ca07200f9aa30d118e7ce4872dd667b84686431ff1eb2ec8b9c91381bd5207cef4746c4dfe2901 + postcss: ^8.5.13 + checksum: 10/803a4581d61689c7f33f65bf84979334a87cc11136c4d74096e6129c9162944e98a219109f4480bebf52555e84778880c94695d2c16f0a14c2097a6c31801325 languageName: node linkType: hard -"cssnano-utils@npm:^5.0.1": - version: 5.0.1 - resolution: "cssnano-utils@npm:5.0.1" +"cssnano-utils@npm:^5.0.3": + version: 5.0.3 + resolution: "cssnano-utils@npm:5.0.3" peerDependencies: - postcss: ^8.4.32 - checksum: 10/cdf37315d3cf9726e10ce842b18e148e4df1d1d18d292540e724d5a96994901abc631c8894328c39ab70c864449a8a83f8fc117114fdcbade204e5e65898af90 + postcss: ^8.5.13 + checksum: 10/8a088118bc7761ed5f4c6b9d1841cf07533c62aee88468ce109a95efe72aaf7cda5be77b18c87d6422c0b4c3b4a5bc3246157f6ad101074c8dde0aefd80257e0 languageName: node linkType: hard -"cssnano@npm:^7.1.3": - version: 7.1.3 - resolution: "cssnano@npm:7.1.3" +"cssnano@npm:^7.1.9": + version: 7.1.9 + resolution: "cssnano@npm:7.1.9" dependencies: - cssnano-preset-default: "npm:^7.0.11" + cssnano-preset-default: "npm:^7.0.17" lilconfig: "npm:^3.1.3" peerDependencies: - postcss: ^8.4.32 - checksum: 10/e67449b2779876cc7f2543bb3b0e6df14ce8957a8527f55bc03e34413985f1fed8a1b047210b1deadbb00f0cabc5fd85a57ef329fa0a9182eb91523ae53449da + postcss: ^8.5.13 + checksum: 10/619d855f2938a035ace3de0318cbadef86deef0d7ff5894e1346e117de6776a609e9e19ffdfe89e076241e6c0e92a31b3ccef85b1ddece9493acfc00ca991d70 languageName: node linkType: hard @@ -7280,7 +7280,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" autoprefixer: "npm:^10.5.0" chokidar: "npm:^4.0.3" - cssnano: "npm:^7.1.3" + cssnano: "npm:^7.1.9" esbuild: "npm:^0.28.0" eslint: "npm:^10.2.1" modern-normalize: "npm:^3.0.1" @@ -13597,67 +13597,67 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-colormin@npm:7.0.6" +"postcss-colormin@npm:^7.0.10": + version: 7.0.10 + resolution: "postcss-colormin@npm:7.0.10" dependencies: - browserslist: "npm:^4.28.1" + "@colordx/core": "npm:^5.4.3" + browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" - colord: "npm:^2.9.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/3b2b798b676263ee360cada9a986d10b1183f8c843cfa07a78ddf47637fdc033c6579dbb3bf390b79a544d38487a42bcdb42dd5d75bff7a4db76a930cd08fc8a + postcss: ^8.5.13 + checksum: 10/e8f8dca6fa99afa2a9b0fc1a921c6a674ad0bf94e6ecda139cb9215cc5b653fb4f0802f9e55d0c770dd8f966f731f5b21d7a1f15b9fb244da341ea583fa16da3 languageName: node linkType: hard -"postcss-convert-values@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-convert-values@npm:7.0.9" +"postcss-convert-values@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-convert-values@npm:7.0.12" dependencies: - browserslist: "npm:^4.28.1" + browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/656fb2270cedbaea3f8979e40a480a7ea436c040e37a87e13dc143a4f462469d6feb84489a22a525a5674e9eb8a793393e57754f0242b91ae40dfd45997f2e8b + postcss: ^8.5.13 + checksum: 10/c32c4bd56d53b313b3d9b73fc5efffb29912123a0905f68dba66ab18e65ac668deddb2fd9e6eeaaf65b710ba603d79fea01cf9b177b84f51d7966108634387a6 languageName: node linkType: hard -"postcss-discard-comments@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-discard-comments@npm:7.0.6" +"postcss-discard-comments@npm:^7.0.8": + version: 7.0.8 + resolution: "postcss-discard-comments@npm:7.0.8" dependencies: postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/d8e80b234c6c2e8af732e14c465f4d93ccd7a436c1d7d805ddc71c6e6370cb1d3020fe2c0022f8859a2d911c9a5969f8e000fcca55456f1064d412505afc6bc5 + postcss: ^8.5.13 + checksum: 10/5e2c97bf21a2caf0aa8e77e13e6e44822985aba1e8b377dc8a1c6f65fab820fd971c4a3f071e036175818b810c7b550525c7f8d8cbd181318d12d150af2ab473 languageName: node linkType: hard -"postcss-discard-duplicates@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-discard-duplicates@npm:7.0.2" +"postcss-discard-duplicates@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-discard-duplicates@npm:7.0.4" peerDependencies: - postcss: ^8.4.32 - checksum: 10/2da841b5c0117528e56e1ccda28924339c03fdb93dab61b767cebb9a9e4a2a077498d00e0c97c9ec36a534f98d6f358e6236f30913c184f90d51f6d302f4f0f6 + postcss: ^8.5.13 + checksum: 10/4230098a937ecc317202bde35d41d2d0c1c2954044e6eb4ed05ffc01de929efb97cbc90af42c74baf2264e8f18ebb4fd63a7bbe5f81da3b3e3d9afab2eb630bd languageName: node linkType: hard -"postcss-discard-empty@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-discard-empty@npm:7.0.1" +"postcss-discard-empty@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-discard-empty@npm:7.0.3" peerDependencies: - postcss: ^8.4.32 - checksum: 10/39977000657e78202da891ae6300593e40e1c8a756f1d9707087390e47a410739c394c35e902130556efb5808e6701b3b34b89facf7a9e56533d617dd9597049 + postcss: ^8.5.13 + checksum: 10/514d4e011e103e7bf00aa2548b0eac3f0ee9fc7e6c1a6c37aa3937b3406e7fbb17b1b3a72d4d3e475358b3b5cfa7c1e52d6c22e24c8606425d6be16b7de96720 languageName: node linkType: hard -"postcss-discard-overridden@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-discard-overridden@npm:7.0.1" +"postcss-discard-overridden@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-discard-overridden@npm:7.0.3" peerDependencies: - postcss: ^8.4.32 - checksum: 10/a0e67314b696591396e6bb371cdd57537e06f63e9fa0d742fe678decf600bed0cdcfa481487bce91b3732bdd7c46338f9102ccc8180c41032811e99962883715 + postcss: ^8.5.13 + checksum: 10/b65cb6bd039a04760abe2dda4290e70ba1e7b39df44a812174687a500b079558af8c26b1d1d1389a85692c3c6874c842cc1f7490d0f7bff2d6017d08f85b6831 languageName: node linkType: hard @@ -13695,211 +13695,213 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-merge-longhand@npm:7.0.5" +"postcss-merge-longhand@npm:^7.0.7": + version: 7.0.7 + resolution: "postcss-merge-longhand@npm:7.0.7" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^7.0.5" + stylehacks: "npm:^7.0.11" peerDependencies: - postcss: ^8.4.32 - checksum: 10/3378fc3a196082dfdb9acff94efbfa0de95ed86bf87f485285e775fd3c21218e5a243e363ad80b96237edb454776f7c1deea28c37afb8b96ddfaf5cfe8bd606b + postcss: ^8.5.13 + checksum: 10/6428417fc9caa2964af97f54026b73077630d32bd6a8f4927ca0834a15f871935dd3506eace9aa4fbf0f89be07f938e581b5ade76e1f7ffded7a0cf1f6e1489d languageName: node linkType: hard -"postcss-merge-rules@npm:^7.0.8": - version: 7.0.8 - resolution: "postcss-merge-rules@npm:7.0.8" +"postcss-merge-rules@npm:^7.0.11": + version: 7.0.11 + resolution: "postcss-merge-rules@npm:7.0.11" dependencies: - browserslist: "npm:^4.28.1" + browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^5.0.1" + cssnano-utils: "npm:^5.0.3" postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/da158ab152175813611ae0ed951678ae6e915e7fa17525622413784d9aa0e2c7e4e2b9e67c592ac8091e385b641855af2e8b55b393cf10941ced71d448075349 + postcss: ^8.5.13 + checksum: 10/6dd8ffa975d17f31a52da573e9b4a6c42c82a27ea8ca43a826f733da0b941f7d0875060c9753ddfe8b752f19e486c5ef9d0799d0631a92b6250c5be8dae0fcea languageName: node linkType: hard -"postcss-minify-font-values@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-minify-font-values@npm:7.0.1" +"postcss-minify-font-values@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-minify-font-values@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/6578a1fd293e202e738ce38d91d71c08ba970f4a998edff48022cb21ec23ef26bf7d284ddb41d6e51bf20b5b5676fe142de1bd092a76d2ef982d5ee1d6b00190 + postcss: ^8.5.13 + checksum: 10/804977738ed7c6585435b6e14e99ed1fe4959b37c3910998f9e661279454a83559a4f1f140ee8d0cd33f290158af966789f1d3680c5002d0cff89d379ef9c5e7 languageName: node linkType: hard -"postcss-minify-gradients@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-minify-gradients@npm:7.0.1" +"postcss-minify-gradients@npm:^7.0.5": + version: 7.0.5 + resolution: "postcss-minify-gradients@npm:7.0.5" dependencies: - colord: "npm:^2.9.3" - cssnano-utils: "npm:^5.0.1" + "@colordx/core": "npm:^5.4.3" + cssnano-utils: "npm:^5.0.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/4aa782331c5d1826e549b3940eefb54e2d51f5c5a2c5f5537384bfe6eac45bfe7ba4535c03cd1642d8a27ab088f56c3682b55f5dd2c3f7969b715692e0c1102b + postcss: ^8.5.13 + checksum: 10/0f6f94a4f37d4dfcbeaa40e8eb05f8ecd3f63dbd6ffca0d93d31ddabb990281fea3c0920dd44790776168e05b5f44abd8209ef0d29a10463c24d21682e4107e5 languageName: node linkType: hard -"postcss-minify-params@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-minify-params@npm:7.0.6" +"postcss-minify-params@npm:^7.0.9": + version: 7.0.9 + resolution: "postcss-minify-params@npm:7.0.9" dependencies: - browserslist: "npm:^4.28.1" - cssnano-utils: "npm:^5.0.1" + browserslist: "npm:^4.28.2" + cssnano-utils: "npm:^5.0.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/5cb3f761e7dfa835037d575f2c76a000c4819d8602f6edcb4316243e3cd9155c01ba6b0b5de4d6a5d621630807d61fde09dcbb0f139099d33b6a00279969ba95 + postcss: ^8.5.13 + checksum: 10/93d7e74ead297e27c75460b4044790dc235bd719ebfac9e24829f8a79981ffd0591bb59759bbe8f23bd49fd7c24ebdf7055e7182a4ff5242099209ea9e34f628 languageName: node linkType: hard -"postcss-minify-selectors@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-minify-selectors@npm:7.0.6" +"postcss-minify-selectors@npm:^7.1.2": + version: 7.1.2 + resolution: "postcss-minify-selectors@npm:7.1.2" dependencies: + browserslist: "npm:^4.28.1" + caniuse-api: "npm:^3.0.0" cssesc: "npm:^3.0.0" postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/75f2518c36a1714a29020256ad0cc72a6780e30a89acfd8c1c3e77f611f47ada0d0fdf9f1a2b8cf68f7c8eb3a1d2b569c7e8659dcab9ea4a3667e00fc910e983 + postcss: ^8.5.13 + checksum: 10/8e7ff64c4bea54d88662e5e75e219b373f71b9afeb52623001d8080272cbdc647c8634d485965c201553e435ea5125f4a80a0e249321238da982c07fd80c0e3d languageName: node linkType: hard -"postcss-normalize-charset@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-charset@npm:7.0.1" +"postcss-normalize-charset@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-charset@npm:7.0.3" peerDependencies: - postcss: ^8.4.32 - checksum: 10/bcec822491e3421b009c688473433164b5c80bbef48af4e47f704bee68f0b7ba2009aaf46788e698dd233d5f4e1cf444a4f59a901623c73f8458c2227b15db57 + postcss: ^8.5.13 + checksum: 10/c9837d9c5770441e24ec8aa1e858bbe2974bbeec153d4808521802c3d6b5de93265a7acc00c56b3c99c530b6806c78cf0c86b06dd21422bfb5ba814f74dc050e languageName: node linkType: hard -"postcss-normalize-display-values@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-display-values@npm:7.0.1" +"postcss-normalize-display-values@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-display-values@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/53f341c17a5487639e6f7c917ad695e059bf4aff66b3c971e008163f774337444753310def9f38dd26066ea96b136422592fc74077c38c40b3bfdfaa338d5b58 + postcss: ^8.5.13 + checksum: 10/1930f45ec655323192c5e33341af0d3b44ea18ad615cac5ff28c0e519b565c46635adb06840b31a3c5d20773712672a47ee1e461e63a08dd304d06660c63aece languageName: node linkType: hard -"postcss-normalize-positions@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-positions@npm:7.0.1" +"postcss-normalize-positions@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-normalize-positions@npm:7.0.4" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/72b23ab87c97c155d2ec475fba8a8b968f7c7b42d055a79b267449d570c328d5ea4cb0002428cf26e9daa70c58655e0b931d2a5801cc407554d3f03a21ac041b + postcss: ^8.5.13 + checksum: 10/aa8ffc54e0ba93d4062585a4a33a5c3984974bb119e449bec736c3ff55d122d16af0700ec47f58f5983644aa4451c84d31f7282a7aa2191d5f999a02bdaa205f languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-repeat-style@npm:7.0.1" +"postcss-normalize-repeat-style@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-normalize-repeat-style@npm:7.0.4" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/db677bceec8c00a1860b64932b99af937e7674b3e5c5ac333c95efb090e9abd747eca4ad51855f0fe73fbe544c3d21e58d06b39e03fd525945309743e31ec235 + postcss: ^8.5.13 + checksum: 10/2902985c069fd9eef7291a3fe16038da930e5fecb047489d4df7c5168a24c81ed919776124e217d24563bb322995586cd9daf104e9269673c271c2243b8ffd8a languageName: node linkType: hard -"postcss-normalize-string@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-string@npm:7.0.1" +"postcss-normalize-string@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-string@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/48df2eaca6f5365af31ad46fd60a32dc7b714cc5ec8ba80980e65855ddc47c03ac82077ce7ca04c90898f73d173410d1d6a104754ff487e7e5a59e3eae8325b3 + postcss: ^8.5.13 + checksum: 10/322188b51371c9bfe66a40131971b4f44f91a27266c05d9c8237dd2e32e1e94b0223cd4cf8d67726e42ea0a6195aa7ac51b79d6fbf24cd3aad9ede00f7abeb1a languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-timing-functions@npm:7.0.1" +"postcss-normalize-timing-functions@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-timing-functions@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/31fb88489244334295918fa7d6af2d76c310a83abd20be0a7f1c408c54ac0c0f81b0ae7877698bf66de1f76495766e159c8871387407dfcafa0cb1a53f5f0460 + postcss: ^8.5.13 + checksum: 10/954df533062f493dd8171f44cb678a3519d63bbcd953f014d65a01e8fea37ca97884f66f55aa0e608b3f3c8ba815c02f606633a95aec586e9581d336198582a9 languageName: node linkType: hard -"postcss-normalize-unicode@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-normalize-unicode@npm:7.0.6" +"postcss-normalize-unicode@npm:^7.0.9": + version: 7.0.9 + resolution: "postcss-normalize-unicode@npm:7.0.9" dependencies: - browserslist: "npm:^4.28.1" + browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/65f4ac99f4bd7f4e825c2d6996bdaacca94dfa05d02c2ccdbc4a1bc9c764a8555b4f9a633120cd2e881121900ff076fc1b3ea3b085c07bdd6b47c58b84854e4c + postcss: ^8.5.13 + checksum: 10/7bbb305563253fdce9380242c5ae9d79e39aab55483b8d43ed18f076198bb968cc85b5681ba1f870a1da742110d6a5ff3758f9f6c490dc05c6fe9de86287fa1c languageName: node linkType: hard -"postcss-normalize-url@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-url@npm:7.0.1" +"postcss-normalize-url@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-url@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/975dd0d1b55b637d45756ec57e554b2134f77368dd3ae09be9fa6636f2f41e72422505409d7fca75c635b9b1b8ec8ec2607d84c6c85497bbfd4e7748a2992882 + postcss: ^8.5.13 + checksum: 10/01897208e2868b4f132e675d0bd905e64c760569d485beca4e88a419fc43d10ca4b324a7b6867ab3dc173d8455251b5d81e08c5e540899cd11beb7b7602baf15 languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-normalize-whitespace@npm:7.0.1" +"postcss-normalize-whitespace@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-normalize-whitespace@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/05a0fa74f4c8e93243053b9cc865cbddddb309b2ccb08271ca9c38ea7ece2ff43d5faa12cce87f06e40cbcf22c94443c9fa2b74ed0c6b94d72a9e67ea0381626 + postcss: ^8.5.13 + checksum: 10/255485b22efd17e436233cf70a90ec296a4f11771de255cc18d334620c828ce20eb014f9216bca441a921543e82126f3c1abadca6f490fc358ae2a461255adba languageName: node linkType: hard -"postcss-ordered-values@npm:^7.0.2": - version: 7.0.2 - resolution: "postcss-ordered-values@npm:7.0.2" +"postcss-ordered-values@npm:^7.0.4": + version: 7.0.4 + resolution: "postcss-ordered-values@npm:7.0.4" dependencies: - cssnano-utils: "npm:^5.0.1" + cssnano-utils: "npm:^5.0.3" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/be8fb13639fb0e1ffd7d4e9bb4824d3a283c8a63a8b0dd1a654435fff1e019007c79be877940bb101bb9ebd8ba3ac18bcffd144e939890bedeb40044dcc2b9cc + postcss: ^8.5.13 + checksum: 10/330f37c1d96d1d8e51d066e21897978786a3088b139807dcae45caa49d95a90ecc82139cc6a78ac50c58c39399e54c15888573bbbcc588f1ac7ae7a7e0964eb3 languageName: node linkType: hard -"postcss-reduce-initial@npm:^7.0.6": - version: 7.0.6 - resolution: "postcss-reduce-initial@npm:7.0.6" +"postcss-reduce-initial@npm:^7.0.9": + version: 7.0.9 + resolution: "postcss-reduce-initial@npm:7.0.9" dependencies: - browserslist: "npm:^4.28.1" + browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/afea4f35baf4250f2fcda911fbaabc35a5e05b632ed359d5c3543972e8a0793ec7ca7a5683711e8f91bc6de2406ef3a4ae782e30a347d8c812538da785db0655 + postcss: ^8.5.13 + checksum: 10/eb20df1be221d502cb3b49a6732f5f6b02a3922fab442ff79725629f274c23a582e544ac5dadedf8dbdc3ac3c04dbc4ea5ef14d6c3c7b34b6f3e9d27144fd3b4 languageName: node linkType: hard -"postcss-reduce-transforms@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-reduce-transforms@npm:7.0.1" +"postcss-reduce-transforms@npm:^7.0.3": + version: 7.0.3 + resolution: "postcss-reduce-transforms@npm:7.0.3" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.4.32 - checksum: 10/a22d07559859b9d4313d579104a25aa254695bc37dec5134de1064d1bd52b9d1f33f050fbf330170ef1105ede9aad7741bbcf9cad2221a6a5c8d529fd3cf0259 + postcss: ^8.5.13 + checksum: 10/5a8bf3d7284a657fa854f5f5880c828d1b9f68a4d8da2428f49f9de1425a06a07c0a62faabc5fbc0f4b16534793d6bbc0b264ad0f817c2d70824e87c1cb74bd3 languageName: node linkType: hard @@ -13915,7 +13917,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.0, postcss-selector-parser@npm:^7.1.1": +"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.1": version: 7.1.1 resolution: "postcss-selector-parser@npm:7.1.1" dependencies: @@ -13925,26 +13927,26 @@ __metadata: languageName: node linkType: hard -"postcss-svgo@npm:^7.1.1": - version: 7.1.1 - resolution: "postcss-svgo@npm:7.1.1" +"postcss-svgo@npm:^7.1.3": + version: 7.1.3 + resolution: "postcss-svgo@npm:7.1.3" dependencies: postcss-value-parser: "npm:^4.2.0" svgo: "npm:^4.0.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/2cd21e8438da6ef93e4904cd14b6118dbe64421e91ae1424d58cac92c549e3f1952f5dcf2c0ecad8bf40abd77e987b8fd398e481d02285030decd03e8edaa8c3 + postcss: ^8.5.13 + checksum: 10/a68263739e876e598d6a64e52d74d3f42fa8db1869a11bd10df5e65b6c596cf7d858f632d38407938d1beebd7169e89291c4f59dc650135a6ef4d3ad98d269a1 languageName: node linkType: hard -"postcss-unique-selectors@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-unique-selectors@npm:7.0.5" +"postcss-unique-selectors@npm:^7.0.7": + version: 7.0.7 + resolution: "postcss-unique-selectors@npm:7.0.7" dependencies: postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/d749f409db33425f97f5c41bdabc6adaafad09c44f20e75c8d30c3f5c308c797f6718a687acab643ac84095d1a245dd05005853b2c24faa1577734a08705ecd4 + postcss: ^8.5.13 + checksum: 10/e0f4265d57503348a3c2982ee0ace767d37ef6406f6610c96cd3a8a0728f8e77fc50bfd59b79048da687e3c191d54d0b6c0b40be1dfb9fdba26591b8e1fc8112 languageName: node linkType: hard @@ -16862,15 +16864,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^7.0.5": - version: 7.0.5 - resolution: "stylehacks@npm:7.0.5" +"stylehacks@npm:^7.0.11": + version: 7.0.11 + resolution: "stylehacks@npm:7.0.11" dependencies: - browserslist: "npm:^4.24.5" - postcss-selector-parser: "npm:^7.1.0" + browserslist: "npm:^4.28.2" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.4.32 - checksum: 10/798ac0f92ff4489c251550d64b903f1aa8b5946e5b09b33ebf68290b5a345257cecf98c989526a5d462b560081194fead38c4f804ec016ceb8b1b3f17ec74fc5 + postcss: ^8.5.13 + checksum: 10/937a53ca6c96447438cc1a556744a3cc3268afed8ffdb239326e574eb93b5be8f13d347602d901cd81bb4d790d5568e4b57a9ae9447b21a947feea06d883a5c8 languageName: node linkType: hard From 9961f2ef79d8408abf49ec85912010dad1733d92 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:02:17 -0500 Subject: [PATCH 045/109] Bump cssnano from 7.1.9 to 8.0.1 Drop node 20 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 380 +++++++++++------------ 3 files changed, 187 insertions(+), 197 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index ba34bb2f3d2..c5efa9c7ddd 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -21,7 +21,7 @@ "@types/postcss-import": "^14.0.3", "autoprefixer": "^10.5.0", "chokidar": "^4.0.3", - "cssnano": "^7.1.9", + "cssnano": "^8.0.1", "esbuild": "^0.28.0", "eslint": "^10.2.1", "modern-normalize": "^3.0.1", diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 18ea581b2e0..a7d94599609 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -19,7 +19,7 @@ "@types/postcss-import": "^14.0.3", "browser-sync": "^3.0.4", "chokidar": "^4.0.3", - "cssnano": "^7.1.9", + "cssnano": "^8.0.1", "glob": "^13.0.6", "postcss": "^8.5.8", "postcss-banner": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index 12780e5ded2..31ac99aceba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5146,7 +5146,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" browser-sync: "npm:^3.0.4" chokidar: "npm:^4.0.3" - cssnano: "npm:^7.1.9" + cssnano: "npm:^8.0.1" glob: "npm:^13.0.6" normalize.css: "npm:^8.0.1" postcss: "npm:^8.5.8" @@ -6669,15 +6669,6 @@ __metadata: languageName: node linkType: hard -"css-declaration-sorter@npm:^7.2.0": - version: 7.2.0 - resolution: "css-declaration-sorter@npm:7.2.0" - peerDependencies: - postcss: ^8.0.9 - checksum: 10/2acb9c13f556fc8f05e601e66ecae4cfdec0ed50ca69f18177718ad5a86c3929f7d0a2cae433fd831b2594670c6e61d3a25c79aa7830be5828dcd9d29219d387 - languageName: node - linkType: hard - "css-select@npm:^5.1.0": version: 5.2.2 resolution: "css-select@npm:5.2.2" @@ -6744,64 +6735,63 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^7.0.17": - version: 7.0.17 - resolution: "cssnano-preset-default@npm:7.0.17" +"cssnano-preset-default@npm:^8.0.1": + version: 8.0.1 + resolution: "cssnano-preset-default@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" - css-declaration-sorter: "npm:^7.2.0" - cssnano-utils: "npm:^5.0.3" + cssnano-utils: "npm:^6.0.0" postcss-calc: "npm:^10.1.1" - postcss-colormin: "npm:^7.0.10" - postcss-convert-values: "npm:^7.0.12" - postcss-discard-comments: "npm:^7.0.8" - postcss-discard-duplicates: "npm:^7.0.4" - postcss-discard-empty: "npm:^7.0.3" - postcss-discard-overridden: "npm:^7.0.3" - postcss-merge-longhand: "npm:^7.0.7" - postcss-merge-rules: "npm:^7.0.11" - postcss-minify-font-values: "npm:^7.0.3" - postcss-minify-gradients: "npm:^7.0.5" - postcss-minify-params: "npm:^7.0.9" - postcss-minify-selectors: "npm:^7.1.2" - postcss-normalize-charset: "npm:^7.0.3" - postcss-normalize-display-values: "npm:^7.0.3" - postcss-normalize-positions: "npm:^7.0.4" - postcss-normalize-repeat-style: "npm:^7.0.4" - postcss-normalize-string: "npm:^7.0.3" - postcss-normalize-timing-functions: "npm:^7.0.3" - postcss-normalize-unicode: "npm:^7.0.9" - postcss-normalize-url: "npm:^7.0.3" - postcss-normalize-whitespace: "npm:^7.0.3" - postcss-ordered-values: "npm:^7.0.4" - postcss-reduce-initial: "npm:^7.0.9" - postcss-reduce-transforms: "npm:^7.0.3" - postcss-svgo: "npm:^7.1.3" - postcss-unique-selectors: "npm:^7.0.7" + postcss-colormin: "npm:^8.0.0" + postcss-convert-values: "npm:^8.0.0" + postcss-discard-comments: "npm:^8.0.0" + postcss-discard-duplicates: "npm:^8.0.0" + postcss-discard-empty: "npm:^8.0.0" + postcss-discard-overridden: "npm:^8.0.0" + postcss-merge-longhand: "npm:^8.0.0" + postcss-merge-rules: "npm:^8.0.0" + postcss-minify-font-values: "npm:^8.0.0" + postcss-minify-gradients: "npm:^8.0.0" + postcss-minify-params: "npm:^8.0.0" + postcss-minify-selectors: "npm:^8.0.1" + postcss-normalize-charset: "npm:^8.0.0" + postcss-normalize-display-values: "npm:^8.0.0" + postcss-normalize-positions: "npm:^8.0.0" + postcss-normalize-repeat-style: "npm:^8.0.0" + postcss-normalize-string: "npm:^8.0.0" + postcss-normalize-timing-functions: "npm:^8.0.0" + postcss-normalize-unicode: "npm:^8.0.0" + postcss-normalize-url: "npm:^8.0.0" + postcss-normalize-whitespace: "npm:^8.0.0" + postcss-ordered-values: "npm:^8.0.0" + postcss-reduce-initial: "npm:^8.0.0" + postcss-reduce-transforms: "npm:^8.0.0" + postcss-svgo: "npm:^8.0.0" + postcss-unique-selectors: "npm:^8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/803a4581d61689c7f33f65bf84979334a87cc11136c4d74096e6129c9162944e98a219109f4480bebf52555e84778880c94695d2c16f0a14c2097a6c31801325 + postcss: ^8.5.14 + checksum: 10/ca245aaff643cc83fbb8b5179b23262d3b386fb594bbe6d8ea1b49af97f5a8d78d66a96442803b5a30ce3bcc334040634c54d13d26dd7bbbe8f4ec8ed300fcef languageName: node linkType: hard -"cssnano-utils@npm:^5.0.3": - version: 5.0.3 - resolution: "cssnano-utils@npm:5.0.3" +"cssnano-utils@npm:^6.0.0": + version: 6.0.0 + resolution: "cssnano-utils@npm:6.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/8a088118bc7761ed5f4c6b9d1841cf07533c62aee88468ce109a95efe72aaf7cda5be77b18c87d6422c0b4c3b4a5bc3246157f6ad101074c8dde0aefd80257e0 + postcss: ^8.5.14 + checksum: 10/ce45d40337352c26e598dff535887649dab126feb2dbe950f2da013acff0a8b6723d0a3cb0f6be4cd038c93bedc01bbee337aae8f333458277fe99990557c57f languageName: node linkType: hard -"cssnano@npm:^7.1.9": - version: 7.1.9 - resolution: "cssnano@npm:7.1.9" +"cssnano@npm:^8.0.1": + version: 8.0.1 + resolution: "cssnano@npm:8.0.1" dependencies: - cssnano-preset-default: "npm:^7.0.17" + cssnano-preset-default: "npm:^8.0.1" lilconfig: "npm:^3.1.3" peerDependencies: - postcss: ^8.5.13 - checksum: 10/619d855f2938a035ace3de0318cbadef86deef0d7ff5894e1346e117de6776a609e9e19ffdfe89e076241e6c0e92a31b3ccef85b1ddece9493acfc00ca991d70 + postcss: ^8.5.14 + checksum: 10/696537370478a1cdeedd928abd4ae98059269e235ddedfaeaa69bc143d851b0e8d7fb51c271fe0576e3af9ecfe6bad5b37bdb5c32f2ef5c250dd330cfd05a75e languageName: node linkType: hard @@ -7280,7 +7270,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" autoprefixer: "npm:^10.5.0" chokidar: "npm:^4.0.3" - cssnano: "npm:^7.1.9" + cssnano: "npm:^8.0.1" esbuild: "npm:^0.28.0" eslint: "npm:^10.2.1" modern-normalize: "npm:^3.0.1" @@ -13597,67 +13587,67 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^7.0.10": - version: 7.0.10 - resolution: "postcss-colormin@npm:7.0.10" +"postcss-colormin@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-colormin@npm:8.0.0" dependencies: "@colordx/core": "npm:^5.4.3" browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/e8f8dca6fa99afa2a9b0fc1a921c6a674ad0bf94e6ecda139cb9215cc5b653fb4f0802f9e55d0c770dd8f966f731f5b21d7a1f15b9fb244da341ea583fa16da3 + postcss: ^8.5.14 + checksum: 10/cf4f5a2e1e6bd4af51a8f4046b348d8725bdd27472c058eb7b30ccb343ef7ffb4be8b7bd724ee8fc7f6c9704225ef23bf078d4cf8d659f2a7cfd83638315fecf languageName: node linkType: hard -"postcss-convert-values@npm:^7.0.12": - version: 7.0.12 - resolution: "postcss-convert-values@npm:7.0.12" +"postcss-convert-values@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-convert-values@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/c32c4bd56d53b313b3d9b73fc5efffb29912123a0905f68dba66ab18e65ac668deddb2fd9e6eeaaf65b710ba603d79fea01cf9b177b84f51d7966108634387a6 + postcss: ^8.5.14 + checksum: 10/b2cedfec08e8e900df06cb988b03bf18d6fee9e495ecbae9e40b88c32c534571b3c8a533387016015a607b3564f1e2e9a69262ce3e96af25e45d508d84ed3b0b languageName: node linkType: hard -"postcss-discard-comments@npm:^7.0.8": - version: 7.0.8 - resolution: "postcss-discard-comments@npm:7.0.8" +"postcss-discard-comments@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-discard-comments@npm:8.0.0" dependencies: postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/5e2c97bf21a2caf0aa8e77e13e6e44822985aba1e8b377dc8a1c6f65fab820fd971c4a3f071e036175818b810c7b550525c7f8d8cbd181318d12d150af2ab473 + postcss: ^8.5.14 + checksum: 10/949f4297294ce676f696fc944b2b6d4e9b857b5b97f7916a04f4184f79da1d380d12d2324760de6dc8291f86e2ec1c83ae8081f48a006e8e9e3473d23760d373 languageName: node linkType: hard -"postcss-discard-duplicates@npm:^7.0.4": - version: 7.0.4 - resolution: "postcss-discard-duplicates@npm:7.0.4" +"postcss-discard-duplicates@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-discard-duplicates@npm:8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/4230098a937ecc317202bde35d41d2d0c1c2954044e6eb4ed05ffc01de929efb97cbc90af42c74baf2264e8f18ebb4fd63a7bbe5f81da3b3e3d9afab2eb630bd + postcss: ^8.5.14 + checksum: 10/857d883b17ace313960db557be655605da5f6b6bab540bdca5c45d72dac334fdff88cc2846ae5d8148ce8115cd9a7dbb9b9e0444fb27f73503058562471bb643 languageName: node linkType: hard -"postcss-discard-empty@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-discard-empty@npm:7.0.3" +"postcss-discard-empty@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-discard-empty@npm:8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/514d4e011e103e7bf00aa2548b0eac3f0ee9fc7e6c1a6c37aa3937b3406e7fbb17b1b3a72d4d3e475358b3b5cfa7c1e52d6c22e24c8606425d6be16b7de96720 + postcss: ^8.5.14 + checksum: 10/92c9861e2b069d2f246b9601886998927f0aa2f8b514671e29898a6098811cfc77156a16d57db88eb3ff27be9b239353a7bea48c95413a887be40a650ef21d88 languageName: node linkType: hard -"postcss-discard-overridden@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-discard-overridden@npm:7.0.3" +"postcss-discard-overridden@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-discard-overridden@npm:8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/b65cb6bd039a04760abe2dda4290e70ba1e7b39df44a812174687a500b079558af8c26b1d1d1389a85692c3c6874c842cc1f7490d0f7bff2d6017d08f85b6831 + postcss: ^8.5.14 + checksum: 10/0ec624bfab2736f1a4e5dfef0b9fd239e99769c04aedfaf7025131f059956a8ee5afbb0c091673bbf3a0a78d604b0ed6b88b6fdf4b6c5d12e8c73230f01480ef languageName: node linkType: hard @@ -13695,213 +13685,213 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^7.0.7": - version: 7.0.7 - resolution: "postcss-merge-longhand@npm:7.0.7" +"postcss-merge-longhand@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-merge-longhand@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^7.0.11" + stylehacks: "npm:^8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/6428417fc9caa2964af97f54026b73077630d32bd6a8f4927ca0834a15f871935dd3506eace9aa4fbf0f89be07f938e581b5ade76e1f7ffded7a0cf1f6e1489d + postcss: ^8.5.14 + checksum: 10/c8c167c102ff30e835f7d4bae7804e5da15bb75a830adbc33297939541ac3390d7faa7ae4f73ab7796674facfca3c3d05b19cab9424bb6397694667063da516b languageName: node linkType: hard -"postcss-merge-rules@npm:^7.0.11": - version: 7.0.11 - resolution: "postcss-merge-rules@npm:7.0.11" +"postcss-merge-rules@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-merge-rules@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^5.0.3" + cssnano-utils: "npm:^6.0.0" postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/6dd8ffa975d17f31a52da573e9b4a6c42c82a27ea8ca43a826f733da0b941f7d0875060c9753ddfe8b752f19e486c5ef9d0799d0631a92b6250c5be8dae0fcea + postcss: ^8.5.14 + checksum: 10/85e6c01a857e324410c4df5f3d0ce5a7fb137b088ddf0eecd6fb784a2b2c5336547a50eb262d688017872d749439551ff7ca556ca098ace6ae0c5e62390394c1 languageName: node linkType: hard -"postcss-minify-font-values@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-minify-font-values@npm:7.0.3" +"postcss-minify-font-values@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-minify-font-values@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/804977738ed7c6585435b6e14e99ed1fe4959b37c3910998f9e661279454a83559a4f1f140ee8d0cd33f290158af966789f1d3680c5002d0cff89d379ef9c5e7 + postcss: ^8.5.14 + checksum: 10/c5ab440e450fb71592fff8018150b5d2a99bb9068578e1c5b5c10187ef34c58365895ef23a45ef39abd4ad2422f76e997ede8f2a7e71832aaa8b09e6c12936fa languageName: node linkType: hard -"postcss-minify-gradients@npm:^7.0.5": - version: 7.0.5 - resolution: "postcss-minify-gradients@npm:7.0.5" +"postcss-minify-gradients@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-minify-gradients@npm:8.0.0" dependencies: "@colordx/core": "npm:^5.4.3" - cssnano-utils: "npm:^5.0.3" + cssnano-utils: "npm:^6.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/0f6f94a4f37d4dfcbeaa40e8eb05f8ecd3f63dbd6ffca0d93d31ddabb990281fea3c0920dd44790776168e05b5f44abd8209ef0d29a10463c24d21682e4107e5 + postcss: ^8.5.14 + checksum: 10/7fa8a718f79de8b0377c19f4eb2aa304641a0dea243a4b53df88c0f7061b093e34e54143822e8ea963d9f92ecaf298f61cef003adf6e0cdccfb89af195cab5d9 languageName: node linkType: hard -"postcss-minify-params@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-minify-params@npm:7.0.9" +"postcss-minify-params@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-minify-params@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" - cssnano-utils: "npm:^5.0.3" + cssnano-utils: "npm:^6.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/93d7e74ead297e27c75460b4044790dc235bd719ebfac9e24829f8a79981ffd0591bb59759bbe8f23bd49fd7c24ebdf7055e7182a4ff5242099209ea9e34f628 + postcss: ^8.5.14 + checksum: 10/8cc79b825412dd1bcb18d2891305bb5b297fa843cb51bc7f1f289d8a2deeb01acb7d49e9e027774175f3da136bcdba973f6aeaa77f83c959ecdd1f21e304e912 languageName: node linkType: hard -"postcss-minify-selectors@npm:^7.1.2": - version: 7.1.2 - resolution: "postcss-minify-selectors@npm:7.1.2" +"postcss-minify-selectors@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-minify-selectors@npm:8.0.1" dependencies: browserslist: "npm:^4.28.1" caniuse-api: "npm:^3.0.0" cssesc: "npm:^3.0.0" postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/8e7ff64c4bea54d88662e5e75e219b373f71b9afeb52623001d8080272cbdc647c8634d485965c201553e435ea5125f4a80a0e249321238da982c07fd80c0e3d + postcss: ^8.5.14 + checksum: 10/d49afafe548f08e5195c1b650f1b84e9ba116153f80728d059b177e4e3824bcc2e67d92cd6244b9e4be93356c90451af5b6387e9a06a9e9caab64f3e273cf208 languageName: node linkType: hard -"postcss-normalize-charset@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-charset@npm:7.0.3" +"postcss-normalize-charset@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-charset@npm:8.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/c9837d9c5770441e24ec8aa1e858bbe2974bbeec153d4808521802c3d6b5de93265a7acc00c56b3c99c530b6806c78cf0c86b06dd21422bfb5ba814f74dc050e + postcss: ^8.5.14 + checksum: 10/500561e553f732205e01c9e5a01b29bb5a4ab02017ac02c4db4d2497889f683caf9e0c6030f0d2f16a58d8f86ba9cee4f2f73605fdeaa3bc47b4778c779acc93 languageName: node linkType: hard -"postcss-normalize-display-values@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-display-values@npm:7.0.3" +"postcss-normalize-display-values@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-display-values@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/1930f45ec655323192c5e33341af0d3b44ea18ad615cac5ff28c0e519b565c46635adb06840b31a3c5d20773712672a47ee1e461e63a08dd304d06660c63aece + postcss: ^8.5.14 + checksum: 10/106906ff5b46b6c53086ee1266d0aa190e27d92bf189a40d5cc664554b5f457d83e976e1256ff10b26e2758885a62fc82b3c6ee660a03b9ecf12c09bb7a16ba7 languageName: node linkType: hard -"postcss-normalize-positions@npm:^7.0.4": - version: 7.0.4 - resolution: "postcss-normalize-positions@npm:7.0.4" +"postcss-normalize-positions@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-positions@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/aa8ffc54e0ba93d4062585a4a33a5c3984974bb119e449bec736c3ff55d122d16af0700ec47f58f5983644aa4451c84d31f7282a7aa2191d5f999a02bdaa205f + postcss: ^8.5.14 + checksum: 10/3b05ebc4fc30134de57caf23e799f4d1ff6dec7ad5c7eb3ae3cfe7d1198d66e6b4071d74a1d419db050adeb6629a2f756fa30bab85109fda1c331a7e9f407346 languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^7.0.4": - version: 7.0.4 - resolution: "postcss-normalize-repeat-style@npm:7.0.4" +"postcss-normalize-repeat-style@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-repeat-style@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/2902985c069fd9eef7291a3fe16038da930e5fecb047489d4df7c5168a24c81ed919776124e217d24563bb322995586cd9daf104e9269673c271c2243b8ffd8a + postcss: ^8.5.14 + checksum: 10/a466b490fe9ddd120bbf6b2f49c03625ac20b86a342d7dc4846da4fe7f6d21d77814c92ed10f75ade164ca9e566eaf4141261e3415fc7a34815c04a13cb26801 languageName: node linkType: hard -"postcss-normalize-string@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-string@npm:7.0.3" +"postcss-normalize-string@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-string@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/322188b51371c9bfe66a40131971b4f44f91a27266c05d9c8237dd2e32e1e94b0223cd4cf8d67726e42ea0a6195aa7ac51b79d6fbf24cd3aad9ede00f7abeb1a + postcss: ^8.5.14 + checksum: 10/9cb2e8d45bc2845cb353acadebb9081b87a12edc8f76c843f9c6b7beabb9b6411fd883bf70ddd6ed95e11296edd0cbc5fa821503dbe70e2a0bb58a5c732b0483 languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-timing-functions@npm:7.0.3" +"postcss-normalize-timing-functions@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-timing-functions@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/954df533062f493dd8171f44cb678a3519d63bbcd953f014d65a01e8fea37ca97884f66f55aa0e608b3f3c8ba815c02f606633a95aec586e9581d336198582a9 + postcss: ^8.5.14 + checksum: 10/f4830d96272014f5a5cca76fccb0f5a41de01af70afdf43d97c4264a05cdcbb0d0f2444d9f62eb86b7ac796c3abb5a8a66202e7f2a9dbd84c665f7f49bf76d1e languageName: node linkType: hard -"postcss-normalize-unicode@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-normalize-unicode@npm:7.0.9" +"postcss-normalize-unicode@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-unicode@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/7bbb305563253fdce9380242c5ae9d79e39aab55483b8d43ed18f076198bb968cc85b5681ba1f870a1da742110d6a5ff3758f9f6c490dc05c6fe9de86287fa1c + postcss: ^8.5.14 + checksum: 10/ab3481ef7aebf187a5135f2e25ea8d1e5fe933b3760d62535b71545733fa366e22d9aa0fe33531efaf33c723868be17d8fa46afc00a835301b3688ca723a4f84 languageName: node linkType: hard -"postcss-normalize-url@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-url@npm:7.0.3" +"postcss-normalize-url@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-url@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/01897208e2868b4f132e675d0bd905e64c760569d485beca4e88a419fc43d10ca4b324a7b6867ab3dc173d8455251b5d81e08c5e540899cd11beb7b7602baf15 + postcss: ^8.5.14 + checksum: 10/88cc2ec142389b87956d8117f7e1345321ab56367895f2f96e59ed5fb91e40c2ab16d775fe4b92c3b6473811719aa005cebd590d5864157104d9c410f8dee8ae languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-normalize-whitespace@npm:7.0.3" +"postcss-normalize-whitespace@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-normalize-whitespace@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/255485b22efd17e436233cf70a90ec296a4f11771de255cc18d334620c828ce20eb014f9216bca441a921543e82126f3c1abadca6f490fc358ae2a461255adba + postcss: ^8.5.14 + checksum: 10/e72afa4bb504d6e3bb35c08626ad2761994a2e99c1c213ce0d3d78595f5e9ba2e99d40201ea31fcd14f19aa3133f75d36767945d679acef01231b9c1078176a3 languageName: node linkType: hard -"postcss-ordered-values@npm:^7.0.4": - version: 7.0.4 - resolution: "postcss-ordered-values@npm:7.0.4" +"postcss-ordered-values@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-ordered-values@npm:8.0.0" dependencies: - cssnano-utils: "npm:^5.0.3" + cssnano-utils: "npm:^6.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/330f37c1d96d1d8e51d066e21897978786a3088b139807dcae45caa49d95a90ecc82139cc6a78ac50c58c39399e54c15888573bbbcc588f1ac7ae7a7e0964eb3 + postcss: ^8.5.14 + checksum: 10/ec7c828f14c0b5494b6ef3d654c08d89335bd8574b7fbab07551b0682ba0d551c033c0b250372801673260de43852ddd68bf361e1ea934465254c2979d53feba languageName: node linkType: hard -"postcss-reduce-initial@npm:^7.0.9": - version: 7.0.9 - resolution: "postcss-reduce-initial@npm:7.0.9" +"postcss-reduce-initial@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-reduce-initial@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" caniuse-api: "npm:^3.0.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/eb20df1be221d502cb3b49a6732f5f6b02a3922fab442ff79725629f274c23a582e544ac5dadedf8dbdc3ac3c04dbc4ea5ef14d6c3c7b34b6f3e9d27144fd3b4 + postcss: ^8.5.14 + checksum: 10/ca4ff4d9de7703905bf1ed0ea98625441630cdfb46a87226c9e44cdb39bce1b284e7a3305c07d013bb85f49a5df3a677eb4263a18e33576d1e4a1bbee99bf1a0 languageName: node linkType: hard -"postcss-reduce-transforms@npm:^7.0.3": - version: 7.0.3 - resolution: "postcss-reduce-transforms@npm:7.0.3" +"postcss-reduce-transforms@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-reduce-transforms@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.13 - checksum: 10/5a8bf3d7284a657fa854f5f5880c828d1b9f68a4d8da2428f49f9de1425a06a07c0a62faabc5fbc0f4b16534793d6bbc0b264ad0f817c2d70824e87c1cb74bd3 + postcss: ^8.5.14 + checksum: 10/8995b6172244458d083af73b37e6249e0c5858f05b40f4ae8b198bc984d3e61aec3a4539c558031a9ec0601638c1d90dd5ce3287d1ba3f482bd7e12f513c99f0 languageName: node linkType: hard @@ -13927,26 +13917,26 @@ __metadata: languageName: node linkType: hard -"postcss-svgo@npm:^7.1.3": - version: 7.1.3 - resolution: "postcss-svgo@npm:7.1.3" +"postcss-svgo@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-svgo@npm:8.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" svgo: "npm:^4.0.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/a68263739e876e598d6a64e52d74d3f42fa8db1869a11bd10df5e65b6c596cf7d858f632d38407938d1beebd7169e89291c4f59dc650135a6ef4d3ad98d269a1 + postcss: ^8.5.14 + checksum: 10/4c51b8bf29874c5afb61205063b774497b26bff322b8eeef0ee16afa360271e30d5976d5d4bdf9506b4b701481b7fef701245489ad41cfc41c4dd18ae3fa5e35 languageName: node linkType: hard -"postcss-unique-selectors@npm:^7.0.7": - version: 7.0.7 - resolution: "postcss-unique-selectors@npm:7.0.7" +"postcss-unique-selectors@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-unique-selectors@npm:8.0.0" dependencies: postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/e0f4265d57503348a3c2982ee0ace767d37ef6406f6610c96cd3a8a0728f8e77fc50bfd59b79048da687e3c191d54d0b6c0b40be1dfb9fdba26591b8e1fc8112 + postcss: ^8.5.14 + checksum: 10/3dd60fda1472ebe4e720189ab75c54a2879be3e7ab42b4925bb78fec637426eb7278fa3f9b4441933fcfa4a7c4bb616436782c7bce293f95ba65471033cf195b languageName: node linkType: hard @@ -16864,15 +16854,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^7.0.11": - version: 7.0.11 - resolution: "stylehacks@npm:7.0.11" +"stylehacks@npm:^8.0.0": + version: 8.0.0 + resolution: "stylehacks@npm:8.0.0" dependencies: browserslist: "npm:^4.28.2" postcss-selector-parser: "npm:^7.1.1" peerDependencies: - postcss: ^8.5.13 - checksum: 10/937a53ca6c96447438cc1a556744a3cc3268afed8ffdb239326e574eb93b5be8f13d347602d901cd81bb4d790d5568e4b57a9ae9447b21a947feea06d883a5c8 + postcss: ^8.5.14 + checksum: 10/024d3200664647aec37f5487b67f1761457e4518cf7d028bf8872a41fb668beb21448b8d1d21c5ebed7f158fc88cccec342101657d1cfc72090f8a73079ee8d0 languageName: node linkType: hard From f9dbc77b6c8c2b1bc812f0aa500a7227f9555a51 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:02:46 -0500 Subject: [PATCH 046/109] Bump dayjs from 1.11.20 to 1.11.21 --- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../Sites.Web/src/_exportables/package.json | 2 +- .../Users.Web/src/_exportables/package.json | 2 +- yarn.lock | 20 +++++++++---------- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 125bda086f2..3620339e9bb 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -13,7 +13,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "es6-promise": "4.2.8", "eslint": "10.2.1", "eslint-plugin-react": "7.37.5", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index f6a27e83d5e..450701f2994 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -25,7 +25,7 @@ "build-storybook": "storybook build" }, "dependencies": { - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "dompurify": "^3.3.3", "html-react-parser": "^5.2.17", "interact.js": "^1.2.8", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index f8b42484319..32c163200a9 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -44,7 +44,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "dompurify": "^3.3.3", "html-react-parser": "^5.2.17", "promise": "^8.3.0", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 802c234686e..32befe7db4c 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -18,7 +18,7 @@ "@types/react-dom": "^19.2.3", "@types/redux": "^3.6.31", "create-react-class": "^15.7.0", - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "eslint": "10.2.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index 0433960b34b..f1f3172abdc 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -16,7 +16,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "eslint": "10.2.1", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 18a6f3f22fb..d7450c65b52 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -16,7 +16,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "dayjs": "^1.11.20", + "dayjs": "^1.11.21", "eslint": "10.2.1", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", diff --git a/yarn.lock b/yarn.lock index 31ac99aceba..314cfc282c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -530,7 +530,7 @@ __metadata: "@storybook/addon-docs": "npm:10.4.2" "@storybook/addon-onboarding": "npm:10.4.2" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" dompurify: "npm:^3.3.3" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" @@ -6887,10 +6887,10 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.11.20": - version: 1.11.20 - resolution: "dayjs@npm:1.11.20" - checksum: 10/5347533f21a55b8bb1b1ef559be9b805514c3a8fb7e68b75fb7e73808131c59e70909c073aa44ce8a0d159195cd110cdd4081cf87ab96cb06fee3edacae791c6 +"dayjs@npm:^1.11.21": + version: 1.11.21 + resolution: "dayjs@npm:1.11.21" + checksum: 10/dd16f9f2706b61b90e3c346a3211ac3afd9e26193136ce0e87f70bf74d1c17a447bceb230a88b175467fc9f5e3243d8c1544b9897092a12d9c80ee44d338dcb6 languageName: node linkType: hard @@ -7218,7 +7218,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" eslint: "npm:10.2.1" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" @@ -7242,7 +7242,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" eslint: "npm:10.2.1" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" @@ -8582,7 +8582,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" es6-promise: "npm:4.2.8" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" @@ -13195,7 +13195,7 @@ __metadata: "@types/knockout": "npm:^3.4.79" "@types/redux": "npm:3.6.31" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" dompurify: "npm:^3.3.3" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" @@ -15959,7 +15959,7 @@ __metadata: "@types/react-dom": "npm:^19.2.3" "@types/redux": "npm:^3.6.31" create-react-class: "npm:^15.7.0" - dayjs: "npm:^1.11.20" + dayjs: "npm:^1.11.21" dompurify: "npm:^3.3.3" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" From cfa6e0e98462098befa4c15a868c921bbe11eec5 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:04:21 -0500 Subject: [PATCH 047/109] Bump dompurify from 3.3.3 to 3.4.8 --- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- .../editBar/scripts/contrib/purify.min.js | 4 +-- .../personaBar/scripts/contrib/purify.min.js | 4 +-- yarn.lock | 30 +++++++++---------- 14 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index defc702d10b..9564a99905b 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -37,7 +37,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 450701f2994..6a33a04f100 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "dayjs": "^1.11.21", - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17", "interact.js": "^1.2.8", "raw-loader": "4.0.2", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index 2b3fc5d8ec3..aef0e9e982f 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -26,7 +26,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 32c163200a9..bc6d47d63c3 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -45,7 +45,7 @@ }, "dependencies": { "dayjs": "^1.11.21", - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17", "promise": "^8.3.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index 1bd85060a52..d2358f4803e 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -45,7 +45,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 78247ac2855..867e901b4dd 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -30,7 +30,7 @@ "redux-thunk": "^2.4.2" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 32befe7db4c..e16ff4a0b88 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17", "react-custom-scrollbars": "^4.2.1" } diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 90bb5365c30..258042d94f4 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -37,7 +37,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 20e967a3126..cdb5dd2d7d1 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -38,7 +38,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 0df68f3cd99..8f967f61c5e 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 37d03670407..21e5467ea52 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.3.3", + "dompurify": "^3.4.8", "html-react-parser": "^5.2.17" } } diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js index 45bdb2da7df..dbf05df7541 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.1/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:T;if(t&&t(e,null),!h(o))return e;let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function x(e){for(let t=0;t/gm),K=a(/\$\{[\w\W]*/gm),V=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),Z=a(/^aria-[\-\w]+$/),J=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Q=a(/^(?:\w+script|data):/i),ee=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),te=a(/^html$/i),ne=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var oe=Object.freeze({__proto__:null,ARIA_ATTR:Z,ATTR_WHITESPACE:ee,CUSTOM_ELEMENT:ne,DATA_ATTR:V,DOCTYPE_NAME:te,ERB_EXPR:$,IS_ALLOWED_URI:J,IS_SCRIPT_OR_DATA:Q,MUSTACHE_EXPR:q,TMPLIT_EXPR:K});const re=1,ie=3,ae=7,le=8,ce=9,se=function(){return"undefined"==typeof window?null:window};var ue=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:se();const o=e=>t(e);if(o.version="3.4.1",o.removed=[],!n||!n.document||n.document.nodeType!==ce||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:C,Node:L,Element:x,NodeFilter:q,NamedNodeMap:$=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:K,DOMParser:V,trustedTypes:Z}=n,Q=x.prototype,ee=M(Q,"cloneNode"),ne=M(Q,"remove"),ue=M(Q,"nextSibling"),me=M(Q,"childNodes"),fe=M(Q,"parentNode");if("function"==typeof C){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let pe,de="";const{implementation:he,createNodeIterator:Te,createDocumentFragment:ge,getElementsByTagName:ye}=r,{importNode:Ae}=a;let Ee={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof fe&&he&&void 0!==he.createHTMLDocument;const{MUSTACHE_EXPR:_e,ERB_EXPR:Se,TMPLIT_EXPR:be,DATA_ATTR:Ne,ARIA_ATTR:Re,IS_SCRIPT_OR_DATA:De,ATTR_WHITESPACE:Oe,CUSTOM_ELEMENT:Ie}=oe;let{IS_ALLOWED_URI:we}=oe,Ce=null;const Le=k({},[...P,...U,...z,...H,...G]);let ke=null;const xe=k({},[...W,...j,...Y,...X]);let ve=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Me=null,Pe=null;const Ue=Object.seal(l(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let ze=!0,Fe=!0,He=!1,Be=!0,Ge=!1,We=!0,je=!1,Ye=!1,Xe=!1,qe=!1,$e=!1,Ke=!1,Ve=!0,Ze=!1;const Je="user-content-";let Qe=!0,et=!1,tt={},nt=null;const ot=k({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let rt=null;const it=k({},["audio","video","img","source","image","track"]);let at=null;const lt=k({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ct="http://www.w3.org/1998/Math/MathML",st="http://www.w3.org/2000/svg",ut="http://www.w3.org/1999/xhtml";let mt=ut,ft=!1,pt=null;const dt=k({},[ct,st,ut],g);let ht=k({},["mi","mo","mn","ms","mtext"]),Tt=k({},["annotation-xml"]);const gt=k({},["title","style","font","a","script"]);let yt=null;const At=["application/xhtml+xml","text/html"];let Et=null,_t=null;const St=r.createElement("form"),bt=function(e){return e instanceof RegExp||e instanceof Function},Nt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(_t&&_t===e)return;e&&"object"==typeof e||(e={}),e=v(e),yt=-1===At.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Et="application/xhtml+xml"===yt?g:T,Ce=D(e,"ALLOWED_TAGS")&&h(e.ALLOWED_TAGS)?k({},e.ALLOWED_TAGS,Et):Le,ke=D(e,"ALLOWED_ATTR")&&h(e.ALLOWED_ATTR)?k({},e.ALLOWED_ATTR,Et):xe,pt=D(e,"ALLOWED_NAMESPACES")&&h(e.ALLOWED_NAMESPACES)?k({},e.ALLOWED_NAMESPACES,g):dt,at=D(e,"ADD_URI_SAFE_ATTR")&&h(e.ADD_URI_SAFE_ATTR)?k(v(lt),e.ADD_URI_SAFE_ATTR,Et):lt,rt=D(e,"ADD_DATA_URI_TAGS")&&h(e.ADD_DATA_URI_TAGS)?k(v(it),e.ADD_DATA_URI_TAGS,Et):it,nt=D(e,"FORBID_CONTENTS")&&h(e.FORBID_CONTENTS)?k({},e.FORBID_CONTENTS,Et):ot,Me=D(e,"FORBID_TAGS")&&h(e.FORBID_TAGS)?k({},e.FORBID_TAGS,Et):v({}),Pe=D(e,"FORBID_ATTR")&&h(e.FORBID_ATTR)?k({},e.FORBID_ATTR,Et):v({}),tt=!!D(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?v(e.USE_PROFILES):e.USE_PROFILES),ze=!1!==e.ALLOW_ARIA_ATTR,Fe=!1!==e.ALLOW_DATA_ATTR,He=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Be=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ge=e.SAFE_FOR_TEMPLATES||!1,We=!1!==e.SAFE_FOR_XML,je=e.WHOLE_DOCUMENT||!1,qe=e.RETURN_DOM||!1,$e=e.RETURN_DOM_FRAGMENT||!1,Ke=e.RETURN_TRUSTED_TYPE||!1,Xe=e.FORCE_BODY||!1,Ve=!1!==e.SANITIZE_DOM,Ze=e.SANITIZE_NAMED_PROPS||!1,Qe=!1!==e.KEEP_CONTENT,et=e.IN_PLACE||!1,we=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:J,mt="string"==typeof e.NAMESPACE?e.NAMESPACE:ut,ht=D(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?v(e.MATHML_TEXT_INTEGRATION_POINTS):k({},["mi","mo","mn","ms","mtext"]),Tt=D(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?v(e.HTML_INTEGRATION_POINTS):k({},["annotation-xml"]);const t=D(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?v(e.CUSTOM_ELEMENT_HANDLING):l(null);if(ve=l(null),D(t,"tagNameCheck")&&bt(t.tagNameCheck)&&(ve.tagNameCheck=t.tagNameCheck),D(t,"attributeNameCheck")&&bt(t.attributeNameCheck)&&(ve.attributeNameCheck=t.attributeNameCheck),D(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ve.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),Ge&&(Fe=!1),$e&&(qe=!0),tt&&(Ce=k({},G),ke=l(null),!0===tt.html&&(k(Ce,P),k(ke,W)),!0===tt.svg&&(k(Ce,U),k(ke,j),k(ke,X)),!0===tt.svgFilters&&(k(Ce,z),k(ke,j),k(ke,X)),!0===tt.mathMl&&(k(Ce,H),k(ke,Y),k(ke,X))),Ue.tagCheck=null,Ue.attributeCheck=null,D(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ue.tagCheck=e.ADD_TAGS:h(e.ADD_TAGS)&&(Ce===Le&&(Ce=v(Ce)),k(Ce,e.ADD_TAGS,Et))),D(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ue.attributeCheck=e.ADD_ATTR:h(e.ADD_ATTR)&&(ke===xe&&(ke=v(ke)),k(ke,e.ADD_ATTR,Et))),D(e,"ADD_URI_SAFE_ATTR")&&h(e.ADD_URI_SAFE_ATTR)&&k(at,e.ADD_URI_SAFE_ATTR,Et),D(e,"FORBID_CONTENTS")&&h(e.FORBID_CONTENTS)&&(nt===ot&&(nt=v(nt)),k(nt,e.FORBID_CONTENTS,Et)),D(e,"ADD_FORBID_CONTENTS")&&h(e.ADD_FORBID_CONTENTS)&&(nt===ot&&(nt=v(nt)),k(nt,e.ADD_FORBID_CONTENTS,Et)),Qe&&(Ce["#text"]=!0),je&&k(Ce,["html","head","body"]),Ce.table&&(k(Ce,["tbody"]),delete Me.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw w('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw w('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');pe=e.TRUSTED_TYPES_POLICY,de=pe.createHTML("")}else void 0===pe&&(pe=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Z,c)),null!==pe&&"string"==typeof de&&(de=pe.createHTML(""));i&&i(e),_t=e},Rt=k({},[...U,...z,...F]),Dt=k({},[...H,...B]),Ot=function(e){p(o.removed,{element:e});try{fe(e).removeChild(e)}catch(t){ne(e)}},It=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(qe||$e)try{Ot(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},wt=function(e){let t=null,n=null;if(Xe)e=""+e;else{const t=y(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===yt&&mt===ut&&(e=''+e+"");const o=pe?pe.createHTML(e):e;if(mt===ut)try{t=(new V).parseFromString(o,yt)}catch(e){}if(!t||!t.documentElement){t=he.createDocument(mt,"template",null);try{t.documentElement.innerHTML=ft?de:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),mt===ut?ye.call(t,je?"html":"body")[0]:je?t.documentElement:i},Ct=function(e){return Te.call(e.ownerDocument||e,e,q.SHOW_ELEMENT|q.SHOW_COMMENT|q.SHOW_TEXT|q.SHOW_PROCESSING_INSTRUCTION|q.SHOW_CDATA_SECTION,null)},Lt=function(e){return e instanceof K&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof $)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},kt=function(e){return"function"==typeof L&&e instanceof L};function xt(e,t,n){u(e,e=>{e.call(o,t,n,_t)})}const vt=function(e){let t=null;if(xt(Ee.beforeSanitizeElements,e,null),Lt(e))return Ot(e),!0;const n=Et(e.nodeName);if(xt(Ee.uponSanitizeElement,e,{tagName:n,allowedTags:Ce}),We&&e.hasChildNodes()&&!kt(e.firstElementChild)&&I(/<[/\w!]/g,e.innerHTML)&&I(/<[/\w!]/g,e.textContent))return Ot(e),!0;if(We&&e.namespaceURI===ut&&"style"===n&&kt(e.firstElementChild))return Ot(e),!0;if(e.nodeType===ae)return Ot(e),!0;if(We&&e.nodeType===le&&I(/<[/\w]/g,e.data))return Ot(e),!0;if(Me[n]||!(Ue.tagCheck instanceof Function&&Ue.tagCheck(n))&&!Ce[n]){if(!Me[n]&&Ut(n)){if(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,n))return!1;if(ve.tagNameCheck instanceof Function&&ve.tagNameCheck(n))return!1}if(Qe&&!nt[n]){const t=fe(e)||e.parentNode,n=me(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=ee(n[o],!0);t.insertBefore(r,ue(e))}}}return Ot(e),!0}return e instanceof x&&!function(e){let t=fe(e);t&&t.tagName||(t={namespaceURI:mt,tagName:"template"});const n=T(e.tagName),o=T(t.tagName);return!!pt[e.namespaceURI]&&(e.namespaceURI===st?t.namespaceURI===ut?"svg"===n:t.namespaceURI===ct?"svg"===n&&("annotation-xml"===o||ht[o]):Boolean(Rt[n]):e.namespaceURI===ct?t.namespaceURI===ut?"math"===n:t.namespaceURI===st?"math"===n&&Tt[o]:Boolean(Dt[n]):e.namespaceURI===ut?!(t.namespaceURI===st&&!Tt[o])&&!(t.namespaceURI===ct&&!ht[o])&&!Dt[n]&&(gt[n]||!Rt[n]):!("application/xhtml+xml"!==yt||!pt[e.namespaceURI]))}(e)?(Ot(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!I(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ge&&e.nodeType===ie&&(t=e.textContent,u([_e,Se,be],e=>{t=A(t,e," ")}),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),xt(Ee.afterSanitizeElements,e,null),!1):(Ot(e),!0)},Mt=function(e,t,n){if(Pe[t])return!1;if(Ve&&("id"===t||"name"===t)&&(n in r||n in St))return!1;if(Fe&&!Pe[t]&&I(Ne,t));else if(ze&&I(Re,t));else if(Ue.attributeCheck instanceof Function&&Ue.attributeCheck(t,e));else if(!ke[t]||Pe[t]){if(!(Ut(e)&&(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,e)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(e))&&(ve.attributeNameCheck instanceof RegExp&&I(ve.attributeNameCheck,t)||ve.attributeNameCheck instanceof Function&&ve.attributeNameCheck(t,e))||"is"===t&&ve.allowCustomizedBuiltInElements&&(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,n)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(n))))return!1}else if(at[t]);else if(I(we,A(n,Oe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!rt[e]){if(He&&!I(De,A(n,Oe,"")));else if(n)return!1}else;return!0},Pt=k({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Ut=function(e){return!Pt[T(e)]&&I(Ie,e)},zt=function(e){xt(Ee.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||Lt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ke,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=Et(a),m=c;let p="value"===a?m:_(m);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,xt(Ee.uponSanitizeAttribute,e,n),p=n.attrValue,!Ze||"id"!==s&&"name"!==s||0===E(p,Je)||(It(a,e),p=Je+p),We&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,p)){It(a,e);continue}if("attributename"===s&&y(p,"href")){It(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){It(a,e);continue}if(!Be&&I(/\/>/i,p)){It(a,e);continue}Ge&&u([_e,Se,be],e=>{p=A(p,e," ")});const d=Et(e.nodeName);if(Mt(d,s,p)){if(pe&&"object"==typeof Z&&"function"==typeof Z.getAttributeType)if(l);else switch(Z.getAttributeType(d,s)){case"TrustedHTML":p=pe.createHTML(p);break;case"TrustedScriptURL":p=pe.createScriptURL(p)}if(p!==m)try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),Lt(e)?Ot(e):f(o.removed)}catch(t){It(a,e)}}else It(a,e)}xt(Ee.afterSanitizeAttributes,e,null)},Ft=function(e){let t=null;const n=Ct(e);for(xt(Ee.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)xt(Ee.uponSanitizeShadowNode,t,null),vt(t),zt(t),t.content instanceof s&&Ft(t.content);xt(Ee.afterSanitizeShadowDOM,e,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(ft=!e,ft&&(e="\x3c!--\x3e"),"string"!=typeof e&&!kt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return S(e);case"boolean":return b(e);case"bigint":return N?N(e):"0";case"symbol":return R?R(e):"Symbol()";case"undefined":default:return O(e);case"function":case"object":{if(null===e)return O(e);const t=e,n=M(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:O(e)}return O(e)}}}(e)))throw w("dirty is not a string, aborting");if(!o.isSupported)return e;if(Ye||Nt(t),o.removed=[],"string"==typeof e&&(et=!1),et){const t=e.nodeName;if("string"==typeof t){const e=Et(t);if(!Ce[e]||Me[e])throw w("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof L)n=wt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===re&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!qe&&!Ge&&!je&&-1===e.indexOf("<"))return pe&&Ke?pe.createHTML(e):e;if(n=wt(e),!n)return qe?null:Ke?de:""}n&&Xe&&Ot(n.firstChild);const c=Ct(et?e:n);for(;i=c.nextNode();)vt(i),zt(i),i.content instanceof s&&Ft(i.content);if(et)return e;if(qe){if(Ge){n.normalize();let e=n.innerHTML;u([_e,Se,be],t=>{e=A(e,t," ")}),n.innerHTML=e}if($e)for(l=ge.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(ke.shadowroot||ke.shadowrootmode)&&(l=Ae.call(a,l,!0)),l}let m=je?n.outerHTML:n.innerHTML;return je&&Ce["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(te,n.ownerDocument.doctype.name)&&(m="\n"+m),Ge&&u([_e,Se,be],e=>{m=A(m,e," ")}),pe&&Ke?pe.createHTML(m):m},o.setConfig=function(){Nt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ye=!0},o.clearConfig=function(){_t=null,Ye=!1},o.isValidAttribute=function(e,t,n){_t||Nt({});const o=Et(e),r=Et(t);return Mt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&p(Ee[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(Ee[e],t);return-1===n?void 0:d(Ee[e],n,1)[0]}return f(Ee[e])},o.removeHooks=function(e){Ee[e]=[]},o.removeAllHooks=function(){Ee={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return ue}); +/*! @license DOMPurify 3.4.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.8/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function P(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=1,le=3,ce=7,se=8,ue=9,fe=11,me=function(){return"undefined"==typeof window?null:window};var pe=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:me();const o=t=>e(t);if(o.version="3.4.8",o.removed=[],!t||!t.document||t.document.nodeType!==ue||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const c=t.HTMLTemplateElement,u=t.Node,f=t.Element,m=t.NodeFilter,k=t.NamedNodeMap;void 0===k&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const L=t.DOMParser,P=t.trustedTypes,pe=f.prototype,de=U(pe,"cloneNode"),he=U(pe,"remove"),ge=U(pe,"nextSibling"),ye=U(pe,"childNodes"),Te=U(pe,"parentNode"),be=U(pe,"shadowRoot"),Ae=U(pe,"attributes"),Se=u&&u.prototype?U(u.prototype,"nodeType"):null,Ee=u&&u.prototype?U(u.prototype,"nodeName"):null;if("function"==typeof c){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let _e,Ne="",Oe=0;const De=function(e){if(Oe>0)throw x('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');Oe++;try{return _e.createHTML(e)}finally{Oe--}},Re=r,we=Re.implementation,Ie=Re.createNodeIterator,ve=Re.createDocumentFragment,Ce=Re.getElementsByTagName,xe=i.importNode;let ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof Te&&we&&void 0!==we.createHTMLDocument;const Le=V,Me=Z,Pe=J,ze=Q,Ue=ee,Fe=ne,He=oe,Be=ie;let je=te,Ge=null;const We=M({},[...F,...H,...B,...G,...Y]);let Ye=null;const qe=M({},[...q,...X,...$,...K]);let Xe=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),$e=null,Ke=null;const Ve=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Ze=!0,Je=!0,Qe=!1,et=!0,tt=!1,nt=!0,ot=!1,rt=!1,it=!1,at=!1,lt=!1,ct=!1,st=!0,ut=!1;const ft="user-content-";let mt=!0,pt=!1,dt={},ht=null;const gt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let yt=null;const Tt=M({},["audio","video","img","source","image","track"]);let bt=null;const At=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),St="http://www.w3.org/1998/Math/MathML",Et="http://www.w3.org/2000/svg",_t="http://www.w3.org/1999/xhtml";let Nt=_t,Ot=!1,Dt=null;const Rt=M({},[St,Et,_t],A);let wt=M({},["mi","mo","mn","ms","mtext"]),It=M({},["annotation-xml"]);const vt=M({},["title","style","font","a","script"]);let Ct=null;const xt=["application/xhtml+xml","text/html"];let kt=null,Lt=null;const Mt=r.createElement("form"),Pt=function(e){return e instanceof RegExp||e instanceof Function},zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Lt&&Lt===e)return;e&&"object"==typeof e||(e={}),e=z(e),Ct=-1===xt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,kt="application/xhtml+xml"===Ct?A:b,Ge=I(e,"ALLOWED_TAGS")&&T(e.ALLOWED_TAGS)?M({},e.ALLOWED_TAGS,kt):We,Ye=I(e,"ALLOWED_ATTR")&&T(e.ALLOWED_ATTR)?M({},e.ALLOWED_ATTR,kt):qe,Dt=I(e,"ALLOWED_NAMESPACES")&&T(e.ALLOWED_NAMESPACES)?M({},e.ALLOWED_NAMESPACES,A):Rt,bt=I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)?M(z(At),e.ADD_URI_SAFE_ATTR,kt):At,yt=I(e,"ADD_DATA_URI_TAGS")&&T(e.ADD_DATA_URI_TAGS)?M(z(Tt),e.ADD_DATA_URI_TAGS,kt):Tt,ht=I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)?M({},e.FORBID_CONTENTS,kt):gt,$e=I(e,"FORBID_TAGS")&&T(e.FORBID_TAGS)?M({},e.FORBID_TAGS,kt):z({}),Ke=I(e,"FORBID_ATTR")&&T(e.FORBID_ATTR)?M({},e.FORBID_ATTR,kt):z({}),dt=!!I(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?z(e.USE_PROFILES):e.USE_PROFILES),Ze=!1!==e.ALLOW_ARIA_ATTR,Je=!1!==e.ALLOW_DATA_ATTR,Qe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,et=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,tt=e.SAFE_FOR_TEMPLATES||!1,nt=!1!==e.SAFE_FOR_XML,ot=e.WHOLE_DOCUMENT||!1,at=e.RETURN_DOM||!1,lt=e.RETURN_DOM_FRAGMENT||!1,ct=e.RETURN_TRUSTED_TYPE||!1,it=e.FORCE_BODY||!1,st=!1!==e.SANITIZE_DOM,ut=e.SANITIZE_NAMED_PROPS||!1,mt=!1!==e.KEEP_CONTENT,pt=e.IN_PLACE||!1,je=function(e){try{return C(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Nt="string"==typeof e.NAMESPACE?e.NAMESPACE:_t,wt=I(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?z(e.MATHML_TEXT_INTEGRATION_POINTS):M({},["mi","mo","mn","ms","mtext"]),It=I(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?z(e.HTML_INTEGRATION_POINTS):M({},["annotation-xml"]);const t=I(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?z(e.CUSTOM_ELEMENT_HANDLING):s(null);if(Xe=s(null),I(t,"tagNameCheck")&&Pt(t.tagNameCheck)&&(Xe.tagNameCheck=t.tagNameCheck),I(t,"attributeNameCheck")&&Pt(t.attributeNameCheck)&&(Xe.attributeNameCheck=t.attributeNameCheck),I(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(Xe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),tt&&(Je=!1),lt&&(at=!0),dt&&(Ge=M({},Y),Ye=s(null),!0===dt.html&&(M(Ge,F),M(Ye,q)),!0===dt.svg&&(M(Ge,H),M(Ye,X),M(Ye,K)),!0===dt.svgFilters&&(M(Ge,B),M(Ye,X),M(Ye,K)),!0===dt.mathMl&&(M(Ge,G),M(Ye,$),M(Ye,K))),Ve.tagCheck=null,Ve.attributeCheck=null,I(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ve.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Ge===We&&(Ge=z(Ge)),M(Ge,e.ADD_TAGS,kt))),I(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ve.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(Ye===qe&&(Ye=z(Ye)),M(Ye,e.ADD_ATTR,kt))),I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(bt,e.ADD_URI_SAFE_ATTR,kt),I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.FORBID_CONTENTS,kt)),I(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.ADD_FORBID_CONTENTS,kt)),mt&&(Ge["#text"]=!0),ot&&M(Ge,["html","head","body"]),Ge.table&&(M(Ge,["tbody"]),delete $e.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=_e;_e=e.TRUSTED_TYPES_POLICY;try{Ne=De("")}catch(e){throw _e=t,e}}else void 0===_e&&null!==e.TRUSTED_TYPES_POLICY&&(_e=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(P,a)),_e&&"string"==typeof Ne&&(Ne=De(""));(ke.uponSanitizeElement.length>0||ke.uponSanitizeAttribute.length>0)&&Ge===We&&(Ge=z(Ge)),ke.uponSanitizeAttribute.length>0&&Ye===qe&&(Ye=z(Ye)),l&&l(e),Lt=e},Ut=M({},[...H,...B,...j]),Ft=M({},[...G,...W]),Ht=function(e){g(o.removed,{element:e});try{Te(e).removeChild(e)}catch(t){he(e)}},Bt=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(at||lt)try{Ht(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},jt=function(e){let t=null,n=null;if(it)e=""+e;else{const t=S(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ct&&Nt===_t&&(e=''+e+"");const o=_e?De(e):e;if(Nt===_t)try{t=(new L).parseFromString(o,Ct)}catch(e){}if(!t||!t.documentElement){t=we.createDocument(Nt,"template",null);try{t.documentElement.innerHTML=Ot?Ne:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Nt===_t?Ce.call(t,ot?"html":"body")[0]:ot?t.documentElement:i},Gt=function(e){return Ie.call(e.ownerDocument||e,e,m.SHOW_ELEMENT|m.SHOW_COMMENT|m.SHOW_TEXT|m.SHOW_PROCESSING_INSTRUCTION|m.SHOW_CDATA_SECTION,null)},Wt=function(e){var t,n;e.normalize();const o=Ie.call(e.ownerDocument||e,e,m.SHOW_TEXT|m.SHOW_COMMENT|m.SHOW_CDATA_SECTION|m.SHOW_PROCESSING_INSTRUCTION,null);let r=o.nextNode();for(;r;){let e=r.data;p([Le,Me,Pe],t=>{e=E(e,t," ")}),r.data=e,r=o.nextNode()}const i=null!==(t=null===(n=e.querySelectorAll)||void 0===n?void 0:n.call(e,"template"))&&void 0!==t?t:[];p(Array.from(i),e=>{qt(e.content)&&Wt(e.content)})},Yt=function(e){const t=Ee?Ee(e):null;return"string"==typeof t&&("form"===kt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Ae(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==Se(e)||e.childNodes!==ye(e)))},qt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return Se(e)===fe}catch(e){return!1}},Xt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return"number"==typeof Se(e)}catch(e){return!1}};function $t(e,t,n){p(e,e=>{e.call(o,t,n,Lt)})}const Kt=function(e){let t=null;if($t(ke.beforeSanitizeElements,e,null),Yt(e))return Ht(e),!0;const n=kt(Ee?Ee(e):e.nodeName);if($t(ke.uponSanitizeElement,e,{tagName:n,allowedTags:Ge}),nt&&e.hasChildNodes()&&!Xt(e.firstElementChild)&&C(/<[/\w!]/g,e.innerHTML)&&C(/<[/\w!]/g,e.textContent))return Ht(e),!0;if(nt&&e.namespaceURI===_t&&"style"===n&&Xt(e.firstElementChild))return Ht(e),!0;if(e.nodeType===ce)return Ht(e),!0;if(nt&&e.nodeType===se&&C(/<[/\w]/g,e.data))return Ht(e),!0;if($e[n]||!(Ve.tagCheck instanceof Function&&Ve.tagCheck(n))&&!Ge[n]){if(!$e[n]&&Jt(n)){if(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n))return!1;if(Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))return!1}if(mt&&!ht[n]){const t=Te(e),n=ye(e);if(n&&t){for(let o=n.length-1;o>=0;--o){const r=de(n[o],!0);t.insertBefore(r,ge(e))}}}return Ht(e),!0}return((Se?Se(e):e.nodeType)!==ae||function(e){let t=Te(e);t&&t.tagName||(t={namespaceURI:Nt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Dt[e.namespaceURI]&&(e.namespaceURI===Et?t.namespaceURI===_t?"svg"===n:t.namespaceURI===St?"svg"===n&&("annotation-xml"===o||wt[o]):Boolean(Ut[n]):e.namespaceURI===St?t.namespaceURI===_t?"math"===n:t.namespaceURI===Et?"math"===n&&It[o]:Boolean(Ft[n]):e.namespaceURI===_t?!(t.namespaceURI===Et&&!It[o])&&!(t.namespaceURI===St&&!wt[o])&&!Ft[n]&&(vt[n]||!Ut[n]):!("application/xhtml+xml"!==Ct||!Dt[e.namespaceURI]))}(e))&&("noscript"!==n&&"noembed"!==n&&"noframes"!==n||!C(/<\/no(script|embed|frames)/i,e.innerHTML))?(tt&&e.nodeType===le&&(t=e.textContent,p([Le,Me,Pe],e=>{t=E(t,e," ")}),e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)),$t(ke.afterSanitizeElements,e,null),!1):(Ht(e),!0)},Vt=function(e,t,n){if(Ke[t])return!1;if(st&&("id"===t||"name"===t)&&(n in r||n in Mt))return!1;const o=Ye[t]||Ve.attributeCheck instanceof Function&&Ve.attributeCheck(t,e);if(Je&&!Ke[t]&&C(ze,t));else if(Ze&&C(Ue,t));else if(!o||Ke[t]){if(!(Jt(e)&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,e)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(e))&&(Xe.attributeNameCheck instanceof RegExp&&C(Xe.attributeNameCheck,t)||Xe.attributeNameCheck instanceof Function&&Xe.attributeNameCheck(t,e))||"is"===t&&Xe.allowCustomizedBuiltInElements&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))))return!1}else if(bt[t]);else if(C(je,E(n,He,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==_(n,"data:")||!yt[e]){if(Qe&&!C(Fe,E(n,He,"")));else if(n)return!1}else;return!0},Zt=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Jt=function(e){return!Zt[b(e)]&&C(Be,e)},Qt=function(e){$t(ke.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||Yt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ye,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],a=i.name,l=i.namespaceURI,c=i.value,s=kt(a),u=c;let f="value"===a?u:N(u);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,$t(ke.uponSanitizeAttribute,e,n),f=n.attrValue,!ut||"id"!==s&&"name"!==s||0===_(f,ft)||(Bt(a,e),f=ft+f),nt&&C(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){Bt(a,e);continue}if("attributename"===s&&S(f,"href")){Bt(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){Bt(a,e);continue}if(!et&&C(/\/>/i,f)){Bt(a,e);continue}tt&&p([Le,Me,Pe],e=>{f=E(f,e," ")});const m=kt(e.nodeName);if(Vt(m,s,f)){if(_e&&"object"==typeof P&&"function"==typeof P.getAttributeType)if(l);else switch(P.getAttributeType(m,s)){case"TrustedHTML":f=De(f);break;case"TrustedScriptURL":f=_e.createScriptURL(f)}if(f!==u)try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),Yt(e)?Ht(e):h(o.removed)}catch(t){Bt(a,e)}}else Bt(a,e)}$t(ke.afterSanitizeAttributes,e,null)},en=function(e){let t=null;const n=Gt(e);for($t(ke.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){$t(ke.uponSanitizeShadowNode,t,null),Kt(t),Qt(t),qt(t.content)&&en(t.content);if((Se?Se(t):t.nodeType)===ae){const e=be?be(t):t.shadowRoot;qt(e)&&(tn(e),en(e))}}$t(ke.afterSanitizeShadowDOM,e,null)},tn=function(e){const t=Se?Se(e):e.nodeType;if(t===ae){const t=be?be(e):e.shadowRoot;qt(t)&&(tn(t),en(t))}const n=ye?ye(e):e.childNodes;if(!n)return;const o=[];p(n,e=>{g(o,e)});for(const e of o)tn(e);if(t===ae){const t=Ee?Ee(e):null;if("string"==typeof t&&"template"===kt(t)){const t=e.content;qt(t)&&tn(t)}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Ot=!e,Ot&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Xt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return O(e);case"boolean":return D(e);case"bigint":return R?R(e):"0";case"symbol":return w?w(e):"Symbol()";case"undefined":default:return v(e);case"function":case"object":{if(null===e)return v(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:v(e)}return v(e)}}}(e)))throw x("dirty is not a string, aborting");if(!o.isSupported)return e;if(rt||zt(t),o.removed=[],"string"==typeof e&&(pt=!1),pt){const t=Ee?Ee(e):e.nodeName;if("string"==typeof t){const e=kt(t);if(!Ge[e]||$e[e])throw x("root node is forbidden and cannot be sanitized in-place")}if(Yt(e))throw x("root node is clobbered and cannot be sanitized in-place");tn(e)}else if(Xt(e))n=jt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ae&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),tn(r);else{if(!at&&!tt&&!ot&&-1===e.indexOf("<"))return _e&&ct?De(e):e;if(n=jt(e),!n)return at?null:ct?Ne:""}n&&it&&Ht(n.firstChild);const c=Gt(pt?e:n);for(;a=c.nextNode();)Kt(a),Qt(a),qt(a.content)&&en(a.content);if(pt)return tt&&Wt(e),e;if(at){if(tt&&Wt(n),lt)for(l=ve.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ye.shadowroot||Ye.shadowrootmode)&&(l=xe.call(i,l,!0)),l}let s=ot?n.outerHTML:n.innerHTML;return ot&&Ge["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&C(re,n.ownerDocument.doctype.name)&&(s="\n"+s),tt&&p([Le,Me,Pe],e=>{s=E(s,e," ")}),_e&&ct?De(s):s},o.setConfig=function(){zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),rt=!0},o.clearConfig=function(){Lt=null,rt=!1},o.isValidAttribute=function(e,t,n){Lt||zt({});const o=kt(e),r=kt(t);return Vt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(ke[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(ke[e],t);return-1===n?void 0:y(ke[e],n,1)[0]}return h(ke[e])},o.removeHooks=function(e){ke[e]=[]},o.removeAllHooks=function(){ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return pe}); //# sourceMappingURL=purify.min.js.map diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js index 45bdb2da7df..dbf05df7541 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.1/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t){for(var n=arguments.length,o=new Array(n>2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:T;if(t&&t(e,null),!h(o))return e;let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function x(e){for(let t=0;t/gm),K=a(/\$\{[\w\W]*/gm),V=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),Z=a(/^aria-[\-\w]+$/),J=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Q=a(/^(?:\w+script|data):/i),ee=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),te=a(/^html$/i),ne=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var oe=Object.freeze({__proto__:null,ARIA_ATTR:Z,ATTR_WHITESPACE:ee,CUSTOM_ELEMENT:ne,DATA_ATTR:V,DOCTYPE_NAME:te,ERB_EXPR:$,IS_ALLOWED_URI:J,IS_SCRIPT_OR_DATA:Q,MUSTACHE_EXPR:q,TMPLIT_EXPR:K});const re=1,ie=3,ae=7,le=8,ce=9,se=function(){return"undefined"==typeof window?null:window};var ue=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:se();const o=e=>t(e);if(o.version="3.4.1",o.removed=[],!n||!n.document||n.document.nodeType!==ce||!n.Element)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:C,Node:L,Element:x,NodeFilter:q,NamedNodeMap:$=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:K,DOMParser:V,trustedTypes:Z}=n,Q=x.prototype,ee=M(Q,"cloneNode"),ne=M(Q,"remove"),ue=M(Q,"nextSibling"),me=M(Q,"childNodes"),fe=M(Q,"parentNode");if("function"==typeof C){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let pe,de="";const{implementation:he,createNodeIterator:Te,createDocumentFragment:ge,getElementsByTagName:ye}=r,{importNode:Ae}=a;let Ee={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof fe&&he&&void 0!==he.createHTMLDocument;const{MUSTACHE_EXPR:_e,ERB_EXPR:Se,TMPLIT_EXPR:be,DATA_ATTR:Ne,ARIA_ATTR:Re,IS_SCRIPT_OR_DATA:De,ATTR_WHITESPACE:Oe,CUSTOM_ELEMENT:Ie}=oe;let{IS_ALLOWED_URI:we}=oe,Ce=null;const Le=k({},[...P,...U,...z,...H,...G]);let ke=null;const xe=k({},[...W,...j,...Y,...X]);let ve=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Me=null,Pe=null;const Ue=Object.seal(l(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let ze=!0,Fe=!0,He=!1,Be=!0,Ge=!1,We=!0,je=!1,Ye=!1,Xe=!1,qe=!1,$e=!1,Ke=!1,Ve=!0,Ze=!1;const Je="user-content-";let Qe=!0,et=!1,tt={},nt=null;const ot=k({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let rt=null;const it=k({},["audio","video","img","source","image","track"]);let at=null;const lt=k({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ct="http://www.w3.org/1998/Math/MathML",st="http://www.w3.org/2000/svg",ut="http://www.w3.org/1999/xhtml";let mt=ut,ft=!1,pt=null;const dt=k({},[ct,st,ut],g);let ht=k({},["mi","mo","mn","ms","mtext"]),Tt=k({},["annotation-xml"]);const gt=k({},["title","style","font","a","script"]);let yt=null;const At=["application/xhtml+xml","text/html"];let Et=null,_t=null;const St=r.createElement("form"),bt=function(e){return e instanceof RegExp||e instanceof Function},Nt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(_t&&_t===e)return;e&&"object"==typeof e||(e={}),e=v(e),yt=-1===At.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Et="application/xhtml+xml"===yt?g:T,Ce=D(e,"ALLOWED_TAGS")&&h(e.ALLOWED_TAGS)?k({},e.ALLOWED_TAGS,Et):Le,ke=D(e,"ALLOWED_ATTR")&&h(e.ALLOWED_ATTR)?k({},e.ALLOWED_ATTR,Et):xe,pt=D(e,"ALLOWED_NAMESPACES")&&h(e.ALLOWED_NAMESPACES)?k({},e.ALLOWED_NAMESPACES,g):dt,at=D(e,"ADD_URI_SAFE_ATTR")&&h(e.ADD_URI_SAFE_ATTR)?k(v(lt),e.ADD_URI_SAFE_ATTR,Et):lt,rt=D(e,"ADD_DATA_URI_TAGS")&&h(e.ADD_DATA_URI_TAGS)?k(v(it),e.ADD_DATA_URI_TAGS,Et):it,nt=D(e,"FORBID_CONTENTS")&&h(e.FORBID_CONTENTS)?k({},e.FORBID_CONTENTS,Et):ot,Me=D(e,"FORBID_TAGS")&&h(e.FORBID_TAGS)?k({},e.FORBID_TAGS,Et):v({}),Pe=D(e,"FORBID_ATTR")&&h(e.FORBID_ATTR)?k({},e.FORBID_ATTR,Et):v({}),tt=!!D(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?v(e.USE_PROFILES):e.USE_PROFILES),ze=!1!==e.ALLOW_ARIA_ATTR,Fe=!1!==e.ALLOW_DATA_ATTR,He=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Be=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Ge=e.SAFE_FOR_TEMPLATES||!1,We=!1!==e.SAFE_FOR_XML,je=e.WHOLE_DOCUMENT||!1,qe=e.RETURN_DOM||!1,$e=e.RETURN_DOM_FRAGMENT||!1,Ke=e.RETURN_TRUSTED_TYPE||!1,Xe=e.FORCE_BODY||!1,Ve=!1!==e.SANITIZE_DOM,Ze=e.SANITIZE_NAMED_PROPS||!1,Qe=!1!==e.KEEP_CONTENT,et=e.IN_PLACE||!1,we=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:J,mt="string"==typeof e.NAMESPACE?e.NAMESPACE:ut,ht=D(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?v(e.MATHML_TEXT_INTEGRATION_POINTS):k({},["mi","mo","mn","ms","mtext"]),Tt=D(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?v(e.HTML_INTEGRATION_POINTS):k({},["annotation-xml"]);const t=D(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?v(e.CUSTOM_ELEMENT_HANDLING):l(null);if(ve=l(null),D(t,"tagNameCheck")&&bt(t.tagNameCheck)&&(ve.tagNameCheck=t.tagNameCheck),D(t,"attributeNameCheck")&&bt(t.attributeNameCheck)&&(ve.attributeNameCheck=t.attributeNameCheck),D(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ve.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),Ge&&(Fe=!1),$e&&(qe=!0),tt&&(Ce=k({},G),ke=l(null),!0===tt.html&&(k(Ce,P),k(ke,W)),!0===tt.svg&&(k(Ce,U),k(ke,j),k(ke,X)),!0===tt.svgFilters&&(k(Ce,z),k(ke,j),k(ke,X)),!0===tt.mathMl&&(k(Ce,H),k(ke,Y),k(ke,X))),Ue.tagCheck=null,Ue.attributeCheck=null,D(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ue.tagCheck=e.ADD_TAGS:h(e.ADD_TAGS)&&(Ce===Le&&(Ce=v(Ce)),k(Ce,e.ADD_TAGS,Et))),D(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ue.attributeCheck=e.ADD_ATTR:h(e.ADD_ATTR)&&(ke===xe&&(ke=v(ke)),k(ke,e.ADD_ATTR,Et))),D(e,"ADD_URI_SAFE_ATTR")&&h(e.ADD_URI_SAFE_ATTR)&&k(at,e.ADD_URI_SAFE_ATTR,Et),D(e,"FORBID_CONTENTS")&&h(e.FORBID_CONTENTS)&&(nt===ot&&(nt=v(nt)),k(nt,e.FORBID_CONTENTS,Et)),D(e,"ADD_FORBID_CONTENTS")&&h(e.ADD_FORBID_CONTENTS)&&(nt===ot&&(nt=v(nt)),k(nt,e.ADD_FORBID_CONTENTS,Et)),Qe&&(Ce["#text"]=!0),je&&k(Ce,["html","head","body"]),Ce.table&&(k(Ce,["tbody"]),delete Me.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw w('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw w('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');pe=e.TRUSTED_TYPES_POLICY,de=pe.createHTML("")}else void 0===pe&&(pe=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Z,c)),null!==pe&&"string"==typeof de&&(de=pe.createHTML(""));i&&i(e),_t=e},Rt=k({},[...U,...z,...F]),Dt=k({},[...H,...B]),Ot=function(e){p(o.removed,{element:e});try{fe(e).removeChild(e)}catch(t){ne(e)}},It=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(qe||$e)try{Ot(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},wt=function(e){let t=null,n=null;if(Xe)e=""+e;else{const t=y(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===yt&&mt===ut&&(e=''+e+"");const o=pe?pe.createHTML(e):e;if(mt===ut)try{t=(new V).parseFromString(o,yt)}catch(e){}if(!t||!t.documentElement){t=he.createDocument(mt,"template",null);try{t.documentElement.innerHTML=ft?de:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),mt===ut?ye.call(t,je?"html":"body")[0]:je?t.documentElement:i},Ct=function(e){return Te.call(e.ownerDocument||e,e,q.SHOW_ELEMENT|q.SHOW_COMMENT|q.SHOW_TEXT|q.SHOW_PROCESSING_INSTRUCTION|q.SHOW_CDATA_SECTION,null)},Lt=function(e){return e instanceof K&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof $)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},kt=function(e){return"function"==typeof L&&e instanceof L};function xt(e,t,n){u(e,e=>{e.call(o,t,n,_t)})}const vt=function(e){let t=null;if(xt(Ee.beforeSanitizeElements,e,null),Lt(e))return Ot(e),!0;const n=Et(e.nodeName);if(xt(Ee.uponSanitizeElement,e,{tagName:n,allowedTags:Ce}),We&&e.hasChildNodes()&&!kt(e.firstElementChild)&&I(/<[/\w!]/g,e.innerHTML)&&I(/<[/\w!]/g,e.textContent))return Ot(e),!0;if(We&&e.namespaceURI===ut&&"style"===n&&kt(e.firstElementChild))return Ot(e),!0;if(e.nodeType===ae)return Ot(e),!0;if(We&&e.nodeType===le&&I(/<[/\w]/g,e.data))return Ot(e),!0;if(Me[n]||!(Ue.tagCheck instanceof Function&&Ue.tagCheck(n))&&!Ce[n]){if(!Me[n]&&Ut(n)){if(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,n))return!1;if(ve.tagNameCheck instanceof Function&&ve.tagNameCheck(n))return!1}if(Qe&&!nt[n]){const t=fe(e)||e.parentNode,n=me(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=ee(n[o],!0);t.insertBefore(r,ue(e))}}}return Ot(e),!0}return e instanceof x&&!function(e){let t=fe(e);t&&t.tagName||(t={namespaceURI:mt,tagName:"template"});const n=T(e.tagName),o=T(t.tagName);return!!pt[e.namespaceURI]&&(e.namespaceURI===st?t.namespaceURI===ut?"svg"===n:t.namespaceURI===ct?"svg"===n&&("annotation-xml"===o||ht[o]):Boolean(Rt[n]):e.namespaceURI===ct?t.namespaceURI===ut?"math"===n:t.namespaceURI===st?"math"===n&&Tt[o]:Boolean(Dt[n]):e.namespaceURI===ut?!(t.namespaceURI===st&&!Tt[o])&&!(t.namespaceURI===ct&&!ht[o])&&!Dt[n]&&(gt[n]||!Rt[n]):!("application/xhtml+xml"!==yt||!pt[e.namespaceURI]))}(e)?(Ot(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!I(/<\/no(script|embed|frames)/i,e.innerHTML)?(Ge&&e.nodeType===ie&&(t=e.textContent,u([_e,Se,be],e=>{t=A(t,e," ")}),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),xt(Ee.afterSanitizeElements,e,null),!1):(Ot(e),!0)},Mt=function(e,t,n){if(Pe[t])return!1;if(Ve&&("id"===t||"name"===t)&&(n in r||n in St))return!1;if(Fe&&!Pe[t]&&I(Ne,t));else if(ze&&I(Re,t));else if(Ue.attributeCheck instanceof Function&&Ue.attributeCheck(t,e));else if(!ke[t]||Pe[t]){if(!(Ut(e)&&(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,e)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(e))&&(ve.attributeNameCheck instanceof RegExp&&I(ve.attributeNameCheck,t)||ve.attributeNameCheck instanceof Function&&ve.attributeNameCheck(t,e))||"is"===t&&ve.allowCustomizedBuiltInElements&&(ve.tagNameCheck instanceof RegExp&&I(ve.tagNameCheck,n)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(n))))return!1}else if(at[t]);else if(I(we,A(n,Oe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==E(n,"data:")||!rt[e]){if(He&&!I(De,A(n,Oe,"")));else if(n)return!1}else;return!0},Pt=k({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Ut=function(e){return!Pt[T(e)]&&I(Ie,e)},zt=function(e){xt(Ee.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||Lt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ke,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=Et(a),m=c;let p="value"===a?m:_(m);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,xt(Ee.uponSanitizeAttribute,e,n),p=n.attrValue,!Ze||"id"!==s&&"name"!==s||0===E(p,Je)||(It(a,e),p=Je+p),We&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,p)){It(a,e);continue}if("attributename"===s&&y(p,"href")){It(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){It(a,e);continue}if(!Be&&I(/\/>/i,p)){It(a,e);continue}Ge&&u([_e,Se,be],e=>{p=A(p,e," ")});const d=Et(e.nodeName);if(Mt(d,s,p)){if(pe&&"object"==typeof Z&&"function"==typeof Z.getAttributeType)if(l);else switch(Z.getAttributeType(d,s)){case"TrustedHTML":p=pe.createHTML(p);break;case"TrustedScriptURL":p=pe.createScriptURL(p)}if(p!==m)try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),Lt(e)?Ot(e):f(o.removed)}catch(t){It(a,e)}}else It(a,e)}xt(Ee.afterSanitizeAttributes,e,null)},Ft=function(e){let t=null;const n=Ct(e);for(xt(Ee.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)xt(Ee.uponSanitizeShadowNode,t,null),vt(t),zt(t),t.content instanceof s&&Ft(t.content);xt(Ee.afterSanitizeShadowDOM,e,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(ft=!e,ft&&(e="\x3c!--\x3e"),"string"!=typeof e&&!kt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return S(e);case"boolean":return b(e);case"bigint":return N?N(e):"0";case"symbol":return R?R(e):"Symbol()";case"undefined":default:return O(e);case"function":case"object":{if(null===e)return O(e);const t=e,n=M(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:O(e)}return O(e)}}}(e)))throw w("dirty is not a string, aborting");if(!o.isSupported)return e;if(Ye||Nt(t),o.removed=[],"string"==typeof e&&(et=!1),et){const t=e.nodeName;if("string"==typeof t){const e=Et(t);if(!Ce[e]||Me[e])throw w("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof L)n=wt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===re&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!qe&&!Ge&&!je&&-1===e.indexOf("<"))return pe&&Ke?pe.createHTML(e):e;if(n=wt(e),!n)return qe?null:Ke?de:""}n&&Xe&&Ot(n.firstChild);const c=Ct(et?e:n);for(;i=c.nextNode();)vt(i),zt(i),i.content instanceof s&&Ft(i.content);if(et)return e;if(qe){if(Ge){n.normalize();let e=n.innerHTML;u([_e,Se,be],t=>{e=A(e,t," ")}),n.innerHTML=e}if($e)for(l=ge.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(ke.shadowroot||ke.shadowrootmode)&&(l=Ae.call(a,l,!0)),l}let m=je?n.outerHTML:n.innerHTML;return je&&Ce["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(te,n.ownerDocument.doctype.name)&&(m="\n"+m),Ge&&u([_e,Se,be],e=>{m=A(m,e," ")}),pe&&Ke?pe.createHTML(m):m},o.setConfig=function(){Nt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ye=!0},o.clearConfig=function(){_t=null,Ye=!1},o.isValidAttribute=function(e,t,n){_t||Nt({});const o=Et(e),r=Et(t);return Mt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&p(Ee[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=m(Ee[e],t);return-1===n?void 0:d(Ee[e],n,1)[0]}return f(Ee[e])},o.removeHooks=function(e){Ee[e]=[]},o.removeAllHooks=function(){Ee={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return ue}); +/*! @license DOMPurify 3.4.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.8/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function P(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=1,le=3,ce=7,se=8,ue=9,fe=11,me=function(){return"undefined"==typeof window?null:window};var pe=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:me();const o=t=>e(t);if(o.version="3.4.8",o.removed=[],!t||!t.document||t.document.nodeType!==ue||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const c=t.HTMLTemplateElement,u=t.Node,f=t.Element,m=t.NodeFilter,k=t.NamedNodeMap;void 0===k&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const L=t.DOMParser,P=t.trustedTypes,pe=f.prototype,de=U(pe,"cloneNode"),he=U(pe,"remove"),ge=U(pe,"nextSibling"),ye=U(pe,"childNodes"),Te=U(pe,"parentNode"),be=U(pe,"shadowRoot"),Ae=U(pe,"attributes"),Se=u&&u.prototype?U(u.prototype,"nodeType"):null,Ee=u&&u.prototype?U(u.prototype,"nodeName"):null;if("function"==typeof c){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let _e,Ne="",Oe=0;const De=function(e){if(Oe>0)throw x('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');Oe++;try{return _e.createHTML(e)}finally{Oe--}},Re=r,we=Re.implementation,Ie=Re.createNodeIterator,ve=Re.createDocumentFragment,Ce=Re.getElementsByTagName,xe=i.importNode;let ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof Te&&we&&void 0!==we.createHTMLDocument;const Le=V,Me=Z,Pe=J,ze=Q,Ue=ee,Fe=ne,He=oe,Be=ie;let je=te,Ge=null;const We=M({},[...F,...H,...B,...G,...Y]);let Ye=null;const qe=M({},[...q,...X,...$,...K]);let Xe=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),$e=null,Ke=null;const Ve=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Ze=!0,Je=!0,Qe=!1,et=!0,tt=!1,nt=!0,ot=!1,rt=!1,it=!1,at=!1,lt=!1,ct=!1,st=!0,ut=!1;const ft="user-content-";let mt=!0,pt=!1,dt={},ht=null;const gt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let yt=null;const Tt=M({},["audio","video","img","source","image","track"]);let bt=null;const At=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),St="http://www.w3.org/1998/Math/MathML",Et="http://www.w3.org/2000/svg",_t="http://www.w3.org/1999/xhtml";let Nt=_t,Ot=!1,Dt=null;const Rt=M({},[St,Et,_t],A);let wt=M({},["mi","mo","mn","ms","mtext"]),It=M({},["annotation-xml"]);const vt=M({},["title","style","font","a","script"]);let Ct=null;const xt=["application/xhtml+xml","text/html"];let kt=null,Lt=null;const Mt=r.createElement("form"),Pt=function(e){return e instanceof RegExp||e instanceof Function},zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Lt&&Lt===e)return;e&&"object"==typeof e||(e={}),e=z(e),Ct=-1===xt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,kt="application/xhtml+xml"===Ct?A:b,Ge=I(e,"ALLOWED_TAGS")&&T(e.ALLOWED_TAGS)?M({},e.ALLOWED_TAGS,kt):We,Ye=I(e,"ALLOWED_ATTR")&&T(e.ALLOWED_ATTR)?M({},e.ALLOWED_ATTR,kt):qe,Dt=I(e,"ALLOWED_NAMESPACES")&&T(e.ALLOWED_NAMESPACES)?M({},e.ALLOWED_NAMESPACES,A):Rt,bt=I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)?M(z(At),e.ADD_URI_SAFE_ATTR,kt):At,yt=I(e,"ADD_DATA_URI_TAGS")&&T(e.ADD_DATA_URI_TAGS)?M(z(Tt),e.ADD_DATA_URI_TAGS,kt):Tt,ht=I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)?M({},e.FORBID_CONTENTS,kt):gt,$e=I(e,"FORBID_TAGS")&&T(e.FORBID_TAGS)?M({},e.FORBID_TAGS,kt):z({}),Ke=I(e,"FORBID_ATTR")&&T(e.FORBID_ATTR)?M({},e.FORBID_ATTR,kt):z({}),dt=!!I(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?z(e.USE_PROFILES):e.USE_PROFILES),Ze=!1!==e.ALLOW_ARIA_ATTR,Je=!1!==e.ALLOW_DATA_ATTR,Qe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,et=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,tt=e.SAFE_FOR_TEMPLATES||!1,nt=!1!==e.SAFE_FOR_XML,ot=e.WHOLE_DOCUMENT||!1,at=e.RETURN_DOM||!1,lt=e.RETURN_DOM_FRAGMENT||!1,ct=e.RETURN_TRUSTED_TYPE||!1,it=e.FORCE_BODY||!1,st=!1!==e.SANITIZE_DOM,ut=e.SANITIZE_NAMED_PROPS||!1,mt=!1!==e.KEEP_CONTENT,pt=e.IN_PLACE||!1,je=function(e){try{return C(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Nt="string"==typeof e.NAMESPACE?e.NAMESPACE:_t,wt=I(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?z(e.MATHML_TEXT_INTEGRATION_POINTS):M({},["mi","mo","mn","ms","mtext"]),It=I(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?z(e.HTML_INTEGRATION_POINTS):M({},["annotation-xml"]);const t=I(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?z(e.CUSTOM_ELEMENT_HANDLING):s(null);if(Xe=s(null),I(t,"tagNameCheck")&&Pt(t.tagNameCheck)&&(Xe.tagNameCheck=t.tagNameCheck),I(t,"attributeNameCheck")&&Pt(t.attributeNameCheck)&&(Xe.attributeNameCheck=t.attributeNameCheck),I(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(Xe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),tt&&(Je=!1),lt&&(at=!0),dt&&(Ge=M({},Y),Ye=s(null),!0===dt.html&&(M(Ge,F),M(Ye,q)),!0===dt.svg&&(M(Ge,H),M(Ye,X),M(Ye,K)),!0===dt.svgFilters&&(M(Ge,B),M(Ye,X),M(Ye,K)),!0===dt.mathMl&&(M(Ge,G),M(Ye,$),M(Ye,K))),Ve.tagCheck=null,Ve.attributeCheck=null,I(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ve.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Ge===We&&(Ge=z(Ge)),M(Ge,e.ADD_TAGS,kt))),I(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ve.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(Ye===qe&&(Ye=z(Ye)),M(Ye,e.ADD_ATTR,kt))),I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(bt,e.ADD_URI_SAFE_ATTR,kt),I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.FORBID_CONTENTS,kt)),I(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.ADD_FORBID_CONTENTS,kt)),mt&&(Ge["#text"]=!0),ot&&M(Ge,["html","head","body"]),Ge.table&&(M(Ge,["tbody"]),delete $e.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=_e;_e=e.TRUSTED_TYPES_POLICY;try{Ne=De("")}catch(e){throw _e=t,e}}else void 0===_e&&null!==e.TRUSTED_TYPES_POLICY&&(_e=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(P,a)),_e&&"string"==typeof Ne&&(Ne=De(""));(ke.uponSanitizeElement.length>0||ke.uponSanitizeAttribute.length>0)&&Ge===We&&(Ge=z(Ge)),ke.uponSanitizeAttribute.length>0&&Ye===qe&&(Ye=z(Ye)),l&&l(e),Lt=e},Ut=M({},[...H,...B,...j]),Ft=M({},[...G,...W]),Ht=function(e){g(o.removed,{element:e});try{Te(e).removeChild(e)}catch(t){he(e)}},Bt=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(at||lt)try{Ht(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},jt=function(e){let t=null,n=null;if(it)e=""+e;else{const t=S(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ct&&Nt===_t&&(e=''+e+"");const o=_e?De(e):e;if(Nt===_t)try{t=(new L).parseFromString(o,Ct)}catch(e){}if(!t||!t.documentElement){t=we.createDocument(Nt,"template",null);try{t.documentElement.innerHTML=Ot?Ne:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Nt===_t?Ce.call(t,ot?"html":"body")[0]:ot?t.documentElement:i},Gt=function(e){return Ie.call(e.ownerDocument||e,e,m.SHOW_ELEMENT|m.SHOW_COMMENT|m.SHOW_TEXT|m.SHOW_PROCESSING_INSTRUCTION|m.SHOW_CDATA_SECTION,null)},Wt=function(e){var t,n;e.normalize();const o=Ie.call(e.ownerDocument||e,e,m.SHOW_TEXT|m.SHOW_COMMENT|m.SHOW_CDATA_SECTION|m.SHOW_PROCESSING_INSTRUCTION,null);let r=o.nextNode();for(;r;){let e=r.data;p([Le,Me,Pe],t=>{e=E(e,t," ")}),r.data=e,r=o.nextNode()}const i=null!==(t=null===(n=e.querySelectorAll)||void 0===n?void 0:n.call(e,"template"))&&void 0!==t?t:[];p(Array.from(i),e=>{qt(e.content)&&Wt(e.content)})},Yt=function(e){const t=Ee?Ee(e):null;return"string"==typeof t&&("form"===kt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Ae(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==Se(e)||e.childNodes!==ye(e)))},qt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return Se(e)===fe}catch(e){return!1}},Xt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return"number"==typeof Se(e)}catch(e){return!1}};function $t(e,t,n){p(e,e=>{e.call(o,t,n,Lt)})}const Kt=function(e){let t=null;if($t(ke.beforeSanitizeElements,e,null),Yt(e))return Ht(e),!0;const n=kt(Ee?Ee(e):e.nodeName);if($t(ke.uponSanitizeElement,e,{tagName:n,allowedTags:Ge}),nt&&e.hasChildNodes()&&!Xt(e.firstElementChild)&&C(/<[/\w!]/g,e.innerHTML)&&C(/<[/\w!]/g,e.textContent))return Ht(e),!0;if(nt&&e.namespaceURI===_t&&"style"===n&&Xt(e.firstElementChild))return Ht(e),!0;if(e.nodeType===ce)return Ht(e),!0;if(nt&&e.nodeType===se&&C(/<[/\w]/g,e.data))return Ht(e),!0;if($e[n]||!(Ve.tagCheck instanceof Function&&Ve.tagCheck(n))&&!Ge[n]){if(!$e[n]&&Jt(n)){if(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n))return!1;if(Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))return!1}if(mt&&!ht[n]){const t=Te(e),n=ye(e);if(n&&t){for(let o=n.length-1;o>=0;--o){const r=de(n[o],!0);t.insertBefore(r,ge(e))}}}return Ht(e),!0}return((Se?Se(e):e.nodeType)!==ae||function(e){let t=Te(e);t&&t.tagName||(t={namespaceURI:Nt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Dt[e.namespaceURI]&&(e.namespaceURI===Et?t.namespaceURI===_t?"svg"===n:t.namespaceURI===St?"svg"===n&&("annotation-xml"===o||wt[o]):Boolean(Ut[n]):e.namespaceURI===St?t.namespaceURI===_t?"math"===n:t.namespaceURI===Et?"math"===n&&It[o]:Boolean(Ft[n]):e.namespaceURI===_t?!(t.namespaceURI===Et&&!It[o])&&!(t.namespaceURI===St&&!wt[o])&&!Ft[n]&&(vt[n]||!Ut[n]):!("application/xhtml+xml"!==Ct||!Dt[e.namespaceURI]))}(e))&&("noscript"!==n&&"noembed"!==n&&"noframes"!==n||!C(/<\/no(script|embed|frames)/i,e.innerHTML))?(tt&&e.nodeType===le&&(t=e.textContent,p([Le,Me,Pe],e=>{t=E(t,e," ")}),e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)),$t(ke.afterSanitizeElements,e,null),!1):(Ht(e),!0)},Vt=function(e,t,n){if(Ke[t])return!1;if(st&&("id"===t||"name"===t)&&(n in r||n in Mt))return!1;const o=Ye[t]||Ve.attributeCheck instanceof Function&&Ve.attributeCheck(t,e);if(Je&&!Ke[t]&&C(ze,t));else if(Ze&&C(Ue,t));else if(!o||Ke[t]){if(!(Jt(e)&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,e)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(e))&&(Xe.attributeNameCheck instanceof RegExp&&C(Xe.attributeNameCheck,t)||Xe.attributeNameCheck instanceof Function&&Xe.attributeNameCheck(t,e))||"is"===t&&Xe.allowCustomizedBuiltInElements&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))))return!1}else if(bt[t]);else if(C(je,E(n,He,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==_(n,"data:")||!yt[e]){if(Qe&&!C(Fe,E(n,He,"")));else if(n)return!1}else;return!0},Zt=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Jt=function(e){return!Zt[b(e)]&&C(Be,e)},Qt=function(e){$t(ke.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||Yt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ye,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],a=i.name,l=i.namespaceURI,c=i.value,s=kt(a),u=c;let f="value"===a?u:N(u);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,$t(ke.uponSanitizeAttribute,e,n),f=n.attrValue,!ut||"id"!==s&&"name"!==s||0===_(f,ft)||(Bt(a,e),f=ft+f),nt&&C(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){Bt(a,e);continue}if("attributename"===s&&S(f,"href")){Bt(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){Bt(a,e);continue}if(!et&&C(/\/>/i,f)){Bt(a,e);continue}tt&&p([Le,Me,Pe],e=>{f=E(f,e," ")});const m=kt(e.nodeName);if(Vt(m,s,f)){if(_e&&"object"==typeof P&&"function"==typeof P.getAttributeType)if(l);else switch(P.getAttributeType(m,s)){case"TrustedHTML":f=De(f);break;case"TrustedScriptURL":f=_e.createScriptURL(f)}if(f!==u)try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),Yt(e)?Ht(e):h(o.removed)}catch(t){Bt(a,e)}}else Bt(a,e)}$t(ke.afterSanitizeAttributes,e,null)},en=function(e){let t=null;const n=Gt(e);for($t(ke.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){$t(ke.uponSanitizeShadowNode,t,null),Kt(t),Qt(t),qt(t.content)&&en(t.content);if((Se?Se(t):t.nodeType)===ae){const e=be?be(t):t.shadowRoot;qt(e)&&(tn(e),en(e))}}$t(ke.afterSanitizeShadowDOM,e,null)},tn=function(e){const t=Se?Se(e):e.nodeType;if(t===ae){const t=be?be(e):e.shadowRoot;qt(t)&&(tn(t),en(t))}const n=ye?ye(e):e.childNodes;if(!n)return;const o=[];p(n,e=>{g(o,e)});for(const e of o)tn(e);if(t===ae){const t=Ee?Ee(e):null;if("string"==typeof t&&"template"===kt(t)){const t=e.content;qt(t)&&tn(t)}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Ot=!e,Ot&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Xt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return O(e);case"boolean":return D(e);case"bigint":return R?R(e):"0";case"symbol":return w?w(e):"Symbol()";case"undefined":default:return v(e);case"function":case"object":{if(null===e)return v(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:v(e)}return v(e)}}}(e)))throw x("dirty is not a string, aborting");if(!o.isSupported)return e;if(rt||zt(t),o.removed=[],"string"==typeof e&&(pt=!1),pt){const t=Ee?Ee(e):e.nodeName;if("string"==typeof t){const e=kt(t);if(!Ge[e]||$e[e])throw x("root node is forbidden and cannot be sanitized in-place")}if(Yt(e))throw x("root node is clobbered and cannot be sanitized in-place");tn(e)}else if(Xt(e))n=jt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ae&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),tn(r);else{if(!at&&!tt&&!ot&&-1===e.indexOf("<"))return _e&&ct?De(e):e;if(n=jt(e),!n)return at?null:ct?Ne:""}n&&it&&Ht(n.firstChild);const c=Gt(pt?e:n);for(;a=c.nextNode();)Kt(a),Qt(a),qt(a.content)&&en(a.content);if(pt)return tt&&Wt(e),e;if(at){if(tt&&Wt(n),lt)for(l=ve.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ye.shadowroot||Ye.shadowrootmode)&&(l=xe.call(i,l,!0)),l}let s=ot?n.outerHTML:n.innerHTML;return ot&&Ge["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&C(re,n.ownerDocument.doctype.name)&&(s="\n"+s),tt&&p([Le,Me,Pe],e=>{s=E(s,e," ")}),_e&&ct?De(s):s},o.setConfig=function(){zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),rt=!0},o.clearConfig=function(){Lt=null,rt=!1},o.isValidAttribute=function(e,t,n){Lt||zt({});const o=kt(e),r=kt(t);return Vt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(ke[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(ke[e],t);return-1===n?void 0:y(ke[e],n,1)[0]}return h(ke[e])},o.removeHooks=function(e){ke[e]=[]},o.removeAllHooks=function(){ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return pe}); //# sourceMappingURL=purify.min.js.map diff --git a/yarn.lock b/yarn.lock index 314cfc282c6..174c5de08d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -531,7 +531,7 @@ __metadata: "@storybook/addon-onboarding": "npm:10.4.2" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" @@ -4993,7 +4993,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" @@ -7379,15 +7379,15 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.3.3": - version: 3.4.1 - resolution: "dompurify@npm:3.4.1" +"dompurify@npm:^3.4.8": + version: 3.4.8 + resolution: "dompurify@npm:3.4.8" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/dcaf945376eff2a61841b205501b163b2c8ae9afe7251e68276b561d9fcf943cefc67e2631fdeae080b52a8b37c96e6beb7e6ae80ad8a83692ff67965dd6b4db + checksum: 10/d661322889a8938bfb99ee27853e9e78661949398e803f344865fd94f8378a494efadd329faea0b16e8085efae1bfeed5f5df372909c3a2be3e583686a0a48fa languageName: node linkType: hard @@ -8622,7 +8622,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" @@ -13196,7 +13196,7 @@ __metadata: "@types/redux": "npm:3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" eslint: "npm:^10.2.1" @@ -14081,7 +14081,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" es6-object-assign: "npm:1.1.0" @@ -15792,7 +15792,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" @@ -15960,7 +15960,7 @@ __metadata: "@types/redux": "npm:^3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" @@ -16172,7 +16172,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" @@ -16209,7 +16209,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" eslint: "npm:10.2.1" eslint-plugin-jest: "npm:^29.15.0" eslint-plugin-react: "npm:7.37.5" @@ -17026,7 +17026,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" @@ -17054,7 +17054,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.3.3" + dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" eslint: "npm:10.2.1" eslint-plugin-react: "npm:7.37.5" From 43623ebe2c12a7f65301364d5f0d0f316666d3f0 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:35:53 -0500 Subject: [PATCH 048/109] Bump eslint-import-resolver-node from 0.3.9 to 0.3.10 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 75 ++++++++++++++++++- 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 6a33a04f100..03ef266e4d2 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -58,7 +58,7 @@ "enzyme-adapter-react-16": "^1.15.8", "enzyme-to-json": "^3.6.2", "eslint": "^10.2.1", - "eslint-import-resolver-node": "^0.3.9", + "eslint-import-resolver-node": "^0.3.10", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.15.0", diff --git a/yarn.lock b/yarn.lock index 174c5de08d9..fdec83279be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -536,7 +536,7 @@ __metadata: enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" eslint: "npm:^10.2.1" - eslint-import-resolver-node: "npm:^0.3.9" + eslint-import-resolver-node: "npm:^0.3.10" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jest: "npm:^29.15.0" @@ -8192,6 +8192,17 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.10": + version: 0.3.10 + resolution: "eslint-import-resolver-node@npm:0.3.10" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.16.1" + resolve: "npm:^2.0.0-next.6" + checksum: 10/f0ad564d345fc53076b46f726b6f9ba96a40d1b7cb33d515ea89d41d1dba37db4ff9b864550608756c2ba061c9e243bf10b920d975848616d0c6c4474f4ea415 + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -9378,6 +9389,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.3": + version: 2.0.4 + resolution: "hasown@npm:2.0.4" + dependencies: + function-bind: "npm:^1.1.2" + checksum: 10/13823863ae48161068b4c51606a3128451c66f14545a5169d667fe9fca168dcd38c27570c7a299e32ef844b8da3d55def7fe88602f8970d4311fb543ee88001a + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^2.1.1": version: 2.5.5 resolution: "hoist-non-react-statics@npm:2.5.5" @@ -9952,6 +9972,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.2": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" + dependencies: + hasown: "npm:^2.0.3" + checksum: 10/6ee7535d82bbe457685799c5f145daf4b7c6be3afbd8e90788429d557f663d6dee72a8e4b9a45d0d756c243fcb5028095999243df090e5f04c02b153786bc8c6 + languageName: node + linkType: hard + "is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": version: 1.0.2 resolution: "is-data-view@npm:1.0.2" @@ -12283,6 +12312,18 @@ __metadata: languageName: node linkType: hard +"node-exports-info@npm:^1.6.0": + version: 1.6.0 + resolution: "node-exports-info@npm:1.6.0" + dependencies: + array.prototype.flatmap: "npm:^1.3.3" + es-errors: "npm:^1.3.0" + object.entries: "npm:^1.1.9" + semver: "npm:^6.3.1" + checksum: 10/0a1667d535f499ac1fe6c6d22f8146bc8b68abc76fa355856219202f6cf5f386027e0ff054e66a22d08be02acbc63fcdc9f98d0fbc97993f5eabc66408fdadad + languageName: node + linkType: hard + "node-gyp@npm:^12.1.0": version: 12.2.0 resolution: "node-gyp@npm:12.2.0" @@ -15206,6 +15247,22 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^2.0.0-next.6": + version: 2.0.0-next.7 + resolution: "resolve@npm:2.0.0-next.7" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/0a6fbd452518c128355a72e3773e65d047128bbc5045d954eca7f911683abfb1b0177494ff8734ca74f2a7a4e3a6bfad9cd6d19a2bde0fe9851025a2734d4a0f + languageName: node + linkType: hard + "resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" @@ -15246,6 +15303,22 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@npm%3A^2.0.0-next.6#optional!builtin": + version: 2.0.0-next.7 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=c3c19d" + dependencies: + es-errors: "npm:^1.3.0" + is-core-module: "npm:^2.16.2" + node-exports-info: "npm:^1.6.0" + object-keys: "npm:^1.1.1" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" + bin: + resolve: bin/resolve + checksum: 10/2c6dd4194c8aa900db299020fcad253239c670ea82a65c8387f1d2885e8dcf6742b64c439e3c811e046a5252eba94f2092b7867e34b7f895e733be48d575192b + languageName: node + linkType: hard + "resp-modifier@npm:6.0.2": version: 6.0.2 resolution: "resp-modifier@npm:6.0.2" From ca50276483a94a43de5b098a7bd365ab2f430856 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:36:45 -0500 Subject: [PATCH 049/109] Bump eslint-import-resolver-node from 0.3.10 to 0.4.0 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 03ef266e4d2..c70f44c525b 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -58,7 +58,7 @@ "enzyme-adapter-react-16": "^1.15.8", "enzyme-to-json": "^3.6.2", "eslint": "^10.2.1", - "eslint-import-resolver-node": "^0.3.10", + "eslint-import-resolver-node": "^0.4.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.15.0", diff --git a/yarn.lock b/yarn.lock index fdec83279be..ded554bbbf7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -536,7 +536,7 @@ __metadata: enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" eslint: "npm:^10.2.1" - eslint-import-resolver-node: "npm:^0.3.10" + eslint-import-resolver-node: "npm:^0.4.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jest: "npm:^29.15.0" @@ -8192,17 +8192,6 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.10": - version: 0.3.10 - resolution: "eslint-import-resolver-node@npm:0.3.10" - dependencies: - debug: "npm:^3.2.7" - is-core-module: "npm:^2.16.1" - resolve: "npm:^2.0.0-next.6" - checksum: 10/f0ad564d345fc53076b46f726b6f9ba96a40d1b7cb33d515ea89d41d1dba37db4ff9b864550608756c2ba061c9e243bf10b920d975848616d0c6c4474f4ea415 - languageName: node - linkType: hard - "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -8214,6 +8203,17 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.4.0": + version: 0.4.0 + resolution: "eslint-import-resolver-node@npm:0.4.0" + dependencies: + debug: "npm:^3.2.7" + is-core-module: "npm:^2.16.2" + resolve: "npm:^2.0.0-next.7" + checksum: 10/685c5f13d54f4bc3443d44c9f4ccdca28124ef290148f91ed4da020b915e12d02d43f20a5f1d46775423d37b8bbd0afbd07d00d292aca6fdd6932e26080e9bd6 + languageName: node + linkType: hard + "eslint-module-utils@npm:^2.12.1": version: 2.12.1 resolution: "eslint-module-utils@npm:2.12.1" @@ -15247,7 +15247,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.6": +"resolve@npm:^2.0.0-next.7": version: 2.0.0-next.7 resolution: "resolve@npm:2.0.0-next.7" dependencies: @@ -15303,7 +15303,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.6#optional!builtin": +"resolve@patch:resolve@npm%3A^2.0.0-next.7#optional!builtin": version: 2.0.0-next.7 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=c3c19d" dependencies: From b384fef407a7dc5d987f7e6eaaf9b60d6a1a692c Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:37:06 -0500 Subject: [PATCH 050/109] Bump chokidar from 4.0.3 to 5.0.0 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 22 +++++++++++++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index c5efa9c7ddd..b97a6ef6b14 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -20,7 +20,7 @@ "@types/node": "^25.9.2", "@types/postcss-import": "^14.0.3", "autoprefixer": "^10.5.0", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "cssnano": "^8.0.1", "esbuild": "^0.28.0", "eslint": "^10.2.1", diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index a7d94599609..1d59b115ae0 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -18,7 +18,7 @@ "@types/node": "^25.9.2", "@types/postcss-import": "^14.0.3", "browser-sync": "^3.0.4", - "chokidar": "^4.0.3", + "chokidar": "^5.0.0", "cssnano": "^8.0.1", "glob": "^13.0.6", "postcss": "^8.5.8", diff --git a/yarn.lock b/yarn.lock index ded554bbbf7..78c569e7742 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5145,7 +5145,7 @@ __metadata: "@types/node": "npm:^25.9.2" "@types/postcss-import": "npm:^14.0.3" browser-sync: "npm:^3.0.4" - chokidar: "npm:^4.0.3" + chokidar: "npm:^5.0.0" cssnano: "npm:^8.0.1" glob: "npm:^13.0.6" normalize.css: "npm:^8.0.1" @@ -6106,7 +6106,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^4.0.0, chokidar@npm:^4.0.3": +"chokidar@npm:^4.0.0": version: 4.0.3 resolution: "chokidar@npm:4.0.3" dependencies: @@ -6115,6 +6115,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^5.0.0": + version: 5.0.0 + resolution: "chokidar@npm:5.0.0" + dependencies: + readdirp: "npm:^5.0.0" + checksum: 10/a1c2a4ee6ee81ba6409712c295a47be055fb9de1186dfbab33c1e82f28619de962ba02fc5f9d433daaedc96c35747460d8b2079ac2907de2c95e3f7cce913113 + languageName: node + linkType: hard + "chownr@npm:^3.0.0": version: 3.0.0 resolution: "chownr@npm:3.0.0" @@ -7269,7 +7278,7 @@ __metadata: "@types/node": "npm:^25.9.2" "@types/postcss-import": "npm:^14.0.3" autoprefixer: "npm:^10.5.0" - chokidar: "npm:^4.0.3" + chokidar: "npm:^5.0.0" cssnano: "npm:^8.0.1" esbuild: "npm:^0.28.0" eslint: "npm:^10.2.1" @@ -14929,6 +14938,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^5.0.0": + version: 5.0.0 + resolution: "readdirp@npm:5.0.0" + checksum: 10/a17a591b51d8b912083660df159e8bd17305dc1a9ef27c869c818bd95ff59e3a6496f97e91e724ef433e789d559d24e39496ea1698822eb5719606dc9c1a923d + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" From 3ff939535a488243dd11c90c6e89133d0ec9f32b Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:38:04 -0500 Subject: [PATCH 051/109] Bump eslint from 10.2.1 to 10.4.1 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- .../ResourceManager.Web/package.json | 2 +- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Licensing.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Roles.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Seo.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../ClientSide/SiteGroups.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/Sites.Web/package.json | 2 +- .../Sites.Web/src/_exportables/package.json | 2 +- .../ClientSide/Styles.Web/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Themes.Web/package.json | 2 +- .../ClientSide/Users.Web/package.json | 2 +- .../Users.Web/src/_exportables/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- yarn.lock | 76 +++++++++---------- 25 files changed, 62 insertions(+), 62 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index b97a6ef6b14..e5125ef155d 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -23,7 +23,7 @@ "chokidar": "^5.0.0", "cssnano": "^8.0.1", "esbuild": "^0.28.0", - "eslint": "^10.2.1", + "eslint": "^10.4.1", "modern-normalize": "^3.0.1", "postcss": "^8.5.8", "postcss-banner": "^4.0.1", diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 35cef334190..49d43ed0999 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -36,7 +36,7 @@ "@stencil/store": "^2.2.2", "@types/node": "^25.9.2", "@typescript-eslint/utils": "^8.60.1", - "eslint": "^10.2.1", + "eslint": "^10.4.1", "jiti": "^2.6.1", "typescript": "^5.9.3", "typescript-eslint": "^8.60.1" diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 9564a99905b..4eafba727f4 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 3620339e9bb..2f4f15804a9 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -15,7 +15,7 @@ "create-react-class": "^15.7.0", "dayjs": "^1.11.21", "es6-promise": "4.2.8", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index c70f44c525b..9322251a464 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -57,7 +57,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", "enzyme-to-json": "^3.6.2", - "eslint": "^10.2.1", + "eslint": "^10.4.1", "eslint-import-resolver-node": "^0.4.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index aef0e9e982f..19d8d02ab2d 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index a4ff32e9df0..221b449ec31 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index bc6d47d63c3..1399f1ff43e 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -28,7 +28,7 @@ "create-react-class": "^15.7.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", - "eslint": "^10.2.1", + "eslint": "^10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "jest": "^30.3.0", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index d2358f4803e..63a2a06b412 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -21,7 +21,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "jest": "^30.3.0", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index fffc3679285..63dbad3fe37 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "^2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "^1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 867e901b4dd..e6b10d4d0e2 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index bc78d725d83..66a7882c008 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index e16ff4a0b88..c5cbcc19bec 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -19,7 +19,7 @@ "@types/redux": "^3.6.31", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 16ebb28c53a..9e015b565fb 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -14,7 +14,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 258042d94f4..0f684ff20b5 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index cdb5dd2d7d1..1b33c2491f7 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -19,7 +19,7 @@ "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-jest": "^29.15.0", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index a19a0f24330..d0d4234ec6a 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -14,7 +14,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index f1f3172abdc..10391706e49 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -17,7 +17,7 @@ "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index fda028ff492..aa3451e2b94 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -36,7 +36,7 @@ "@types/node": "^25.9.2", "@typescript-eslint/eslint-plugin": "^8.60.1", "@typescript-eslint/parser": "^8.60.1", - "eslint": "^10.2.1", + "eslint": "^10.4.1", "jiti": "^2.6.1", "typescript-eslint": "^8.60.1" } diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 8f967f61c5e..44eb5eb0c7a 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index 7dbb83b0106..2d3b2ed22d8 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 08c88338c82..0c3567cbac7 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "jest": "^30.3.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index d7450c65b52..584cad21c2e 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -17,7 +17,7 @@ "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 21e5467ea52..fd0ebfb16e7 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.2.1", + "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "less": "4.6.4", diff --git a/yarn.lock b/yarn.lock index 78c569e7742..54d1b61a088 100644 --- a/yarn.lock +++ b/yarn.lock @@ -535,7 +535,7 @@ __metadata: enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" - eslint: "npm:^10.2.1" + eslint: "npm:^10.4.1" eslint-import-resolver-node: "npm:^0.4.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" @@ -1060,12 +1060,12 @@ __metadata: languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.5.5": - version: 0.5.5 - resolution: "@eslint/config-helpers@npm:0.5.5" +"@eslint/config-helpers@npm:^0.6.0": + version: 0.6.0 + resolution: "@eslint/config-helpers@npm:0.6.0" dependencies: "@eslint/core": "npm:^1.2.1" - checksum: 10/19072449502b928a716df87b2d9b13c7befb21974b0f93fdbea705ddba098792142808105170ef2183c28ce13ac9fa1713ef0599749f8469434ac2b914fc8f4d + checksum: 10/2daa66b0c3821313a6239beed2236ad7f3a45540050b5ce69527206ba7e58e9c17aff2f68be6d3f0f95d6294a911da86aa50863a1aeadd607faa943c11677a46 languageName: node linkType: hard @@ -1092,13 +1092,13 @@ __metadata: languageName: node linkType: hard -"@eslint/plugin-kit@npm:^0.7.1": - version: 0.7.1 - resolution: "@eslint/plugin-kit@npm:0.7.1" +"@eslint/plugin-kit@npm:^0.7.2": + version: 0.7.2 + resolution: "@eslint/plugin-kit@npm:0.7.2" dependencies: "@eslint/core": "npm:^1.2.1" levn: "npm:^0.4.1" - checksum: 10/8f923f4cdadadd215e0c2028e6a53101bb148a7780cdb4dc8cd69b0c77fc88496742e87e0605b12905ff715e2c7ad6cbd2d92c5653cdbf91cca1e229b5022c1f + checksum: 10/ef9fc6f8ca28e132d4c81cfbaa92274800d1d73bb9d6ef2124613dd39b7f09e3592deb64bad10b183bff78db5465d4b100f522d994c8550424526b9ac4a072b0 languageName: node linkType: hard @@ -4995,7 +4995,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -7191,7 +7191,7 @@ __metadata: "@stencil/store": "npm:^2.2.2" "@types/node": "npm:^25.9.2" "@typescript-eslint/utils": "npm:^8.60.1" - eslint: "npm:^10.2.1" + eslint: "npm:^10.4.1" jiti: "npm:^2.6.1" typescript: "npm:^5.9.3" typescript-eslint: "npm:^8.60.1" @@ -7207,7 +7207,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -7228,7 +7228,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" @@ -7252,7 +7252,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" @@ -7281,7 +7281,7 @@ __metadata: chokidar: "npm:^5.0.0" cssnano: "npm:^8.0.1" esbuild: "npm:^0.28.0" - eslint: "npm:^10.2.1" + eslint: "npm:^10.4.1" modern-normalize: "npm:^3.0.1" postcss: "npm:^8.5.8" postcss-banner: "npm:^4.0.1" @@ -8396,16 +8396,16 @@ __metadata: languageName: node linkType: hard -"eslint@npm:10.2.1, eslint@npm:^10.2.1": - version: 10.2.1 - resolution: "eslint@npm:10.2.1" +"eslint@npm:10.4.1, eslint@npm:^10.4.1": + version: 10.4.1 + resolution: "eslint@npm:10.4.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.2" "@eslint/config-array": "npm:^0.23.5" - "@eslint/config-helpers": "npm:^0.5.5" + "@eslint/config-helpers": "npm:^0.6.0" "@eslint/core": "npm:^1.2.1" - "@eslint/plugin-kit": "npm:^0.7.1" + "@eslint/plugin-kit": "npm:^0.7.2" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" @@ -8437,7 +8437,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/954658c846696dc501a2b8e5fb268713e231dd81375dc25d76cd2fb4a1c73094ea73c64197634ece6fca8a54536e89eb44548a11be672544522e7a50eb8aae95 + checksum: 10/5722bd0ec1a87f49ee4511c7549dcfa69df0076927b0290b0a3b145425fd357906ffe6dc1307214a0bd344131bf53795fa2cdebfd36ee9146c01d98147044679 languageName: node linkType: hard @@ -8604,7 +8604,7 @@ __metadata: create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" es6-promise: "npm:4.2.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -8643,7 +8643,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -11331,7 +11331,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -13249,7 +13249,7 @@ __metadata: dompurify: "npm:^3.4.8" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" - eslint: "npm:^10.2.1" + eslint: "npm:^10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -14135,7 +14135,7 @@ __metadata: enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -15400,7 +15400,7 @@ __metadata: array.prototype.findindex: "npm:^2.2.4" create-react-class: "npm:^15.7.0" es6-object-assign: "npm:^1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -15882,7 +15882,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -15989,7 +15989,7 @@ __metadata: array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -16050,7 +16050,7 @@ __metadata: create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" dompurify: "npm:^3.4.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -16262,7 +16262,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -16299,7 +16299,7 @@ __metadata: array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-jest: "npm:^29.15.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" @@ -16329,7 +16329,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -16966,7 +16966,7 @@ __metadata: "@types/node": "npm:^25.9.2" "@typescript-eslint/eslint-plugin": "npm:^8.60.1" "@typescript-eslint/parser": "npm:^8.60.1" - eslint: "npm:^10.2.1" + eslint: "npm:^10.4.1" jiti: "npm:^2.6.1" typescript-eslint: "npm:^8.60.1" languageName: unknown @@ -17117,7 +17117,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -17145,7 +17145,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" @@ -17201,7 +17201,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" less: "npm:4.6.4" @@ -17986,7 +17986,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.2.1" + eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" jest: "npm:^30.3.0" From 22484003ef17b33d55f9965277e41808ea33ec6d Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:38:33 -0500 Subject: [PATCH 052/109] Bump @eslint/js from 9.39.4 to 10.0.1 --- .../ResourceManager.Web/package.json | 2 +- yarn.lock | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 49d43ed0999..889bd5c5306 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -29,7 +29,7 @@ "license": "MIT", "devDependencies": { "@dnncommunity/dnn-elements": "^0.29.2", - "@eslint/js": "^9.39.4", + "@eslint/js": "^10.0.1", "@stencil/core": "^4.43.5", "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", diff --git a/yarn.lock b/yarn.lock index 54d1b61a088..01addb7c0d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1078,10 +1078,15 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:^9.39.4": - version: 9.39.4 - resolution: "@eslint/js@npm:9.39.4" - checksum: 10/0a7ab4c4108cf2cadf66849ebd20f5957cc53052b88d8807d0b54e489dbf6ffcaf741e144e7f9b187c395499ce2e6ddc565dbfa4f60c6df455cf2b30bcbdc5a3 +"@eslint/js@npm:^10.0.1": + version: 10.0.1 + resolution: "@eslint/js@npm:10.0.1" + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + checksum: 10/27ff77b8f0aab350b2f7a69d974eabb816bb9f4cab986b1538782269d6bfdc29e351803fa7a62c22c0b786341324f1a28b86bc83956ddfa189aa6bead1a87758 languageName: node linkType: hard @@ -7184,7 +7189,7 @@ __metadata: resolution: "dnn-resource-manager@workspace:DNN Platform/Modules/ResourceManager/ResourceManager.Web" dependencies: "@dnncommunity/dnn-elements": "npm:^0.29.2" - "@eslint/js": "npm:^9.39.4" + "@eslint/js": "npm:^10.0.1" "@stencil/core": "npm:^4.43.5" "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" From 56a2224ba0cf6131669916737da4c393c173c03e Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:39:01 -0500 Subject: [PATCH 053/109] Bump eslint-plugin-jest from 29.15.0 to 29.15.2 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- yarn.lock | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 9322251a464..9d6e8f04735 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -61,7 +61,7 @@ "eslint-import-resolver-node": "^0.4.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.15.0", + "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-storybook": "10.3.3", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 1b33c2491f7..aa1b27f9388 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -20,7 +20,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "eslint": "10.4.1", - "eslint-plugin-jest": "^29.15.0", + "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", "globals": "^17.4.0", "jest": "^30.3.0", diff --git a/yarn.lock b/yarn.lock index 01addb7c0d1..3491c490bca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -539,7 +539,7 @@ __metadata: eslint-import-resolver-node: "npm:^0.4.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" - eslint-plugin-jest: "npm:^29.15.0" + eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" eslint-plugin-storybook: "npm:10.3.3" html-react-parser: "npm:^5.2.17" @@ -8283,16 +8283,16 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^29.15.0": - version: 29.15.0 - resolution: "eslint-plugin-jest@npm:29.15.0" +"eslint-plugin-jest@npm:^29.15.2": + version: 29.15.2 + resolution: "eslint-plugin-jest@npm:29.15.2" dependencies: "@typescript-eslint/utils": "npm:^8.0.0" peerDependencies: "@typescript-eslint/eslint-plugin": ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 jest: "*" - typescript: ">=4.8.4 <6.0.0" + typescript: ">=4.8.4 <7.0.0" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true @@ -8300,7 +8300,7 @@ __metadata: optional: true typescript: optional: true - checksum: 10/552361326c55564fe09092adeb34bf4aae179fdd39b4de6aa561511cebedee370b4ed53f98683af6c695a30891589f54e6fa9ed03ae87957fbe16a506732d0ab + checksum: 10/c7bc4dc705e5613e51a1d19bb924a439db9897c67e694f091e29dbacaa218b758040aacbb8d3f9136f2af0171ad69c1c49736b5e3f30098bdf44d4c1e93c6381 languageName: node linkType: hard @@ -16305,7 +16305,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" eslint: "npm:10.4.1" - eslint-plugin-jest: "npm:^29.15.0" + eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.4.0" html-react-parser: "npm:^5.2.17" From a432f18ff0f8a7369e730b930beb441cfd7489fe Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:39:34 -0500 Subject: [PATCH 054/109] Bump eslint-plugin-storybook from 10.3.3 to 10.4.2 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 9d6e8f04735..fbfc843c5ec 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -63,7 +63,7 @@ "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", - "eslint-plugin-storybook": "10.3.3", + "eslint-plugin-storybook": "10.4.2", "less": "4.6.4", "nanoid": "^5.1.7", "prop-types": "^15.8.1", diff --git a/yarn.lock b/yarn.lock index 3491c490bca..e94bbf8e82b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -541,7 +541,7 @@ __metadata: eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" - eslint-plugin-storybook: "npm:10.3.3" + eslint-plugin-storybook: "npm:10.4.2" html-react-parser: "npm:^5.2.17" interact.js: "npm:^1.2.8" less: "npm:4.6.4" @@ -8345,15 +8345,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:10.3.3": - version: 10.3.3 - resolution: "eslint-plugin-storybook@npm:10.3.3" +"eslint-plugin-storybook@npm:10.4.2": + version: 10.4.2 + resolution: "eslint-plugin-storybook@npm:10.4.2" dependencies: "@typescript-eslint/utils": "npm:^8.48.0" peerDependencies: eslint: ">=8" - storybook: ^10.3.3 - checksum: 10/195ac728b9dded0820e02deaa808b66be87beaf206c11f4858c80c8aa4ddc86ee2a9e2d404b83e6776f92690c274d5268b2c01f77b87102995ee2b9bdb026857 + storybook: ^10.4.2 + checksum: 10/a4a9b22ca97b14f7eb0018b6635dbf7a31ebf2012ff9f3fc515f5058d0dc768abbe0eef2f9d423f28228cf415e0dcfc778bcad7892750f73bb39d49ea347413c languageName: node linkType: hard From c7642b6e4a7bf3998bb3709517ed2bab06272765 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:40:32 -0500 Subject: [PATCH 055/109] Bump globals from 17.4.0 to 17.6.0 --- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Licensing.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Roles.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Seo.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../ClientSide/SiteGroups.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/Sites.Web/package.json | 2 +- .../Sites.Web/src/_exportables/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Themes.Web/package.json | 2 +- .../ClientSide/Users.Web/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- yarn.lock | 46 +++++++++---------- 20 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 4eafba727f4..9883b2f4cc9 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -19,7 +19,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 2f4f15804a9..552badad26b 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -17,7 +17,7 @@ "es6-promise": "4.2.8", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index 19d8d02ab2d..f6bda144635 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -17,7 +17,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index 221b449ec31..e6bb57ddbfa 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -19,7 +19,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 1399f1ff43e..b15ac104e2f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -30,7 +30,7 @@ "enzyme-adapter-react-16": "^1.15.8", "eslint": "^10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "jest": "^30.3.0", "less": "4.6.4", "lodash": "4.18.1", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index 63a2a06b412..f45485b9714 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -23,7 +23,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "jest": "^30.3.0", "less": "4.6.4", "localization": "^1.0.2", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index 63dbad3fe37..cc90e53fc23 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -20,7 +20,7 @@ "es6-object-assign": "^1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index e6b10d4d0e2..457f7e275c1 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -17,7 +17,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index 66a7882c008..69593d2aa98 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -19,7 +19,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index c5cbcc19bec..0ef42a5cfde 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -21,7 +21,7 @@ "dayjs": "^1.11.21", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 9e015b565fb..9a8966f31c7 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -16,7 +16,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 0f684ff20b5..8114c226afa 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -17,7 +17,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "localization": "^1.0.2", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index aa1b27f9388..f35211882c7 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -22,7 +22,7 @@ "eslint": "10.4.1", "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "jest": "^30.3.0", "less": "4.6.4", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index d0d4234ec6a..bf04a728266 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -16,7 +16,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index 10391706e49..4b6fb7d4212 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -21,7 +21,7 @@ "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 44eb5eb0c7a..33a18f0a57b 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -20,7 +20,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index 2d3b2ed22d8..f61dd07a51a 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -17,7 +17,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 0c3567cbac7..b6c960c5136 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -17,7 +17,7 @@ "create-react-class": "^15.7.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "jest": "^30.3.0", "less": "4.6.4", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index fd0ebfb16e7..49f6ac32a57 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -20,7 +20,7 @@ "es6-object-assign": "1.1.0", "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", - "globals": "^17.4.0", + "globals": "^17.6.0", "less": "4.6.4", "object-path": "0.11.8", "prop-types": "^15.8.1", diff --git a/yarn.lock b/yarn.lock index e94bbf8e82b..020447d2c29 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5002,7 +5002,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" prop-types: "npm:15.8.1" @@ -7214,7 +7214,7 @@ __metadata: create-react-class: "npm:^15.7.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -7237,7 +7237,7 @@ __metadata: eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -8611,7 +8611,7 @@ __metadata: es6-promise: "npm:4.2.8" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -8650,7 +8650,7 @@ __metadata: dompurify: "npm:^3.4.8" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" prop-types: "npm:^15.8.1" @@ -9276,10 +9276,10 @@ __metadata: languageName: node linkType: hard -"globals@npm:^17.4.0": - version: 17.4.0 - resolution: "globals@npm:17.4.0" - checksum: 10/ffad244617e94efcb3da72b7beefc941167c21316148ce378f322db7af72db06468f370e23224b3c7b17b5173a7c75b134e5e7b0949f2828519054a76892508d +"globals@npm:^17.6.0": + version: 17.6.0 + resolution: "globals@npm:17.6.0" + checksum: 10/2bf0febf31c942edee6f4eca7e939a9c885f8ecfb767048b1c4dd2a32008d0ab136e6076665d76b44b29c2571bbbc1681371caab05fd8ee0067c7618e841b89d languageName: node linkType: hard @@ -11338,7 +11338,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -13256,7 +13256,7 @@ __metadata: enzyme-adapter-react-16: "npm:^1.15.8" eslint: "npm:^10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" jest: "npm:^30.3.0" less: "npm:4.6.4" @@ -14142,7 +14142,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" jest: "npm:^30.3.0" less: "npm:4.6.4" @@ -15407,7 +15407,7 @@ __metadata: es6-object-assign: "npm:^1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -15889,7 +15889,7 @@ __metadata: dompurify: "npm:^3.4.8" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" prop-types: "npm:^15.8.1" @@ -15996,7 +15996,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -16057,7 +16057,7 @@ __metadata: dompurify: "npm:^3.4.8" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" prop-types: "npm:^15.8.1" @@ -16269,7 +16269,7 @@ __metadata: dompurify: "npm:^3.4.8" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" localization: "npm:^1.0.2" @@ -16307,7 +16307,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" jest: "npm:^30.3.0" less: "npm:4.6.4" @@ -16336,7 +16336,7 @@ __metadata: create-react-class: "npm:^15.7.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -17124,7 +17124,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" prop-types: "npm:^15.8.1" @@ -17152,7 +17152,7 @@ __metadata: es6-object-assign: "npm:1.1.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" html-react-parser: "npm:^5.2.17" less: "npm:4.6.4" object-path: "npm:0.11.8" @@ -17208,7 +17208,7 @@ __metadata: create-react-class: "npm:^15.7.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -17993,7 +17993,7 @@ __metadata: create-react-class: "npm:^15.7.0" eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" - globals: "npm:^17.4.0" + globals: "npm:^17.6.0" jest: "npm:^30.3.0" less: "npm:4.6.4" localization: "npm:^1.0.2" From 710bdad3745d5b4bd555d040a594df3aab7b8db4 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:41:24 -0500 Subject: [PATCH 056/109] Bump html-react-parser from 5.2.17 to 6.1.3 --- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- yarn.lock | 117 +++++++++++++----- 12 files changed, 98 insertions(+), 41 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 9883b2f4cc9..2bd1a6da179 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -38,6 +38,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index fbfc843c5ec..4e77015b555 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -27,7 +27,7 @@ "dependencies": { "dayjs": "^1.11.21", "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17", + "html-react-parser": "^6.1.3", "interact.js": "^1.2.8", "raw-loader": "4.0.2", "react-accessible-tooltip": "^2.0.3", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index f6bda144635..c62668eaba1 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -27,6 +27,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index b15ac104e2f..09e8d2cc644 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -46,7 +46,7 @@ "dependencies": { "dayjs": "^1.11.21", "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17", + "html-react-parser": "^6.1.3", "promise": "^8.3.0", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index f45485b9714..a4ddbb5a708 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -46,6 +46,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 457f7e275c1..bb11f038921 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -31,6 +31,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 0ef42a5cfde..714b72da352 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -31,7 +31,7 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17", + "html-react-parser": "^6.1.3", "react-custom-scrollbars": "^4.2.1" } } diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 8114c226afa..c37dfb83baf 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -38,6 +38,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index f35211882c7..cd148521939 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -39,6 +39,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 33a18f0a57b..c99ec2f5de4 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -31,6 +31,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 49f6ac32a57..5782d1fad08 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -31,6 +31,6 @@ }, "dependencies": { "dompurify": "^3.4.8", - "html-react-parser": "^5.2.17" + "html-react-parser": "^6.1.3" } } diff --git a/yarn.lock b/yarn.lock index 020447d2c29..07528d4e0a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -542,7 +542,7 @@ __metadata: eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" eslint-plugin-storybook: "npm:10.4.2" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" interact.js: "npm:^1.2.8" less: "npm:4.6.4" nanoid: "npm:^5.1.7" @@ -5003,7 +5003,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" prop-types: "npm:15.8.1" react: "npm:^16.14.0" @@ -7370,6 +7370,17 @@ __metadata: languageName: node linkType: hard +"dom-serializer@npm:^3.0.0": + version: 3.1.1 + resolution: "dom-serializer@npm:3.1.1" + dependencies: + domelementtype: "npm:^3.0.0" + domhandler: "npm:^6.0.0" + entities: "npm:^8.0.0" + checksum: 10/16004bf603b85a2e0b15c4d4b5ca162c4356053eb7d9845ae05e0411a0b56449ddf76fb46e3ae954d6b720a8cc9d71ae30c22c83272eeac0102eedb218a64c80 + languageName: node + linkType: hard + "dom-walk@npm:^0.1.0": version: 0.1.2 resolution: "dom-walk@npm:0.1.2" @@ -7384,7 +7395,23 @@ __metadata: languageName: node linkType: hard -"domhandler@npm:5.0.3, domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": +"domelementtype@npm:^3.0.0": + version: 3.0.0 + resolution: "domelementtype@npm:3.0.0" + checksum: 10/6b5120222f7e8b3491ad2f00036a1a14965bccab91014bfa54fa7789081b71f88141bf3b5b264c75ca4916b08e16ac1233a4f3b38067acb3fca9a7b21327cec1 + languageName: node + linkType: hard + +"domhandler@npm:6.0.1, domhandler@npm:^6.0.0": + version: 6.0.1 + resolution: "domhandler@npm:6.0.1" + dependencies: + domelementtype: "npm:^3.0.0" + checksum: 10/370e7c121cf3223a5aa21ce03666189eebac8d5b16af83efc221a93ed4f6c7b9f2cf2cc92ef7d50cbbd05787e1fbad42ec3c4717f6eb578667280443b94ffe10 + languageName: node + linkType: hard + +"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": version: 5.0.3 resolution: "domhandler@npm:5.0.3" dependencies: @@ -7416,6 +7443,17 @@ __metadata: languageName: node linkType: hard +"domutils@npm:^4.0.2": + version: 4.0.2 + resolution: "domutils@npm:4.0.2" + dependencies: + dom-serializer: "npm:^3.0.0" + domelementtype: "npm:^3.0.0" + domhandler: "npm:^6.0.0" + checksum: 10/cb1e270d046225654c4333b45e87a316ecad2721113e92d3f8842795d93418bb0269bee024aad4793b494361e93b7b5e62b773926a89e46748db49df42acb38b + languageName: node + linkType: hard + "dot-case@npm:^3.0.4": version: 3.0.4 resolution: "dot-case@npm:3.0.4" @@ -7681,6 +7719,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^8.0.0": + version: 8.0.0 + resolution: "entities@npm:8.0.0" + checksum: 10/d6e2ba75e444fb101ee2fbb07c839e687306c8a509426b75186619c19196f97c1db9932ca083f823c03e4a20e7407b654aa34de8cbb7770468e20fb2d4573a0e + languageName: node + linkType: hard + "env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -8651,7 +8696,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -9462,13 +9507,13 @@ __metadata: languageName: node linkType: hard -"html-dom-parser@npm:5.1.8": - version: 5.1.8 - resolution: "html-dom-parser@npm:5.1.8" +"html-dom-parser@npm:8.0.0": + version: 8.0.0 + resolution: "html-dom-parser@npm:8.0.0" dependencies: - domhandler: "npm:5.0.3" - htmlparser2: "npm:10.1.0" - checksum: 10/579deb63bd0981912983121971f687c952d7b2bf5c43dada2fe8eeb85f51f388ed084ffb6452afd136cd9db3ccbd1c9a6b3200d39c522acfecd50ee7f0c8ad25 + domhandler: "npm:6.0.1" + htmlparser2: "npm:12.0.0" + checksum: 10/317c51f0c1d0539689492670d32291ab98c0321b6ebbd552ee6c8d6813280db94402f18132d066acb119d025320e0221e24f300286f28df2f41065e806e73661 languageName: node linkType: hard @@ -9522,25 +9567,37 @@ __metadata: languageName: node linkType: hard -"html-react-parser@npm:^5.2.17": - version: 5.2.17 - resolution: "html-react-parser@npm:5.2.17" +"html-react-parser@npm:^6.1.3": + version: 6.1.3 + resolution: "html-react-parser@npm:6.1.3" dependencies: - domhandler: "npm:5.0.3" - html-dom-parser: "npm:5.1.8" + domhandler: "npm:6.0.1" + html-dom-parser: "npm:8.0.0" react-property: "npm:2.0.2" - style-to-js: "npm:1.1.21" + style-to-js: "npm:2.0.0" peerDependencies: "@types/react": 0.14 || 15 || 16 || 17 || 18 || 19 react: 0.14 || 15 || 16 || 17 || 18 || 19 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/74ec0bc5945a90fd154c84830ff1caaa6c686c1c0c82330a1e3cda18b15c8f9b177d2c564d1d3cf566b586c34ce78e2006692aeda3300b0ba30c5234cb7b07c8 + checksum: 10/0e0a6eff46f40a527eacb87b91082e942eebaa3de4d91464b947775c6704fb7854819d956977440b0c3bab813ef638f1324a12338ad270c88b9f8130c949a085 languageName: node linkType: hard -"htmlparser2@npm:10.1.0, htmlparser2@npm:^10.0.0": +"htmlparser2@npm:12.0.0": + version: 12.0.0 + resolution: "htmlparser2@npm:12.0.0" + dependencies: + domelementtype: "npm:^3.0.0" + domhandler: "npm:^6.0.0" + domutils: "npm:^4.0.2" + entities: "npm:^8.0.0" + checksum: 10/f5b29381f960fedd09e5b46cbb249d0506fb75bc46c572d6367de684da2adec8382cb9548ea1fcec2e84d0881f76a840397cfae732b7a2edac05f4280a1efc31 + languageName: node + linkType: hard + +"htmlparser2@npm:^10.0.0": version: 10.1.0 resolution: "htmlparser2@npm:10.1.0" dependencies: @@ -13257,7 +13314,7 @@ __metadata: eslint: "npm:^10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" jest: "npm:^30.3.0" less: "npm:4.6.4" lodash: "npm:4.18.1" @@ -14143,7 +14200,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" jest: "npm:^30.3.0" less: "npm:4.6.4" localization: "npm:^1.0.2" @@ -15890,7 +15947,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -16058,7 +16115,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -16270,7 +16327,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" @@ -16308,7 +16365,7 @@ __metadata: eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" jest: "npm:^30.3.0" less: "npm:4.6.4" prop-types: "npm:^15.8.1" @@ -16930,12 +16987,12 @@ __metadata: languageName: node linkType: hard -"style-to-js@npm:1.1.21": - version: 1.1.21 - resolution: "style-to-js@npm:1.1.21" +"style-to-js@npm:2.0.0": + version: 2.0.0 + resolution: "style-to-js@npm:2.0.0" dependencies: style-to-object: "npm:1.0.14" - checksum: 10/5e30b4c52ed4e0294324adab2a43a0438b5495a77a72a6b1258637eebfc4dc8e0614f5ac7bf38a2f514879b3b448215d01fecf1f8d7468b8b95d90bed1d05d57 + checksum: 10/4f8e48cf9257a3017825c76d2a216df0912fa51f87abe989b5ba64d8a66e9a82a9900b86f32b4e412c0a5e98d014fe4f7a384ab3bcaf1d9fa61cc879b4cf5cff languageName: node linkType: hard @@ -17125,7 +17182,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -17153,7 +17210,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - html-react-parser: "npm:^5.2.17" + html-react-parser: "npm:^6.1.3" less: "npm:4.6.4" object-path: "npm:0.11.8" prop-types: "npm:^15.8.1" From c37daadd17d5b7fda48ab029a317855b0f157443 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:41:50 -0500 Subject: [PATCH 057/109] Bump jest from 30.3.0 to 30.4.2 --- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/Users.Web/package.json | 2 +- yarn.lock | 735 ++++++++++-------- 5 files changed, 396 insertions(+), 347 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 09e8d2cc644..729a417a587 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -31,7 +31,7 @@ "eslint": "^10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "jest": "^30.3.0", + "jest": "^30.4.2", "less": "4.6.4", "lodash": "4.18.1", "react-custom-scrollbars": "4.2.1", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index a4ddbb5a708..b86a72f8d12 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -24,7 +24,7 @@ "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "jest": "^30.3.0", + "jest": "^30.4.2", "less": "4.6.4", "localization": "^1.0.2", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index cd148521939..49fb85bd389 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -23,7 +23,7 @@ "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "jest": "^30.3.0", + "jest": "^30.4.2", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index b6c960c5136..953189d8743 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.4.1", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "jest": "^30.3.0", + "jest": "^30.4.2", "less": "4.6.4", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/yarn.lock b/yarn.lock index 07528d4e0a5..edc50d0ddd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1470,57 +1470,58 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/console@npm:30.3.0" +"@jest/console@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/console@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" chalk: "npm:^4.1.2" - jest-message-util: "npm:30.3.0" - jest-util: "npm:30.3.0" + jest-message-util: "npm:30.4.1" + jest-util: "npm:30.4.1" slash: "npm:^3.0.0" - checksum: 10/aa23c9d77975b7c547190394272454e3563fbf0f99e7170f8b3f8128d83aaa62ad2d07291633e0ec1d4aee7e256dcf0b254bd391cdcd039d0ce6eac6ca835b24 + checksum: 10/4eb463d29654c20716f5f9cde43e5d958cb3b9234477df57da5b3814c3f1a4a0ab611a8eaf4b5abc146190a012584d7025f445f3560ed62acd843fc95c0a0e65 languageName: node linkType: hard -"@jest/core@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/core@npm:30.3.0" - dependencies: - "@jest/console": "npm:30.3.0" - "@jest/pattern": "npm:30.0.1" - "@jest/reporters": "npm:30.3.0" - "@jest/test-result": "npm:30.3.0" - "@jest/transform": "npm:30.3.0" - "@jest/types": "npm:30.3.0" +"@jest/core@npm:30.4.2": + version: 30.4.2 + resolution: "@jest/core@npm:30.4.2" + dependencies: + "@jest/console": "npm:30.4.1" + "@jest/pattern": "npm:30.4.0" + "@jest/reporters": "npm:30.4.1" + "@jest/test-result": "npm:30.4.1" + "@jest/transform": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" ci-info: "npm:^4.2.0" exit-x: "npm:^0.2.2" + fast-json-stable-stringify: "npm:^2.1.0" graceful-fs: "npm:^4.2.11" - jest-changed-files: "npm:30.3.0" - jest-config: "npm:30.3.0" - jest-haste-map: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.3.0" - jest-resolve-dependencies: "npm:30.3.0" - jest-runner: "npm:30.3.0" - jest-runtime: "npm:30.3.0" - jest-snapshot: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-validate: "npm:30.3.0" - jest-watcher: "npm:30.3.0" - pretty-format: "npm:30.3.0" + jest-changed-files: "npm:30.4.1" + jest-config: "npm:30.4.2" + jest-haste-map: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-regex-util: "npm:30.4.0" + jest-resolve: "npm:30.4.1" + jest-resolve-dependencies: "npm:30.4.2" + jest-runner: "npm:30.4.2" + jest-runtime: "npm:30.4.2" + jest-snapshot: "npm:30.4.1" + jest-util: "npm:30.4.1" + jest-validate: "npm:30.4.1" + jest-watcher: "npm:30.4.1" + pretty-format: "npm:30.4.1" slash: "npm:^3.0.0" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10/76f8561686e3bbaf2fcdc9c2391d47fef403e5fe0a936a48762ca60bcaf18692b5d2f8e5e26610cc43e965a6b120458dc9a7484e7e8ffb459118b61a90c2063d + checksum: 10/ecc695392685ab56c6df5d29d6f7927141071d8f3f75e5f7c7664f0faded1307caf5daf051074252d5ddb9546bf2bfe3b0c63ca81fe6238dc34e1bb5f8a7a261 languageName: node linkType: hard @@ -1531,48 +1532,55 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/environment@npm:30.3.0" +"@jest/diff-sequences@npm:30.4.0": + version: 30.4.0 + resolution: "@jest/diff-sequences@npm:30.4.0" + checksum: 10/65c27937c10a7157899dad5d176806104286f9d55464f318955a0cee98db8aed6b8f70ad4aee7133468087146422cdd391d49b1e101ec543db3283ee4eb59c06 + languageName: node + linkType: hard + +"@jest/environment@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/environment@npm:30.4.1" dependencies: - "@jest/fake-timers": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/fake-timers": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" - jest-mock: "npm:30.3.0" - checksum: 10/9b64add2e5430411ca997aed23cd34786d0e87562f5930ad0d4160df51435ae061809fcaa6bbc6c0ff9f0ba5f1241a5ce9a32ec772fa1d7c6b022f0169b622a4 + jest-mock: "npm:30.4.1" + checksum: 10/c25946fee29604f5aa24ea059bc3cc7bc4c8cdaf26db1ed6ffa4f28e37f5193cc4e868650c807d89caff4123e44d07b58200d4cb5960ebdb7d66531509d76359 languageName: node linkType: hard -"@jest/expect-utils@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/expect-utils@npm:30.3.0" +"@jest/expect-utils@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/expect-utils@npm:30.4.1" dependencies: "@jest/get-type": "npm:30.1.0" - checksum: 10/766fd24f527a13004c542c2642b68b9142270801ab20bd448a559d9c2f40af079d0eb9ec9520a47f97b4d6c7d0837ba46e86284f53c939f11d9fcbda73a11e19 + checksum: 10/3f0337ec791d669cacd07594521f2da71b956712dfd0c0007253dd5e886ef640df510af1357878a80ac56f09d3db9fd68e3db66959f0fdb3add5f551dd7e0f35 languageName: node linkType: hard -"@jest/expect@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/expect@npm:30.3.0" +"@jest/expect@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/expect@npm:30.4.1" dependencies: - expect: "npm:30.3.0" - jest-snapshot: "npm:30.3.0" - checksum: 10/74832945a2b18c7b962b27e0ca4d25d19a29d1c3ca6fe4a9c23946025b4146799e62a81d50060ac7bcaf7036fb477aa350ddf300e215333b42d013a3d9f8ba2b + expect: "npm:30.4.1" + jest-snapshot: "npm:30.4.1" + checksum: 10/40ae0317a3590ced7a7fd21c49e6b1af6b122e6a83822e643af83f02034dfed6485248cae08d6bcf9380039ba3824ac56db18478712c64ddf5f709ee23cf30cd languageName: node linkType: hard -"@jest/fake-timers@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/fake-timers@npm:30.3.0" +"@jest/fake-timers@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/fake-timers@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" - "@sinonjs/fake-timers": "npm:^15.0.0" + "@jest/types": "npm:30.4.1" + "@sinonjs/fake-timers": "npm:^15.4.0" "@types/node": "npm:*" - jest-message-util: "npm:30.3.0" - jest-mock: "npm:30.3.0" - jest-util: "npm:30.3.0" - checksum: 10/e39d30b61ae85485bfa0b1d86d62d866d33964bf0b95b8b4f45d2f1f1baa94fd7e134c7729370a58cb67b58d2b860fb396290b5c271782ed4d3728341027549b + jest-message-util: "npm:30.4.1" + jest-mock: "npm:30.4.1" + jest-util: "npm:30.4.1" + checksum: 10/bc7aff23548395d6e7957bc24f699f921a9616f2357ab49616b0468c7b5e94e6ac4cbdd45d306f1a5d7f72e2a055294f52be3666e4c1da7c137874c5b226e1c6 languageName: node linkType: hard @@ -1583,37 +1591,37 @@ __metadata: languageName: node linkType: hard -"@jest/globals@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/globals@npm:30.3.0" +"@jest/globals@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/globals@npm:30.4.1" dependencies: - "@jest/environment": "npm:30.3.0" - "@jest/expect": "npm:30.3.0" - "@jest/types": "npm:30.3.0" - jest-mock: "npm:30.3.0" - checksum: 10/485bdc0f35faf3e76cb451b75e16892d87f7ab5757e290b1a9e849a3af0ef81c47abddb188fbc0442a4689514cf0551e34d13970c9cf03610a269c39f800ff46 + "@jest/environment": "npm:30.4.1" + "@jest/expect": "npm:30.4.1" + "@jest/types": "npm:30.4.1" + jest-mock: "npm:30.4.1" + checksum: 10/5fe04b9c3b97f0061e4464201ee0dd674dd958843eb80542791d1c576c51f12aaa3f3b369e136d5fd3f8c716f9c9bbfbb76491a3cbc3c4efb3cc71063f909132 languageName: node linkType: hard -"@jest/pattern@npm:30.0.1": - version: 30.0.1 - resolution: "@jest/pattern@npm:30.0.1" +"@jest/pattern@npm:30.4.0": + version: 30.4.0 + resolution: "@jest/pattern@npm:30.4.0" dependencies: "@types/node": "npm:*" - jest-regex-util: "npm:30.0.1" - checksum: 10/afd03b4d3eadc9c9970cf924955dee47984a7e767901fe6fa463b17b246f0ddeec07b3e82c09715c54bde3c8abb92074160c0d79967bd23778724f184e7f5b7b + jest-regex-util: "npm:30.4.0" + checksum: 10/4fb1db0e586713708d2fcd79059315600978608483ef2d80e04a0a59b20b0d8de0d3f47cad950ff90bfb9ea3cb788709ee3d1eb225734e4dbf1c4b743c93d204 languageName: node linkType: hard -"@jest/reporters@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/reporters@npm:30.3.0" +"@jest/reporters@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/reporters@npm:30.4.1" dependencies: "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:30.3.0" - "@jest/test-result": "npm:30.3.0" - "@jest/transform": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/console": "npm:30.4.1" + "@jest/test-result": "npm:30.4.1" + "@jest/transform": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@jridgewell/trace-mapping": "npm:^0.3.25" "@types/node": "npm:*" chalk: "npm:^4.1.2" @@ -1626,9 +1634,9 @@ __metadata: istanbul-lib-report: "npm:^3.0.0" istanbul-lib-source-maps: "npm:^5.0.0" istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-worker: "npm:30.3.0" + jest-message-util: "npm:30.4.1" + jest-util: "npm:30.4.1" + jest-worker: "npm:30.4.1" slash: "npm:^3.0.0" string-length: "npm:^4.0.2" v8-to-istanbul: "npm:^9.0.1" @@ -1637,7 +1645,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 10/50cc20d9e908239352c5c6bc594c2880e30e16db6f8c0657513d1a46e3a761ed20464afa604af35bc72cbca0eac6cd34829c075513ecf725af03161a7662097e + checksum: 10/e14e3717c9fe49004b6406cc53554f90954345917bb5f077d23e3a2cecde26d90493e1522d95f63b6c14ef06fb63d45b695ac6400d63b96fecc7a80d1ef83f4d languageName: node linkType: hard @@ -1650,15 +1658,24 @@ __metadata: languageName: node linkType: hard -"@jest/snapshot-utils@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/snapshot-utils@npm:30.3.0" +"@jest/schemas@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/schemas@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10/86e62c8fd8fc77535085f1ede3a416430a3740f78b8f88ec7d0ee4516b22daf3326ffc1ade9d5f7839bbde923aaf1b5ac430a42ed4bb1a38edc3de5005a58f51 + languageName: node + linkType: hard + +"@jest/snapshot-utils@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/snapshot-utils@npm:30.4.1" + dependencies: + "@jest/types": "npm:30.4.1" chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" natural-compare: "npm:^1.4.0" - checksum: 10/2214d4f0f33d2363a0785c0ba75066bf4ed4beefd5b2d2a5c3124d66ab92f91163f03696be625223bdb0527f1e6360c4b306ba9ae421aeb966d4a57d6d972099 + checksum: 10/8f17768702153267388b3043f358027385e591ac4668699bfce3547cb8e08ac146a074913bcddf68c0a4f7155e24a6d582d27f4592f5c3bd5f9fbc3f9182ef78 languageName: node linkType: hard @@ -1673,64 +1690,64 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/test-result@npm:30.3.0" +"@jest/test-result@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/test-result@npm:30.4.1" dependencies: - "@jest/console": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/console": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/istanbul-lib-coverage": "npm:^2.0.6" collect-v8-coverage: "npm:^1.0.2" - checksum: 10/89bed2adc8077e592deb74e4a9bd6c1d937c1ae18805b3b4e799d00276ab91a4974b7dc1f38dc12a5da7712ef0ba2e63c69245696e63f4a7b292fc79bb3981b7 + checksum: 10/c420182d72cef64827981230b4c84b2de3f4312067e7baf1e3e13c501dc57f73faa09fed1a5ed1a6e96bc29f6c67ac2c14de5f973945f14853010729678cb44a languageName: node linkType: hard -"@jest/test-sequencer@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/test-sequencer@npm:30.3.0" +"@jest/test-sequencer@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/test-sequencer@npm:30.4.1" dependencies: - "@jest/test-result": "npm:30.3.0" + "@jest/test-result": "npm:30.4.1" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.3.0" + jest-haste-map: "npm:30.4.1" slash: "npm:^3.0.0" - checksum: 10/d2a593733b029bae5e1a60249fb8ced2fa701e2b336b69de4cd0a1e0008f4373ab1329422f819e209d1d95a29959bd0cc131c7f94c9ad8f3831833f79a08f997 + checksum: 10/d911ef0c527c402d41537aa5f9754725a58732c1c6616401454633fd45729da0b2f01b4c50322b1b789a9f2d4edf3a24aecb0b2e4ca4d873c4335894b63bc5b0 languageName: node linkType: hard -"@jest/transform@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/transform@npm:30.3.0" +"@jest/transform@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/transform@npm:30.4.1" dependencies: "@babel/core": "npm:^7.27.4" - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@jridgewell/trace-mapping": "npm:^0.3.25" babel-plugin-istanbul: "npm:^7.0.1" chalk: "npm:^4.1.2" convert-source-map: "npm:^2.0.0" fast-json-stable-stringify: "npm:^2.1.0" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.3.0" - jest-regex-util: "npm:30.0.1" - jest-util: "npm:30.3.0" + jest-haste-map: "npm:30.4.1" + jest-regex-util: "npm:30.4.0" + jest-util: "npm:30.4.1" pirates: "npm:^4.0.7" slash: "npm:^3.0.0" write-file-atomic: "npm:^5.0.1" - checksum: 10/279b6b73f59c274d7011febcbc0a1fa8939e8f677801a0a9bd95b9cf49244957267f3769c8cd541ae8026d8176089cd5e55f0f8d5361ec7788970978f4f394b4 + checksum: 10/7b570451f6c26360f1b852c2281dcc4e36fe685dbc159cf5eabf83d49d6aae4569f444d38f3afb5b3b6e0b809eb41b65f3145c0cac5fee3eec9c9b178fb1f0ea languageName: node linkType: hard -"@jest/types@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/types@npm:30.3.0" +"@jest/types@npm:30.4.1": + version: 30.4.1 + resolution: "@jest/types@npm:30.4.1" dependencies: - "@jest/pattern": "npm:30.0.1" - "@jest/schemas": "npm:30.0.5" + "@jest/pattern": "npm:30.4.0" + "@jest/schemas": "npm:30.4.1" "@types/istanbul-lib-coverage": "npm:^2.0.6" "@types/istanbul-reports": "npm:^3.0.4" "@types/node": "npm:*" "@types/yargs": "npm:^17.0.33" chalk: "npm:^4.1.2" - checksum: 10/d6943cc270f07c7bc1ee6f3bb9ad1263ce7897d1a282221bf1d27499d77f2a68cfa6625ca73c193d3f81fe22a8e00635cd7acb5e73a546965c172219c81ec12c + checksum: 10/cc0999508613487c6d0f55661cd342ebe7cfe579fa9917534b94310204358f03f94524f70f00b4fe3c6dd2ccd0fd44657615a1b9f420ab310d68b43964bff87c languageName: node linkType: hard @@ -3603,12 +3620,12 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^15.0.0": - version: 15.1.1 - resolution: "@sinonjs/fake-timers@npm:15.1.1" +"@sinonjs/fake-timers@npm:^15.4.0": + version: 15.4.0 + resolution: "@sinonjs/fake-timers@npm:15.4.0" dependencies: "@sinonjs/commons": "npm:^3.0.1" - checksum: 10/f262d613ea7f7cdb1b5d90c0cae01b7c6b797d6d0f1ca0fe30b7b69012e3076bb8a0f69d735bc69d2824b9bb1efb8554ca9765b4a6bb22defdec9ce79e7cd8a4 + checksum: 10/3960a9fe065f38a4228c66d184eeb101e8a6af9cbfc8454dd5d45ac397201da72134048d4e808a25993494885b172dd6deecdad9949bbf4c1d3a220ef561f6cc languageName: node linkType: hard @@ -5461,20 +5478,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:30.3.0": - version: 30.3.0 - resolution: "babel-jest@npm:30.3.0" +"babel-jest@npm:30.4.1": + version: 30.4.1 + resolution: "babel-jest@npm:30.4.1" dependencies: - "@jest/transform": "npm:30.3.0" + "@jest/transform": "npm:30.4.1" "@types/babel__core": "npm:^7.20.5" babel-plugin-istanbul: "npm:^7.0.1" - babel-preset-jest: "npm:30.3.0" + babel-preset-jest: "npm:30.4.0" chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" slash: "npm:^3.0.0" peerDependencies: "@babel/core": ^7.11.0 || ^8.0.0-0 - checksum: 10/7c78f083b11430e69e719ddacd4089db3c055437e06b2d7b382d797a675c7a114268f0044ce98c9a32091638cb9ada53e278d46a7079a74ff845d1aa4a2b0678 + checksum: 10/f739152bee60b368b27676441c54e235b49bca10329bb6395b54cca5982ced1f7a5a2c504e406e1082aac3dc68ab518771c9de62cf66ffe00993ad071a58fd1b languageName: node linkType: hard @@ -5491,12 +5508,12 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:30.3.0": - version: 30.3.0 - resolution: "babel-plugin-jest-hoist@npm:30.3.0" +"babel-plugin-jest-hoist@npm:30.4.0": + version: 30.4.0 + resolution: "babel-plugin-jest-hoist@npm:30.4.0" dependencies: "@types/babel__core": "npm:^7.20.5" - checksum: 10/1444d633a8ad2505d5e15e458718f1bc5929a074f14179a38f53542c32d3c5158a6f7cab82f7fa6b334b0a45982252639bd7642bb0bc843c6566e44cb083925e + checksum: 10/112f984b3b4315f7ff15d5d17df7f5aa4b500e562c67c2eafcd9974af4369c17d50feed2f9c95cbcec32faba8ccb04f8b62828aca41a47d5fdedc532b49fbf19 languageName: node linkType: hard @@ -5525,15 +5542,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:30.3.0": - version: 30.3.0 - resolution: "babel-preset-jest@npm:30.3.0" +"babel-preset-jest@npm:30.4.0": + version: 30.4.0 + resolution: "babel-preset-jest@npm:30.4.0" dependencies: - babel-plugin-jest-hoist: "npm:30.3.0" + babel-plugin-jest-hoist: "npm:30.4.0" babel-preset-current-node-syntax: "npm:^1.2.0" peerDependencies: "@babel/core": ^7.11.0 || ^8.0.0-beta.1 - checksum: 10/fd29c8ff5967c047006bde152cf5ac99ce2e1d573f6f044828cb4d06eab95b65549a38554ea97174bbe508006d2a7cb1370581d87aa73f6b3c2134f2d49aaf85 + checksum: 10/7fbdcaa1f24b2efbc1b658220df849a375858bd5e208cefcf53b116bca972b28565a0715521cc20bec41adbd20ff73b9dbbdea3634bd71f50062f0ce694a7159 languageName: node linkType: hard @@ -8622,17 +8639,17 @@ __metadata: languageName: node linkType: hard -"expect@npm:30.3.0": - version: 30.3.0 - resolution: "expect@npm:30.3.0" +"expect@npm:30.4.1": + version: 30.4.1 + resolution: "expect@npm:30.4.1" dependencies: - "@jest/expect-utils": "npm:30.3.0" + "@jest/expect-utils": "npm:30.4.1" "@jest/get-type": "npm:30.1.0" - jest-matcher-utils: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-mock: "npm:30.3.0" - jest-util: "npm:30.3.0" - checksum: 10/607748963fd2cf2b95ec848d59086afdff5e6b690d1ddd907f84514687f32a787896281ba49a5fda2af819238bec7fdeaf258814997d2b08eedc0968de57f3bd + jest-matcher-utils: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-mock: "npm:30.4.1" + jest-util: "npm:30.4.1" + checksum: 10/f25051e5073c55369199ec3108ac01c60074bd09dad0b5a6c9fe40596438051cb52607e0e97505126422535b8d0dacab13aa29bb14e9fac71630bc710201a3f1 languageName: node linkType: hard @@ -10514,58 +10531,58 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:30.3.0": - version: 30.3.0 - resolution: "jest-changed-files@npm:30.3.0" +"jest-changed-files@npm:30.4.1": + version: 30.4.1 + resolution: "jest-changed-files@npm:30.4.1" dependencies: execa: "npm:^5.1.1" - jest-util: "npm:30.3.0" + jest-util: "npm:30.4.1" p-limit: "npm:^3.1.0" - checksum: 10/a65834a428ec7c4512319af52a7397e5fd90088ca85e649c66cda7092fc287b0fae6c0a9d691cca99278b7dfacbbdbcce17e2bebdd81068503389089035489ce + checksum: 10/e566af0d6c53115edf34fd1d9bda3b857fcc6626bd032516a480b60ec208d515558eda1e693e76ef992633d71828a4c38a3e91a236142459855483cbd03ff4c4 languageName: node linkType: hard -"jest-circus@npm:30.3.0": - version: 30.3.0 - resolution: "jest-circus@npm:30.3.0" +"jest-circus@npm:30.4.2": + version: 30.4.2 + resolution: "jest-circus@npm:30.4.2" dependencies: - "@jest/environment": "npm:30.3.0" - "@jest/expect": "npm:30.3.0" - "@jest/test-result": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/environment": "npm:30.4.1" + "@jest/expect": "npm:30.4.1" + "@jest/test-result": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" chalk: "npm:^4.1.2" co: "npm:^4.6.0" dedent: "npm:^1.6.0" is-generator-fn: "npm:^2.1.0" - jest-each: "npm:30.3.0" - jest-matcher-utils: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-runtime: "npm:30.3.0" - jest-snapshot: "npm:30.3.0" - jest-util: "npm:30.3.0" + jest-each: "npm:30.4.1" + jest-matcher-utils: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-runtime: "npm:30.4.2" + jest-snapshot: "npm:30.4.1" + jest-util: "npm:30.4.1" p-limit: "npm:^3.1.0" - pretty-format: "npm:30.3.0" + pretty-format: "npm:30.4.1" pure-rand: "npm:^7.0.0" slash: "npm:^3.0.0" stack-utils: "npm:^2.0.6" - checksum: 10/6aba7c0282af3db4b03870ebe1fc417e651fbfc3cc260de8b73d95ede3ed390af0c94ef376877c5ef50cf8ab49d125ddcd25d6913543b63bf6caa0e22bfecc6f + checksum: 10/b210db2cd3ab595c6053deee4c11e7eb5ea293b9af16fc87021288125dd42e8d13fdc77be21eca71f1636c6fe104edc26e32d6e707168763e97b0d1718c11203 languageName: node linkType: hard -"jest-cli@npm:30.3.0": - version: 30.3.0 - resolution: "jest-cli@npm:30.3.0" +"jest-cli@npm:30.4.2": + version: 30.4.2 + resolution: "jest-cli@npm:30.4.2" dependencies: - "@jest/core": "npm:30.3.0" - "@jest/test-result": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/core": "npm:30.4.2" + "@jest/test-result": "npm:30.4.1" + "@jest/types": "npm:30.4.1" chalk: "npm:^4.1.2" exit-x: "npm:^0.2.2" import-local: "npm:^3.2.0" - jest-config: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-validate: "npm:30.3.0" + jest-config: "npm:30.4.2" + jest-util: "npm:30.4.1" + jest-validate: "npm:30.4.1" yargs: "npm:^17.7.2" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -10574,35 +10591,35 @@ __metadata: optional: true bin: jest: ./bin/jest.js - checksum: 10/a80aa3a2eec0b0d6644c25ce196d485e178b9c2ad037c17764a645f2fe156563c7fb2dca07cb10d8b9da77dbb8e0c6bcb4b82ca9a59ee50f12700f06670093c1 + checksum: 10/dd33f8ee6500298639d5ec4d5f641306d9876fa182042ee40e9c63c59bdf9a82dc46da5bf38fae0783f6ac874df7f7f099006b263022954cf494f8468dfe583c languageName: node linkType: hard -"jest-config@npm:30.3.0": - version: 30.3.0 - resolution: "jest-config@npm:30.3.0" +"jest-config@npm:30.4.2": + version: 30.4.2 + resolution: "jest-config@npm:30.4.2" dependencies: "@babel/core": "npm:^7.27.4" "@jest/get-type": "npm:30.1.0" - "@jest/pattern": "npm:30.0.1" - "@jest/test-sequencer": "npm:30.3.0" - "@jest/types": "npm:30.3.0" - babel-jest: "npm:30.3.0" + "@jest/pattern": "npm:30.4.0" + "@jest/test-sequencer": "npm:30.4.1" + "@jest/types": "npm:30.4.1" + babel-jest: "npm:30.4.1" chalk: "npm:^4.1.2" ci-info: "npm:^4.2.0" deepmerge: "npm:^4.3.1" glob: "npm:^10.5.0" graceful-fs: "npm:^4.2.11" - jest-circus: "npm:30.3.0" - jest-docblock: "npm:30.2.0" - jest-environment-node: "npm:30.3.0" - jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.3.0" - jest-runner: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-validate: "npm:30.3.0" + jest-circus: "npm:30.4.2" + jest-docblock: "npm:30.4.0" + jest-environment-node: "npm:30.4.1" + jest-regex-util: "npm:30.4.0" + jest-resolve: "npm:30.4.1" + jest-runner: "npm:30.4.2" + jest-util: "npm:30.4.1" + jest-validate: "npm:30.4.1" parse-json: "npm:^5.2.0" - pretty-format: "npm:30.3.0" + pretty-format: "npm:30.4.1" slash: "npm:^3.0.0" strip-json-comments: "npm:^3.1.1" peerDependencies: @@ -10616,11 +10633,23 @@ __metadata: optional: true ts-node: optional: true - checksum: 10/89c49426e2be5ee0c7cf9d6ab0a1dd6eb5ea03f67a5cc57d991d3d2441762d7101a215da5596bcb5b39c47e209ab8fdf4682fd1365cef7a5e48903b689bf4116 + checksum: 10/d37d923a5b3e815b73bbefe09c2f7fb092d6933f5f4ec0555fd9cacf97c58e8adb73fc4780a99e6a49e798444b1bb0097c9d5232feb1b8ffa31af589f9c02d9a + languageName: node + linkType: hard + +"jest-diff@npm:30.4.1": + version: 30.4.1 + resolution: "jest-diff@npm:30.4.1" + dependencies: + "@jest/diff-sequences": "npm:30.4.0" + "@jest/get-type": "npm:30.1.0" + chalk: "npm:^4.1.2" + pretty-format: "npm:30.4.1" + checksum: 10/594212df96bf101170afdb7eebd188d6d7d27241cbdd18b61d95f1142a3c94ae3b270377d15e719fb3c5efe4458d32acba8ad13dd6230dd7d6917a9eebb32625 languageName: node linkType: hard -"jest-diff@npm:30.3.0, jest-diff@npm:>=30.0.0 < 31, jest-diff@npm:^30.0.2": +"jest-diff@npm:>=30.0.0 < 31, jest-diff@npm:^30.0.2": version: 30.3.0 resolution: "jest-diff@npm:30.3.0" dependencies: @@ -10632,112 +10661,113 @@ __metadata: languageName: node linkType: hard -"jest-docblock@npm:30.2.0": - version: 30.2.0 - resolution: "jest-docblock@npm:30.2.0" +"jest-docblock@npm:30.4.0": + version: 30.4.0 + resolution: "jest-docblock@npm:30.4.0" dependencies: detect-newline: "npm:^3.1.0" - checksum: 10/e01a7d1193947ed0f9713c26bfc7852e51cb758cafec807e5665a0a8d582473a43778bee099f8aa5c70b2941963e5341f4b10bd86b036a4fa3bcec0f4c04e099 + checksum: 10/0ee25351ef941e832e53d10e74f34b38941b8f5fe750584661f6c5a115771818b081b8e39830c49d152fd361af81c7800c2d3a3c3a0e2dc742f7bfdbb6b1baaa languageName: node linkType: hard -"jest-each@npm:30.3.0": - version: 30.3.0 - resolution: "jest-each@npm:30.3.0" +"jest-each@npm:30.4.1": + version: 30.4.1 + resolution: "jest-each@npm:30.4.1" dependencies: "@jest/get-type": "npm:30.1.0" - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" chalk: "npm:^4.1.2" - jest-util: "npm:30.3.0" - pretty-format: "npm:30.3.0" - checksum: 10/ece465cbb1c4fbb445c9cfacd33275489940684fd0d447f6d4bdb4ef81d63c1b0bc3b365be7400dbbffd8d5502fd5faf10e97025a61c27bcd3da1ea21c749381 + jest-util: "npm:30.4.1" + pretty-format: "npm:30.4.1" + checksum: 10/077365c3fd0dc0d74aaa180fe4e3728533685413db58e7a30c8502d19a60a0b08259825d8aa36c569c8175a9d0cf901dd69c0a4eb63567c22c07bd0b566ddf89 languageName: node linkType: hard -"jest-environment-node@npm:30.3.0": - version: 30.3.0 - resolution: "jest-environment-node@npm:30.3.0" +"jest-environment-node@npm:30.4.1": + version: 30.4.1 + resolution: "jest-environment-node@npm:30.4.1" dependencies: - "@jest/environment": "npm:30.3.0" - "@jest/fake-timers": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/environment": "npm:30.4.1" + "@jest/fake-timers": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" - jest-mock: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-validate: "npm:30.3.0" - checksum: 10/805732507857f283f8c5eaca78561401c16043cd9a2579fc4a3cd6139a5138c6108f4b32f7fafe5b41f9b53f2fbc63cf65eb892e15e086034b09899c9fa4fed4 + jest-mock: "npm:30.4.1" + jest-util: "npm:30.4.1" + jest-validate: "npm:30.4.1" + checksum: 10/b93157061c6fa4b62808741bdda5fbc0372a9d2a3db844f0ffb819ed104b3b5c6ff73375d9f57c0d8485a0ad6aed07d4cfbb98aca985c38e1a29f64096b940bc languageName: node linkType: hard -"jest-haste-map@npm:30.3.0": - version: 30.3.0 - resolution: "jest-haste-map@npm:30.3.0" +"jest-haste-map@npm:30.4.1": + version: 30.4.1 + resolution: "jest-haste-map@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" anymatch: "npm:^3.1.3" fb-watchman: "npm:^2.0.2" fsevents: "npm:^2.3.3" graceful-fs: "npm:^4.2.11" - jest-regex-util: "npm:30.0.1" - jest-util: "npm:30.3.0" - jest-worker: "npm:30.3.0" + jest-regex-util: "npm:30.4.0" + jest-util: "npm:30.4.1" + jest-worker: "npm:30.4.1" picomatch: "npm:^4.0.3" walker: "npm:^1.0.8" dependenciesMeta: fsevents: optional: true - checksum: 10/0e0cc449d57414ac2d1f9ece64a98ffc4b4041fe3fba7cf9aaeb71089f7101583b1752e88aa4440d6fa71f86ef50d630be4f31f922cdf404d78655cb9811493b + checksum: 10/d26404c7258d03fa423604191bca39707438ca1e62a9a471c92fcd468fa386cbdce2c50b3834fb830b25836e3eee34e3070d22b016b42f0ab626c157f5726eeb languageName: node linkType: hard -"jest-leak-detector@npm:30.3.0": - version: 30.3.0 - resolution: "jest-leak-detector@npm:30.3.0" +"jest-leak-detector@npm:30.4.1": + version: 30.4.1 + resolution: "jest-leak-detector@npm:30.4.1" dependencies: "@jest/get-type": "npm:30.1.0" - pretty-format: "npm:30.3.0" - checksum: 10/950ce3266067dd983f80231ce753fdfb9fe167d810b4507d84e674205c2cb96d37f38615ae502fa9277dde497ee52ce581656b48709aacf9502a4f0006bfab0e + pretty-format: "npm:30.4.1" + checksum: 10/8c0945d1c73f6a2abde8660f7fc5693b344cd1f5fd66153c0c2d13007f8429486eb99ecf15ac68d3d4410534fd0fad1ed430c32a641cdac66e021dbd33204c9a languageName: node linkType: hard -"jest-matcher-utils@npm:30.3.0": - version: 30.3.0 - resolution: "jest-matcher-utils@npm:30.3.0" +"jest-matcher-utils@npm:30.4.1": + version: 30.4.1 + resolution: "jest-matcher-utils@npm:30.4.1" dependencies: "@jest/get-type": "npm:30.1.0" chalk: "npm:^4.1.2" - jest-diff: "npm:30.3.0" - pretty-format: "npm:30.3.0" - checksum: 10/8aeef24fe2a21a3a22eb26a805c0a4c8ca8961aa1ebc07d680bf55b260f593814467bdfb60b271a3c239a411b2468f352c279cef466e35fd024d901ffa6cc942 + jest-diff: "npm:30.4.1" + pretty-format: "npm:30.4.1" + checksum: 10/4da6e5c7fe5903fae7394233ea4b892567fb027065670c03096d01be0b389f858055c5ade20d59e82fedec6f3287e6f1720de526cd9a9ad3495432320adb9194 languageName: node linkType: hard -"jest-message-util@npm:30.3.0": - version: 30.3.0 - resolution: "jest-message-util@npm:30.3.0" +"jest-message-util@npm:30.4.1": + version: 30.4.1 + resolution: "jest-message-util@npm:30.4.1" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@types/stack-utils": "npm:^2.0.3" chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" + jest-util: "npm:30.4.1" picomatch: "npm:^4.0.3" - pretty-format: "npm:30.3.0" + pretty-format: "npm:30.4.1" slash: "npm:^3.0.0" stack-utils: "npm:^2.0.6" - checksum: 10/886577543ec60b421d21987190c5e393ff3652f4f2f2b504776d73f932518827b026ab8e6ffdb1f21ff5142ddf160ba4794e56d96143baeb4ae6939e040a10bd + checksum: 10/f83894efa37aa9c61c0a559b1027ecdb0d0cd8afd3e8ea74e797c707d58daea814e72f04b6db0bb6a148c12ae203e9c6e6c5544832ca5fae286c4f80c18ddc3f languageName: node linkType: hard -"jest-mock@npm:30.3.0": - version: 30.3.0 - resolution: "jest-mock@npm:30.3.0" +"jest-mock@npm:30.4.1": + version: 30.4.1 + resolution: "jest-mock@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" - jest-util: "npm:30.3.0" - checksum: 10/9d2a9e52c2aebc486e9accaf641efa5c6589666e883b5ac1987261d0e2c105a06b885c22aeeb1cd7582e421970c95e34fe0b41bc4a8c06d7e3e4c27651e76ad1 + jest-util: "npm:30.4.1" + checksum: 10/8d0c2794130217b9030b888ce380fe57d82388eec19351bd666440ba46f1e24a7e2bdf42cbe9bcfda2b881d4c0ea09db3c80131b9ab788fb5224af2a1339b422 languageName: node linkType: hard @@ -10753,193 +10783,193 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:30.0.1": - version: 30.0.1 - resolution: "jest-regex-util@npm:30.0.1" - checksum: 10/fa8dac80c3e94db20d5e1e51d1bdf101cf5ede8f4e0b8f395ba8b8ea81e71804ffd747452a6bb6413032865de98ac656ef8ae43eddd18d980b6442a2764ed562 +"jest-regex-util@npm:30.4.0": + version: 30.4.0 + resolution: "jest-regex-util@npm:30.4.0" + checksum: 10/8664fcc1d07c8236a3bd012c0f06ae9d14d96e758b32ee340a3a7c4c326d0b5052d8c4ae4f4c4184f08bf78723d905352f22923647df9658ace3604f03bf074f languageName: node linkType: hard -"jest-resolve-dependencies@npm:30.3.0": - version: 30.3.0 - resolution: "jest-resolve-dependencies@npm:30.3.0" +"jest-resolve-dependencies@npm:30.4.2": + version: 30.4.2 + resolution: "jest-resolve-dependencies@npm:30.4.2" dependencies: - jest-regex-util: "npm:30.0.1" - jest-snapshot: "npm:30.3.0" - checksum: 10/79dfbc3c8c967e7908bcb02f5116c37002f2cdc10360d179876de832c10ee87cb85cc27895b035697da477ab6ad70170f4e2907a85d35a44117646554cc72111 + jest-regex-util: "npm:30.4.0" + jest-snapshot: "npm:30.4.1" + checksum: 10/ec7e27d1abf67dfe9ec1a2887b5fa883e1e6ca38eb45506a82f93e29d8df62c18cb40ec07af43fe0fa65d568051a878b6649745f6c032d8962a8dad6323763ad languageName: node linkType: hard -"jest-resolve@npm:30.3.0": - version: 30.3.0 - resolution: "jest-resolve@npm:30.3.0" +"jest-resolve@npm:30.4.1": + version: 30.4.1 + resolution: "jest-resolve@npm:30.4.1" dependencies: chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.3.0" + jest-haste-map: "npm:30.4.1" jest-pnp-resolver: "npm:^1.2.3" - jest-util: "npm:30.3.0" - jest-validate: "npm:30.3.0" + jest-util: "npm:30.4.1" + jest-validate: "npm:30.4.1" slash: "npm:^3.0.0" unrs-resolver: "npm:^1.7.11" - checksum: 10/7d88ef3f6424386e4b4e65d486ac1d3b86c142cf789f0ab945a2cd8bd830edc0314c7561a459b95062f41bc550ae7110f461dbafcc07030f61728edb00b4bcdd + checksum: 10/197ca741df92c1006c2367142b5e44827d995f062e94a923f574e87ce04f966634851bb31f54ea377ca163a8362613947cd2311abf8a5712fe879b1ac15f662f languageName: node linkType: hard -"jest-runner@npm:30.3.0": - version: 30.3.0 - resolution: "jest-runner@npm:30.3.0" +"jest-runner@npm:30.4.2": + version: 30.4.2 + resolution: "jest-runner@npm:30.4.2" dependencies: - "@jest/console": "npm:30.3.0" - "@jest/environment": "npm:30.3.0" - "@jest/test-result": "npm:30.3.0" - "@jest/transform": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/console": "npm:30.4.1" + "@jest/environment": "npm:30.4.1" + "@jest/test-result": "npm:30.4.1" + "@jest/transform": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" chalk: "npm:^4.1.2" emittery: "npm:^0.13.1" exit-x: "npm:^0.2.2" graceful-fs: "npm:^4.2.11" - jest-docblock: "npm:30.2.0" - jest-environment-node: "npm:30.3.0" - jest-haste-map: "npm:30.3.0" - jest-leak-detector: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-resolve: "npm:30.3.0" - jest-runtime: "npm:30.3.0" - jest-util: "npm:30.3.0" - jest-watcher: "npm:30.3.0" - jest-worker: "npm:30.3.0" + jest-docblock: "npm:30.4.0" + jest-environment-node: "npm:30.4.1" + jest-haste-map: "npm:30.4.1" + jest-leak-detector: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-resolve: "npm:30.4.1" + jest-runtime: "npm:30.4.2" + jest-util: "npm:30.4.1" + jest-watcher: "npm:30.4.1" + jest-worker: "npm:30.4.1" p-limit: "npm:^3.1.0" source-map-support: "npm:0.5.13" - checksum: 10/f467591d2ff95f7b3138dc7c8631e751000d1fcabfdb9a94623fce3fd7b538a45628e9a1e8e8758c4d7a0c3757c393a3ef034ba986d7565e3f1b597ab7a73748 + checksum: 10/3ed8ee70019f1f5a63faaf07a15e522ec878601dc6eccbde7eb4d0529e4d1a7314e7041160075458257e3103f41d6e9bbb2df8698806805ae2768a7e90228103 languageName: node linkType: hard -"jest-runtime@npm:30.3.0": - version: 30.3.0 - resolution: "jest-runtime@npm:30.3.0" +"jest-runtime@npm:30.4.2": + version: 30.4.2 + resolution: "jest-runtime@npm:30.4.2" dependencies: - "@jest/environment": "npm:30.3.0" - "@jest/fake-timers": "npm:30.3.0" - "@jest/globals": "npm:30.3.0" + "@jest/environment": "npm:30.4.1" + "@jest/fake-timers": "npm:30.4.1" + "@jest/globals": "npm:30.4.1" "@jest/source-map": "npm:30.0.1" - "@jest/test-result": "npm:30.3.0" - "@jest/transform": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/test-result": "npm:30.4.1" + "@jest/transform": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" chalk: "npm:^4.1.2" cjs-module-lexer: "npm:^2.1.0" collect-v8-coverage: "npm:^1.0.2" glob: "npm:^10.5.0" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-mock: "npm:30.3.0" - jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.3.0" - jest-snapshot: "npm:30.3.0" - jest-util: "npm:30.3.0" + jest-haste-map: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-mock: "npm:30.4.1" + jest-regex-util: "npm:30.4.0" + jest-resolve: "npm:30.4.1" + jest-snapshot: "npm:30.4.1" + jest-util: "npm:30.4.1" slash: "npm:^3.0.0" strip-bom: "npm:^4.0.0" - checksum: 10/a9335405ca46e8d77c8400887566b5cf2a3544e1b067eb3b187e86ea5c74f1b8b16ecf1de3a589bfb32be95e77452a01913f187d66a41c5a4595a30d7dc1daf0 + checksum: 10/bc2612a17650e7187d2c778aa66fc07926f828eeb3a445e47ffa757f65a4fb29628a43c6e792196b0a3a06d099b0405b6654a2c314fc5092013690d01483fd75 languageName: node linkType: hard -"jest-snapshot@npm:30.3.0": - version: 30.3.0 - resolution: "jest-snapshot@npm:30.3.0" +"jest-snapshot@npm:30.4.1": + version: 30.4.1 + resolution: "jest-snapshot@npm:30.4.1" dependencies: "@babel/core": "npm:^7.27.4" "@babel/generator": "npm:^7.27.5" "@babel/plugin-syntax-jsx": "npm:^7.27.1" "@babel/plugin-syntax-typescript": "npm:^7.27.1" "@babel/types": "npm:^7.27.3" - "@jest/expect-utils": "npm:30.3.0" + "@jest/expect-utils": "npm:30.4.1" "@jest/get-type": "npm:30.1.0" - "@jest/snapshot-utils": "npm:30.3.0" - "@jest/transform": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/snapshot-utils": "npm:30.4.1" + "@jest/transform": "npm:30.4.1" + "@jest/types": "npm:30.4.1" babel-preset-current-node-syntax: "npm:^1.2.0" chalk: "npm:^4.1.2" - expect: "npm:30.3.0" + expect: "npm:30.4.1" graceful-fs: "npm:^4.2.11" - jest-diff: "npm:30.3.0" - jest-matcher-utils: "npm:30.3.0" - jest-message-util: "npm:30.3.0" - jest-util: "npm:30.3.0" - pretty-format: "npm:30.3.0" + jest-diff: "npm:30.4.1" + jest-matcher-utils: "npm:30.4.1" + jest-message-util: "npm:30.4.1" + jest-util: "npm:30.4.1" + pretty-format: "npm:30.4.1" semver: "npm:^7.7.2" synckit: "npm:^0.11.8" - checksum: 10/d9f75c436587410cc8170a710d53a632e148a648ec82476ef9e618d8067246e48af7c460773304ad53eecf748b118619a6afd87212f86d680d3439787b4fec39 + checksum: 10/6135108d3e0e9fb93ed10fd9ad91d8dbe56f90a9ea84c32a0b551518f8c71f363299dcc301717f3ed82cfe2a276d7993d2b3ccfabea3e8020d49ae8b0f9b6cd8 languageName: node linkType: hard -"jest-util@npm:30.3.0": - version: 30.3.0 - resolution: "jest-util@npm:30.3.0" +"jest-util@npm:30.4.1": + version: 30.4.1 + resolution: "jest-util@npm:30.4.1" dependencies: - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" chalk: "npm:^4.1.2" ci-info: "npm:^4.2.0" graceful-fs: "npm:^4.2.11" picomatch: "npm:^4.0.3" - checksum: 10/4b016004637f6a53d6f54c993dc8904a4d6abe93acb8dd70622dc2ca80290a03692e834af1068969b486426e87d411144705edd4d772bb715a826d7e15b5a4b3 + checksum: 10/603093e12076906afcf28be514d5b7ac4e3c0e26997b0047614cf2a308b65d773137304a1fb011d747517e881aeed067f6606b9937f5b838d67f6e5734b49ebe languageName: node linkType: hard -"jest-validate@npm:30.3.0": - version: 30.3.0 - resolution: "jest-validate@npm:30.3.0" +"jest-validate@npm:30.4.1": + version: 30.4.1 + resolution: "jest-validate@npm:30.4.1" dependencies: "@jest/get-type": "npm:30.1.0" - "@jest/types": "npm:30.3.0" + "@jest/types": "npm:30.4.1" camelcase: "npm:^6.3.0" chalk: "npm:^4.1.2" leven: "npm:^3.1.0" - pretty-format: "npm:30.3.0" - checksum: 10/b26e32602c65f93d4fa9ca24efa661df24b8919c5c4cb88b87852178310833df3a7fdb757afb9d769cfe13f6636385626d8ac8a2ad7af47365d309a548cd0e06 + pretty-format: "npm:30.4.1" + checksum: 10/527fe8ad02df9a4f7f467ecc4e3ac2a37a27b7b30345e7bc3cb9c2ead33fbc8ed1290c0827baa06471281012c38abb96cb268af274a0a2350548e50db20a434f languageName: node linkType: hard -"jest-watcher@npm:30.3.0": - version: 30.3.0 - resolution: "jest-watcher@npm:30.3.0" +"jest-watcher@npm:30.4.1": + version: 30.4.1 + resolution: "jest-watcher@npm:30.4.1" dependencies: - "@jest/test-result": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/test-result": "npm:30.4.1" + "@jest/types": "npm:30.4.1" "@types/node": "npm:*" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" emittery: "npm:^0.13.1" - jest-util: "npm:30.3.0" + jest-util: "npm:30.4.1" string-length: "npm:^4.0.2" - checksum: 10/b3a284869be1c69a8084c1129fcc08b719b8556d3af93b6cd587f9e2f948e5ce5084cb0ec62a166e3161d1d8b6dc580a88ba02abc05a0948809c65b27bd60f3a + checksum: 10/05350ed3d5643e87e22cc5faee14f912dfc06ba63d56944006d9837f2070ed509a1d124c7e7be3e3a9a6a382bd31d491146da6fda4483acd4b8292091888e9bd languageName: node linkType: hard -"jest-worker@npm:30.3.0": - version: 30.3.0 - resolution: "jest-worker@npm:30.3.0" +"jest-worker@npm:30.4.1": + version: 30.4.1 + resolution: "jest-worker@npm:30.4.1" dependencies: "@types/node": "npm:*" "@ungap/structured-clone": "npm:^1.3.0" - jest-util: "npm:30.3.0" + jest-util: "npm:30.4.1" merge-stream: "npm:^2.0.0" supports-color: "npm:^8.1.1" - checksum: 10/6198e7462617e8f544b1ba593970fb7656e990aa87a2259f693edde106b5aecf63bae692e8d6adc4313efcaba283b15fc25f6834cacca12cf241da0ece722060 + checksum: 10/ff6af73c9097fc07e90490d3e1e354c702390ef66f7f40054a15dd6d56809a25634179969ff80bde782a6c645f49fa48bf3aacfe7d05af7315c48020f9b2b1cd languageName: node linkType: hard -"jest@npm:^30.3.0": - version: 30.3.0 - resolution: "jest@npm:30.3.0" +"jest@npm:^30.4.2": + version: 30.4.2 + resolution: "jest@npm:30.4.2" dependencies: - "@jest/core": "npm:30.3.0" - "@jest/types": "npm:30.3.0" + "@jest/core": "npm:30.4.2" + "@jest/types": "npm:30.4.1" import-local: "npm:^3.2.0" - jest-cli: "npm:30.3.0" + jest-cli: "npm:30.4.2" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -10947,7 +10977,7 @@ __metadata: optional: true bin: jest: ./bin/jest.js - checksum: 10/e8485ede8456c71915e94a7ab4fe66c983043263109d61e0665a17cb7f8e843a5a30abca4d932b0ea7aa90326aa10d4acb31d8f3cd2b3158a89c1e5ee3b92856 + checksum: 10/3690f4009a46781b480fbd4c8c60dd910a3cf8af76626f29971003c28eb17dfa322e86f3203e3da168edcc9f7ba973f3b1fbf15ca12393cc5f86bc61f3289fef languageName: node linkType: hard @@ -13315,7 +13345,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - jest: "npm:^30.3.0" + jest: "npm:^30.4.2" less: "npm:4.6.4" lodash: "npm:4.18.1" promise: "npm:^8.3.0" @@ -14106,6 +14136,18 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:30.4.1": + version: 30.4.1 + resolution: "pretty-format@npm:30.4.1" + dependencies: + "@jest/schemas": "npm:30.4.1" + ansi-styles: "npm:^5.2.0" + react-is-18: "npm:react-is@^18.3.1" + react-is-19: "npm:react-is@^19.2.5" + checksum: 10/60311ef47a646eeaec0432efe66290cb6f0d2eccb123a28ad4ab6d7e53087bc62db91cfd54c3cc00c89d6875aefb2bf6264381b6c9411ce6bff3d6aa8280abad + languageName: node + linkType: hard + "pretty-hrtime@npm:^1.0.3": version: 1.0.3 resolution: "pretty-hrtime@npm:1.0.3" @@ -14201,7 +14243,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - jest: "npm:^30.3.0" + jest: "npm:^30.4.2" less: "npm:4.6.4" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" @@ -14606,13 +14648,20 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0, react-is@npm:^18.3.1": +"react-is-18@npm:react-is@^18.3.1, react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0, react-is@npm:^18.3.1": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 languageName: node linkType: hard +"react-is-19@npm:react-is@^19.2.5": + version: 19.2.7 + resolution: "react-is@npm:19.2.7" + checksum: 10/ae0d3ae7638aa2fa2a82a78a817daf2806e57fa0aef357d07e1e8d1e9a301902e5967168e9334b5816db0df8fa980a725cd57569ba5a9e6e76a71e117b18be04 + languageName: node + linkType: hard + "react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.3.2, react-is@npm:^16.7.0, react-is@npm:^16.8.6": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -16366,7 +16415,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - jest: "npm:^30.3.0" + jest: "npm:^30.4.2" less: "npm:4.6.4" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -18051,7 +18100,7 @@ __metadata: eslint: "npm:10.4.1" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - jest: "npm:^30.3.0" + jest: "npm:^30.4.2" less: "npm:4.6.4" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" From ac60857156ff8a416c4c5a67723f9e9c92512865 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:42:14 -0500 Subject: [PATCH 058/109] Bump kiti from 2.6.1 to 2.7.0 --- .../ResourceManager.Web/package.json | 2 +- .../ClientSide/Styles.Web/package.json | 2 +- yarn.lock | 13 +++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 889bd5c5306..670f2881498 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -37,7 +37,7 @@ "@types/node": "^25.9.2", "@typescript-eslint/utils": "^8.60.1", "eslint": "^10.4.1", - "jiti": "^2.6.1", + "jiti": "^2.7.0", "typescript": "^5.9.3", "typescript-eslint": "^8.60.1" } diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index aa3451e2b94..b4a68dc5b90 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -37,7 +37,7 @@ "@typescript-eslint/eslint-plugin": "^8.60.1", "@typescript-eslint/parser": "^8.60.1", "eslint": "^10.4.1", - "jiti": "^2.6.1", + "jiti": "^2.7.0", "typescript-eslint": "^8.60.1" } } diff --git a/yarn.lock b/yarn.lock index edc50d0ddd5..9e29d24f75f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7214,7 +7214,7 @@ __metadata: "@types/node": "npm:^25.9.2" "@typescript-eslint/utils": "npm:^8.60.1" eslint: "npm:^10.4.1" - jiti: "npm:^2.6.1" + jiti: "npm:^2.7.0" typescript: "npm:^5.9.3" typescript-eslint: "npm:^8.60.1" languageName: unknown @@ -10990,6 +10990,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.7.0": + version: 2.7.0 + resolution: "jiti@npm:2.7.0" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10/6d75a8dbd61dbee031aa0937fabb748ff8ddf370b971958cc704f5cf26b4c5bdc9dcd0563059b2627a2bd41d946fa0bc64f912fdc8981ca7945a9d63c74ad0f9 + languageName: node + linkType: hard + "jodit@npm:^4.6.2": version: 4.6.2 resolution: "jodit@npm:4.6.2" @@ -17078,7 +17087,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.60.1" "@typescript-eslint/parser": "npm:^8.60.1" eslint: "npm:^10.4.1" - jiti: "npm:^2.6.1" + jiti: "npm:^2.7.0" typescript-eslint: "npm:^8.60.1" languageName: unknown linkType: soft From 34adac432325da65c95656f1e6e7b09803929ae4 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:42:36 -0500 Subject: [PATCH 059/109] Bump nanoid from 5.1.7 to 5.1.11 --- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 4e77015b555..43f3f321e7a 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -65,7 +65,7 @@ "eslint-plugin-react": "7.37.5", "eslint-plugin-storybook": "10.4.2", "less": "4.6.4", - "nanoid": "^5.1.7", + "nanoid": "^5.1.11", "prop-types": "^15.8.1", "react": "^16.14.0", "react-addons-test-utils": "^15.6.2", diff --git a/yarn.lock b/yarn.lock index 9e29d24f75f..c0c736cc6a7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -545,7 +545,7 @@ __metadata: html-react-parser: "npm:^6.1.3" interact.js: "npm:^1.2.8" less: "npm:4.6.4" - nanoid: "npm:^5.1.7" + nanoid: "npm:^5.1.11" prop-types: "npm:^15.8.1" raw-loader: "npm:4.0.2" react: "npm:^16.14.0" @@ -12316,12 +12316,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^5.1.7": - version: 5.1.7 - resolution: "nanoid@npm:5.1.7" +"nanoid@npm:^5.1.11": + version: 5.1.11 + resolution: "nanoid@npm:5.1.11" bin: nanoid: bin/nanoid.js - checksum: 10/9ca13b1e87c61b21afaa578f40afbb6488fbc24609c34bba744941f9f56feb5b416ea7dfcc1ec4927a8c0f52e5ea755633662dbd58b9e87fd7899c1d7b242ed6 + checksum: 10/d5971a1d39f68bd9845565c70a27733c832ba1bd73caad3c7b999a366c0355b6fcc65064f3b0179bca6cd36b50cacd5747d4482c303f026b58d62ebe31df9868 languageName: node linkType: hard From be25dcaa30878cdfe038fe24f74dc978298c0cc2 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:42:57 -0500 Subject: [PATCH 060/109] Bump postcss from 8.5.8 to 8.5.15 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index e5125ef155d..6fc19132912 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -25,7 +25,7 @@ "esbuild": "^0.28.0", "eslint": "^10.4.1", "modern-normalize": "^3.0.1", - "postcss": "^8.5.8", + "postcss": "^8.5.15", "postcss-banner": "^4.0.1", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 1d59b115ae0..6ceac26ea92 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -21,7 +21,7 @@ "chokidar": "^5.0.0", "cssnano": "^8.0.1", "glob": "^13.0.6", - "postcss": "^8.5.8", + "postcss": "^8.5.15", "postcss-banner": "^4.0.1", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", diff --git a/yarn.lock b/yarn.lock index c0c736cc6a7..7412f13b7b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5171,7 +5171,7 @@ __metadata: cssnano: "npm:^8.0.1" glob: "npm:^13.0.6" normalize.css: "npm:^8.0.1" - postcss: "npm:^8.5.8" + postcss: "npm:^8.5.15" postcss-banner: "npm:^4.0.1" postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" @@ -7305,7 +7305,7 @@ __metadata: esbuild: "npm:^0.28.0" eslint: "npm:^10.4.1" modern-normalize: "npm:^3.0.1" - postcss: "npm:^8.5.8" + postcss: "npm:^8.5.15" postcss-banner: "npm:^4.0.1" postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" @@ -14098,7 +14098,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.0.0, postcss@npm:^8.2.2, postcss@npm:^8.5.8": +"postcss@npm:^8.0.0, postcss@npm:^8.2.2": version: 8.5.10 resolution: "postcss@npm:8.5.10" dependencies: From 413fe9691404f30aa1f373208f47a9a708ee0931 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:43:23 -0500 Subject: [PATCH 061/109] Bump react-router from 7.13.1 to 7.17.0 --- .../Samples/Dnn.ContactList.SpaReact/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json index 14129529257..8e8135192d2 100644 --- a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json +++ b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router": "^7.13.1" + "react-router": "^7.17.0" }, "devDependencies": { "@types/react": "^19.2.17", diff --git a/yarn.lock b/yarn.lock index 7412f13b7b0..5127a7379cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7324,7 +7324,7 @@ __metadata: "@vitejs/plugin-react": "npm:^6.0.2" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" - react-router: "npm:^7.13.1" + react-router: "npm:^7.17.0" typescript: "npm:^5.9.3" vite: "npm:^8.0.16" languageName: unknown @@ -14780,9 +14780,9 @@ __metadata: languageName: node linkType: hard -"react-router@npm:^7.13.1": - version: 7.16.0 - resolution: "react-router@npm:7.16.0" +"react-router@npm:^7.17.0": + version: 7.17.0 + resolution: "react-router@npm:7.17.0" dependencies: cookie: "npm:^1.0.1" set-cookie-parser: "npm:^2.6.0" @@ -14792,7 +14792,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: 10/2c77d27170eab1dfa6f0593e846f9d352424cc789a505aaee9bee9c9da1ed9d6a044d0a476e3eaf240e73b09169b4ffb85b5910d026a34abd055aed5b2f5a5cb + checksum: 10/0f1303150cd607682f911c32b3584cb88bd6312004553032b4db36a7917eae1eba08ba527d42647cb3842e76c313b2ad67fafa1cbfe554c14e6e87c13535b8a1 languageName: node linkType: hard From 5172f73390c60518f765bdffb1709a90d0ebcfac Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:43:50 -0500 Subject: [PATCH 062/109] Bump sass-embedded from 1.98.0 to 1.100.0 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 225 ++++++++++++++++++++++- 3 files changed, 224 insertions(+), 5 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 6fc19132912..52c8d97261e 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -29,7 +29,7 @@ "postcss-banner": "^4.0.1", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", - "sass-embedded": "^1.98.0", + "sass-embedded": "^1.100.0", "tsx": "^4.21.0", "typescript": "^5.9.3" } diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 6ceac26ea92..47b859b7a87 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -25,7 +25,7 @@ "postcss-banner": "^4.0.1", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", - "sass-embedded": "^1.98.0", + "sass-embedded": "^1.100.0", "tsx": "^4.21.0", "typescript": "^5.9.3", "zip-lib": "^1.3.4" diff --git a/yarn.lock b/yarn.lock index 5127a7379cf..b541fcfd506 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5175,7 +5175,7 @@ __metadata: postcss-banner: "npm:^4.0.1" postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" - sass-embedded: "npm:^1.98.0" + sass-embedded: "npm:^1.100.0" tsx: "npm:^4.21.0" typescript: "npm:^5.9.3" zip-lib: "npm:^1.3.4" @@ -7309,7 +7309,7 @@ __metadata: postcss-banner: "npm:^4.0.1" postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" - sass-embedded: "npm:^1.98.0" + sass-embedded: "npm:^1.100.0" tsx: "npm:^4.21.0" typescript: "npm:^5.9.3" languageName: unknown @@ -15702,6 +15702,15 @@ __metadata: languageName: node linkType: hard +"sass-embedded-all-unknown@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-all-unknown@npm:1.100.0" + dependencies: + sass: "npm:1.100.0" + conditions: (!cpu=arm | !cpu=arm64 | !cpu=riscv64 | !cpu=x64) + languageName: node + linkType: hard + "sass-embedded-all-unknown@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-all-unknown@npm:1.98.0" @@ -15711,6 +15720,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-android-arm64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-android-arm64@npm:1.100.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "sass-embedded-android-arm64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-android-arm64@npm:1.98.0" @@ -15718,6 +15734,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-android-arm@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-android-arm@npm:1.100.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "sass-embedded-android-arm@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-android-arm@npm:1.98.0" @@ -15725,6 +15748,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-android-riscv64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-android-riscv64@npm:1.100.0" + conditions: os=android & cpu=riscv64 + languageName: node + linkType: hard + "sass-embedded-android-riscv64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-android-riscv64@npm:1.98.0" @@ -15732,6 +15762,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-android-x64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-android-x64@npm:1.100.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "sass-embedded-android-x64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-android-x64@npm:1.98.0" @@ -15739,6 +15776,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-darwin-arm64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-darwin-arm64@npm:1.100.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "sass-embedded-darwin-arm64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-darwin-arm64@npm:1.98.0" @@ -15746,6 +15790,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-darwin-x64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-darwin-x64@npm:1.100.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "sass-embedded-darwin-x64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-darwin-x64@npm:1.98.0" @@ -15753,6 +15804,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-arm64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-arm64@npm:1.100.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "sass-embedded-linux-arm64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-arm64@npm:1.98.0" @@ -15760,6 +15818,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-arm@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-arm@npm:1.100.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "sass-embedded-linux-arm@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-arm@npm:1.98.0" @@ -15767,6 +15832,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-musl-arm64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-musl-arm64@npm:1.100.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "sass-embedded-linux-musl-arm64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-musl-arm64@npm:1.98.0" @@ -15774,6 +15846,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-musl-arm@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-musl-arm@npm:1.100.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "sass-embedded-linux-musl-arm@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-musl-arm@npm:1.98.0" @@ -15781,6 +15860,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-musl-riscv64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-musl-riscv64@npm:1.100.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "sass-embedded-linux-musl-riscv64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-musl-riscv64@npm:1.98.0" @@ -15788,6 +15874,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-musl-x64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-musl-x64@npm:1.100.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "sass-embedded-linux-musl-x64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-musl-x64@npm:1.98.0" @@ -15795,6 +15888,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-riscv64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-riscv64@npm:1.100.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "sass-embedded-linux-riscv64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-riscv64@npm:1.98.0" @@ -15802,6 +15902,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-linux-x64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-linux-x64@npm:1.100.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "sass-embedded-linux-x64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-linux-x64@npm:1.98.0" @@ -15809,6 +15916,15 @@ __metadata: languageName: node linkType: hard +"sass-embedded-unknown-all@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-unknown-all@npm:1.100.0" + dependencies: + sass: "npm:1.100.0" + conditions: (!os=android | !os=darwin | !os=linux | !os=win32) + languageName: node + linkType: hard + "sass-embedded-unknown-all@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-unknown-all@npm:1.98.0" @@ -15818,6 +15934,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-win32-arm64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-win32-arm64@npm:1.100.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "sass-embedded-win32-arm64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-win32-arm64@npm:1.98.0" @@ -15825,6 +15948,13 @@ __metadata: languageName: node linkType: hard +"sass-embedded-win32-x64@npm:1.100.0": + version: 1.100.0 + resolution: "sass-embedded-win32-x64@npm:1.100.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "sass-embedded-win32-x64@npm:1.98.0": version: 1.98.0 resolution: "sass-embedded-win32-x64@npm:1.98.0" @@ -15832,7 +15962,79 @@ __metadata: languageName: node linkType: hard -"sass-embedded@npm:^1.89.2, sass-embedded@npm:^1.98.0": +"sass-embedded@npm:^1.100.0": + version: 1.100.0 + resolution: "sass-embedded@npm:1.100.0" + dependencies: + "@bufbuild/protobuf": "npm:^2.5.0" + colorjs.io: "npm:^0.5.0" + immutable: "npm:^5.1.5" + rxjs: "npm:^7.4.0" + sass-embedded-all-unknown: "npm:1.100.0" + sass-embedded-android-arm: "npm:1.100.0" + sass-embedded-android-arm64: "npm:1.100.0" + sass-embedded-android-riscv64: "npm:1.100.0" + sass-embedded-android-x64: "npm:1.100.0" + sass-embedded-darwin-arm64: "npm:1.100.0" + sass-embedded-darwin-x64: "npm:1.100.0" + sass-embedded-linux-arm: "npm:1.100.0" + sass-embedded-linux-arm64: "npm:1.100.0" + sass-embedded-linux-musl-arm: "npm:1.100.0" + sass-embedded-linux-musl-arm64: "npm:1.100.0" + sass-embedded-linux-musl-riscv64: "npm:1.100.0" + sass-embedded-linux-musl-x64: "npm:1.100.0" + sass-embedded-linux-riscv64: "npm:1.100.0" + sass-embedded-linux-x64: "npm:1.100.0" + sass-embedded-unknown-all: "npm:1.100.0" + sass-embedded-win32-arm64: "npm:1.100.0" + sass-embedded-win32-x64: "npm:1.100.0" + supports-color: "npm:^8.1.1" + sync-child-process: "npm:^1.0.2" + varint: "npm:^6.0.0" + dependenciesMeta: + sass-embedded-all-unknown: + optional: true + sass-embedded-android-arm: + optional: true + sass-embedded-android-arm64: + optional: true + sass-embedded-android-riscv64: + optional: true + sass-embedded-android-x64: + optional: true + sass-embedded-darwin-arm64: + optional: true + sass-embedded-darwin-x64: + optional: true + sass-embedded-linux-arm: + optional: true + sass-embedded-linux-arm64: + optional: true + sass-embedded-linux-musl-arm: + optional: true + sass-embedded-linux-musl-arm64: + optional: true + sass-embedded-linux-musl-riscv64: + optional: true + sass-embedded-linux-musl-x64: + optional: true + sass-embedded-linux-riscv64: + optional: true + sass-embedded-linux-x64: + optional: true + sass-embedded-unknown-all: + optional: true + sass-embedded-win32-arm64: + optional: true + sass-embedded-win32-x64: + optional: true + bin: + sass: dist/bin/sass.js + checksum: 10/68bc27c183baaa41b58d184c24d941840a407bb2295391817564d6118add32dd968c4eb5b6a7b8effdcdd3240ed2a5e86b1b4806c996ff7c038835da9a14b4b4 + languageName: node + linkType: hard + +"sass-embedded@npm:^1.89.2": version: 1.98.0 resolution: "sass-embedded@npm:1.98.0" dependencies: @@ -15904,6 +16106,23 @@ __metadata: languageName: node linkType: hard +"sass@npm:1.100.0": + version: 1.100.0 + resolution: "sass@npm:1.100.0" + dependencies: + "@parcel/watcher": "npm:^2.4.1" + chokidar: "npm:^5.0.0" + immutable: "npm:^5.1.5" + source-map-js: "npm:>=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true + bin: + sass: sass.js + checksum: 10/165d5ba502d747f3090e58d02e507b05a48f7856f542d3bb1ee74931fc47680b11b22e7fd4e90559738f7c295653db98b1d15b16ff6ec5447f6566654cc5c71e + languageName: node + linkType: hard + "sass@npm:1.98.0": version: 1.98.0 resolution: "sass@npm:1.98.0" From 4ba3263919d58ca20aa109147d94211cbea69dd5 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:44:11 -0500 Subject: [PATCH 063/109] Bump tsx from 4.21.0 to 4.22.4 --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 35 ++++++------------------ 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 52c8d97261e..ca605091a08 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -30,7 +30,7 @@ "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", "sass-embedded": "^1.100.0", - "tsx": "^4.21.0", + "tsx": "^4.22.4", "typescript": "^5.9.3" } } diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 47b859b7a87..b531d2743c2 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -26,7 +26,7 @@ "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", "sass-embedded": "^1.100.0", - "tsx": "^4.21.0", + "tsx": "^4.22.4", "typescript": "^5.9.3", "zip-lib": "^1.3.4" }, diff --git a/yarn.lock b/yarn.lock index b541fcfd506..a1571890823 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5176,7 +5176,7 @@ __metadata: postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" sass-embedded: "npm:^1.100.0" - tsx: "npm:^4.21.0" + tsx: "npm:^4.22.4" typescript: "npm:^5.9.3" zip-lib: "npm:^1.3.4" languageName: unknown @@ -7310,7 +7310,7 @@ __metadata: postcss-cli: "npm:^11.0.1" postcss-import: "npm:^16.1.1" sass-embedded: "npm:^1.100.0" - tsx: "npm:^4.21.0" + tsx: "npm:^4.22.4" typescript: "npm:^5.9.3" languageName: unknown linkType: soft @@ -8055,7 +8055,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0, esbuild@npm:~0.27.0": +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": version: 0.27.4 resolution: "esbuild@npm:0.27.4" dependencies: @@ -8144,7 +8144,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.28.0": +"esbuild@npm:^0.28.0, esbuild@npm:~0.28.0": version: 0.28.0 resolution: "esbuild@npm:0.28.0" dependencies: @@ -9163,15 +9163,6 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": - version: 4.10.1 - resolution: "get-tsconfig@npm:4.10.1" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/04d63f47fdecaefbd1f73ec02949be4ec4db7d6d9fbc8d4e81f9a4bb1c6f876e48943712f2f9236643d3e4d61d9a7b06da08564d08b034631ebe3f5605bef237 - languageName: node - linkType: hard - "git-raw-commits@npm:^3.0.0": version: 3.0.0 resolution: "git-raw-commits@npm:3.0.0" @@ -15329,13 +15320,6 @@ __metadata: languageName: node linkType: hard -"resolve-pkg-maps@npm:^1.0.0": - version: 1.0.0 - resolution: "resolve-pkg-maps@npm:1.0.0" - checksum: 10/0763150adf303040c304009231314d1e84c6e5ebfa2d82b7d94e96a6e82bacd1dcc0b58ae257315f3c8adb89a91d8d0f12928241cba2df1680fbe6f60bf99b0e - languageName: node - linkType: hard - "resolve.exports@npm:2.0.3": version: 2.0.3 resolution: "resolve.exports@npm:2.0.3" @@ -17870,19 +17854,18 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.21.0": - version: 4.21.0 - resolution: "tsx@npm:4.21.0" +"tsx@npm:^4.22.4": + version: 4.22.4 + resolution: "tsx@npm:4.22.4" dependencies: - esbuild: "npm:~0.27.0" + esbuild: "npm:~0.28.0" fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" dependenciesMeta: fsevents: optional: true bin: tsx: dist/cli.mjs - checksum: 10/7afedeff855ba98c47dc28b33d7e8e253c4dc1f791938db402d79c174bdf806b897c1a5f91e5b1259c112520c816f826b4c5d98f0bad7e95b02dec66fedb64d2 + checksum: 10/9d6e7e9d1158eb84327d822720a2053bcfd972f8988e4789041bac5a767fc394ef302b1ff7e1d3dfbee391a0b03bd3dbb02cd302387729baf1dc7b9dce93b3ba languageName: node linkType: hard From 2d7927358e266a2f907a97a801cf1adfcac91dd1 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:44:57 -0500 Subject: [PATCH 064/109] Bump @dnncommunity/dnn-elements from 0.29.2 to 0.29.3 --- .../ResourceManager.Web/package.json | 2 +- .../ClientSide/Styles.Web/package.json | 2 +- yarn.lock | 37 +++++++++---------- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 670f2881498..4b65f8229be 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -28,7 +28,7 @@ }, "license": "MIT", "devDependencies": { - "@dnncommunity/dnn-elements": "^0.29.2", + "@dnncommunity/dnn-elements": "^0.29.3", "@eslint/js": "^10.0.1", "@stencil/core": "^4.43.5", "@stencil/eslint-plugin": "^1.3.1", diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index b4a68dc5b90..11f432b0db7 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -30,7 +30,7 @@ "@stencil/core": "^4.43.5" }, "devDependencies": { - "@dnncommunity/dnn-elements": "^0.29.2", + "@dnncommunity/dnn-elements": "^0.29.3", "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@types/node": "^25.9.2", diff --git a/yarn.lock b/yarn.lock index a1571890823..937054a9d50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,14 +507,20 @@ __metadata: languageName: node linkType: hard -"@dnncommunity/dnn-elements@npm:^0.29.2": - version: 0.29.2 - resolution: "@dnncommunity/dnn-elements@npm:0.29.2" +"@dnncommunity/dnn-elements@npm:^0.29.3": + version: 0.29.3 + resolution: "@dnncommunity/dnn-elements@npm:0.29.3" dependencies: - jodit: "npm:^4.6.2" + jodit: "npm:^4.11.15" peerDependencies: "@typescript-eslint/utils": ^8.30.1 - checksum: 10/c26bcc2ed915aaf6d884bba3edbd7725e13beba1a11cba128016f1dc8cd45cd057a3a4586cf66955e05664a42a1bc3223353872b904084b6ab4a28570da38391 + eslint: ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + "@typescript-eslint/utils": + optional: true + eslint: + optional: true + checksum: 10/d35658f1d1ce437b3b1e99f81c839556b58aea554d555457d5b5ca0ff7059b1689fb78f7464b210a1a135c4f60265027d730da14e52bed9f2fefcd0f5df550fc languageName: node linkType: hard @@ -5434,13 +5440,6 @@ __metadata: languageName: node linkType: hard -"autobind-decorator@npm:^2.4.0": - version: 2.4.0 - resolution: "autobind-decorator@npm:2.4.0" - checksum: 10/9e24cb18f2ca5ff0753cbf29f5616a344779bd212a79995bf9e5ab0e008c9c83772b380e88d68525e6ec08ceedb807c16d60b57f249d4e77fd4888e94a3aee21 - languageName: node - linkType: hard - "autoprefixer@npm:^10.5.0": version: 10.5.0 resolution: "autoprefixer@npm:10.5.0" @@ -7205,7 +7204,7 @@ __metadata: version: 0.0.0-use.local resolution: "dnn-resource-manager@workspace:DNN Platform/Modules/ResourceManager/ResourceManager.Web" dependencies: - "@dnncommunity/dnn-elements": "npm:^0.29.2" + "@dnncommunity/dnn-elements": "npm:^0.29.3" "@eslint/js": "npm:^10.0.1" "@stencil/core": "npm:^4.43.5" "@stencil/eslint-plugin": "npm:^1.3.1" @@ -10990,12 +10989,10 @@ __metadata: languageName: node linkType: hard -"jodit@npm:^4.6.2": - version: 4.6.2 - resolution: "jodit@npm:4.6.2" - dependencies: - autobind-decorator: "npm:^2.4.0" - checksum: 10/a0d0d537339fe0756173d62ff9a07bcba88bc8be2baeb538e93dba849802a8401f431d43c1e8e413434af413a8f3d790b465876988a6f58e034558a388378850 +"jodit@npm:^4.11.15": + version: 4.12.13 + resolution: "jodit@npm:4.12.13" + checksum: 10/6e412bc8d68109103e6d02599c2a2eb0180940966dca616130a0e0063ae6c0139e07c3c835a99ea4cf1455652f39d046d2cca06033581eb3f9e52192dcb739ad languageName: node linkType: hard @@ -17282,7 +17279,7 @@ __metadata: version: 0.0.0-use.local resolution: "styles@workspace:Dnn.AdminExperience/ClientSide/Styles.Web" dependencies: - "@dnncommunity/dnn-elements": "npm:^0.29.2" + "@dnncommunity/dnn-elements": "npm:^0.29.3" "@stencil/core": "npm:^4.43.5" "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" From 7e6f8f75db8a7d801471d978dbd74ed188f3e40d Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 11:46:26 -0500 Subject: [PATCH 065/109] yarn dedupe --- yarn.lock | 645 +++--------------------------------------------------- 1 file changed, 26 insertions(+), 619 deletions(-) diff --git a/yarn.lock b/yarn.lock index 937054a9d50..5501d6f7500 100644 --- a/yarn.lock +++ b/yarn.lock @@ -584,7 +584,7 @@ __metadata: languageName: unknown linkType: soft -"@emnapi/core@npm:1.10.0": +"@emnapi/core@npm:1.10.0, @emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0": version: 1.10.0 resolution: "@emnapi/core@npm:1.10.0" dependencies: @@ -604,17 +604,7 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.5.0": - version: 1.9.0 - resolution: "@emnapi/core@npm:1.9.0" - dependencies: - "@emnapi/wasi-threads": "npm:1.2.0" - tslib: "npm:^2.4.0" - checksum: 10/52d8dc5ba0d6814c5061686b8286d84cc5349c8fc09de3a9c4175bc2369c2890b335f7b03e55bc19ce3033158962cd817522fcb3bdeb1feb9ba7a060d61b69ab - languageName: node - linkType: hard - -"@emnapi/runtime@npm:1.10.0": +"@emnapi/runtime@npm:1.10.0, @emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0": version: 1.10.0 resolution: "@emnapi/runtime@npm:1.10.0" dependencies: @@ -632,24 +622,6 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.5.0": - version: 1.9.0 - resolution: "@emnapi/runtime@npm:1.9.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/d04a7e67676c2560d5394a01d63532af943760cf19cc8f375390a345aeab2b19e9ee35485b06b5c211df18f947fb14ac50658fca5c4067946f1e50af3490b3b5 - languageName: node - linkType: hard - -"@emnapi/wasi-threads@npm:1.2.0": - version: 1.2.0 - resolution: "@emnapi/wasi-threads@npm:1.2.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10/c8e48c7200530744dc58170d2e25933b61433e4a0c50b4f192f5d8d4b065c7023dbfc48dac0afadbc29bd239013f2ae454c6e54e0ca6e8248402bf95c9e77e22 - languageName: node - linkType: hard - "@emnapi/wasi-threads@npm:1.2.1": version: 1.2.1 resolution: "@emnapi/wasi-threads@npm:1.2.1" @@ -1531,13 +1503,6 @@ __metadata: languageName: node linkType: hard -"@jest/diff-sequences@npm:30.3.0": - version: 30.3.0 - resolution: "@jest/diff-sequences@npm:30.3.0" - checksum: 10/0d5b6e1599c5e0bb702f0804e7f93bbe4911b5929c40fd6a77c06105711eae24d709c8964e8d623cc70c34b7dc7262d76a115a6eb05f1576336cdb6c46593e7c - languageName: node - linkType: hard - "@jest/diff-sequences@npm:30.4.0": version: 30.4.0 resolution: "@jest/diff-sequences@npm:30.4.0" @@ -1655,15 +1620,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:30.0.5": - version: 30.0.5 - resolution: "@jest/schemas@npm:30.0.5" - dependencies: - "@sinclair/typebox": "npm:^0.34.0" - checksum: 10/40df4db55d4aeed09d1c7e19caf23788309cea34490a1c5d584c913494195e698b9967e996afc27226cac6d76e7512fe73ae6b9584480695c60dd18a5459cdba - languageName: node - linkType: hard - "@jest/schemas@npm:30.4.1": version: 30.4.1 resolution: "@jest/schemas@npm:30.4.1" @@ -3508,14 +3464,14 @@ __metadata: languageName: node linkType: hard -"@rspack/lite-tapable@npm:1.1.0, @rspack/lite-tapable@npm:~1.1.0": +"@rspack/lite-tapable@npm:1.1.0": version: 1.1.0 resolution: "@rspack/lite-tapable@npm:1.1.0" checksum: 10/41ff73fe5e1b8dccaad746c9c1bd36dd67649e1ad35776f311b5ba94333a397704e11158579e25a6a7e677c51abe35e66987b1b000faef48d4e4ad2470fea150 languageName: node linkType: hard -"@rspack/lite-tapable@npm:^1.1.1": +"@rspack/lite-tapable@npm:^1.1.1, @rspack/lite-tapable@npm:~1.1.0": version: 1.1.2 resolution: "@rspack/lite-tapable@npm:1.1.2" checksum: 10/3c2893308641c6e5aed919b061e704920162a0cb4f2e635b410d3e45a50c20b57d600b6445143c518a1d3d66b8d53b5d194601db5da356460c8d05eade30a70a @@ -4294,16 +4250,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0": - version: 24.9.0 - resolution: "@types/node@npm:24.9.0" - dependencies: - undici-types: "npm:~7.16.0" - checksum: 10/485bb1c2bb713e34935b47d41ecbdb02af8454ad72b013275992d09be885729a65c78733f054534ef9104df24c4cca2eb3a6c3082eae3c6c7ae078a643cacf9d - languageName: node - linkType: hard - -"@types/node@npm:^25.9.2": +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:^25.9.2": version: 25.9.2 resolution: "@types/node@npm:25.9.2" dependencies: @@ -4360,16 +4307,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:>=16.9.11": - version: 19.2.2 - resolution: "@types/react@npm:19.2.2" - dependencies: - csstype: "npm:^3.0.2" - checksum: 10/d6adf8fd4bb23a7e04da5700d96b15dc0f59653727a9c6e940c151d7232fa1dbbab98417d5ac830dcfb6cba3f206efbd4cd83647e6f9a688d7363a90e607f6bf - languageName: node - linkType: hard - -"@types/react@npm:^19.2.17": +"@types/react@npm:*, @types/react@npm:>=16.9.11, @types/react@npm:^19.2.17": version: 19.2.17 resolution: "@types/react@npm:19.2.17" dependencies: @@ -4495,19 +4433,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/project-service@npm:8.57.2" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.57.2" - "@typescript-eslint/types": "npm:^8.57.2" - debug: "npm:^4.4.3" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10/e7f47d5394c6ca3c92fa373bd3a149ad13549944d0d7a12f0ddef6dc921b017cf283876bb272b1f6c4f90e6c84bac7b140ac08acee3a3f26dfd8b43556e0949e - languageName: node - linkType: hard - "@typescript-eslint/project-service@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/project-service@npm:8.60.1" @@ -4521,16 +4446,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/scope-manager@npm:8.57.2" - dependencies: - "@typescript-eslint/types": "npm:8.57.2" - "@typescript-eslint/visitor-keys": "npm:8.57.2" - checksum: 10/2c1498e25481ee6b1de5c6cbf8fbbdfa9e5e940a91ddd12687dd17d68de5df81c286861f0378282fbe49172dd44094bfeb5b63f80faf37e54dce8fd2ddc7f733 - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/scope-manager@npm:8.60.1" @@ -4541,15 +4456,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.57.2, @typescript-eslint/tsconfig-utils@npm:^8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.57.2" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10/2a6e27d541fd0071e5ca14116ba210eab77a8f74cedda32dfce4acce951632971b066261e4b151d34dd0cfad357cb4fd2f7d0b38c9e82a155c226e5c12bd41b3 - languageName: node - linkType: hard - "@typescript-eslint/tsconfig-utils@npm:8.60.1, @typescript-eslint/tsconfig-utils@npm:^8.60.1": version: 8.60.1 resolution: "@typescript-eslint/tsconfig-utils@npm:8.60.1" @@ -4575,13 +4481,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.57.2, @typescript-eslint/types@npm:^8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/types@npm:8.57.2" - checksum: 10/6d30ff13c8ebe01ba8bcce5f1a5ba52f2c6546056e056f50e010394461d2fffda46dad2a4ebdff59c179873abd274242d8f6a8246c60d7ce244d02ad87bb07f8 - languageName: node - linkType: hard - "@typescript-eslint/types@npm:8.60.1, @typescript-eslint/types@npm:^8.60.1": version: 8.60.1 resolution: "@typescript-eslint/types@npm:8.60.1" @@ -4589,25 +4488,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/typescript-estree@npm:8.57.2" - dependencies: - "@typescript-eslint/project-service": "npm:8.57.2" - "@typescript-eslint/tsconfig-utils": "npm:8.57.2" - "@typescript-eslint/types": "npm:8.57.2" - "@typescript-eslint/visitor-keys": "npm:8.57.2" - debug: "npm:^4.4.3" - minimatch: "npm:^10.2.2" - semver: "npm:^7.7.3" - tinyglobby: "npm:^0.2.15" - ts-api-utils: "npm:^2.4.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10/85d3f2799ee3915b4a06014d90db4aab28c0c0377b40aced5b49acb5f038862e5447f6c355d85368a8f587820f7840e945fa8a9d5347234f1fb070a97c2a9c1d - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/typescript-estree@npm:8.60.1" @@ -4627,7 +4507,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.60.1, @typescript-eslint/utils@npm:^8.60.1": +"@typescript-eslint/utils@npm:8.60.1, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0, @typescript-eslint/utils@npm:^8.60.1": version: 8.60.1 resolution: "@typescript-eslint/utils@npm:8.60.1" dependencies: @@ -4642,31 +4522,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0": - version: 8.57.2 - resolution: "@typescript-eslint/utils@npm:8.57.2" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.57.2" - "@typescript-eslint/types": "npm:8.57.2" - "@typescript-eslint/typescript-estree": "npm:8.57.2" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10/48851aa53b403e67dce7504859f3e5a9e008d43fa8c98dc2b0fc900980c1f77dda60648f957fd69a78cea44e0a94d1d7e807fcbc30ffca3fb688d04be2acd898 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.57.2": - version: 8.57.2 - resolution: "@typescript-eslint/visitor-keys@npm:8.57.2" - dependencies: - "@typescript-eslint/types": "npm:8.57.2" - eslint-visitor-keys: "npm:^5.0.0" - checksum: 10/8059dcb05694b31b3372f022e25493c4a3fd1a9952720bcb3eac1911828f0b81b3f8aeb11a30dc646880e16396317512747a9b2afee059c0472ea5c4d4546d29 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/visitor-keys@npm:8.60.1" @@ -4978,16 +4833,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.15.0": - version: 8.15.0 - resolution: "acorn@npm:8.15.0" - bin: - acorn: bin/acorn - checksum: 10/77f2de5051a631cf1729c090e5759148459cdb76b5f5c70f890503d629cf5052357b0ce783c0f976dd8a93c5150f59f6d18df1def3f502396a20f81282482fa4 - languageName: node - linkType: hard - -"acorn@npm:^8.16.0": +"acorn@npm:^8.15.0, acorn@npm:^8.16.0": version: 8.16.0 resolution: "acorn@npm:8.16.0" bin: @@ -5597,15 +5443,6 @@ __metadata: languageName: node linkType: hard -"baseline-browser-mapping@npm:^2.9.0": - version: 2.10.33 - resolution: "baseline-browser-mapping@npm:2.10.33" - bin: - baseline-browser-mapping: dist/cli.cjs - checksum: 10/e5ea31ff7988d631af72cc579825d109f1b8ab70af2490b875daaef5eba9257c60e108a768f7bd949394ca6a9e33469ea48e7367aea680671f8073733514f101 - languageName: node - linkType: hard - "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -5782,22 +5619,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": - version: 4.28.1 - resolution: "browserslist@npm:4.28.1" - dependencies: - baseline-browser-mapping: "npm:^2.9.0" - caniuse-lite: "npm:^1.0.30001759" - electron-to-chromium: "npm:^1.5.263" - node-releases: "npm:^2.0.27" - update-browserslist-db: "npm:^1.2.0" - bin: - browserslist: cli.js - checksum: 10/64f2a97de4bce8473c0e5ae0af8d76d1ead07a5b05fc6bc87b848678bb9c3a91ae787b27aa98cdd33fc00779607e6c156000bed58fefb9cf8e4c5a183b994cdb - languageName: node - linkType: hard - -"browserslist@npm:^4.28.2": +"browserslist@npm:^4.0.0, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1, browserslist@npm:^4.28.2": version: 4.28.2 resolution: "browserslist@npm:4.28.2" dependencies: @@ -6000,14 +5822,7 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001759": - version: 1.0.30001793 - resolution: "caniuse-lite@npm:1.0.30001793" - checksum: 10/5a1ac39f2f174e86d8320f394a5dfbeab98041722b13d02a21fe47afc2723bc754ea3716a1f276f8462bcbbc3016e82e6f155ebde0881e537af463b5eac1816b - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001782, caniuse-lite@npm:^1.0.30001787": +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001782, caniuse-lite@npm:^1.0.30001787": version: 1.0.30001797 resolution: "caniuse-lite@npm:1.0.30001797" checksum: 10/30d34d8ede7a99cedec5489cb7a4fc75b0d641afcc436d2b0986aaf9beb056d3f15391e6a08b06b0bd8a84c64793ac8197005b14a96412514706a5715be98796 @@ -6127,15 +5942,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^4.0.0": - version: 4.0.3 - resolution: "chokidar@npm:4.0.3" - dependencies: - readdirp: "npm:^4.0.1" - checksum: 10/bf2a575ea5596000e88f5db95461a9d59ad2047e939d5a4aac59dd472d126be8f1c1ff3c7654b477cf532d18f42a97279ef80ee847972fd2a25410bf00b80b59 - languageName: node - linkType: hard - "chokidar@npm:^5.0.0": version: 5.0.0 resolution: "chokidar@npm:5.0.0" @@ -7566,13 +7372,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.263": - version: 1.5.286 - resolution: "electron-to-chromium@npm:1.5.286" - checksum: 10/530ae36571f3f737431dc1f97ab176d9ec38d78e7a14a78fff78540769ef139e9011200a886864111ee26d64e647136531ff004f368f5df8cdd755c45ad97649 - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.328": version: 1.5.368 resolution: "electron-to-chromium@npm:1.5.368" @@ -8982,18 +8781,7 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.0.0, fs-extra@npm:^11.2.0": - version: 11.3.4 - resolution: "fs-extra@npm:11.3.4" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/1b8deea9c540a2efe63c750bc9e1ba6238115579d1571d67fe8fb58e3fb6df19aba29fd4ebb81217cf0bf5bce0df30ca68dbc3e06f6652b856edd385ce0ff649 - languageName: node - linkType: hard - -"fs-extra@npm:^11.3.5": +"fs-extra@npm:^11.0.0, fs-extra@npm:^11.2.0, fs-extra@npm:^11.3.5": version: 11.3.5 resolution: "fs-extra@npm:11.3.5" dependencies: @@ -9446,16 +9234,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a - languageName: node - linkType: hard - -"hasown@npm:^2.0.3": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2, hasown@npm:^2.0.3": version: 2.0.4 resolution: "hasown@npm:2.0.4" dependencies: @@ -10041,16 +9820,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1, is-core-module@npm:^2.5.0": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.2": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1, is-core-module@npm:^2.16.2, is-core-module@npm:^2.5.0": version: 2.16.2 resolution: "is-core-module@npm:2.16.2" dependencies: @@ -10627,7 +10397,7 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:30.4.1": +"jest-diff@npm:30.4.1, jest-diff@npm:>=30.0.0 < 31, jest-diff@npm:^30.0.2": version: 30.4.1 resolution: "jest-diff@npm:30.4.1" dependencies: @@ -10639,18 +10409,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:>=30.0.0 < 31, jest-diff@npm:^30.0.2": - version: 30.3.0 - resolution: "jest-diff@npm:30.3.0" - dependencies: - "@jest/diff-sequences": "npm:30.3.0" - "@jest/get-type": "npm:30.1.0" - chalk: "npm:^4.1.2" - pretty-format: "npm:30.3.0" - checksum: 10/9f566259085e6badd525dc48ee6de3792cfae080abd66e170ac230359cf32c4334d92f0f48b577a31ad2a6aed4aefde81f5f4366ab44a96f78bcde975e5cc26e - languageName: node - linkType: hard - "jest-docblock@npm:30.4.0": version: 30.4.0 resolution: "jest-docblock@npm:30.4.0" @@ -10971,16 +10729,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.6.1": - version: 2.6.1 - resolution: "jiti@npm:2.6.1" - bin: - jiti: lib/jiti-cli.mjs - checksum: 10/8cd72c5fd03a0502564c3f46c49761090f6dadead21fa191b73535724f095ad86c2fa89ee6fe4bc3515337e8d406cc8fb2d37b73fa0c99a34584bac35cd4a4de - languageName: node - linkType: hard - -"jiti@npm:^2.7.0": +"jiti@npm:^2.6.1, jiti@npm:^2.7.0": version: 2.7.0 resolution: "jiti@npm:2.7.0" bin: @@ -12082,7 +11831,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:10.2.4, minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^10.2.2": +"minimatch@npm:10.2.4": version: 10.2.4 resolution: "minimatch@npm:10.2.4" dependencies: @@ -12100,7 +11849,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.2.4": +"minimatch@npm:^10.0.3, minimatch@npm:^10.1.1, minimatch@npm:^10.2.2, minimatch@npm:^10.2.4": version: 10.2.5 resolution: "minimatch@npm:10.2.5" dependencies: @@ -12286,15 +12035,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10/73b5afe5975a307aaa3c95dfe3334c52cdf9ae71518176895229b8d65ab0d1c0417dd081426134eb7571c055720428ea5d57c645138161e7d10df80815527c48 - languageName: node - linkType: hard - "nanoid@npm:^3.3.12": version: 3.3.12 resolution: "nanoid@npm:3.3.12" @@ -12476,13 +12216,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.27": - version: 2.0.27 - resolution: "node-releases@npm:2.0.27" - checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 - languageName: node - linkType: hard - "node-releases@npm:^2.0.36": version: 2.0.47 resolution: "node-releases@npm:2.0.47" @@ -14086,18 +13819,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.0.0, postcss@npm:^8.2.2": - version: 8.5.10 - resolution: "postcss@npm:8.5.10" - dependencies: - nanoid: "npm:^3.3.11" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10/7eac6169e535b63c8412e94d4f6047fc23efa3e9dde804b541940043c831b25f1cd867d83cd2c4371ad2450c8abcb42c208aa25668c1f0f3650d7f72faf711a8 - languageName: node - linkType: hard - -"postcss@npm:^8.5.15": +"postcss@npm:^8.0.0, postcss@npm:^8.2.2, postcss@npm:^8.5.15": version: 8.5.15 resolution: "postcss@npm:8.5.15" dependencies: @@ -14122,17 +13844,6 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:30.3.0": - version: 30.3.0 - resolution: "pretty-format@npm:30.3.0" - dependencies: - "@jest/schemas": "npm:30.0.5" - ansi-styles: "npm:^5.2.0" - react-is: "npm:^18.3.1" - checksum: 10/b288db630841f2464554c5cfa7d7faf519ad7b5c05c3818e764c7cb486bcf59f240ea5576c748f8ca6625623c5856a8906642255bbe89d6cfa1a9090b0fbc6b9 - languageName: node - linkType: hard - "pretty-format@npm:30.4.1": version: 30.4.1 resolution: "pretty-format@npm:30.4.1" @@ -14645,7 +14356,7 @@ __metadata: languageName: node linkType: hard -"react-is-18@npm:react-is@^18.3.1, react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0, react-is@npm:^18.3.1": +"react-is-18@npm:react-is@^18.3.1, react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 @@ -15039,13 +14750,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:^4.0.1": - version: 4.1.2 - resolution: "readdirp@npm:4.1.2" - checksum: 10/7b817c265940dba90bb9c94d82920d76c3a35ea2d67f9f9d8bd936adcfe02d50c802b14be3dd2e725e002dddbe2cc1c7a0edfb1bc3a365c9dfd5a61e612eea1e - languageName: node - linkType: hard - "readdirp@npm:^5.0.0": version: 5.0.0 resolution: "readdirp@npm:5.0.0" @@ -15324,20 +15028,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4": - version: 1.22.11 - resolution: "resolve@npm:1.22.11" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/e1b2e738884a08de03f97ee71494335eba8c2b0feb1de9ae065e82c48997f349f77a2b10e8817e147cf610bfabc4b1cb7891ee8eaf5bf80d4ad514a34c4fab0a - languageName: node - linkType: hard - -"resolve@npm:^1.22.12": +"resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.22.1, resolve@npm:^1.22.12, resolve@npm:^1.22.4": version: 1.22.12 resolution: "resolve@npm:1.22.12" dependencies: @@ -15351,20 +15042,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.5": - version: 2.0.0-next.5 - resolution: "resolve@npm:2.0.0-next.5" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/2d6fd28699f901744368e6f2032b4268b4c7b9185fd8beb64f68c93ac6b22e52ae13560ceefc96241a665b985edf9ffd393ae26d2946a7d3a07b7007b7d51e79 - languageName: node - linkType: hard - -"resolve@npm:^2.0.0-next.7": +"resolve@npm:^2.0.0-next.5, resolve@npm:^2.0.0-next.7": version: 2.0.0-next.7 resolution: "resolve@npm:2.0.0-next.7" dependencies: @@ -15380,20 +15058,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": - version: 1.22.11 - resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.1" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/fd342cad25e52cd6f4f3d1716e189717f2522bfd6641109fe7aa372f32b5714a296ed7c238ddbe7ebb0c1ddfe0b7f71c9984171024c97cf1b2073e3e40ff71a8 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.22.12#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.12#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.12 resolution: "resolve@patch:resolve@npm%3A1.22.12#optional!builtin::version=1.22.12&hash=c3c19d" dependencies: @@ -15407,20 +15072,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin": - version: 2.0.0-next.5 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#optional!builtin::version=2.0.0-next.5&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/05fa778de9d0347c8b889eb7a18f1f06bf0f801b0eb4610b4871a4b2f22e220900cf0ad525e94f990bb8d8921c07754ab2122c0c225ab4cdcea98f36e64fa4c2 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^2.0.0-next.7#optional!builtin": +"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin, resolve@patch:resolve@npm%3A^2.0.0-next.7#optional!builtin": version: 2.0.0-next.7 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.7#optional!builtin::version=2.0.0-next.7&hash=c3c19d" dependencies: @@ -15692,15 +15344,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-all-unknown@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-all-unknown@npm:1.98.0" - dependencies: - sass: "npm:1.98.0" - conditions: (!cpu=arm | !cpu=arm64 | !cpu=riscv64 | !cpu=x64) - languageName: node - linkType: hard - "sass-embedded-android-arm64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-android-arm64@npm:1.100.0" @@ -15708,13 +15351,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-android-arm64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-android-arm64@npm:1.98.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "sass-embedded-android-arm@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-android-arm@npm:1.100.0" @@ -15722,13 +15358,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-android-arm@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-android-arm@npm:1.98.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "sass-embedded-android-riscv64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-android-riscv64@npm:1.100.0" @@ -15736,13 +15365,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-android-riscv64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-android-riscv64@npm:1.98.0" - conditions: os=android & cpu=riscv64 - languageName: node - linkType: hard - "sass-embedded-android-x64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-android-x64@npm:1.100.0" @@ -15750,13 +15372,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-android-x64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-android-x64@npm:1.98.0" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "sass-embedded-darwin-arm64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-darwin-arm64@npm:1.100.0" @@ -15764,13 +15379,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-darwin-arm64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-darwin-arm64@npm:1.98.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "sass-embedded-darwin-x64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-darwin-x64@npm:1.100.0" @@ -15778,13 +15386,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-darwin-x64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-darwin-x64@npm:1.98.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "sass-embedded-linux-arm64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-arm64@npm:1.100.0" @@ -15792,13 +15393,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-arm64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-arm64@npm:1.98.0" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "sass-embedded-linux-arm@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-arm@npm:1.100.0" @@ -15806,13 +15400,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-arm@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-arm@npm:1.98.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "sass-embedded-linux-musl-arm64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-musl-arm64@npm:1.100.0" @@ -15820,13 +15407,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-musl-arm64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-musl-arm64@npm:1.98.0" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "sass-embedded-linux-musl-arm@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-musl-arm@npm:1.100.0" @@ -15834,13 +15414,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-musl-arm@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-musl-arm@npm:1.98.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "sass-embedded-linux-musl-riscv64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-musl-riscv64@npm:1.100.0" @@ -15848,13 +15421,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-musl-riscv64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-musl-riscv64@npm:1.98.0" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "sass-embedded-linux-musl-x64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-musl-x64@npm:1.100.0" @@ -15862,13 +15428,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-musl-x64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-musl-x64@npm:1.98.0" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "sass-embedded-linux-riscv64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-riscv64@npm:1.100.0" @@ -15876,13 +15435,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-riscv64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-riscv64@npm:1.98.0" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "sass-embedded-linux-x64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-linux-x64@npm:1.100.0" @@ -15890,13 +15442,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-linux-x64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-linux-x64@npm:1.98.0" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "sass-embedded-unknown-all@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-unknown-all@npm:1.100.0" @@ -15906,15 +15451,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-unknown-all@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-unknown-all@npm:1.98.0" - dependencies: - sass: "npm:1.98.0" - conditions: (!os=android | !os=darwin | !os=linux | !os=win32) - languageName: node - linkType: hard - "sass-embedded-win32-arm64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-win32-arm64@npm:1.100.0" @@ -15922,13 +15458,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded-win32-arm64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-win32-arm64@npm:1.98.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "sass-embedded-win32-x64@npm:1.100.0": version: 1.100.0 resolution: "sass-embedded-win32-x64@npm:1.100.0" @@ -15936,14 +15465,7 @@ __metadata: languageName: node linkType: hard -"sass-embedded-win32-x64@npm:1.98.0": - version: 1.98.0 - resolution: "sass-embedded-win32-x64@npm:1.98.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"sass-embedded@npm:^1.100.0": +"sass-embedded@npm:^1.100.0, sass-embedded@npm:^1.89.2": version: 1.100.0 resolution: "sass-embedded@npm:1.100.0" dependencies: @@ -16015,78 +15537,6 @@ __metadata: languageName: node linkType: hard -"sass-embedded@npm:^1.89.2": - version: 1.98.0 - resolution: "sass-embedded@npm:1.98.0" - dependencies: - "@bufbuild/protobuf": "npm:^2.5.0" - colorjs.io: "npm:^0.5.0" - immutable: "npm:^5.1.5" - rxjs: "npm:^7.4.0" - sass-embedded-all-unknown: "npm:1.98.0" - sass-embedded-android-arm: "npm:1.98.0" - sass-embedded-android-arm64: "npm:1.98.0" - sass-embedded-android-riscv64: "npm:1.98.0" - sass-embedded-android-x64: "npm:1.98.0" - sass-embedded-darwin-arm64: "npm:1.98.0" - sass-embedded-darwin-x64: "npm:1.98.0" - sass-embedded-linux-arm: "npm:1.98.0" - sass-embedded-linux-arm64: "npm:1.98.0" - sass-embedded-linux-musl-arm: "npm:1.98.0" - sass-embedded-linux-musl-arm64: "npm:1.98.0" - sass-embedded-linux-musl-riscv64: "npm:1.98.0" - sass-embedded-linux-musl-x64: "npm:1.98.0" - sass-embedded-linux-riscv64: "npm:1.98.0" - sass-embedded-linux-x64: "npm:1.98.0" - sass-embedded-unknown-all: "npm:1.98.0" - sass-embedded-win32-arm64: "npm:1.98.0" - sass-embedded-win32-x64: "npm:1.98.0" - supports-color: "npm:^8.1.1" - sync-child-process: "npm:^1.0.2" - varint: "npm:^6.0.0" - dependenciesMeta: - sass-embedded-all-unknown: - optional: true - sass-embedded-android-arm: - optional: true - sass-embedded-android-arm64: - optional: true - sass-embedded-android-riscv64: - optional: true - sass-embedded-android-x64: - optional: true - sass-embedded-darwin-arm64: - optional: true - sass-embedded-darwin-x64: - optional: true - sass-embedded-linux-arm: - optional: true - sass-embedded-linux-arm64: - optional: true - sass-embedded-linux-musl-arm: - optional: true - sass-embedded-linux-musl-arm64: - optional: true - sass-embedded-linux-musl-riscv64: - optional: true - sass-embedded-linux-musl-x64: - optional: true - sass-embedded-linux-riscv64: - optional: true - sass-embedded-linux-x64: - optional: true - sass-embedded-unknown-all: - optional: true - sass-embedded-win32-arm64: - optional: true - sass-embedded-win32-x64: - optional: true - bin: - sass: dist/bin/sass.js - checksum: 10/ec11de835554a7dbac684151dbf792a75b376d1e2ab7da36e6b9888fba126f9607989fc4407328c095cf170532e409561f5a636747b9140f096d2632aee30a2c - languageName: node - linkType: hard - "sass@npm:1.100.0": version: 1.100.0 resolution: "sass@npm:1.100.0" @@ -16104,23 +15554,6 @@ __metadata: languageName: node linkType: hard -"sass@npm:1.98.0": - version: 1.98.0 - resolution: "sass@npm:1.98.0" - dependencies: - "@parcel/watcher": "npm:^2.4.1" - chokidar: "npm:^4.0.0" - immutable: "npm:^5.1.5" - source-map-js: "npm:>=0.6.2 <2.0.0" - dependenciesMeta: - "@parcel/watcher": - optional: true - bin: - sass: sass.js - checksum: 10/37d134d07639dc8fc8557495c3b98801bb736f0d1fc5fbfb2e0dba3c21200f447cf3e6166cd285603c922171366696c1d2e766af2c4cf82d882a3dc4d4e39f00 - languageName: node - linkType: hard - "sax@npm:^1.2.4, sax@npm:^1.5.0": version: 1.5.0 resolution: "sax@npm:1.5.0" @@ -17596,17 +17029,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" - dependencies: - fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10/d72bd826a8b0fa5fa3929e7fe5ba48fceb2ae495df3a231b6c5408cd7d8c00b58ab5a9c2a76ba56a62ee9b5e083626f1f33599734bed1ffc4b792406408f0ca2 - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.17": +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.17": version: 0.2.17 resolution: "tinyglobby@npm:0.2.17" dependencies: @@ -17760,15 +17183,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.4.0": - version: 2.4.0 - resolution: "ts-api-utils@npm:2.4.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10/d6b2b3b6caad8d2f4ddc0c3785d22bb1a6041773335a1c71d73a5d67d11d993763fe8e4faefc4a4d03bb42b26c6126bbcf2e34826baed1def5369d0ebad358fa - languageName: node - linkType: hard - "ts-api-utils@npm:^2.5.0": version: 2.5.0 resolution: "ts-api-utils@npm:2.5.0" @@ -18091,13 +17505,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~7.16.0": - version: 7.16.0 - resolution: "undici-types@npm:7.16.0" - checksum: 10/db43439f69c2d94cc29f75cbfe9de86df87061d6b0c577ebe9bb3255f49b22c50162a7d7eb413b0458b6510b8ca299ac7cff38c3a29fbd31af9f504bcf7fbc0d - languageName: node - linkType: hard - "undici@npm:^7.10.0": version: 7.24.0 resolution: "undici@npm:7.24.0" @@ -18244,7 +17651,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.2.0, update-browserslist-db@npm:^1.2.3": +"update-browserslist-db@npm:^1.2.3": version: 1.2.3 resolution: "update-browserslist-db@npm:1.2.3" dependencies: From 56a4b99e715b40823293b4744c561400417c4e71 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 12:09:12 -0500 Subject: [PATCH 066/109] Bump yarn in sample project --- .../Modules/Samples/Dnn.ContactList.SpaReact/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json index 8e8135192d2..f39363cd733 100644 --- a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json +++ b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json @@ -2,7 +2,7 @@ "name": "dnn.contactlist.spareact", "version": "1.0.0", "type": "module", - "packageManager": "yarn@4.12.0", + "packageManager": "yarn@4.16.0+sha512.5374c94eb4ef6aa8188fb112f20c1aa6569f248d676c5e576e1fd2a1a4d8d87a96df65d9dfe1c2a0252cbe38bda46cf18d955005b81b43cc7607a5c9d56fd2b6", "scripts": { "dev": "vite", "build": "tsc && vite build --mode production", From c2dc5b99eee995520b5595b76373489e3c4d5a97 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 13:04:03 -0500 Subject: [PATCH 067/109] Bump react-tooltip from 4.5.1 to 5.30.1 --- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../src/TextOverflowWrapperNew/index.jsx | 123 +++++++++--------- yarn.lock | 57 +++++--- 4 files changed, 98 insertions(+), 86 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 552badad26b..fde196636c5 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -30,7 +30,7 @@ "react-motion": "0.5.2", "react-redux": "8.1.3", "react-tabs": "3.2.3", - "react-tooltip": "4.5.1", + "react-tooltip": "5", "react-widgets": "^5.8.6", "redux": "4.2.1", "redux-devtools": "3.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 43f3f321e7a..346dfc327e2 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -39,7 +39,7 @@ "react-scrollbar": "^0.5.6", "react-slider": "2.0.6", "react-tabs": "3.2.3", - "react-tooltip": "^4.5.1", + "react-tooltip": "5", "react-widgets": "^5.8.6", "redux-undo": "^1.0.0-beta9", "scroll": "^3.0.1", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TextOverflowWrapperNew/index.jsx b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TextOverflowWrapperNew/index.jsx index 18932af0479..6b329933797 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TextOverflowWrapperNew/index.jsx +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/src/TextOverflowWrapperNew/index.jsx @@ -1,82 +1,77 @@ import React, { Component } from "react"; import PropTypes from "prop-types"; -import ReactTooltip from "react-tooltip"; +import { Tooltip as ReactTooltip } from "react-tooltip"; import "./style.less"; const generateID = () => "a" + Math.random().toString(36).substr(2, 10); class TextOverflowWrapperNew extends Component { + constructor() { + super(); + this.state = { + isTooltipActive: false, + id: generateID(), + }; + } - constructor() { - super(); - this.state = { - isTooltipActive: false, - id: generateID() - }; - } + showTooltip() { + this.setState({ + isTooltipActive: true, + }); + } - showTooltip() { - this.setState({ - isTooltipActive: true - }); - } + hideTooltip() { + this.setState({ + isTooltipActive: false, + }); + } - hideTooltip() { - this.setState({ - isTooltipActive: false - }); - } + render() { + const { props, state } = this; - render() { - const { props, state } = this; + const hotspotStyles = { + marginLeft: "20px", + backgroundColor: "transparent", + position: "absolute", + top: 0, + left: 0, + height: "20px", + width: "200px", + zIndex: 10000, + }; - const hotspotStyles = { - marginLeft:"20px", - backgroundColor:"transparent", - position:"absolute", - top:0, - left:0, - height: "20px", - width: "200px", - zIndex: 10000 - }; - - return ( -
-
-
- -
- {props.text} -
-
-
- ); - } + return ( +
+
+ +
{props.text}
+
+
+ ); + } } TextOverflowWrapperNew.propTypes = { - text: PropTypes.string, - hotspotStyles: PropTypes.object, - type: PropTypes.string, - place: PropTypes.string, - effect: PropTypes.string, - offset: PropTypes.number, - multiline: PropTypes.bool, - className: PropTypes.string, - border: PropTypes.bool + text: PropTypes.string, + hotspotStyles: PropTypes.object, + type: PropTypes.string, + place: PropTypes.string, + float: PropTypes.bool, + offset: PropTypes.number, + className: PropTypes.string, + border: PropTypes.bool, }; export default TextOverflowWrapperNew; diff --git a/yarn.lock b/yarn.lock index 5501d6f7500..c8698e65d85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -568,7 +568,7 @@ __metadata: react-slider: "npm:2.0.6" react-tabs: "npm:3.2.3" react-test-renderer: "npm:^17.0.2" - react-tooltip: "npm:^4.5.1" + react-tooltip: "npm:5" react-widgets: "npm:^5.8.6" redux-undo: "npm:^1.0.0-beta9" scroll: "npm:^3.0.1" @@ -1097,6 +1097,32 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.7.5": + version: 1.7.5 + resolution: "@floating-ui/core@npm:1.7.5" + dependencies: + "@floating-ui/utils": "npm:^0.2.11" + checksum: 10/fecdc9b3ce93f02bf78a6114b93730a4cb9fa8234c62f9a949016186297a039c9f9cd3c5c81ff74b93ebddf0b32048c4af7a528afe7904b75423ed2e7491b888 + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.6.1": + version: 1.7.6 + resolution: "@floating-ui/dom@npm:1.7.6" + dependencies: + "@floating-ui/core": "npm:^1.7.5" + "@floating-ui/utils": "npm:^0.2.11" + checksum: 10/84dff2ffdf85c8b92d7edafc543c55869abbeaeb3007fa983159467e050153b507a0f5fe8e84f88c3f28c35a82de9df9c20a6eef5560cbba3afae19141444ff2 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.11": + version: 0.2.11 + resolution: "@floating-ui/utils@npm:0.2.11" + checksum: 10/72150138ba1c274d757a1da85233202fa9fdfd2272ec1fb0883eb0ffdf138863af81573049ed2c20b98adb4b7ae2236065541ce14037fe328955089831a678d5 + languageName: node + linkType: hard + "@gar/promise-retry@npm:^1.0.0": version: 1.0.2 resolution: "@gar/promise-retry@npm:1.0.2" @@ -5979,7 +6005,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:*, classnames@npm:^2.2.6, classnames@npm:^2.3.1": +"classnames@npm:*, classnames@npm:^2.2.6, classnames@npm:^2.3.0, classnames@npm:^2.3.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 @@ -8484,7 +8510,7 @@ __metadata: react-motion: "npm:0.5.2" react-redux: "npm:8.1.3" react-tabs: "npm:3.2.3" - react-tooltip: "npm:4.5.1" + react-tooltip: "npm:5" react-widgets: "npm:^5.8.6" redux: "npm:4.2.1" redux-devtools: "npm:3.7.0" @@ -14572,16 +14598,16 @@ __metadata: languageName: node linkType: hard -"react-tooltip@npm:4.5.1, react-tooltip@npm:^4.5.1": - version: 4.5.1 - resolution: "react-tooltip@npm:4.5.1" +"react-tooltip@npm:5": + version: 5.30.1 + resolution: "react-tooltip@npm:5.30.1" dependencies: - prop-types: "npm:^15.8.1" - uuid: "npm:^7.0.3" + "@floating-ui/dom": "npm:^1.6.1" + classnames: "npm:^2.3.0" peerDependencies: - react: ">=16.0.0" - react-dom: ">=16.0.0" - checksum: 10/a2031d6a9903f18046bb3374a1a23f739fb5ebd272c049772dec9108d5da141f4cf98354970e824d70a83f06aed48cf7e96ab69616ecc0d4e6e8c73cef4b6823 + react: ">=16.14.0" + react-dom: ">=16.14.0" + checksum: 10/99cc5243fbdfae5a8b0bba9d2ab56063f90c350f73a749bcad5442f548173c30df01bd3de0d1cd31c1f4a4ba4a24d00fd2984cf2026e771e764cb9580a80144e languageName: node linkType: hard @@ -17762,15 +17788,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^7.0.3": - version: 7.0.3 - resolution: "uuid@npm:7.0.3" - bin: - uuid: dist/bin/uuid - checksum: 10/b2a4d30ecd6581015175487426558aafd7f7b4013a2e30802c128cc28cad9abe46ecd36c02f7fbcde7908fd4672334818d56a441c0871963d6bd89d911bef2ea - languageName: node - linkType: hard - "v8-to-istanbul@npm:^9.0.1": version: 9.3.0 resolution: "v8-to-istanbul@npm:9.3.0" From c47cf83d97ada6bb7ed97dd959a17c6561909821 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 8 Jun 2026 13:09:06 -0500 Subject: [PATCH 068/109] Bump react-tooltip from 5.30.1 to 6.0.7 --- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 27 ++++++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index fde196636c5..b8549cbe704 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -30,7 +30,7 @@ "react-motion": "0.5.2", "react-redux": "8.1.3", "react-tabs": "3.2.3", - "react-tooltip": "5", + "react-tooltip": "^6.0.7", "react-widgets": "^5.8.6", "redux": "4.2.1", "redux-devtools": "3.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 346dfc327e2..bd4242bff6d 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -39,7 +39,7 @@ "react-scrollbar": "^0.5.6", "react-slider": "2.0.6", "react-tabs": "3.2.3", - "react-tooltip": "5", + "react-tooltip": "^6.0.7", "react-widgets": "^5.8.6", "redux-undo": "^1.0.0-beta9", "scroll": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index c8698e65d85..28d006f5b1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -568,7 +568,7 @@ __metadata: react-slider: "npm:2.0.6" react-tabs: "npm:3.2.3" react-test-renderer: "npm:^17.0.2" - react-tooltip: "npm:5" + react-tooltip: "npm:^6.0.7" react-widgets: "npm:^5.8.6" redux-undo: "npm:^1.0.0-beta9" scroll: "npm:^3.0.1" @@ -1106,7 +1106,7 @@ __metadata: languageName: node linkType: hard -"@floating-ui/dom@npm:^1.6.1": +"@floating-ui/dom@npm:1.7.6": version: 1.7.6 resolution: "@floating-ui/dom@npm:1.7.6" dependencies: @@ -6005,7 +6005,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:*, classnames@npm:^2.2.6, classnames@npm:^2.3.0, classnames@npm:^2.3.1": +"classnames@npm:*, classnames@npm:^2.2.6, classnames@npm:^2.3.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 @@ -6087,6 +6087,13 @@ __metadata: languageName: node linkType: hard +"clsx@npm:2.1.1": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 + languageName: node + linkType: hard + "clsx@npm:^1.1.0": version: 1.2.1 resolution: "clsx@npm:1.2.1" @@ -8510,7 +8517,7 @@ __metadata: react-motion: "npm:0.5.2" react-redux: "npm:8.1.3" react-tabs: "npm:3.2.3" - react-tooltip: "npm:5" + react-tooltip: "npm:^6.0.7" react-widgets: "npm:^5.8.6" redux: "npm:4.2.1" redux-devtools: "npm:3.7.0" @@ -14598,16 +14605,16 @@ __metadata: languageName: node linkType: hard -"react-tooltip@npm:5": - version: 5.30.1 - resolution: "react-tooltip@npm:5.30.1" +"react-tooltip@npm:^6.0.7": + version: 6.0.7 + resolution: "react-tooltip@npm:6.0.7" dependencies: - "@floating-ui/dom": "npm:^1.6.1" - classnames: "npm:^2.3.0" + "@floating-ui/dom": "npm:1.7.6" + clsx: "npm:2.1.1" peerDependencies: react: ">=16.14.0" react-dom: ">=16.14.0" - checksum: 10/99cc5243fbdfae5a8b0bba9d2ab56063f90c350f73a749bcad5442f548173c30df01bd3de0d1cd31c1f4a4ba4a24d00fd2984cf2026e771e764cb9580a80144e + checksum: 10/fc1a75e5ca99f23772d4f13a6d03d28baeb7f2ee09565da877b53d894ea1675e7d52b2ed9d4c1bd73537c9604dd9800c71c2333251f04968ea8ec48a498f287d languageName: node linkType: hard From 60866c609efc1497f8a9cc3c832784ed12bfc325 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:17:30 +0000 Subject: [PATCH 069/109] Bump esbuild in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [esbuild](https://github.com/evanw/esbuild). Updates `esbuild` from 0.28.0 to 0.28.1 - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.28.0...v0.28.1) --- updated-dependencies: - dependency-name: esbuild dependency-version: 0.28.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- yarn.lock | 432 +++++++++++++++++++++++++++--------------------------- 1 file changed, 216 insertions(+), 216 deletions(-) diff --git a/yarn.lock b/yarn.lock index 28d006f5b1b..3c53f73b91f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -631,366 +631,366 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/aix-ppc64@npm:0.27.4" +"@esbuild/aix-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/aix-ppc64@npm:0.27.7" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/aix-ppc64@npm:0.28.0" +"@esbuild/aix-ppc64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/aix-ppc64@npm:0.28.1" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/android-arm64@npm:0.27.4" +"@esbuild/android-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm64@npm:0.27.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/android-arm64@npm:0.28.0" +"@esbuild/android-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-arm64@npm:0.28.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/android-arm@npm:0.27.4" +"@esbuild/android-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm@npm:0.27.7" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-arm@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/android-arm@npm:0.28.0" +"@esbuild/android-arm@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-arm@npm:0.28.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/android-x64@npm:0.27.4" +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/android-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/android-x64@npm:0.28.0" +"@esbuild/android-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/android-x64@npm:0.28.1" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/darwin-arm64@npm:0.27.4" +"@esbuild/darwin-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-arm64@npm:0.27.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/darwin-arm64@npm:0.28.0" +"@esbuild/darwin-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/darwin-arm64@npm:0.28.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/darwin-x64@npm:0.27.4" +"@esbuild/darwin-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-x64@npm:0.27.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/darwin-x64@npm:0.28.0" +"@esbuild/darwin-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/darwin-x64@npm:0.28.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/freebsd-arm64@npm:0.27.4" +"@esbuild/freebsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-arm64@npm:0.27.7" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/freebsd-arm64@npm:0.28.0" +"@esbuild/freebsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/freebsd-arm64@npm:0.28.1" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/freebsd-x64@npm:0.27.4" +"@esbuild/freebsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-x64@npm:0.27.7" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/freebsd-x64@npm:0.28.0" +"@esbuild/freebsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/freebsd-x64@npm:0.28.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-arm64@npm:0.27.4" +"@esbuild/linux-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm64@npm:0.27.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-arm64@npm:0.28.0" +"@esbuild/linux-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-arm64@npm:0.28.1" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-arm@npm:0.27.4" +"@esbuild/linux-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm@npm:0.27.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-arm@npm:0.28.0" +"@esbuild/linux-arm@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-arm@npm:0.28.1" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-ia32@npm:0.27.4" +"@esbuild/linux-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ia32@npm:0.27.7" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-ia32@npm:0.28.0" +"@esbuild/linux-ia32@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-ia32@npm:0.28.1" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-loong64@npm:0.27.4" +"@esbuild/linux-loong64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-loong64@npm:0.27.7" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-loong64@npm:0.28.0" +"@esbuild/linux-loong64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-loong64@npm:0.28.1" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-mips64el@npm:0.27.4" +"@esbuild/linux-mips64el@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-mips64el@npm:0.27.7" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-mips64el@npm:0.28.0" +"@esbuild/linux-mips64el@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-mips64el@npm:0.28.1" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-ppc64@npm:0.27.4" +"@esbuild/linux-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ppc64@npm:0.27.7" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-ppc64@npm:0.28.0" +"@esbuild/linux-ppc64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-ppc64@npm:0.28.1" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-riscv64@npm:0.27.4" +"@esbuild/linux-riscv64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-riscv64@npm:0.27.7" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-riscv64@npm:0.28.0" +"@esbuild/linux-riscv64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-riscv64@npm:0.28.1" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-s390x@npm:0.27.4" +"@esbuild/linux-s390x@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-s390x@npm:0.27.7" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-s390x@npm:0.28.0" +"@esbuild/linux-s390x@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-s390x@npm:0.28.1" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/linux-x64@npm:0.27.4" +"@esbuild/linux-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-x64@npm:0.27.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/linux-x64@npm:0.28.0" +"@esbuild/linux-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/linux-x64@npm:0.28.1" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/netbsd-arm64@npm:0.27.4" +"@esbuild/netbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-arm64@npm:0.27.7" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/netbsd-arm64@npm:0.28.0" +"@esbuild/netbsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/netbsd-arm64@npm:0.28.1" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/netbsd-x64@npm:0.27.4" +"@esbuild/netbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-x64@npm:0.27.7" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/netbsd-x64@npm:0.28.0" +"@esbuild/netbsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/netbsd-x64@npm:0.28.1" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/openbsd-arm64@npm:0.27.4" +"@esbuild/openbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-arm64@npm:0.27.7" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/openbsd-arm64@npm:0.28.0" +"@esbuild/openbsd-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openbsd-arm64@npm:0.28.1" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/openbsd-x64@npm:0.27.4" +"@esbuild/openbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-x64@npm:0.27.7" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/openbsd-x64@npm:0.28.0" +"@esbuild/openbsd-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openbsd-x64@npm:0.28.1" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/openharmony-arm64@npm:0.27.4" +"@esbuild/openharmony-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openharmony-arm64@npm:0.27.7" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/openharmony-arm64@npm:0.28.0" +"@esbuild/openharmony-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/openharmony-arm64@npm:0.28.1" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/sunos-x64@npm:0.27.4" +"@esbuild/sunos-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/sunos-x64@npm:0.27.7" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/sunos-x64@npm:0.28.0" +"@esbuild/sunos-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/sunos-x64@npm:0.28.1" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/win32-arm64@npm:0.27.4" +"@esbuild/win32-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-arm64@npm:0.27.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/win32-arm64@npm:0.28.0" +"@esbuild/win32-arm64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-arm64@npm:0.28.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/win32-ia32@npm:0.27.4" +"@esbuild/win32-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-ia32@npm:0.27.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/win32-ia32@npm:0.28.0" +"@esbuild/win32-ia32@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-ia32@npm:0.28.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.27.4": - version: 0.27.4 - resolution: "@esbuild/win32-x64@npm:0.27.4" +"@esbuild/win32-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-x64@npm:0.27.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.28.0": - version: 0.28.0 - resolution: "@esbuild/win32-x64@npm:0.28.0" +"@esbuild/win32-x64@npm:0.28.1": + version: 0.28.1 + resolution: "@esbuild/win32-x64@npm:0.28.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7887,35 +7887,35 @@ __metadata: linkType: hard "esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": - version: 0.27.4 - resolution: "esbuild@npm:0.27.4" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.4" - "@esbuild/android-arm": "npm:0.27.4" - "@esbuild/android-arm64": "npm:0.27.4" - "@esbuild/android-x64": "npm:0.27.4" - "@esbuild/darwin-arm64": "npm:0.27.4" - "@esbuild/darwin-x64": "npm:0.27.4" - "@esbuild/freebsd-arm64": "npm:0.27.4" - "@esbuild/freebsd-x64": "npm:0.27.4" - "@esbuild/linux-arm": "npm:0.27.4" - "@esbuild/linux-arm64": "npm:0.27.4" - "@esbuild/linux-ia32": "npm:0.27.4" - "@esbuild/linux-loong64": "npm:0.27.4" - "@esbuild/linux-mips64el": "npm:0.27.4" - "@esbuild/linux-ppc64": "npm:0.27.4" - "@esbuild/linux-riscv64": "npm:0.27.4" - "@esbuild/linux-s390x": "npm:0.27.4" - "@esbuild/linux-x64": "npm:0.27.4" - "@esbuild/netbsd-arm64": "npm:0.27.4" - "@esbuild/netbsd-x64": "npm:0.27.4" - "@esbuild/openbsd-arm64": "npm:0.27.4" - "@esbuild/openbsd-x64": "npm:0.27.4" - "@esbuild/openharmony-arm64": "npm:0.27.4" - "@esbuild/sunos-x64": "npm:0.27.4" - "@esbuild/win32-arm64": "npm:0.27.4" - "@esbuild/win32-ia32": "npm:0.27.4" - "@esbuild/win32-x64": "npm:0.27.4" + version: 0.27.7 + resolution: "esbuild@npm:0.27.7" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.7" + "@esbuild/android-arm": "npm:0.27.7" + "@esbuild/android-arm64": "npm:0.27.7" + "@esbuild/android-x64": "npm:0.27.7" + "@esbuild/darwin-arm64": "npm:0.27.7" + "@esbuild/darwin-x64": "npm:0.27.7" + "@esbuild/freebsd-arm64": "npm:0.27.7" + "@esbuild/freebsd-x64": "npm:0.27.7" + "@esbuild/linux-arm": "npm:0.27.7" + "@esbuild/linux-arm64": "npm:0.27.7" + "@esbuild/linux-ia32": "npm:0.27.7" + "@esbuild/linux-loong64": "npm:0.27.7" + "@esbuild/linux-mips64el": "npm:0.27.7" + "@esbuild/linux-ppc64": "npm:0.27.7" + "@esbuild/linux-riscv64": "npm:0.27.7" + "@esbuild/linux-s390x": "npm:0.27.7" + "@esbuild/linux-x64": "npm:0.27.7" + "@esbuild/netbsd-arm64": "npm:0.27.7" + "@esbuild/netbsd-x64": "npm:0.27.7" + "@esbuild/openbsd-arm64": "npm:0.27.7" + "@esbuild/openbsd-x64": "npm:0.27.7" + "@esbuild/openharmony-arm64": "npm:0.27.7" + "@esbuild/sunos-x64": "npm:0.27.7" + "@esbuild/win32-arm64": "npm:0.27.7" + "@esbuild/win32-ia32": "npm:0.27.7" + "@esbuild/win32-x64": "npm:0.27.7" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -7971,40 +7971,40 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/32b46ec22ef78bae6cc141145022a4c0209852c07151f037fbefccc2033ca54e7f33705f8fca198eb7026f400142f64c2dbc9f0d0ce9c0a638ebc472a04abc4a + checksum: 10/262b16c4a33cb70e9f054759a7ce420541649315eef7b064172c795021ccce322e56c3f5fd52e8842873f1c23745f3ab62311a24860950bd5406ba77b36b8529 languageName: node linkType: hard "esbuild@npm:^0.28.0, esbuild@npm:~0.28.0": - version: 0.28.0 - resolution: "esbuild@npm:0.28.0" - dependencies: - "@esbuild/aix-ppc64": "npm:0.28.0" - "@esbuild/android-arm": "npm:0.28.0" - "@esbuild/android-arm64": "npm:0.28.0" - "@esbuild/android-x64": "npm:0.28.0" - "@esbuild/darwin-arm64": "npm:0.28.0" - "@esbuild/darwin-x64": "npm:0.28.0" - "@esbuild/freebsd-arm64": "npm:0.28.0" - "@esbuild/freebsd-x64": "npm:0.28.0" - "@esbuild/linux-arm": "npm:0.28.0" - "@esbuild/linux-arm64": "npm:0.28.0" - "@esbuild/linux-ia32": "npm:0.28.0" - "@esbuild/linux-loong64": "npm:0.28.0" - "@esbuild/linux-mips64el": "npm:0.28.0" - "@esbuild/linux-ppc64": "npm:0.28.0" - "@esbuild/linux-riscv64": "npm:0.28.0" - "@esbuild/linux-s390x": "npm:0.28.0" - "@esbuild/linux-x64": "npm:0.28.0" - "@esbuild/netbsd-arm64": "npm:0.28.0" - "@esbuild/netbsd-x64": "npm:0.28.0" - "@esbuild/openbsd-arm64": "npm:0.28.0" - "@esbuild/openbsd-x64": "npm:0.28.0" - "@esbuild/openharmony-arm64": "npm:0.28.0" - "@esbuild/sunos-x64": "npm:0.28.0" - "@esbuild/win32-arm64": "npm:0.28.0" - "@esbuild/win32-ia32": "npm:0.28.0" - "@esbuild/win32-x64": "npm:0.28.0" + version: 0.28.1 + resolution: "esbuild@npm:0.28.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.28.1" + "@esbuild/android-arm": "npm:0.28.1" + "@esbuild/android-arm64": "npm:0.28.1" + "@esbuild/android-x64": "npm:0.28.1" + "@esbuild/darwin-arm64": "npm:0.28.1" + "@esbuild/darwin-x64": "npm:0.28.1" + "@esbuild/freebsd-arm64": "npm:0.28.1" + "@esbuild/freebsd-x64": "npm:0.28.1" + "@esbuild/linux-arm": "npm:0.28.1" + "@esbuild/linux-arm64": "npm:0.28.1" + "@esbuild/linux-ia32": "npm:0.28.1" + "@esbuild/linux-loong64": "npm:0.28.1" + "@esbuild/linux-mips64el": "npm:0.28.1" + "@esbuild/linux-ppc64": "npm:0.28.1" + "@esbuild/linux-riscv64": "npm:0.28.1" + "@esbuild/linux-s390x": "npm:0.28.1" + "@esbuild/linux-x64": "npm:0.28.1" + "@esbuild/netbsd-arm64": "npm:0.28.1" + "@esbuild/netbsd-x64": "npm:0.28.1" + "@esbuild/openbsd-arm64": "npm:0.28.1" + "@esbuild/openbsd-x64": "npm:0.28.1" + "@esbuild/openharmony-arm64": "npm:0.28.1" + "@esbuild/sunos-x64": "npm:0.28.1" + "@esbuild/win32-arm64": "npm:0.28.1" + "@esbuild/win32-ia32": "npm:0.28.1" + "@esbuild/win32-x64": "npm:0.28.1" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -8060,7 +8060,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/49eafc8906cc4a760a1704556bd3b301f808fcdcf2725190383f151741226bf2a2898a03da75a06a896d6217dadc4f3f3168983557ee31bae602e2e37779a83a + checksum: 10/aaa4a922644afffac45e735c99caf343f881e2d36abcc6b6fb53c230bd69940504a5bb6b0041bdd1a690e748ebc681d3308a7d178987c523d74c63c2c280bac8 languageName: node linkType: hard From f45903e82170915a99c4b472f05f4d452ce19bd9 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Fri, 12 Jun 2026 22:05:08 -0500 Subject: [PATCH 070/109] Force newer esbuild to be used by storybook --- package.json | 3 +- yarn.lock | 273 +-------------------------------------------------- 2 files changed, 3 insertions(+), 273 deletions(-) diff --git a/package.json b/package.json index a4df2e55333..fd12bdceed8 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,8 @@ "test": "lerna run test" }, "resolutions": { - "@types/ws": "8.5.4" + "@types/ws": "8.5.4", + "esbuild": "0.28.1" }, "packageManager": "yarn@4.16.0+sha512.5374c94eb4ef6aa8188fb112f20c1aa6569f248d676c5e576e1fd2a1a4d8d87a96df65d9dfe1c2a0252cbe38bda46cf18d955005b81b43cc7607a5c9d56fd2b6" } diff --git a/yarn.lock b/yarn.lock index 3c53f73b91f..3d3b7f1ebf3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -631,13 +631,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/aix-ppc64@npm:0.27.7" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/aix-ppc64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/aix-ppc64@npm:0.28.1" @@ -645,13 +638,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/android-arm64@npm:0.27.7" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/android-arm64@npm:0.28.1" @@ -659,13 +645,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/android-arm@npm:0.27.7" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/android-arm@npm:0.28.1" @@ -673,13 +652,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/android-x64@npm:0.27.7" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/android-x64@npm:0.28.1" @@ -687,13 +659,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/darwin-arm64@npm:0.27.7" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/darwin-arm64@npm:0.28.1" @@ -701,13 +666,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/darwin-x64@npm:0.27.7" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/darwin-x64@npm:0.28.1" @@ -715,13 +673,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/freebsd-arm64@npm:0.27.7" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/freebsd-arm64@npm:0.28.1" @@ -729,13 +680,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/freebsd-x64@npm:0.27.7" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/freebsd-x64@npm:0.28.1" @@ -743,13 +687,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-arm64@npm:0.27.7" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-arm64@npm:0.28.1" @@ -757,13 +694,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-arm@npm:0.27.7" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-arm@npm:0.28.1" @@ -771,13 +701,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-ia32@npm:0.27.7" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-ia32@npm:0.28.1" @@ -785,13 +708,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-loong64@npm:0.27.7" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-loong64@npm:0.28.1" @@ -799,13 +715,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-mips64el@npm:0.27.7" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-mips64el@npm:0.28.1" @@ -813,13 +722,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-ppc64@npm:0.27.7" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-ppc64@npm:0.28.1" @@ -827,13 +729,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-riscv64@npm:0.27.7" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-riscv64@npm:0.28.1" @@ -841,13 +736,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-s390x@npm:0.27.7" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-s390x@npm:0.28.1" @@ -855,13 +743,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/linux-x64@npm:0.27.7" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/linux-x64@npm:0.28.1" @@ -869,13 +750,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/netbsd-arm64@npm:0.27.7" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/netbsd-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/netbsd-arm64@npm:0.28.1" @@ -883,13 +757,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/netbsd-x64@npm:0.27.7" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/netbsd-x64@npm:0.28.1" @@ -897,13 +764,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/openbsd-arm64@npm:0.27.7" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/openbsd-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/openbsd-arm64@npm:0.28.1" @@ -911,13 +771,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/openbsd-x64@npm:0.27.7" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/openbsd-x64@npm:0.28.1" @@ -925,13 +778,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/openharmony-arm64@npm:0.27.7" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/openharmony-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/openharmony-arm64@npm:0.28.1" @@ -939,13 +785,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/sunos-x64@npm:0.27.7" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/sunos-x64@npm:0.28.1" @@ -953,13 +792,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/win32-arm64@npm:0.27.7" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/win32-arm64@npm:0.28.1" @@ -967,13 +799,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/win32-ia32@npm:0.27.7" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/win32-ia32@npm:0.28.1" @@ -981,13 +806,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.27.7": - version: 0.27.7 - resolution: "@esbuild/win32-x64@npm:0.27.7" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.28.1": version: 0.28.1 resolution: "@esbuild/win32-x64@npm:0.28.1" @@ -7886,96 +7704,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": - version: 0.27.7 - resolution: "esbuild@npm:0.27.7" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.7" - "@esbuild/android-arm": "npm:0.27.7" - "@esbuild/android-arm64": "npm:0.27.7" - "@esbuild/android-x64": "npm:0.27.7" - "@esbuild/darwin-arm64": "npm:0.27.7" - "@esbuild/darwin-x64": "npm:0.27.7" - "@esbuild/freebsd-arm64": "npm:0.27.7" - "@esbuild/freebsd-x64": "npm:0.27.7" - "@esbuild/linux-arm": "npm:0.27.7" - "@esbuild/linux-arm64": "npm:0.27.7" - "@esbuild/linux-ia32": "npm:0.27.7" - "@esbuild/linux-loong64": "npm:0.27.7" - "@esbuild/linux-mips64el": "npm:0.27.7" - "@esbuild/linux-ppc64": "npm:0.27.7" - "@esbuild/linux-riscv64": "npm:0.27.7" - "@esbuild/linux-s390x": "npm:0.27.7" - "@esbuild/linux-x64": "npm:0.27.7" - "@esbuild/netbsd-arm64": "npm:0.27.7" - "@esbuild/netbsd-x64": "npm:0.27.7" - "@esbuild/openbsd-arm64": "npm:0.27.7" - "@esbuild/openbsd-x64": "npm:0.27.7" - "@esbuild/openharmony-arm64": "npm:0.27.7" - "@esbuild/sunos-x64": "npm:0.27.7" - "@esbuild/win32-arm64": "npm:0.27.7" - "@esbuild/win32-ia32": "npm:0.27.7" - "@esbuild/win32-x64": "npm:0.27.7" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/262b16c4a33cb70e9f054759a7ce420541649315eef7b064172c795021ccce322e56c3f5fd52e8842873f1c23745f3ab62311a24860950bd5406ba77b36b8529 - languageName: node - linkType: hard - -"esbuild@npm:^0.28.0, esbuild@npm:~0.28.0": +"esbuild@npm:0.28.1": version: 0.28.1 resolution: "esbuild@npm:0.28.1" dependencies: From ef6da8bc87e995ad0bf3371e40c2bd1270134282 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 14 Jun 2026 02:35:35 -0400 Subject: [PATCH 071/109] Added resolutions comment --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index fd12bdceed8..4ec61e49a68 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,10 @@ "lint": "lerna run lint", "test": "lerna run test" }, + "//resolutions-comments": { + "@types/ws": "Workaround for https://stackoverflow.com/questions/76436147/types-ws-type-server-is-not-generic/76570993#76570993", + "esbuild": "Workaround for https://github.com/storybookjs/storybook/pull/35157 we can remove this when they release a version with the update." + }, "resolutions": { "@types/ws": "8.5.4", "esbuild": "0.28.1" From d54a9ad077e03cf95997293bbff06419478e9c88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 03:17:11 +0000 Subject: [PATCH 072/109] Update caniuse database --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d3b7f1ebf3..c4008344da3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5279,11 +5279,11 @@ __metadata: linkType: hard "baseline-browser-mapping@npm:^2.10.12": - version: 2.10.34 - resolution: "baseline-browser-mapping@npm:2.10.34" + version: 2.10.37 + resolution: "baseline-browser-mapping@npm:2.10.37" bin: baseline-browser-mapping: dist/cli.cjs - checksum: 10/d0f2e4792b04b2f305e60ca5bf591fa92a2ee39125d8d8e39959e06d8ea68832a026782acd71050f27e44dc676e2de621c87aa698a47976b4e82ce735cd70fc1 + checksum: 10/5bf887e82a238ab2ec216283ab2c44291d5ad917b4c4d21bb88f466be513223bda20d746c2758cdb0be5b3dad1e52ee8b468dbc196096da92673d6904992af66 languageName: node linkType: hard @@ -5667,9 +5667,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001782, caniuse-lite@npm:^1.0.30001787": - version: 1.0.30001797 - resolution: "caniuse-lite@npm:1.0.30001797" - checksum: 10/30d34d8ede7a99cedec5489cb7a4fc75b0d641afcc436d2b0986aaf9beb056d3f15391e6a08b06b0bd8a84c64793ac8197005b14a96412514706a5715be98796 + version: 1.0.30001799 + resolution: "caniuse-lite@npm:1.0.30001799" + checksum: 10/eb90443f1e4e4ac7cfe3686d43f0d132c0b552d0d896c0520e7306f2ddf743b4dd5380a7b8adc5ca8d250247966a6cf32cb042930dbc1df452e8623ad92c57e2 languageName: node linkType: hard From a3748a3a0e3d4f0e5bf1f651a6e2aa1ceebff769 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 16 Jun 2026 16:01:35 -0500 Subject: [PATCH 073/109] Do not persist credentials after CI checkout --- .github/workflows/ci.yml | 2 ++ .github/workflows/dependency-review.yml | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 986d40f2ce3..db08720f4a8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,7 @@ jobs: uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 with: fetch-depth: 0 # include all history for GitVersion + persist-credentials: false - name: "Setup Node.js" uses: "actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e" # v6.4.0 @@ -192,3 +193,4 @@ jobs: - name: "NuGet Push" run: "dotnet nuget push *.nupkg --api-key ${{ steps.nuget-login.outputs.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json" + diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index caee7d8a3dc..1b72734abcd 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -1,9 +1,9 @@ name: "Dependency Review" -on: +on: pull_request: merge_group: - types: + types: - "checks_requested" concurrency: @@ -20,5 +20,10 @@ jobs: steps: - name: "Checkout Repository" uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + with: + persist-credentials: false + - name: "Dependency Review" uses: "actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294" # v5.0.0 + + From 1021c62b9b578f5fee6a32e3e9719d1853926791 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 16 Jun 2026 16:09:28 -0500 Subject: [PATCH 074/109] Do not inline input into script --- .github/workflows/ci.yml | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db08720f4a8..f3ad52ff1b5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,10 +67,15 @@ jobs: steps: - name: "Setup Environment Variables" run: | - "CAKE_TARGET=${{ inputs.CAKE_TARGET || env.CAKE_TARGET }}" >> $env:GITHUB_ENV; - "CAKE_VERBOSITY=${{ inputs.CAKE_VERBOSITY || env.CAKE_VERBOSITY }}" >> $env:GITHUB_ENV; - "RELEASE_MODE=${{ inputs.RELEASE_MODE || env.RELEASE_MODE }}" >> $env:GITHUB_ENV; - "RUN_TESTS=${{ inputs.RUN_TESTS || env.RUN_TESTS }}" >> $env:GITHUB_ENV; + "CAKE_TARGET=$env:CAKE_TARGET" >> $env:GITHUB_ENV; + "CAKE_VERBOSITY=$env:CAKE_VERBOSITY" >> $env:GITHUB_ENV; + "RELEASE_MODE=$env:RELEASE_MODE" >> $env:GITHUB_ENV; + "RUN_TESTS=$env:RUN_TESTS" >> $env:GITHUB_ENV; + env: + CAKE_TARGET: ${{ inputs.CAKE_TARGET || env.CAKE_TARGET }} + CAKE_VERBOSITY: ${{ inputs.CAKE_VERBOSITY || env.CAKE_VERBOSITY }} + RELEASE_MODE: ${{ inputs.RELEASE_MODE || env.RELEASE_MODE }} + RUN_TESTS: ${{ inputs.RUN_TESTS || env.RUN_TESTS }} - name: "Checkout" uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 @@ -104,18 +109,18 @@ jobs: (Get-Content $path) | ForEach-Object { if ($_ -match $pattern3) { # We have found the matching line - '[assembly: AssemblyStatus(ReleaseMode.{0})]' -f '${{ env.RELEASE_MODE }}' + '[assembly: AssemblyStatus(ReleaseMode.{0})]' -f $env:RELEASE_MODE } else { $_ } } | Set-Content $path - name: "Run DNN Build via Cake" - run: "./build.ps1 --target=${{ env.CAKE_TARGET }} --verbosity=${{ env.CAKE_VERBOSITY }}" + run: "./build.ps1 --target=$env:CAKE_TARGET --verbosity=$env:CAKE_VERBOSITY" - name: "Run Unit Tests via Cake" if: ${{ env.RUN_TESTS == 'true' }} - run: "./build.ps1 --target=UnitTests --verbosity=${{ env.CAKE_VERBOSITY }}" + run: "./build.ps1 --target=UnitTests --verbosity=$env:CAKE_VERBOSITY" continue-on-error: true - name: "Publish Test Results" @@ -137,7 +142,7 @@ jobs: - name: "Create GitHub Pull Request" if: ${{ success() && !contains('pull_request', github.event_name) && (contains(fromJSON('["develop", "main"]'), github.ref_name) || startsWith('release/', github.ref_name)) }} - run: "./build.ps1 --target=CreateGitHubPullRequest --verbosity=${{ env.CAKE_VERBOSITY }}" + run: "./build.ps1 --target=CreateGitHubPullRequest --verbosity=$env:CAKE_VERBOSITY" env: GITHUB_APP_ID: ${{ secrets.GITHUB_APP_ID }} GITHUB_APP_PRIVATE_KEY: ${{ secrets.GITHUB_APP_PRIVATE_KEY }} @@ -192,5 +197,7 @@ jobs: user: ${{ secrets.NUGET_USER }} - name: "NuGet Push" - run: "dotnet nuget push *.nupkg --api-key ${{ steps.nuget-login.outputs.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json" + run: "dotnet nuget push *.nupkg --api-key $env:NUGET_API_KEY --source https://api.nuget.org/v3/index.json" + env: + NUGET_API_KEY: ${{ steps.nuget-login.outputs.NUGET_API_KEY }} From b83d21688031f387d81491eaf99be40634c5f870 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 16 Jun 2026 16:13:40 -0500 Subject: [PATCH 075/109] Add name to workflow --- .github/workflows/dependency-review.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 1b72734abcd..6e4acfc0b61 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -14,6 +14,7 @@ permissions: {} jobs: dependency-review: + name: "Dependency Review" runs-on: "ubuntu-latest" permissions: contents: "read" From 37e077d4bd2eeb0d1fdc3c1fd31b667ae59a3e43 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 16 Jun 2026 16:14:28 -0500 Subject: [PATCH 076/109] Add comment to permission grants --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3ad52ff1b5..60bdbb21786 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,8 +59,8 @@ jobs: name: "Build and Validate" runs-on: "windows-2025-vs2026" permissions: - checks: "write" - pull-requests: "write" + checks: "write" # needed by EnricoMi/publish-unit-test-result-action + pull-requests: "write" # needed by EnricoMi/publish-unit-test-result-action defaults: run: shell: "pwsh" @@ -156,9 +156,9 @@ jobs: if: ${{ github.event_name == 'workflow_dispatch' }} runs-on: "ubuntu-latest" permissions: - id-token: "write" + id-token: "write" # needed by actions/attest contents: "read" - attestations: "write" + attestations: "write" # needed by actions/attest steps: - name: "Download Artifacts" uses: "actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c" # v8.0.1 @@ -180,7 +180,7 @@ jobs: if: ${{ github.event_name == 'workflow_dispatch' }} runs-on: "ubuntu-latest" permissions: - id-token: "write" + id-token: "write" # needed by NuGet/login defaults: run: shell: "pwsh" From ff7ba11b7347271bbb9446a7205571c9ec634ecc Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:18:18 -0500 Subject: [PATCH 077/109] Bump socks and ip-address --- yarn.lock | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index c4008344da3..98889f826ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9478,13 +9478,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10/1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c +"ip-address@npm:^10.1.1": + version: 10.2.0 + resolution: "ip-address@npm:10.2.0" + checksum: 10/12fec399e1af5753ac322e47a6d81a50d3a528b3abb17c09525b2a2edcaedcca628c40520706f7037bc4d8e951b0296c47e7b86d0a8e6e2335c8f0ba4afcfac1 languageName: node linkType: hard @@ -10537,13 +10534,6 @@ __metadata: languageName: node linkType: hard -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10/bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef - languageName: node - linkType: hard - "jsdom@npm:^27.0.1": version: 27.4.0 resolution: "jsdom@npm:27.4.0" @@ -15954,12 +15944,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.5 - resolution: "socks@npm:2.8.5" + version: 2.8.9 + resolution: "socks@npm:2.8.9" dependencies: - ip-address: "npm:^9.0.5" + ip-address: "npm:^10.1.1" smart-buffer: "npm:^4.2.0" - checksum: 10/0109090ec2bcb8d12d3875a987e85539ed08697500ad971a603c3057e4c266b4bf6a603e07af6d19218c422dd9b72d923aaa6c1f20abae275510bba458e4ccc9 + checksum: 10/8675e6b023faeaa5c2511664b106fd21f5d5ecb403584412e0efae58a76e0c0661c0c18ca340988f6cb398232308dae85fb710f847c9c6e0a6af33b07e4cd33a languageName: node linkType: hard @@ -16056,7 +16046,7 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.1, sprintf-js@npm:^1.1.3": +"sprintf-js@npm:^1.1.1": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" checksum: 10/e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb From 837befc0b1b1f24ac8c9b6b5ff219fad651b5aa4 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:20:46 -0500 Subject: [PATCH 078/109] Bump ws --- yarn.lock | 59 +++++++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/yarn.lock b/yarn.lock index 98889f826ed..c848adaf9b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4225,6 +4225,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:8.5.4": + version: 8.5.4 + resolution: "@types/ws@npm:8.5.4" + dependencies: + "@types/node": "npm:*" + checksum: 10/8ad37f8ec1f7a1e2b8c0d53353ac30d182277c0bce4d877a497a0b7bcfbeee1838270eb6247a6978da66cc2891106d3c77511ebc827c58967ede8e756446422f + languageName: node + linkType: hard + "@types/yargs-parser@npm:*": version: 21.0.3 resolution: "@types/yargs-parser@npm:21.0.3" @@ -6611,7 +6620,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": +"debug@npm:~4.3.2": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -7319,15 +7328,15 @@ __metadata: linkType: hard "engine.io-client@npm:~6.6.1": - version: 6.6.3 - resolution: "engine.io-client@npm:6.6.3" + version: 6.6.6 + resolution: "engine.io-client@npm:6.6.6" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" - debug: "npm:~4.3.1" + debug: "npm:~4.4.1" engine.io-parser: "npm:~5.2.1" - ws: "npm:~8.17.1" + ws: "npm:~8.21.0" xmlhttprequest-ssl: "npm:~2.1.1" - checksum: 10/c5b8e7eb0f2637b21a63780214878b842306247f540cccab7a4d15606d142e42878cc79607f8f77fa29f016b6854702b7d5ad275df7ad6150f08954a1e2c332a + checksum: 10/9fe1af84a19838af5888d919fadba15a61aa22b8b145fc1bee8090c8226b2d9a1c6b84600705bd9d794f89791997008c222557a8d8aaed4c3165794b286b3704 languageName: node linkType: hard @@ -7339,19 +7348,20 @@ __metadata: linkType: hard "engine.io@npm:~6.6.0": - version: 6.6.4 - resolution: "engine.io@npm:6.6.4" + version: 6.6.9 + resolution: "engine.io@npm:6.6.9" dependencies: "@types/cors": "npm:^2.8.12" "@types/node": "npm:>=10.0.0" + "@types/ws": "npm:^8.5.12" accepts: "npm:~1.3.4" base64id: "npm:2.0.0" cookie: "npm:~0.7.2" cors: "npm:~2.8.5" - debug: "npm:~4.3.1" + debug: "npm:~4.4.1" engine.io-parser: "npm:~5.2.1" - ws: "npm:~8.17.1" - checksum: 10/005b43b392d5b4b9bb196d1ae2a8cc1334a7dc70af3cfb50627d257de407ca1afae725fcd8571f9621cd12ed437abaac819c64cf22f09d5ae02b954a7e7bf4f8 + ws: "npm:~8.21.0" + checksum: 10/604c1d0d7180b67689ccb9bf8d5faca3255cdeed63c05eae92960df2f1c0c016fe37f492d2c015efa9082af5addf553ee9923113649d593cd09ee3e19cefa5f4 languageName: node linkType: hard @@ -15886,12 +15896,12 @@ __metadata: linkType: hard "socket.io-adapter@npm:~2.5.2": - version: 2.5.5 - resolution: "socket.io-adapter@npm:2.5.5" + version: 2.5.8 + resolution: "socket.io-adapter@npm:2.5.8" dependencies: - debug: "npm:~4.3.4" - ws: "npm:~8.17.1" - checksum: 10/e364733a4c34ff1d4a02219e409bd48074fd614b7f5b0568ccfa30dd553252a5b9a41056931306a276891d13ea76a19e2c6f2128a4675c37323f642896874d80 + debug: "npm:~4.4.1" + ws: "npm:~8.21.0" + checksum: 10/6d1d408916b000d4350d21720c6271cb075fc16ce5e3a37a3367136dad7dd2b24d734e1fb6561bdeaec2d4c30b0ae3792643beee39ee4eb2fd9166257bc29dfc languageName: node linkType: hard @@ -17880,7 +17890,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0, ws@npm:^8.18.3": +"ws@npm:^8.18.0, ws@npm:^8.18.3, ws@npm:~8.21.0": version: 8.21.0 resolution: "ws@npm:8.21.0" peerDependencies: @@ -17895,21 +17905,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:~8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10/4264ae92c0b3e59c7e309001e93079b26937aab181835fb7af79f906b22cd33b6196d96556dafb4e985742dd401e99139572242e9847661fdbc96556b9e6902d - languageName: node - linkType: hard - "wsl-utils@npm:^0.1.0": version: 0.1.0 resolution: "wsl-utils@npm:0.1.0" From 6226389ca5497d4ffb4fb9513077ef46ca8fd744 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:23:27 -0500 Subject: [PATCH 079/109] bump storybook --- .../ClientSide/Dnn.React.Common/package.json | 8 +- yarn.lock | 80 ++++++++++++------- 2 files changed, 53 insertions(+), 35 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index bd4242bff6d..e082439884a 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -51,8 +51,8 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", - "@storybook/addon-docs": "10.4.2", - "@storybook/addon-onboarding": "10.4.2", + "@storybook/addon-docs": "10.4.6", + "@storybook/addon-onboarding": "10.4.6", "create-react-class": "^15.7.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", @@ -63,7 +63,7 @@ "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", - "eslint-plugin-storybook": "10.4.2", + "eslint-plugin-storybook": "10.4.6", "less": "4.6.4", "nanoid": "^5.1.11", "prop-types": "^15.8.1", @@ -72,7 +72,7 @@ "react-dom": "^16.14.0", "react-hot-loader": "^4.13.1", "react-test-renderer": "^17.0.2", - "storybook": "10.4.2", + "storybook": "10.4.6", "storybook-react-rsbuild": "^3.3.4", "typescript": "^5.9.3" }, diff --git a/yarn.lock b/yarn.lock index c848adaf9b2..ea27e289e1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -533,8 +533,8 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" - "@storybook/addon-docs": "npm:10.4.2" - "@storybook/addon-onboarding": "npm:10.4.2" + "@storybook/addon-docs": "npm:10.4.6" + "@storybook/addon-onboarding": "npm:10.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" dompurify: "npm:^3.4.8" @@ -547,7 +547,7 @@ __metadata: eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" - eslint-plugin-storybook: "npm:10.4.2" + eslint-plugin-storybook: "npm:10.4.6" html-react-parser: "npm:^6.1.3" interact.js: "npm:^1.2.8" less: "npm:4.6.4" @@ -572,7 +572,7 @@ __metadata: react-widgets: "npm:^5.8.6" redux-undo: "npm:^1.0.0-beta9" scroll: "npm:^3.0.1" - storybook: "npm:10.4.2" + storybook: "npm:10.4.6" storybook-react-rsbuild: "npm:^3.3.4" throttle-debounce: "npm:^5.0.2" typescript: "npm:^5.9.3" @@ -3514,45 +3514,45 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:10.4.2": - version: 10.4.2 - resolution: "@storybook/addon-docs@npm:10.4.2" +"@storybook/addon-docs@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-docs@npm:10.4.6" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:10.4.2" + "@storybook/csf-plugin": "npm:10.4.6" "@storybook/icons": "npm:^2.0.2" - "@storybook/react-dom-shim": "npm:10.4.2" + "@storybook/react-dom-shim": "npm:10.4.6" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.2 + storybook: ^10.4.6 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/592685928bcdcebc35e9e9dab5c14230115713f1c2636923709b001ad714609c3d18b1d0b18b205546ab0808880795315fb4c5ec8b9a34106a6d0797dd1fd93f + checksum: 10/d484a40e256fbf26fed3e57e7ceb079d40edc13d7bbb21734aa82dcc7f3c9315b8158dac46ef364d4345c8dad72d8e8e3e0bc7a388a9c2b50cee5be62a7ae0e5 languageName: node linkType: hard -"@storybook/addon-onboarding@npm:10.4.2": - version: 10.4.2 - resolution: "@storybook/addon-onboarding@npm:10.4.2" +"@storybook/addon-onboarding@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/addon-onboarding@npm:10.4.6" peerDependencies: - storybook: ^10.4.2 - checksum: 10/0350125acf46483e168a660972d056df4054d5f23e88c26ddc46a3b5880a734a884c186cbfa9697b8a06c0c5f7de0b60e4bc0725d2127f57b80654038d69e6fe + storybook: ^10.4.6 + checksum: 10/021aa3870b3f2c1e78835813363918197809b037ea60ae5751e3ae2845df3c5c429fbe125ae10d81f9af279a8944dd00bf6c48b66b6a77e125e2dc3fac686e0c languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.4.2": - version: 10.4.2 - resolution: "@storybook/csf-plugin@npm:10.4.2" +"@storybook/csf-plugin@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/csf-plugin@npm:10.4.6" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.4.2 + storybook: ^10.4.6 vite: "*" webpack: "*" peerDependenciesMeta: @@ -3564,7 +3564,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10/e27bb2f21ae727f95df8e2e9c2f16f29382e046fa37ed2b6dcb55c178a055847f8d23ed9973d0d9eb2db30fcfc976b2526403c913b83c99bb170fcc05f9a9bc4 + checksum: 10/d29e3876d5debc2cbff23726e28fe86054e0c145cbf1abf1d55180a1b963e236078fe56d1771a44e0947686f75a1c9235b284e78e18d2c7dd489993881cc0546 languageName: node linkType: hard @@ -3621,6 +3621,24 @@ __metadata: languageName: node linkType: hard +"@storybook/react-dom-shim@npm:10.4.6": + version: 10.4.6 + resolution: "@storybook/react-dom-shim@npm:10.4.6" + peerDependencies: + "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + "@types/react-dom": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.6 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/e094336355c103234c921f45c151be380443cfa7f2e9adfbc3d7e9277317e147135d916b3368158267e12d2924703da2e486e9a8aad8d849892d35efeef390a5 + languageName: node + linkType: hard + "@storybook/react@npm:^10.3.5": version: 10.4.2 resolution: "@storybook/react@npm:10.4.2" @@ -7977,15 +7995,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-storybook@npm:10.4.2": - version: 10.4.2 - resolution: "eslint-plugin-storybook@npm:10.4.2" +"eslint-plugin-storybook@npm:10.4.6": + version: 10.4.6 + resolution: "eslint-plugin-storybook@npm:10.4.6" dependencies: "@typescript-eslint/utils": "npm:^8.48.0" peerDependencies: eslint: ">=8" - storybook: ^10.4.2 - checksum: 10/a4a9b22ca97b14f7eb0018b6635dbf7a31ebf2012ff9f3fc515f5058d0dc768abbe0eef2f9d423f28228cf415e0dcfc778bcad7892750f73bb39d49ea347413c + storybook: ^10.4.6 + checksum: 10/511e11d3901fa642df41e98c49c60af325a3d40355dce899e5d76113b12c1eebd894ea1c804ae1a5e22b4c9d4b3548de7e0b95841e7c8201ed04ae4a3e9e9c59 languageName: node linkType: hard @@ -16200,9 +16218,9 @@ __metadata: languageName: node linkType: hard -"storybook@npm:10.4.2": - version: 10.4.2 - resolution: "storybook@npm:10.4.2" +"storybook@npm:10.4.6": + version: 10.4.6 + resolution: "storybook@npm:10.4.6" dependencies: "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^2.0.2" @@ -16211,7 +16229,7 @@ __metadata: "@vitest/expect": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" "@webcontainer/env": "npm:^1.1.1" - esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" + esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0" open: "npm:^10.2.0" oxc-parser: "npm:^0.127.0" oxc-resolver: "npm:^11.19.1" @@ -16232,7 +16250,7 @@ __metadata: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10/d92be1bb48bdd8bf804b3f8f02ca274d160b47bf62c35b7a9652d0391c3cc00a7a634ccd1c555b531afd4f009d0467015be52dcc1641cca54d93c870d44bf1c1 + checksum: 10/888bf94249fa34d25321f89338553465b0ad0c7d2b4965ff4f62675e7d29bfa4c25653dd932a50e631bb0ad20d7b82c3ffe45214cf23d4e22f5dc673eaa94a76 languageName: node linkType: hard From 2d74b216e498b5d6a6d8b865aa4f0a8b381adc43 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:23:48 -0500 Subject: [PATCH 080/109] bump typescript-eslint --- .../ResourceManager.Web/package.json | 4 +- .../ClientSide/Styles.Web/package.json | 6 +- yarn.lock | 159 +++++++++++++----- 3 files changed, 126 insertions(+), 43 deletions(-) diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 4b65f8229be..2b01049c57d 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -35,10 +35,10 @@ "@stencil/sass": "^3.2.3", "@stencil/store": "^2.2.2", "@types/node": "^25.9.2", - "@typescript-eslint/utils": "^8.60.1", + "@typescript-eslint/utils": "^8.61.1", "eslint": "^10.4.1", "jiti": "^2.7.0", "typescript": "^5.9.3", - "typescript-eslint": "^8.60.1" + "typescript-eslint": "^8.61.1" } } diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index 11f432b0db7..4ef5c2f94ee 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -34,10 +34,10 @@ "@stencil/eslint-plugin": "^1.3.1", "@stencil/sass": "^3.2.3", "@types/node": "^25.9.2", - "@typescript-eslint/eslint-plugin": "^8.60.1", - "@typescript-eslint/parser": "^8.60.1", + "@typescript-eslint/eslint-plugin": "^8.61.1", + "@typescript-eslint/parser": "^8.61.1", "eslint": "^10.4.1", "jiti": "^2.7.0", - "typescript-eslint": "^8.60.1" + "typescript-eslint": "^8.61.1" } } diff --git a/yarn.lock b/yarn.lock index ea27e289e1f..3b27864ffe6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4268,39 +4268,39 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.60.1, @typescript-eslint/eslint-plugin@npm:^8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.60.1" +"@typescript-eslint/eslint-plugin@npm:8.61.1, @typescript-eslint/eslint-plugin@npm:^8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.61.1" dependencies: "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.60.1" - "@typescript-eslint/type-utils": "npm:8.60.1" - "@typescript-eslint/utils": "npm:8.60.1" - "@typescript-eslint/visitor-keys": "npm:8.60.1" + "@typescript-eslint/scope-manager": "npm:8.61.1" + "@typescript-eslint/type-utils": "npm:8.61.1" + "@typescript-eslint/utils": "npm:8.61.1" + "@typescript-eslint/visitor-keys": "npm:8.61.1" ignore: "npm:^7.0.5" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.5.0" peerDependencies: - "@typescript-eslint/parser": ^8.60.1 + "@typescript-eslint/parser": ^8.61.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10/f3633bb2700bc32299578baeaf6650418656229be256147ba9d1ab09b34ef2b7fed83804ef4d2439e9189dbdcb89399d67bc8fea55262be6caa32114be048538 + checksum: 10/5434b78781f750eb1e2918f960ff3a6a3fae36951591456b1a309695a5c6c027d914038d7c2c71e614611b5c46a3be85b4b004581be0bcfb1be84e741b0e98a8 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.60.1, @typescript-eslint/parser@npm:^8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/parser@npm:8.60.1" +"@typescript-eslint/parser@npm:8.61.1, @typescript-eslint/parser@npm:^8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/parser@npm:8.61.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.60.1" - "@typescript-eslint/types": "npm:8.60.1" - "@typescript-eslint/typescript-estree": "npm:8.60.1" - "@typescript-eslint/visitor-keys": "npm:8.60.1" + "@typescript-eslint/scope-manager": "npm:8.61.1" + "@typescript-eslint/types": "npm:8.61.1" + "@typescript-eslint/typescript-estree": "npm:8.61.1" + "@typescript-eslint/visitor-keys": "npm:8.61.1" debug: "npm:^4.4.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10/f9c484c4a3897015328f328a1c6ee778d113dd134201f635c0421cb72efe6e63f3a68524aff0df6e19e76ff93daf5cabd946e67f12f10dddcf19bda534aa68dc + checksum: 10/cdaca9bb78bd6cc7210e88b28c42af11b23a47393a97ed37350e64a3846d036ebd178583fd2a54216974a740b3f6932274bdaf72046e6307ef26aee3ebe35cec languageName: node linkType: hard @@ -4317,6 +4317,19 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/project-service@npm:8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/project-service@npm:8.61.1" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.61.1" + "@typescript-eslint/types": "npm:^8.61.1" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/51eb5cbd74748d08512db976bbeabdb9352f44e220621dce3bc96837bc309c7d266df49007be196e57950cf9e12e2c574649cbf14aa2e518734ee55ff7d86f2c + languageName: node + linkType: hard + "@typescript-eslint/scope-manager@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/scope-manager@npm:8.60.1" @@ -4327,6 +4340,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/scope-manager@npm:8.61.1" + dependencies: + "@typescript-eslint/types": "npm:8.61.1" + "@typescript-eslint/visitor-keys": "npm:8.61.1" + checksum: 10/69c1d5b403b2e6adbae7e24856628941e912304ac728b6beae959df98092707adf3f60e1d0c9b90badd758d76174e9d44a7eba55608693c976e5cba5cc47593c + languageName: node + linkType: hard + "@typescript-eslint/tsconfig-utils@npm:8.60.1, @typescript-eslint/tsconfig-utils@npm:^8.60.1": version: 8.60.1 resolution: "@typescript-eslint/tsconfig-utils@npm:8.60.1" @@ -4336,19 +4359,28 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/type-utils@npm:8.60.1" +"@typescript-eslint/tsconfig-utils@npm:8.61.1, @typescript-eslint/tsconfig-utils@npm:^8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.61.1" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/ee81d01809178d6fd88a478bdf8fb546063c55f01385c6443fe7b93ebe9ba26ecda4f0eb804b2fc0a189dc34a51e89690477fb68cd099cd3952902f376d641c6 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/type-utils@npm:8.61.1" dependencies: - "@typescript-eslint/types": "npm:8.60.1" - "@typescript-eslint/typescript-estree": "npm:8.60.1" - "@typescript-eslint/utils": "npm:8.60.1" + "@typescript-eslint/types": "npm:8.61.1" + "@typescript-eslint/typescript-estree": "npm:8.61.1" + "@typescript-eslint/utils": "npm:8.61.1" debug: "npm:^4.4.3" ts-api-utils: "npm:^2.5.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10/6f426263be597063831bf308e52328e8d387af5db955a09cb85fde1c72f5b1b36a365133b9c9a74330e5e948e59bf9a9b82605f4c9c4e3bf9b6cb7f4c37e4b18 + checksum: 10/01c62227479d94ed3745e3bef5a0c870586d75b6ed550e4beb84b25df23de29558e0bdb6ff291e457977254764766c5d252b75a03d4ad592998269dba69a32a6 languageName: node linkType: hard @@ -4359,6 +4391,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.61.1, @typescript-eslint/types@npm:^8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/types@npm:8.61.1" + checksum: 10/9aa036b27d1874533bf1b931151adaaebb4380cfd14cc71395ab8d2c00c7420218e42811c2b5a68c9fa54cd048e1ab47085afd8b44cd5d736fb5cb8edd300d64 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.60.1": version: 8.60.1 resolution: "@typescript-eslint/typescript-estree@npm:8.60.1" @@ -4378,7 +4417,41 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.60.1, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0, @typescript-eslint/utils@npm:^8.60.1": +"@typescript-eslint/typescript-estree@npm:8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.61.1" + dependencies: + "@typescript-eslint/project-service": "npm:8.61.1" + "@typescript-eslint/tsconfig-utils": "npm:8.61.1" + "@typescript-eslint/types": "npm:8.61.1" + "@typescript-eslint/visitor-keys": "npm:8.61.1" + debug: "npm:^4.4.3" + minimatch: "npm:^10.2.2" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.5.0" + peerDependencies: + typescript: ">=4.8.4 <6.1.0" + checksum: 10/36b8b68e7fe9bdba0bb24b46a43a29e39f0cd45440ea190644e230d10e96b0bab9289027668910ff976100d68a9b3bc222618bf96b99bae6fd0053eb560a1257 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.61.1, @typescript-eslint/utils@npm:^8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/utils@npm:8.61.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.61.1" + "@typescript-eslint/types": "npm:8.61.1" + "@typescript-eslint/typescript-estree": "npm:8.61.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: ">=4.8.4 <6.1.0" + checksum: 10/7c8886801f73fc09ecf585b0e8f33799e4a341d51b00db0467f05853f84b808bb98a35e92eab49f28d5d24a1c915959d834214776f0ff6f0cfa5abb3f2e11496 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0": version: 8.60.1 resolution: "@typescript-eslint/utils@npm:8.60.1" dependencies: @@ -4403,6 +4476,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.61.1": + version: 8.61.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.61.1" + dependencies: + "@typescript-eslint/types": "npm:8.61.1" + eslint-visitor-keys: "npm:^5.0.0" + checksum: 10/7d99c6ae9e91d32b8cc3662ead0e393c912351b5786ece62e1dc198a6b0e9813bb7eae44772970512e7e424a342c86529d9f3dae7c8ab83ac95b5dc33826647a + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.3.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -6895,11 +6978,11 @@ __metadata: "@stencil/sass": "npm:^3.2.3" "@stencil/store": "npm:^2.2.2" "@types/node": "npm:^25.9.2" - "@typescript-eslint/utils": "npm:^8.60.1" + "@typescript-eslint/utils": "npm:^8.61.1" eslint: "npm:^10.4.1" jiti: "npm:^2.7.0" typescript: "npm:^5.9.3" - typescript-eslint: "npm:^8.60.1" + typescript-eslint: "npm:^8.61.1" languageName: unknown linkType: soft @@ -16497,11 +16580,11 @@ __metadata: "@stencil/eslint-plugin": "npm:^1.3.1" "@stencil/sass": "npm:^3.2.3" "@types/node": "npm:^25.9.2" - "@typescript-eslint/eslint-plugin": "npm:^8.60.1" - "@typescript-eslint/parser": "npm:^8.60.1" + "@typescript-eslint/eslint-plugin": "npm:^8.61.1" + "@typescript-eslint/parser": "npm:^8.61.1" eslint: "npm:^10.4.1" jiti: "npm:^2.7.0" - typescript-eslint: "npm:^8.60.1" + typescript-eslint: "npm:^8.61.1" languageName: unknown linkType: soft @@ -17182,18 +17265,18 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.60.1": - version: 8.60.1 - resolution: "typescript-eslint@npm:8.60.1" +"typescript-eslint@npm:^8.61.1": + version: 8.61.1 + resolution: "typescript-eslint@npm:8.61.1" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.60.1" - "@typescript-eslint/parser": "npm:8.60.1" - "@typescript-eslint/typescript-estree": "npm:8.60.1" - "@typescript-eslint/utils": "npm:8.60.1" + "@typescript-eslint/eslint-plugin": "npm:8.61.1" + "@typescript-eslint/parser": "npm:8.61.1" + "@typescript-eslint/typescript-estree": "npm:8.61.1" + "@typescript-eslint/utils": "npm:8.61.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: ">=4.8.4 <6.1.0" - checksum: 10/e12091ab2540b817c76b0ec6aad92e341f810310bec2b24bc95780aee106049c05363998f6ea52ed066130c8afc41dca1627f56e4c1df1dd519f4d4ca0ce4910 + checksum: 10/33a798da178f8942a5fb188a991a2eaa9047d7ca95178c67df2565531379b2a587c14ff836716a8b11ed3328c34af5e3b3ea985fa4d2a521a1bb605c2f0e0aa4 languageName: node linkType: hard From 38c820f49784966e02040faebd743a9511f9b7df Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:25:27 -0500 Subject: [PATCH 081/109] bump eslint --- DNN Platform/Dnn.ClientSide/package.json | 2 +- .../ResourceManager.Web/package.json | 2 +- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Licensing.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Roles.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Seo.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../ClientSide/SiteGroups.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/Sites.Web/package.json | 2 +- .../Sites.Web/src/_exportables/package.json | 2 +- .../ClientSide/Styles.Web/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Themes.Web/package.json | 2 +- .../ClientSide/Users.Web/package.json | 2 +- .../Users.Web/src/_exportables/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- yarn.lock | 56 +++++++++---------- 25 files changed, 52 insertions(+), 52 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index ca605091a08..2a87e9f9eb2 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -23,7 +23,7 @@ "chokidar": "^5.0.0", "cssnano": "^8.0.1", "esbuild": "^0.28.0", - "eslint": "^10.4.1", + "eslint": "^10.5.0", "modern-normalize": "^3.0.1", "postcss": "^8.5.15", "postcss-banner": "^4.0.1", diff --git a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json index 2b01049c57d..b75dc8d4819 100644 --- a/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json +++ b/DNN Platform/Modules/ResourceManager/ResourceManager.Web/package.json @@ -36,7 +36,7 @@ "@stencil/store": "^2.2.2", "@types/node": "^25.9.2", "@typescript-eslint/utils": "^8.61.1", - "eslint": "^10.4.1", + "eslint": "^10.5.0", "jiti": "^2.7.0", "typescript": "^5.9.3", "typescript-eslint": "^8.61.1" diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index 2bd1a6da179..f02eaf77f5c 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index b8549cbe704..66137239b9a 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -15,7 +15,7 @@ "create-react-class": "^15.7.0", "dayjs": "^1.11.21", "es6-promise": "4.2.8", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index e082439884a..60b3f631ebf 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -57,7 +57,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", "enzyme-to-json": "^3.6.2", - "eslint": "^10.4.1", + "eslint": "^10.5.0", "eslint-import-resolver-node": "^0.4.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index c62668eaba1..0e486dbefa0 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index e6bb57ddbfa..421720fab92 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index 729a417a587..b60bdf42a38 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -28,7 +28,7 @@ "create-react-class": "^15.7.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", - "eslint": "^10.4.1", + "eslint": "^10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index b86a72f8d12..a903f8166b1 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -21,7 +21,7 @@ "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.8", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index cc90e53fc23..e49be25e1ab 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "^2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "^1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index bb11f038921..42e7f4a3c77 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index 69593d2aa98..d60cd93ea55 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -17,7 +17,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 714b72da352..063e61f9216 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -19,7 +19,7 @@ "@types/redux": "^3.6.31", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 9a8966f31c7..090ddc36bb1 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -14,7 +14,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index c37dfb83baf..56bb809654d 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 49fb85bd389..64a2451fa42 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -19,7 +19,7 @@ "array.prototype.find": "2.2.3", "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index bf04a728266..2398d779c53 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -14,7 +14,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index 4b6fb7d4212..52b0fdcbbde 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -17,7 +17,7 @@ "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json index 4ef5c2f94ee..43497b20424 100644 --- a/Dnn.AdminExperience/ClientSide/Styles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Styles.Web/package.json @@ -36,7 +36,7 @@ "@types/node": "^25.9.2", "@typescript-eslint/eslint-plugin": "^8.61.1", "@typescript-eslint/parser": "^8.61.1", - "eslint": "^10.4.1", + "eslint": "^10.5.0", "jiti": "^2.7.0", "typescript-eslint": "^8.61.1" } diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index c99ec2f5de4..788851dd787 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index f61dd07a51a..144eb2cff7f 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-react": "^1.4.6", "@rsbuild/plugin-svgr": "^1.3.1", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 953189d8743..75625feb189 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -15,7 +15,7 @@ "@rsbuild/plugin-less": "^1.6.4", "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 584cad21c2e..600b98e5e79 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -17,7 +17,7 @@ "@rsbuild/plugin-react": "^1.4.6", "create-react-class": "^15.7.0", "dayjs": "^1.11.21", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-filenames": "^1.3.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 5782d1fad08..3d9c4cba6e3 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -18,7 +18,7 @@ "array.prototype.findindex": "2.2.4", "create-react-class": "^15.7.0", "es6-object-assign": "1.1.0", - "eslint": "10.4.1", + "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "less": "4.6.4", diff --git a/yarn.lock b/yarn.lock index 3b27864ffe6..787ab19bfc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -541,7 +541,7 @@ __metadata: enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" - eslint: "npm:^10.4.1" + eslint: "npm:^10.5.0" eslint-import-resolver-node: "npm:^0.4.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" @@ -4823,7 +4823,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -6979,7 +6979,7 @@ __metadata: "@stencil/store": "npm:^2.2.2" "@types/node": "npm:^25.9.2" "@typescript-eslint/utils": "npm:^8.61.1" - eslint: "npm:^10.4.1" + eslint: "npm:^10.5.0" jiti: "npm:^2.7.0" typescript: "npm:^5.9.3" typescript-eslint: "npm:^8.61.1" @@ -6995,7 +6995,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -7016,7 +7016,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" @@ -7040,7 +7040,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-filenames: "npm:^1.3.2" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" @@ -7069,7 +7069,7 @@ __metadata: chokidar: "npm:^5.0.0" cssnano: "npm:^8.0.1" esbuild: "npm:^0.28.0" - eslint: "npm:^10.4.1" + eslint: "npm:^10.5.0" modern-normalize: "npm:^3.0.1" postcss: "npm:^8.5.15" postcss-banner: "npm:^4.0.1" @@ -8134,9 +8134,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:10.4.1, eslint@npm:^10.4.1": - version: 10.4.1 - resolution: "eslint@npm:10.4.1" +"eslint@npm:10.5.0, eslint@npm:^10.5.0": + version: 10.5.0 + resolution: "eslint@npm:10.5.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.2" @@ -8175,7 +8175,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/5722bd0ec1a87f49ee4511c7549dcfa69df0076927b0290b0a3b145425fd357906ffe6dc1307214a0bd344131bf53795fa2cdebfd36ee9146c01d98147044679 + checksum: 10/28882f9b00803fca938015894d6e1ac2c80e00c1349385764f54ac4c0707c33fd0e32b678845c54ea0bc8ae04d59d7aa93d68dbd835e5e4833c65bf9b15ea91f languageName: node linkType: hard @@ -8342,7 +8342,7 @@ __metadata: create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" es6-promise: "npm:4.2.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -8381,7 +8381,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -11032,7 +11032,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -12934,7 +12934,7 @@ __metadata: dompurify: "npm:^3.4.8" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" - eslint: "npm:^10.4.1" + eslint: "npm:^10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -13810,7 +13810,7 @@ __metadata: enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -15016,7 +15016,7 @@ __metadata: array.prototype.findindex: "npm:^2.2.4" create-react-class: "npm:^15.7.0" es6-object-assign: "npm:^1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -15498,7 +15498,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -15605,7 +15605,7 @@ __metadata: array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -15666,7 +15666,7 @@ __metadata: create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" dompurify: "npm:^3.4.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -15878,7 +15878,7 @@ __metadata: "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -15915,7 +15915,7 @@ __metadata: array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" @@ -15945,7 +15945,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -16582,7 +16582,7 @@ __metadata: "@types/node": "npm:^25.9.2" "@typescript-eslint/eslint-plugin": "npm:^8.61.1" "@typescript-eslint/parser": "npm:^8.61.1" - eslint: "npm:^10.4.1" + eslint: "npm:^10.5.0" jiti: "npm:^2.7.0" typescript-eslint: "npm:^8.61.1" languageName: unknown @@ -16733,7 +16733,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -16761,7 +16761,7 @@ __metadata: create-react-class: "npm:^15.7.0" dompurify: "npm:^3.4.8" es6-object-assign: "npm:1.1.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" @@ -16817,7 +16817,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" less: "npm:4.6.4" @@ -17575,7 +17575,7 @@ __metadata: "@rsbuild/plugin-less": "npm:^1.6.4" "@rsbuild/plugin-react": "npm:^1.4.6" create-react-class: "npm:^15.7.0" - eslint: "npm:10.4.1" + eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" jest: "npm:^30.4.2" From 5cad3ebbbdd1f9543d03f142cd8543412ff0e035 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:26:19 -0500 Subject: [PATCH 082/109] bump cssnano --- DNN Platform/Dnn.ClientSide/package.json | 2 +- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 424 +++++++++++------------ 3 files changed, 211 insertions(+), 217 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 2a87e9f9eb2..6df11442bce 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -21,7 +21,7 @@ "@types/postcss-import": "^14.0.3", "autoprefixer": "^10.5.0", "chokidar": "^5.0.0", - "cssnano": "^8.0.1", + "cssnano": "^8.0.2", "esbuild": "^0.28.0", "eslint": "^10.5.0", "modern-normalize": "^3.0.1", diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index b531d2743c2..6b45eb35fce 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -19,7 +19,7 @@ "@types/postcss-import": "^14.0.3", "browser-sync": "^3.0.4", "chokidar": "^5.0.0", - "cssnano": "^8.0.1", + "cssnano": "^8.0.2", "glob": "^13.0.6", "postcss": "^8.5.15", "postcss-banner": "^4.0.1", diff --git a/yarn.lock b/yarn.lock index 787ab19bfc0..572cfc69ce7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4974,7 +4974,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" browser-sync: "npm:^3.0.4" chokidar: "npm:^5.0.0" - cssnano: "npm:^8.0.1" + cssnano: "npm:^8.0.2" glob: "npm:^13.0.6" normalize.css: "npm:^8.0.1" postcss: "npm:^8.5.15" @@ -5764,15 +5764,13 @@ __metadata: languageName: node linkType: hard -"caniuse-api@npm:^3.0.0": - version: 3.0.0 - resolution: "caniuse-api@npm:3.0.0" +"caniuse-api@npm:^4.0.0": + version: 4.0.0 + resolution: "caniuse-api@npm:4.0.0" dependencies: browserslist: "npm:^4.0.0" caniuse-lite: "npm:^1.0.0" - lodash.memoize: "npm:^4.1.2" - lodash.uniq: "npm:^4.5.0" - checksum: 10/db2a229383b20d0529b6b589dde99d7b6cb56ba371366f58cbbfa2929c9f42c01f873e2b6ef641d4eda9f0b4118de77dbb2805814670bdad4234bf08e720b0b4 + checksum: 10/6b698a87c26630bd4c6d2609098713cb1df5309b0dd96e2c05d2ee945f100d6770bae2e2276641f021a0e6555e55841ddf93b5d4225bd059fd66a76b61668506 languageName: node linkType: hard @@ -6532,63 +6530,63 @@ __metadata: languageName: node linkType: hard -"cssnano-preset-default@npm:^8.0.1": - version: 8.0.1 - resolution: "cssnano-preset-default@npm:8.0.1" +"cssnano-preset-default@npm:^8.0.2": + version: 8.0.2 + resolution: "cssnano-preset-default@npm:8.0.2" dependencies: browserslist: "npm:^4.28.2" - cssnano-utils: "npm:^6.0.0" + cssnano-utils: "npm:^6.0.1" postcss-calc: "npm:^10.1.1" - postcss-colormin: "npm:^8.0.0" - postcss-convert-values: "npm:^8.0.0" - postcss-discard-comments: "npm:^8.0.0" - postcss-discard-duplicates: "npm:^8.0.0" - postcss-discard-empty: "npm:^8.0.0" - postcss-discard-overridden: "npm:^8.0.0" - postcss-merge-longhand: "npm:^8.0.0" - postcss-merge-rules: "npm:^8.0.0" - postcss-minify-font-values: "npm:^8.0.0" - postcss-minify-gradients: "npm:^8.0.0" - postcss-minify-params: "npm:^8.0.0" - postcss-minify-selectors: "npm:^8.0.1" - postcss-normalize-charset: "npm:^8.0.0" - postcss-normalize-display-values: "npm:^8.0.0" - postcss-normalize-positions: "npm:^8.0.0" - postcss-normalize-repeat-style: "npm:^8.0.0" - postcss-normalize-string: "npm:^8.0.0" - postcss-normalize-timing-functions: "npm:^8.0.0" - postcss-normalize-unicode: "npm:^8.0.0" - postcss-normalize-url: "npm:^8.0.0" - postcss-normalize-whitespace: "npm:^8.0.0" - postcss-ordered-values: "npm:^8.0.0" - postcss-reduce-initial: "npm:^8.0.0" - postcss-reduce-transforms: "npm:^8.0.0" - postcss-svgo: "npm:^8.0.0" - postcss-unique-selectors: "npm:^8.0.0" + postcss-colormin: "npm:^8.0.1" + postcss-convert-values: "npm:^8.0.1" + postcss-discard-comments: "npm:^8.0.1" + postcss-discard-duplicates: "npm:^8.0.1" + postcss-discard-empty: "npm:^8.0.1" + postcss-discard-overridden: "npm:^8.0.1" + postcss-merge-longhand: "npm:^8.0.1" + postcss-merge-rules: "npm:^8.0.1" + postcss-minify-font-values: "npm:^8.0.1" + postcss-minify-gradients: "npm:^8.0.1" + postcss-minify-params: "npm:^8.0.1" + postcss-minify-selectors: "npm:^8.0.2" + postcss-normalize-charset: "npm:^8.0.1" + postcss-normalize-display-values: "npm:^8.0.1" + postcss-normalize-positions: "npm:^8.0.1" + postcss-normalize-repeat-style: "npm:^8.0.1" + postcss-normalize-string: "npm:^8.0.1" + postcss-normalize-timing-functions: "npm:^8.0.1" + postcss-normalize-unicode: "npm:^8.0.1" + postcss-normalize-url: "npm:^8.0.1" + postcss-normalize-whitespace: "npm:^8.0.1" + postcss-ordered-values: "npm:^8.0.1" + postcss-reduce-initial: "npm:^8.0.1" + postcss-reduce-transforms: "npm:^8.0.1" + postcss-svgo: "npm:^8.0.1" + postcss-unique-selectors: "npm:^8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/ca245aaff643cc83fbb8b5179b23262d3b386fb594bbe6d8ea1b49af97f5a8d78d66a96442803b5a30ce3bcc334040634c54d13d26dd7bbbe8f4ec8ed300fcef + postcss: ^8.5.15 + checksum: 10/fa78fe3e9a8ee0feabfbcfb78612a284c420f811b25e351f9fcbe2de70d9cf5a3ddd1a3c6b6d77c6259a0ffd3e613533b6da42d89df1e24e6134395f7876f3c7 languageName: node linkType: hard -"cssnano-utils@npm:^6.0.0": - version: 6.0.0 - resolution: "cssnano-utils@npm:6.0.0" +"cssnano-utils@npm:^6.0.1": + version: 6.0.1 + resolution: "cssnano-utils@npm:6.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/ce45d40337352c26e598dff535887649dab126feb2dbe950f2da013acff0a8b6723d0a3cb0f6be4cd038c93bedc01bbee337aae8f333458277fe99990557c57f + postcss: ^8.5.15 + checksum: 10/b071cfe701e87066ae7c31fd3867d3064a7966f4e09c58ef6b29cfd8f00bc638f342b8ef97812936575a049f556f420067fe9b953fdd589ffe191ff57df28615 languageName: node linkType: hard -"cssnano@npm:^8.0.1": - version: 8.0.1 - resolution: "cssnano@npm:8.0.1" +"cssnano@npm:^8.0.2": + version: 8.0.2 + resolution: "cssnano@npm:8.0.2" dependencies: - cssnano-preset-default: "npm:^8.0.1" + cssnano-preset-default: "npm:^8.0.2" lilconfig: "npm:^3.1.3" peerDependencies: - postcss: ^8.5.14 - checksum: 10/696537370478a1cdeedd928abd4ae98059269e235ddedfaeaa69bc143d851b0e8d7fb51c271fe0576e3af9ecfe6bad5b37bdb5c32f2ef5c250dd330cfd05a75e + postcss: ^8.5.15 + checksum: 10/8765bba8db1361ae2508271ea64a0705d69ed674f18dceb1aed9e754b1368698f16b1a799b0e3e29e6e5c9bb7f764eb5e2b6d86e02953c096f750886e23ad2dc languageName: node linkType: hard @@ -7067,7 +7065,7 @@ __metadata: "@types/postcss-import": "npm:^14.0.3" autoprefixer: "npm:^10.5.0" chokidar: "npm:^5.0.0" - cssnano: "npm:^8.0.1" + cssnano: "npm:^8.0.2" esbuild: "npm:^0.28.0" eslint: "npm:^10.5.0" modern-normalize: "npm:^3.0.1" @@ -11356,13 +11354,6 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:^4.1.2": - version: 4.1.2 - resolution: "lodash.memoize@npm:4.1.2" - checksum: 10/192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da - languageName: node - linkType: hard - "lodash.snakecase@npm:4.1.1": version: 4.1.1 resolution: "lodash.snakecase@npm:4.1.1" @@ -11370,13 +11361,6 @@ __metadata: languageName: node linkType: hard -"lodash.uniq@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.uniq@npm:4.5.0" - checksum: 10/86246ca64ac0755c612e5df6d93cfe92f9ecac2e5ff054b965efbbb1d9a647b6310969e78545006f70f52760554b03233ad0103324121ae31474c20d5f7a2812 - languageName: node - linkType: hard - "lodash.upperfirst@npm:4.3.1": version: 4.3.1 resolution: "lodash.upperfirst@npm:4.3.1" @@ -13322,67 +13306,67 @@ __metadata: languageName: node linkType: hard -"postcss-colormin@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-colormin@npm:8.0.0" +"postcss-colormin@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-colormin@npm:8.0.1" dependencies: "@colordx/core": "npm:^5.4.3" browserslist: "npm:^4.28.2" - caniuse-api: "npm:^3.0.0" + caniuse-api: "npm:^4.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/cf4f5a2e1e6bd4af51a8f4046b348d8725bdd27472c058eb7b30ccb343ef7ffb4be8b7bd724ee8fc7f6c9704225ef23bf078d4cf8d659f2a7cfd83638315fecf + postcss: ^8.5.15 + checksum: 10/22868643ab4e05747a8e4f14756d9a789b374eb9a9a782363b4cbf50367b8c51ee1ed0f06ec83f8c26c4aff312fc419ad24c771bf076948ee7c78d21e52190b6 languageName: node linkType: hard -"postcss-convert-values@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-convert-values@npm:8.0.0" +"postcss-convert-values@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-convert-values@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/b2cedfec08e8e900df06cb988b03bf18d6fee9e495ecbae9e40b88c32c534571b3c8a533387016015a607b3564f1e2e9a69262ce3e96af25e45d508d84ed3b0b + postcss: ^8.5.15 + checksum: 10/2f3e8dadfd8dec0a59f059c970c74bb58f96863b1ae10da55928bc6746b98f8dee174768411b77f5f4086606b252e2d8050aac2595dc778e27ce8942869963fd languageName: node linkType: hard -"postcss-discard-comments@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-discard-comments@npm:8.0.0" +"postcss-discard-comments@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-discard-comments@npm:8.0.1" dependencies: - postcss-selector-parser: "npm:^7.1.1" + postcss-selector-parser: "npm:^7.1.2" peerDependencies: - postcss: ^8.5.14 - checksum: 10/949f4297294ce676f696fc944b2b6d4e9b857b5b97f7916a04f4184f79da1d380d12d2324760de6dc8291f86e2ec1c83ae8081f48a006e8e9e3473d23760d373 + postcss: ^8.5.15 + checksum: 10/b533f218bb55c95df62475e23881950f937936e5b310fb7b775ee6550a176e6c8162e3734ccc02745b60390e7bc57a48775dc593b2e62d4d27041c907017102f languageName: node linkType: hard -"postcss-discard-duplicates@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-discard-duplicates@npm:8.0.0" +"postcss-discard-duplicates@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-discard-duplicates@npm:8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/857d883b17ace313960db557be655605da5f6b6bab540bdca5c45d72dac334fdff88cc2846ae5d8148ce8115cd9a7dbb9b9e0444fb27f73503058562471bb643 + postcss: ^8.5.15 + checksum: 10/1b7e612b63303926a5bc25b7dfc5a5a6b3fc61f60dd212a7625e6d85dfaf60d39d468ad866062965b3cc2d678fae7bef14dbe2d0415608386e0fe60722da067c languageName: node linkType: hard -"postcss-discard-empty@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-discard-empty@npm:8.0.0" +"postcss-discard-empty@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-discard-empty@npm:8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/92c9861e2b069d2f246b9601886998927f0aa2f8b514671e29898a6098811cfc77156a16d57db88eb3ff27be9b239353a7bea48c95413a887be40a650ef21d88 + postcss: ^8.5.15 + checksum: 10/4ce7bbb9bb2957e8985dc3ac444ef9c0dcd001c998199d2d4cc918c8eaae4b64b133c788a52025084f099cf13e23f20a9b3e2bde1e9728525d7764f3dc06fa0a languageName: node linkType: hard -"postcss-discard-overridden@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-discard-overridden@npm:8.0.0" +"postcss-discard-overridden@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-discard-overridden@npm:8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/0ec624bfab2736f1a4e5dfef0b9fd239e99769c04aedfaf7025131f059956a8ee5afbb0c091673bbf3a0a78d604b0ed6b88b6fdf4b6c5d12e8c73230f01480ef + postcss: ^8.5.15 + checksum: 10/b921c95d41cc457a5e224530ac301438954165ae4adb5a18a73b1194e72e8618b6181c78771e478cb9dd1385627c5484f18b8ad2160f1dba98f3cea8f45bd4f4 languageName: node linkType: hard @@ -13420,213 +13404,213 @@ __metadata: languageName: node linkType: hard -"postcss-merge-longhand@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-merge-longhand@npm:8.0.0" +"postcss-merge-longhand@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-merge-longhand@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" - stylehacks: "npm:^8.0.0" + stylehacks: "npm:^8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/c8c167c102ff30e835f7d4bae7804e5da15bb75a830adbc33297939541ac3390d7faa7ae4f73ab7796674facfca3c3d05b19cab9424bb6397694667063da516b + postcss: ^8.5.15 + checksum: 10/e7363552ecf9f1bcc2cec85af049534eb3e738fca5211ec89c84a975ae73603736c7e8c2e0065edb268bd38792cc617341f42f9338d7ed6d90f6d4408536c123 languageName: node linkType: hard -"postcss-merge-rules@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-merge-rules@npm:8.0.0" +"postcss-merge-rules@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-merge-rules@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" - caniuse-api: "npm:^3.0.0" - cssnano-utils: "npm:^6.0.0" - postcss-selector-parser: "npm:^7.1.1" + caniuse-api: "npm:^4.0.0" + cssnano-utils: "npm:^6.0.1" + postcss-selector-parser: "npm:^7.1.2" peerDependencies: - postcss: ^8.5.14 - checksum: 10/85e6c01a857e324410c4df5f3d0ce5a7fb137b088ddf0eecd6fb784a2b2c5336547a50eb262d688017872d749439551ff7ca556ca098ace6ae0c5e62390394c1 + postcss: ^8.5.15 + checksum: 10/25961ab12a756455b363393847f9c7a22ff7ed7ec101fe8597bddf5dfb5be72938381f1ba5eecc29ae4c43aaf0e333fed1d6a60f720a44f5e85e92f552834b8d languageName: node linkType: hard -"postcss-minify-font-values@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-minify-font-values@npm:8.0.0" +"postcss-minify-font-values@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-minify-font-values@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/c5ab440e450fb71592fff8018150b5d2a99bb9068578e1c5b5c10187ef34c58365895ef23a45ef39abd4ad2422f76e997ede8f2a7e71832aaa8b09e6c12936fa + postcss: ^8.5.15 + checksum: 10/7a799d19213a2b87153c17516de4592d8c0f1f016375cfcac4f720e4b0c31c6a8819c0db169f3c850277192959e3fd58b71f9bcc0675b777a4779bdb5bf7499e languageName: node linkType: hard -"postcss-minify-gradients@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-minify-gradients@npm:8.0.0" +"postcss-minify-gradients@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-minify-gradients@npm:8.0.1" dependencies: "@colordx/core": "npm:^5.4.3" - cssnano-utils: "npm:^6.0.0" + cssnano-utils: "npm:^6.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/7fa8a718f79de8b0377c19f4eb2aa304641a0dea243a4b53df88c0f7061b093e34e54143822e8ea963d9f92ecaf298f61cef003adf6e0cdccfb89af195cab5d9 + postcss: ^8.5.15 + checksum: 10/4bf49aa5edcdb662d07a13d2bfd3e8414e6ef71f922ca4c2e7c82b1aa622ca3f70be24df85743da818aee4343855406e40e85e76fc6bff607ed0d53e0364ef77 languageName: node linkType: hard -"postcss-minify-params@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-minify-params@npm:8.0.0" +"postcss-minify-params@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-minify-params@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" - cssnano-utils: "npm:^6.0.0" + cssnano-utils: "npm:^6.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/8cc79b825412dd1bcb18d2891305bb5b297fa843cb51bc7f1f289d8a2deeb01acb7d49e9e027774175f3da136bcdba973f6aeaa77f83c959ecdd1f21e304e912 + postcss: ^8.5.15 + checksum: 10/8adaf6015e1114dcf6d305d681bb5ef2d39e5116bbb0ba3a73bc028dc2ab002173e0a2f9d3f79c263645e1e8ef910ef52c5eb194d3f25be542e0973c97e36196 languageName: node linkType: hard -"postcss-minify-selectors@npm:^8.0.1": - version: 8.0.1 - resolution: "postcss-minify-selectors@npm:8.0.1" +"postcss-minify-selectors@npm:^8.0.2": + version: 8.0.2 + resolution: "postcss-minify-selectors@npm:8.0.2" dependencies: browserslist: "npm:^4.28.1" - caniuse-api: "npm:^3.0.0" + caniuse-api: "npm:^4.0.0" cssesc: "npm:^3.0.0" - postcss-selector-parser: "npm:^7.1.1" + postcss-selector-parser: "npm:^7.1.2" peerDependencies: - postcss: ^8.5.14 - checksum: 10/d49afafe548f08e5195c1b650f1b84e9ba116153f80728d059b177e4e3824bcc2e67d92cd6244b9e4be93356c90451af5b6387e9a06a9e9caab64f3e273cf208 + postcss: ^8.5.15 + checksum: 10/c20dde3fd1131d89d963a6e96a7585dea8eb98df78a293a5954d17001691c2502dfef2a3fc91bd0f8cf25864ee855cd57c78e57b34c1c3e8ce87294b952940b4 languageName: node linkType: hard -"postcss-normalize-charset@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-charset@npm:8.0.0" +"postcss-normalize-charset@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-charset@npm:8.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/500561e553f732205e01c9e5a01b29bb5a4ab02017ac02c4db4d2497889f683caf9e0c6030f0d2f16a58d8f86ba9cee4f2f73605fdeaa3bc47b4778c779acc93 + postcss: ^8.5.15 + checksum: 10/88124225d18f108928c488d5edd49a4d1137b7496c50ca423ab26dfaf980d23b3621b8d1294bffd4ee5fe69507dc4ad15936b3ed86709ad6c19126b50cf42d54 languageName: node linkType: hard -"postcss-normalize-display-values@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-display-values@npm:8.0.0" +"postcss-normalize-display-values@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-display-values@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/106906ff5b46b6c53086ee1266d0aa190e27d92bf189a40d5cc664554b5f457d83e976e1256ff10b26e2758885a62fc82b3c6ee660a03b9ecf12c09bb7a16ba7 + postcss: ^8.5.15 + checksum: 10/f02d55a8cb91524e60ce9ad588ace516257c5afbef002192b993b954d81d6c90510725b5bef5422bc99f14c05ea2885b5dedf333fdb6f03b737a67c7b1442416 languageName: node linkType: hard -"postcss-normalize-positions@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-positions@npm:8.0.0" +"postcss-normalize-positions@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-positions@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/3b05ebc4fc30134de57caf23e799f4d1ff6dec7ad5c7eb3ae3cfe7d1198d66e6b4071d74a1d419db050adeb6629a2f756fa30bab85109fda1c331a7e9f407346 + postcss: ^8.5.15 + checksum: 10/5b2dd1211ac670dc5cce43d9a5d34922c397a758dbcb2fab0cbe5c5743cf63c73c9a427baceb07357e21b2fbba4040a7c39b7e83ddc162d4134b10cea631e3ec languageName: node linkType: hard -"postcss-normalize-repeat-style@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-repeat-style@npm:8.0.0" +"postcss-normalize-repeat-style@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-repeat-style@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/a466b490fe9ddd120bbf6b2f49c03625ac20b86a342d7dc4846da4fe7f6d21d77814c92ed10f75ade164ca9e566eaf4141261e3415fc7a34815c04a13cb26801 + postcss: ^8.5.15 + checksum: 10/0830617de37821eb17d24fe9e3dc85524c61149428bd5aca185c1192c037590f7d2ec02ab8a8cff3869e1560d9a28fad21bd4d947f7962e7e4effd8c4584ae75 languageName: node linkType: hard -"postcss-normalize-string@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-string@npm:8.0.0" +"postcss-normalize-string@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-string@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/9cb2e8d45bc2845cb353acadebb9081b87a12edc8f76c843f9c6b7beabb9b6411fd883bf70ddd6ed95e11296edd0cbc5fa821503dbe70e2a0bb58a5c732b0483 + postcss: ^8.5.15 + checksum: 10/d09ce2785362e957e97eaf4c7f4c028b273e8c7b1d5cdfff9ccbeb985d80714d0384fd34da1b59598c041b1408d0f8ee8ff61a38e07761d1af93a5fd4584be5a languageName: node linkType: hard -"postcss-normalize-timing-functions@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-timing-functions@npm:8.0.0" +"postcss-normalize-timing-functions@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-timing-functions@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/f4830d96272014f5a5cca76fccb0f5a41de01af70afdf43d97c4264a05cdcbb0d0f2444d9f62eb86b7ac796c3abb5a8a66202e7f2a9dbd84c665f7f49bf76d1e + postcss: ^8.5.15 + checksum: 10/793abc2b21a83c68137dcf47deb2df347cf5fc3d3d9d9c84fb665d0b697e3e52df191aff6d18a87b1f6f73503ea76c3c8380a04e3711c09609858bcd6c5b5c80 languageName: node linkType: hard -"postcss-normalize-unicode@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-unicode@npm:8.0.0" +"postcss-normalize-unicode@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-unicode@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/ab3481ef7aebf187a5135f2e25ea8d1e5fe933b3760d62535b71545733fa366e22d9aa0fe33531efaf33c723868be17d8fa46afc00a835301b3688ca723a4f84 + postcss: ^8.5.15 + checksum: 10/07eb6471f7b2a9d8e8b570fe3705fcadcc11d78963e921e48e3fdaeefda5dcd0364cbe73b5163db1618a05dfd52db4c594c76b1631eae88e7d68f0256597b111 languageName: node linkType: hard -"postcss-normalize-url@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-url@npm:8.0.0" +"postcss-normalize-url@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-url@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/88cc2ec142389b87956d8117f7e1345321ab56367895f2f96e59ed5fb91e40c2ab16d775fe4b92c3b6473811719aa005cebd590d5864157104d9c410f8dee8ae + postcss: ^8.5.15 + checksum: 10/9ee54a2b6bb51541d400b31f63a1ee8b6f78a2db02f0608e9c44483a313d96874040c0fd99cb5d48439773f99f728f0e5a05753aa50de3562ea8037d3489d9ce languageName: node linkType: hard -"postcss-normalize-whitespace@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-normalize-whitespace@npm:8.0.0" +"postcss-normalize-whitespace@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-normalize-whitespace@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/e72afa4bb504d6e3bb35c08626ad2761994a2e99c1c213ce0d3d78595f5e9ba2e99d40201ea31fcd14f19aa3133f75d36767945d679acef01231b9c1078176a3 + postcss: ^8.5.15 + checksum: 10/b646c4dd4ad03f154e41362febfa45f25baf998bccea207e486e25032daa5e87a6b117feabfbbb0cffe6368ee4d489775e3c1fc8683a29e27ac7842bba171ccb languageName: node linkType: hard -"postcss-ordered-values@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-ordered-values@npm:8.0.0" +"postcss-ordered-values@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-ordered-values@npm:8.0.1" dependencies: - cssnano-utils: "npm:^6.0.0" + cssnano-utils: "npm:^6.0.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/ec7c828f14c0b5494b6ef3d654c08d89335bd8574b7fbab07551b0682ba0d551c033c0b250372801673260de43852ddd68bf361e1ea934465254c2979d53feba + postcss: ^8.5.15 + checksum: 10/22fea4d20e2333014bb6742f198b66374d56ed7c80e71cc7ef4df2e2228a68c446a2c9d242291e193670ad52325755e58773b3298d961a3314dbf03a4c0778c1 languageName: node linkType: hard -"postcss-reduce-initial@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-reduce-initial@npm:8.0.0" +"postcss-reduce-initial@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-reduce-initial@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" - caniuse-api: "npm:^3.0.0" + caniuse-api: "npm:^4.0.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/ca4ff4d9de7703905bf1ed0ea98625441630cdfb46a87226c9e44cdb39bce1b284e7a3305c07d013bb85f49a5df3a677eb4263a18e33576d1e4a1bbee99bf1a0 + postcss: ^8.5.15 + checksum: 10/137ded1ddf5f00043ff6418bc114ae2d2632401c3929b83bb1fd80097f34d58e57e945a1478b6a0d5441ef6904469c82adff47e6b020898bd7291ac1f93d9245 languageName: node linkType: hard -"postcss-reduce-transforms@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-reduce-transforms@npm:8.0.0" +"postcss-reduce-transforms@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-reduce-transforms@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: - postcss: ^8.5.14 - checksum: 10/8995b6172244458d083af73b37e6249e0c5858f05b40f4ae8b198bc984d3e61aec3a4539c558031a9ec0601638c1d90dd5ce3287d1ba3f482bd7e12f513c99f0 + postcss: ^8.5.15 + checksum: 10/85b26534e678ffb9f89b530835fc46b2f0bd852d870a2213469f39f29cde9fa8f0987a5147118c0151b6036ce336008e4c1d43d3f235c75ac18107ac70c2f873 languageName: node linkType: hard @@ -13642,7 +13626,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.1": +"postcss-selector-parser@npm:^7.0.0": version: 7.1.1 resolution: "postcss-selector-parser@npm:7.1.1" dependencies: @@ -13652,26 +13636,36 @@ __metadata: languageName: node linkType: hard -"postcss-svgo@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-svgo@npm:8.0.0" +"postcss-selector-parser@npm:^7.1.2": + version: 7.1.4 + resolution: "postcss-selector-parser@npm:7.1.4" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/c6d36b37defd387d65b5e0b778cd441303d147eb4a4b7135c6a0452fa777310027218db3ff71a19fb831d067bcdf45a776c6ed71d83bd2ced8afc2e3d5b03385 + languageName: node + linkType: hard + +"postcss-svgo@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-svgo@npm:8.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" svgo: "npm:^4.0.1" peerDependencies: - postcss: ^8.5.14 - checksum: 10/4c51b8bf29874c5afb61205063b774497b26bff322b8eeef0ee16afa360271e30d5976d5d4bdf9506b4b701481b7fef701245489ad41cfc41c4dd18ae3fa5e35 + postcss: ^8.5.15 + checksum: 10/003e2d781ae9c5bb81231bea1f245146d58991d9c2fabcf8715dfa92d776e8bda7d8c6629e05eaaddfa94ec13cdf0abc5c14a50630ce40b9e451b2a0ccaaa07d languageName: node linkType: hard -"postcss-unique-selectors@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-unique-selectors@npm:8.0.0" +"postcss-unique-selectors@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-unique-selectors@npm:8.0.1" dependencies: - postcss-selector-parser: "npm:^7.1.1" + postcss-selector-parser: "npm:^7.1.2" peerDependencies: - postcss: ^8.5.14 - checksum: 10/3dd60fda1472ebe4e720189ab75c54a2879be3e7ab42b4925bb78fec637426eb7278fa3f9b4441933fcfa4a7c4bb616436782c7bce293f95ba65471033cf195b + postcss: ^8.5.15 + checksum: 10/b7101b23610f5ea3a975dd22dde3707c5f4fa943ee9b783c225f7f381c3d9ba87af1ec097849209248a9bfe040bbc47d9f84d6a93a908ff8b74e1823324e6051 languageName: node linkType: hard @@ -16559,15 +16553,15 @@ __metadata: languageName: node linkType: hard -"stylehacks@npm:^8.0.0": - version: 8.0.0 - resolution: "stylehacks@npm:8.0.0" +"stylehacks@npm:^8.0.1": + version: 8.0.1 + resolution: "stylehacks@npm:8.0.1" dependencies: browserslist: "npm:^4.28.2" - postcss-selector-parser: "npm:^7.1.1" + postcss-selector-parser: "npm:^7.1.2" peerDependencies: - postcss: ^8.5.14 - checksum: 10/024d3200664647aec37f5487b67f1761457e4518cf7d028bf8872a41fb668beb21448b8d1d21c5ebed7f158fc88cccec342101657d1cfc72090f8a73079ee8d0 + postcss: ^8.5.15 + checksum: 10/fe2b8d62bb335b227ba252ea4ccf3dfafc687a53ad9711daae50753e8e3f257f603af6475f9095aa7e4ad53b3dd367b3734d58e300ba93c54566157170071680 languageName: node linkType: hard From c1241ab8c0f14d5d629ec96d343a42478d39dc65 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:26:32 -0500 Subject: [PATCH 083/109] bump esbuild --- DNN Platform/Dnn.ClientSide/package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DNN Platform/Dnn.ClientSide/package.json b/DNN Platform/Dnn.ClientSide/package.json index 6df11442bce..10d3f4d14fe 100644 --- a/DNN Platform/Dnn.ClientSide/package.json +++ b/DNN Platform/Dnn.ClientSide/package.json @@ -22,7 +22,7 @@ "autoprefixer": "^10.5.0", "chokidar": "^5.0.0", "cssnano": "^8.0.2", - "esbuild": "^0.28.0", + "esbuild": "^0.28.1", "eslint": "^10.5.0", "modern-normalize": "^3.0.1", "postcss": "^8.5.15", diff --git a/yarn.lock b/yarn.lock index 572cfc69ce7..82d6374a9dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7066,7 +7066,7 @@ __metadata: autoprefixer: "npm:^10.5.0" chokidar: "npm:^5.0.0" cssnano: "npm:^8.0.2" - esbuild: "npm:^0.28.0" + esbuild: "npm:^0.28.1" eslint: "npm:^10.5.0" modern-normalize: "npm:^3.0.1" postcss: "npm:^8.5.15" From f4a5fabea80573f0e054f29c00a55bb38054d3d5 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:26:41 -0500 Subject: [PATCH 084/109] bump less --- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Licensing.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Roles.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Seo.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../ClientSide/SiteGroups.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/Sites.Web/package.json | 2 +- .../Sites.Web/src/_exportables/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Themes.Web/package.json | 2 +- .../ClientSide/Users.Web/package.json | 2 +- .../Users.Web/src/_exportables/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- yarn.lock | 85 ++++++++++++++----- 22 files changed, 84 insertions(+), 43 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index f02eaf77f5c..ed8c580a423 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -20,7 +20,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "15.8.1", "react": "^16.14.0", "react-click-outside": "^3.0.1", diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 66137239b9a..41f87249561 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-collapse": "5.1.1", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 60b3f631ebf..828bc411d0e 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -64,7 +64,7 @@ "eslint-plugin-jest": "^29.15.2", "eslint-plugin-react": "7.37.5", "eslint-plugin-storybook": "10.4.6", - "less": "4.6.4", + "less": "4.6.6", "nanoid": "^5.1.11", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index 0e486dbefa0..a9cbf75d101 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json index 421720fab92..4930aa07549 100644 --- a/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Licensing.Web/package.json @@ -20,7 +20,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index b60bdf42a38..afdc699675f 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -32,7 +32,7 @@ "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", - "less": "4.6.4", + "less": "4.6.6", "lodash": "4.18.1", "react-custom-scrollbars": "4.2.1", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index a903f8166b1..9bd0cfe2859 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -25,7 +25,7 @@ "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", - "less": "4.6.4", + "less": "4.6.6", "localization": "^1.0.2", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json index e49be25e1ab..0d88f4aea10 100644 --- a/Dnn.AdminExperience/ClientSide/Roles.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Roles.Web/package.json @@ -21,7 +21,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-click-outside": "^3.0.1", diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index 42e7f4a3c77..bafb3febd10 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json index d60cd93ea55..b4dbd76a520 100644 --- a/Dnn.AdminExperience/ClientSide/Seo.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Seo.Web/package.json @@ -20,7 +20,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index 063e61f9216..a104504d242 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -22,7 +22,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json index 090ddc36bb1..bfeec2f665a 100644 --- a/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteGroups.Web/package.json @@ -17,7 +17,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 56bb809654d..907f733d481 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "localization": "^1.0.2", "prop-types": "^15.8.1", "rc-progress": "^4.0.0", diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 64a2451fa42..7d7d8143735 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -24,7 +24,7 @@ "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-custom-scrollbars": "4.2.1", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json index 2398d779c53..c9360923729 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/package.json @@ -17,7 +17,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json index 52b0fdcbbde..3c2483907d6 100644 --- a/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Sites.Web/src/_exportables/package.json @@ -22,7 +22,7 @@ "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 788851dd787..48652d5bee5 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -21,7 +21,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json index 144eb2cff7f..2b2db6ac67c 100644 --- a/Dnn.AdminExperience/ClientSide/Themes.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Themes.Web/package.json @@ -18,7 +18,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/package.json index 75625feb189..15a3beb1b29 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/package.json @@ -19,7 +19,7 @@ "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", "jest": "^30.4.2", - "less": "4.6.4", + "less": "4.6.6", "prop-types": "^15.8.1", "react": "^16.14.0", "react-dom": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json index 600b98e5e79..80f0a5a070d 100644 --- a/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json +++ b/Dnn.AdminExperience/ClientSide/Users.Web/src/_exportables/package.json @@ -22,7 +22,7 @@ "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "7.37.5", "eslint-plugin-spellcheck": "0.0.20", - "less": "4.6.4", + "less": "4.6.6", "localization": "^1.0.2", "prop-types": "15.8.1", "react": "^16.14.0", diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 3d9c4cba6e3..7ab4262e052 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -21,7 +21,7 @@ "eslint": "10.5.0", "eslint-plugin-react": "7.37.5", "globals": "^17.6.0", - "less": "4.6.4", + "less": "4.6.6", "object-path": "0.11.8", "prop-types": "^15.8.1", "react": "^16.14.0", diff --git a/yarn.lock b/yarn.lock index 82d6374a9dd..f1a3adea6bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -550,7 +550,7 @@ __metadata: eslint-plugin-storybook: "npm:10.4.6" html-react-parser: "npm:^6.1.3" interact.js: "npm:^1.2.8" - less: "npm:4.6.4" + less: "npm:4.6.6" nanoid: "npm:^5.1.11" prop-types: "npm:^15.8.1" raw-loader: "npm:4.0.2" @@ -4827,7 +4827,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:15.8.1" react: "npm:^16.14.0" react-click-outside: "npm:^3.0.1" @@ -6996,7 +6996,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -7019,7 +7019,7 @@ __metadata: eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -7043,7 +7043,7 @@ __metadata: eslint-plugin-import: "npm:^2.32.0" eslint-plugin-react: "npm:7.37.5" eslint-plugin-spellcheck: "npm:0.0.20" - less: "npm:4.6.4" + less: "npm:4.6.6" localization: "npm:^1.0.2" prop-types: "npm:15.8.1" react: "npm:^16.14.0" @@ -8343,7 +8343,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-collapse: "npm:5.1.1" @@ -8383,7 +8383,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -10941,7 +10941,41 @@ __metadata: languageName: node linkType: hard -"less@npm:4.6.4, less@npm:^4.6.4": +"less@npm:4.6.6": + version: 4.6.6 + resolution: "less@npm:4.6.6" + dependencies: + copy-anything: "npm:^3.0.5" + errno: "npm:^0.1.1" + graceful-fs: "npm:^4.1.2" + image-size: "npm:~0.5.0" + make-dir: "npm:^5.1.0" + mime: "npm:^1.4.1" + needle: "npm:^3.1.0" + parse-node-version: "npm:^1.0.1" + source-map: "npm:~0.6.0" + dependenciesMeta: + errno: + optional: true + graceful-fs: + optional: true + image-size: + optional: true + make-dir: + optional: true + mime: + optional: true + needle: + optional: true + source-map: + optional: true + bin: + lessc: bin/lessc + checksum: 10/2d3cba18c8b2994984d4eeba16eebf8ac220e1f72d3f5e7aa98b22c4dcb7464995c72aca3c052719d1345b5daed68a1aaea55faa65ad84816d0e74a4d6864b76 + languageName: node + linkType: hard + +"less@npm:^4.6.4": version: 4.6.4 resolution: "less@npm:4.6.4" dependencies: @@ -11033,7 +11067,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -11481,6 +11515,13 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:^5.1.0": + version: 5.1.0 + resolution: "make-dir@npm:5.1.0" + checksum: 10/372abd9cbb2029bead4efe6c369c9af8ae77773d9a31ed5378fd7ae8072f06ea272aec5c7aba7543d3b8578a45b0bf90d86a78ab311afa4bc3446000977095a9 + languageName: node + linkType: hard + "make-fetch-happen@npm:15.0.2, make-fetch-happen@npm:^15.0.0, make-fetch-happen@npm:^15.0.2": version: 15.0.2 resolution: "make-fetch-happen@npm:15.0.2" @@ -12923,7 +12964,7 @@ __metadata: globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" jest: "npm:^30.4.2" - less: "npm:4.6.4" + less: "npm:4.6.6" lodash: "npm:4.18.1" promise: "npm:^8.3.0" prop-types: "npm:^15.8.1" @@ -13809,7 +13850,7 @@ __metadata: globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" jest: "npm:^30.4.2" - less: "npm:4.6.4" + less: "npm:4.6.6" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -15013,7 +15054,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-click-outside: "npm:^3.0.1" @@ -15496,7 +15537,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -15602,7 +15643,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -15664,7 +15705,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-custom-scrollbars: "npm:^4.2.1" @@ -15876,7 +15917,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" rc-progress: "npm:^4.0.0" @@ -15915,7 +15956,7 @@ __metadata: globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" jest: "npm:^30.4.2" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-custom-scrollbars: "npm:4.2.1" @@ -15942,7 +15983,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -16731,7 +16772,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -16759,7 +16800,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" html-react-parser: "npm:^6.1.3" - less: "npm:4.6.4" + less: "npm:4.6.6" object-path: "npm:0.11.8" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" @@ -16814,7 +16855,7 @@ __metadata: eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" - less: "npm:4.6.4" + less: "npm:4.6.6" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" react-dom: "npm:^16.14.0" @@ -17573,7 +17614,7 @@ __metadata: eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" jest: "npm:^30.4.2" - less: "npm:4.6.4" + less: "npm:4.6.6" localization: "npm:^1.0.2" prop-types: "npm:^15.8.1" react: "npm:^16.14.0" From a2a2ed128db4ac1de8f7b4fc91192aaf3894d2d6 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:26:53 -0500 Subject: [PATCH 085/109] bump react-router --- .../Samples/Dnn.ContactList.SpaReact/package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json index f39363cd733..00c0a0a105a 100644 --- a/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json +++ b/DNN Platform/Modules/Samples/Dnn.ContactList.SpaReact/package.json @@ -12,7 +12,7 @@ "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router": "^7.17.0" + "react-router": "^7.18.0" }, "devDependencies": { "@types/react": "^19.2.17", diff --git a/yarn.lock b/yarn.lock index f1a3adea6bf..609cdd3923e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7088,7 +7088,7 @@ __metadata: "@vitejs/plugin-react": "npm:^6.0.2" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" - react-router: "npm:^7.17.0" + react-router: "npm:^7.18.0" typescript: "npm:^5.9.3" vite: "npm:^8.0.16" languageName: unknown @@ -14377,9 +14377,9 @@ __metadata: languageName: node linkType: hard -"react-router@npm:^7.17.0": - version: 7.17.0 - resolution: "react-router@npm:7.17.0" +"react-router@npm:^7.18.0": + version: 7.18.0 + resolution: "react-router@npm:7.18.0" dependencies: cookie: "npm:^1.0.1" set-cookie-parser: "npm:^2.6.0" @@ -14389,7 +14389,7 @@ __metadata: peerDependenciesMeta: react-dom: optional: true - checksum: 10/0f1303150cd607682f911c32b3584cb88bd6312004553032b4db36a7917eae1eba08ba527d42647cb3842e76c313b2ad67fafa1cbfe554c14e6e87c13535b8a1 + checksum: 10/a69b5502a3549de56adce7ba87ae02ac5b052da49eae261124824dd963d047218795706c780e019f366961a7a1e073417a96b295b743f6f57d2a30c68fd78d61 languageName: node linkType: hard From 3704c75947c2e91bf6a78dcbfdfaea119417beca Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:27:04 -0500 Subject: [PATCH 086/109] bump react-tooltip --- .../ClientSide/Bundle.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- yarn.lock | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json index 41f87249561..f096da58408 100644 --- a/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Bundle.Web/package.json @@ -30,7 +30,7 @@ "react-motion": "0.5.2", "react-redux": "8.1.3", "react-tabs": "3.2.3", - "react-tooltip": "^6.0.7", + "react-tooltip": "^6.0.8", "react-widgets": "^5.8.6", "redux": "4.2.1", "redux-devtools": "3.7.0", diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index 828bc411d0e..f3aa38dc732 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -39,7 +39,7 @@ "react-scrollbar": "^0.5.6", "react-slider": "2.0.6", "react-tabs": "3.2.3", - "react-tooltip": "^6.0.7", + "react-tooltip": "^6.0.8", "react-widgets": "^5.8.6", "redux-undo": "^1.0.0-beta9", "scroll": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index 609cdd3923e..d509e589a77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -568,7 +568,7 @@ __metadata: react-slider: "npm:2.0.6" react-tabs: "npm:3.2.3" react-test-renderer: "npm:^17.0.2" - react-tooltip: "npm:^6.0.7" + react-tooltip: "npm:^6.0.8" react-widgets: "npm:^5.8.6" redux-undo: "npm:^1.0.0-beta9" scroll: "npm:^3.0.1" @@ -8355,7 +8355,7 @@ __metadata: react-motion: "npm:0.5.2" react-redux: "npm:8.1.3" react-tabs: "npm:3.2.3" - react-tooltip: "npm:^6.0.7" + react-tooltip: "npm:^6.0.8" react-widgets: "npm:^5.8.6" redux: "npm:4.2.1" redux-devtools: "npm:3.7.0" @@ -14470,16 +14470,16 @@ __metadata: languageName: node linkType: hard -"react-tooltip@npm:^6.0.7": - version: 6.0.7 - resolution: "react-tooltip@npm:6.0.7" +"react-tooltip@npm:^6.0.8": + version: 6.0.8 + resolution: "react-tooltip@npm:6.0.8" dependencies: "@floating-ui/dom": "npm:1.7.6" clsx: "npm:2.1.1" peerDependencies: react: ">=16.14.0" react-dom: ">=16.14.0" - checksum: 10/fc1a75e5ca99f23772d4f13a6d03d28baeb7f2ee09565da877b53d894ea1675e7d52b2ed9d4c1bd73537c9604dd9800c71c2333251f04968ea8ec48a498f287d + checksum: 10/b0823d8c48375953862c39261bde60b02339b38f64501572bdc51d1c201155a11ca62593b2b1f52d59706d92a35e9933bbf984433a63d5025fce9ba576a81fea languageName: node linkType: hard From 81c827e4a9314cdf92017dad906ec2be9967a671 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:27:16 -0500 Subject: [PATCH 087/109] bump zip-lib --- DNN Platform/Skins/Aperture/package.json | 2 +- yarn.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/DNN Platform/Skins/Aperture/package.json b/DNN Platform/Skins/Aperture/package.json index 6b45eb35fce..404e4824de7 100644 --- a/DNN Platform/Skins/Aperture/package.json +++ b/DNN Platform/Skins/Aperture/package.json @@ -28,7 +28,7 @@ "sass-embedded": "^1.100.0", "tsx": "^4.22.4", "typescript": "^5.9.3", - "zip-lib": "^1.3.4" + "zip-lib": "^1.4.0" }, "browserslist": [ "last 2 versions", diff --git a/yarn.lock b/yarn.lock index d509e589a77..350609c72be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4984,7 +4984,7 @@ __metadata: sass-embedded: "npm:^1.100.0" tsx: "npm:^4.22.4" typescript: "npm:^5.9.3" - zip-lib: "npm:^1.3.4" + zip-lib: "npm:^1.4.0" languageName: unknown linkType: soft @@ -18159,7 +18159,7 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^3.3.1": +"yauzl@npm:^3.4.0": version: 3.4.0 resolution: "yauzl@npm:3.4.0" dependencies: @@ -18191,12 +18191,12 @@ __metadata: languageName: node linkType: hard -"zip-lib@npm:^1.3.4": - version: 1.3.4 - resolution: "zip-lib@npm:1.3.4" +"zip-lib@npm:^1.4.0": + version: 1.4.0 + resolution: "zip-lib@npm:1.4.0" dependencies: - yauzl: "npm:^3.3.1" + yauzl: "npm:^3.4.0" yazl: "npm:^3.3.1" - checksum: 10/fd6c6b052f06131ea4efb843414d2538b1f5764b19054d5e43bbdae797110fdfdcdb958e6062e42d97dcc99e2c8ed6e7f55f8f50dee7cb1c6ac82f6271aebf26 + checksum: 10/ca8c308dc637699a727ded116c21a2fbc94a5356ba8d76ac3e9f3b44c3eaef1d6558a60e9c05a986e63830458fce15bef7033b5b58d3d77df71fe3bbf5715deb languageName: node linkType: hard From 3546605c95ec0bc927f30ded04aef219a1653d79 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 10:27:35 -0500 Subject: [PATCH 088/109] bump dompurify --- .../ClientSide/AdminLogs.Web/package.json | 2 +- .../ClientSide/Dnn.React.Common/package.json | 2 +- .../ClientSide/Extensions.Web/package.json | 2 +- .../ClientSide/Pages.Web/package.json | 2 +- .../ClientSide/Prompt.Web/package.json | 2 +- .../ClientSide/Security.Web/package.json | 2 +- .../ClientSide/Servers.Web/package.json | 2 +- .../SiteImportExport.Web/package.json | 2 +- .../ClientSide/SiteSettings.Web/package.json | 2 +- .../ClientSide/TaskScheduler.Web/package.json | 2 +- .../ClientSide/Vocabularies.Web/package.json | 2 +- .../editBar/scripts/contrib/purify.min.js | 4 +-- .../personaBar/scripts/contrib/purify.min.js | 4 +-- yarn.lock | 30 +++++++++---------- 14 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json index ed8c580a423..81d7d465bb5 100644 --- a/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/AdminLogs.Web/package.json @@ -37,7 +37,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json index f3aa38dc732..431e528bb61 100644 --- a/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json +++ b/Dnn.AdminExperience/ClientSide/Dnn.React.Common/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "dayjs": "^1.11.21", - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3", "interact.js": "^1.2.8", "raw-loader": "4.0.2", diff --git a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json index a9cbf75d101..396010c1da5 100644 --- a/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Extensions.Web/package.json @@ -26,7 +26,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json index afdc699675f..dc77b0ae61c 100644 --- a/Dnn.AdminExperience/ClientSide/Pages.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Pages.Web/package.json @@ -45,7 +45,7 @@ }, "dependencies": { "dayjs": "^1.11.21", - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3", "promise": "^8.3.0", "prop-types": "^15.8.1", diff --git a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json index 9bd0cfe2859..4416ab58967 100644 --- a/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Prompt.Web/package.json @@ -45,7 +45,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Security.Web/package.json b/Dnn.AdminExperience/ClientSide/Security.Web/package.json index bafb3febd10..70744c92326 100644 --- a/Dnn.AdminExperience/ClientSide/Security.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Security.Web/package.json @@ -30,7 +30,7 @@ "redux-thunk": "^2.4.2" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json index a104504d242..1d7739a6b2b 100644 --- a/Dnn.AdminExperience/ClientSide/Servers.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Servers.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3", "react-custom-scrollbars": "^4.2.1" } diff --git a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json index 907f733d481..2f67cd4775c 100644 --- a/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteImportExport.Web/package.json @@ -37,7 +37,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json index 7d7d8143735..e64ec5e9245 100644 --- a/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/SiteSettings.Web/package.json @@ -38,7 +38,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json index 48652d5bee5..49a2a6338c4 100644 --- a/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/TaskScheduler.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json index 7ab4262e052..ab520b698b1 100644 --- a/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json +++ b/Dnn.AdminExperience/ClientSide/Vocabularies.Web/package.json @@ -30,7 +30,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "dompurify": "^3.4.8", + "dompurify": "^3.4.10", "html-react-parser": "^6.1.3" } } diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js index dbf05df7541..e74386fed67 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.8/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function P(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=1,le=3,ce=7,se=8,ue=9,fe=11,me=function(){return"undefined"==typeof window?null:window};var pe=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:me();const o=t=>e(t);if(o.version="3.4.8",o.removed=[],!t||!t.document||t.document.nodeType!==ue||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const c=t.HTMLTemplateElement,u=t.Node,f=t.Element,m=t.NodeFilter,k=t.NamedNodeMap;void 0===k&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const L=t.DOMParser,P=t.trustedTypes,pe=f.prototype,de=U(pe,"cloneNode"),he=U(pe,"remove"),ge=U(pe,"nextSibling"),ye=U(pe,"childNodes"),Te=U(pe,"parentNode"),be=U(pe,"shadowRoot"),Ae=U(pe,"attributes"),Se=u&&u.prototype?U(u.prototype,"nodeType"):null,Ee=u&&u.prototype?U(u.prototype,"nodeName"):null;if("function"==typeof c){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let _e,Ne="",Oe=0;const De=function(e){if(Oe>0)throw x('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');Oe++;try{return _e.createHTML(e)}finally{Oe--}},Re=r,we=Re.implementation,Ie=Re.createNodeIterator,ve=Re.createDocumentFragment,Ce=Re.getElementsByTagName,xe=i.importNode;let ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof Te&&we&&void 0!==we.createHTMLDocument;const Le=V,Me=Z,Pe=J,ze=Q,Ue=ee,Fe=ne,He=oe,Be=ie;let je=te,Ge=null;const We=M({},[...F,...H,...B,...G,...Y]);let Ye=null;const qe=M({},[...q,...X,...$,...K]);let Xe=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),$e=null,Ke=null;const Ve=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Ze=!0,Je=!0,Qe=!1,et=!0,tt=!1,nt=!0,ot=!1,rt=!1,it=!1,at=!1,lt=!1,ct=!1,st=!0,ut=!1;const ft="user-content-";let mt=!0,pt=!1,dt={},ht=null;const gt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let yt=null;const Tt=M({},["audio","video","img","source","image","track"]);let bt=null;const At=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),St="http://www.w3.org/1998/Math/MathML",Et="http://www.w3.org/2000/svg",_t="http://www.w3.org/1999/xhtml";let Nt=_t,Ot=!1,Dt=null;const Rt=M({},[St,Et,_t],A);let wt=M({},["mi","mo","mn","ms","mtext"]),It=M({},["annotation-xml"]);const vt=M({},["title","style","font","a","script"]);let Ct=null;const xt=["application/xhtml+xml","text/html"];let kt=null,Lt=null;const Mt=r.createElement("form"),Pt=function(e){return e instanceof RegExp||e instanceof Function},zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Lt&&Lt===e)return;e&&"object"==typeof e||(e={}),e=z(e),Ct=-1===xt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,kt="application/xhtml+xml"===Ct?A:b,Ge=I(e,"ALLOWED_TAGS")&&T(e.ALLOWED_TAGS)?M({},e.ALLOWED_TAGS,kt):We,Ye=I(e,"ALLOWED_ATTR")&&T(e.ALLOWED_ATTR)?M({},e.ALLOWED_ATTR,kt):qe,Dt=I(e,"ALLOWED_NAMESPACES")&&T(e.ALLOWED_NAMESPACES)?M({},e.ALLOWED_NAMESPACES,A):Rt,bt=I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)?M(z(At),e.ADD_URI_SAFE_ATTR,kt):At,yt=I(e,"ADD_DATA_URI_TAGS")&&T(e.ADD_DATA_URI_TAGS)?M(z(Tt),e.ADD_DATA_URI_TAGS,kt):Tt,ht=I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)?M({},e.FORBID_CONTENTS,kt):gt,$e=I(e,"FORBID_TAGS")&&T(e.FORBID_TAGS)?M({},e.FORBID_TAGS,kt):z({}),Ke=I(e,"FORBID_ATTR")&&T(e.FORBID_ATTR)?M({},e.FORBID_ATTR,kt):z({}),dt=!!I(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?z(e.USE_PROFILES):e.USE_PROFILES),Ze=!1!==e.ALLOW_ARIA_ATTR,Je=!1!==e.ALLOW_DATA_ATTR,Qe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,et=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,tt=e.SAFE_FOR_TEMPLATES||!1,nt=!1!==e.SAFE_FOR_XML,ot=e.WHOLE_DOCUMENT||!1,at=e.RETURN_DOM||!1,lt=e.RETURN_DOM_FRAGMENT||!1,ct=e.RETURN_TRUSTED_TYPE||!1,it=e.FORCE_BODY||!1,st=!1!==e.SANITIZE_DOM,ut=e.SANITIZE_NAMED_PROPS||!1,mt=!1!==e.KEEP_CONTENT,pt=e.IN_PLACE||!1,je=function(e){try{return C(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Nt="string"==typeof e.NAMESPACE?e.NAMESPACE:_t,wt=I(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?z(e.MATHML_TEXT_INTEGRATION_POINTS):M({},["mi","mo","mn","ms","mtext"]),It=I(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?z(e.HTML_INTEGRATION_POINTS):M({},["annotation-xml"]);const t=I(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?z(e.CUSTOM_ELEMENT_HANDLING):s(null);if(Xe=s(null),I(t,"tagNameCheck")&&Pt(t.tagNameCheck)&&(Xe.tagNameCheck=t.tagNameCheck),I(t,"attributeNameCheck")&&Pt(t.attributeNameCheck)&&(Xe.attributeNameCheck=t.attributeNameCheck),I(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(Xe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),tt&&(Je=!1),lt&&(at=!0),dt&&(Ge=M({},Y),Ye=s(null),!0===dt.html&&(M(Ge,F),M(Ye,q)),!0===dt.svg&&(M(Ge,H),M(Ye,X),M(Ye,K)),!0===dt.svgFilters&&(M(Ge,B),M(Ye,X),M(Ye,K)),!0===dt.mathMl&&(M(Ge,G),M(Ye,$),M(Ye,K))),Ve.tagCheck=null,Ve.attributeCheck=null,I(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ve.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Ge===We&&(Ge=z(Ge)),M(Ge,e.ADD_TAGS,kt))),I(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ve.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(Ye===qe&&(Ye=z(Ye)),M(Ye,e.ADD_ATTR,kt))),I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(bt,e.ADD_URI_SAFE_ATTR,kt),I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.FORBID_CONTENTS,kt)),I(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.ADD_FORBID_CONTENTS,kt)),mt&&(Ge["#text"]=!0),ot&&M(Ge,["html","head","body"]),Ge.table&&(M(Ge,["tbody"]),delete $e.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=_e;_e=e.TRUSTED_TYPES_POLICY;try{Ne=De("")}catch(e){throw _e=t,e}}else void 0===_e&&null!==e.TRUSTED_TYPES_POLICY&&(_e=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(P,a)),_e&&"string"==typeof Ne&&(Ne=De(""));(ke.uponSanitizeElement.length>0||ke.uponSanitizeAttribute.length>0)&&Ge===We&&(Ge=z(Ge)),ke.uponSanitizeAttribute.length>0&&Ye===qe&&(Ye=z(Ye)),l&&l(e),Lt=e},Ut=M({},[...H,...B,...j]),Ft=M({},[...G,...W]),Ht=function(e){g(o.removed,{element:e});try{Te(e).removeChild(e)}catch(t){he(e)}},Bt=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(at||lt)try{Ht(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},jt=function(e){let t=null,n=null;if(it)e=""+e;else{const t=S(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ct&&Nt===_t&&(e=''+e+"");const o=_e?De(e):e;if(Nt===_t)try{t=(new L).parseFromString(o,Ct)}catch(e){}if(!t||!t.documentElement){t=we.createDocument(Nt,"template",null);try{t.documentElement.innerHTML=Ot?Ne:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Nt===_t?Ce.call(t,ot?"html":"body")[0]:ot?t.documentElement:i},Gt=function(e){return Ie.call(e.ownerDocument||e,e,m.SHOW_ELEMENT|m.SHOW_COMMENT|m.SHOW_TEXT|m.SHOW_PROCESSING_INSTRUCTION|m.SHOW_CDATA_SECTION,null)},Wt=function(e){var t,n;e.normalize();const o=Ie.call(e.ownerDocument||e,e,m.SHOW_TEXT|m.SHOW_COMMENT|m.SHOW_CDATA_SECTION|m.SHOW_PROCESSING_INSTRUCTION,null);let r=o.nextNode();for(;r;){let e=r.data;p([Le,Me,Pe],t=>{e=E(e,t," ")}),r.data=e,r=o.nextNode()}const i=null!==(t=null===(n=e.querySelectorAll)||void 0===n?void 0:n.call(e,"template"))&&void 0!==t?t:[];p(Array.from(i),e=>{qt(e.content)&&Wt(e.content)})},Yt=function(e){const t=Ee?Ee(e):null;return"string"==typeof t&&("form"===kt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Ae(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==Se(e)||e.childNodes!==ye(e)))},qt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return Se(e)===fe}catch(e){return!1}},Xt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return"number"==typeof Se(e)}catch(e){return!1}};function $t(e,t,n){p(e,e=>{e.call(o,t,n,Lt)})}const Kt=function(e){let t=null;if($t(ke.beforeSanitizeElements,e,null),Yt(e))return Ht(e),!0;const n=kt(Ee?Ee(e):e.nodeName);if($t(ke.uponSanitizeElement,e,{tagName:n,allowedTags:Ge}),nt&&e.hasChildNodes()&&!Xt(e.firstElementChild)&&C(/<[/\w!]/g,e.innerHTML)&&C(/<[/\w!]/g,e.textContent))return Ht(e),!0;if(nt&&e.namespaceURI===_t&&"style"===n&&Xt(e.firstElementChild))return Ht(e),!0;if(e.nodeType===ce)return Ht(e),!0;if(nt&&e.nodeType===se&&C(/<[/\w]/g,e.data))return Ht(e),!0;if($e[n]||!(Ve.tagCheck instanceof Function&&Ve.tagCheck(n))&&!Ge[n]){if(!$e[n]&&Jt(n)){if(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n))return!1;if(Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))return!1}if(mt&&!ht[n]){const t=Te(e),n=ye(e);if(n&&t){for(let o=n.length-1;o>=0;--o){const r=de(n[o],!0);t.insertBefore(r,ge(e))}}}return Ht(e),!0}return((Se?Se(e):e.nodeType)!==ae||function(e){let t=Te(e);t&&t.tagName||(t={namespaceURI:Nt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Dt[e.namespaceURI]&&(e.namespaceURI===Et?t.namespaceURI===_t?"svg"===n:t.namespaceURI===St?"svg"===n&&("annotation-xml"===o||wt[o]):Boolean(Ut[n]):e.namespaceURI===St?t.namespaceURI===_t?"math"===n:t.namespaceURI===Et?"math"===n&&It[o]:Boolean(Ft[n]):e.namespaceURI===_t?!(t.namespaceURI===Et&&!It[o])&&!(t.namespaceURI===St&&!wt[o])&&!Ft[n]&&(vt[n]||!Ut[n]):!("application/xhtml+xml"!==Ct||!Dt[e.namespaceURI]))}(e))&&("noscript"!==n&&"noembed"!==n&&"noframes"!==n||!C(/<\/no(script|embed|frames)/i,e.innerHTML))?(tt&&e.nodeType===le&&(t=e.textContent,p([Le,Me,Pe],e=>{t=E(t,e," ")}),e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)),$t(ke.afterSanitizeElements,e,null),!1):(Ht(e),!0)},Vt=function(e,t,n){if(Ke[t])return!1;if(st&&("id"===t||"name"===t)&&(n in r||n in Mt))return!1;const o=Ye[t]||Ve.attributeCheck instanceof Function&&Ve.attributeCheck(t,e);if(Je&&!Ke[t]&&C(ze,t));else if(Ze&&C(Ue,t));else if(!o||Ke[t]){if(!(Jt(e)&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,e)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(e))&&(Xe.attributeNameCheck instanceof RegExp&&C(Xe.attributeNameCheck,t)||Xe.attributeNameCheck instanceof Function&&Xe.attributeNameCheck(t,e))||"is"===t&&Xe.allowCustomizedBuiltInElements&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))))return!1}else if(bt[t]);else if(C(je,E(n,He,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==_(n,"data:")||!yt[e]){if(Qe&&!C(Fe,E(n,He,"")));else if(n)return!1}else;return!0},Zt=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Jt=function(e){return!Zt[b(e)]&&C(Be,e)},Qt=function(e){$t(ke.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||Yt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ye,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],a=i.name,l=i.namespaceURI,c=i.value,s=kt(a),u=c;let f="value"===a?u:N(u);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,$t(ke.uponSanitizeAttribute,e,n),f=n.attrValue,!ut||"id"!==s&&"name"!==s||0===_(f,ft)||(Bt(a,e),f=ft+f),nt&&C(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){Bt(a,e);continue}if("attributename"===s&&S(f,"href")){Bt(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){Bt(a,e);continue}if(!et&&C(/\/>/i,f)){Bt(a,e);continue}tt&&p([Le,Me,Pe],e=>{f=E(f,e," ")});const m=kt(e.nodeName);if(Vt(m,s,f)){if(_e&&"object"==typeof P&&"function"==typeof P.getAttributeType)if(l);else switch(P.getAttributeType(m,s)){case"TrustedHTML":f=De(f);break;case"TrustedScriptURL":f=_e.createScriptURL(f)}if(f!==u)try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),Yt(e)?Ht(e):h(o.removed)}catch(t){Bt(a,e)}}else Bt(a,e)}$t(ke.afterSanitizeAttributes,e,null)},en=function(e){let t=null;const n=Gt(e);for($t(ke.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){$t(ke.uponSanitizeShadowNode,t,null),Kt(t),Qt(t),qt(t.content)&&en(t.content);if((Se?Se(t):t.nodeType)===ae){const e=be?be(t):t.shadowRoot;qt(e)&&(tn(e),en(e))}}$t(ke.afterSanitizeShadowDOM,e,null)},tn=function(e){const t=Se?Se(e):e.nodeType;if(t===ae){const t=be?be(e):e.shadowRoot;qt(t)&&(tn(t),en(t))}const n=ye?ye(e):e.childNodes;if(!n)return;const o=[];p(n,e=>{g(o,e)});for(const e of o)tn(e);if(t===ae){const t=Ee?Ee(e):null;if("string"==typeof t&&"template"===kt(t)){const t=e.content;qt(t)&&tn(t)}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Ot=!e,Ot&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Xt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return O(e);case"boolean":return D(e);case"bigint":return R?R(e):"0";case"symbol":return w?w(e):"Symbol()";case"undefined":default:return v(e);case"function":case"object":{if(null===e)return v(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:v(e)}return v(e)}}}(e)))throw x("dirty is not a string, aborting");if(!o.isSupported)return e;if(rt||zt(t),o.removed=[],"string"==typeof e&&(pt=!1),pt){const t=Ee?Ee(e):e.nodeName;if("string"==typeof t){const e=kt(t);if(!Ge[e]||$e[e])throw x("root node is forbidden and cannot be sanitized in-place")}if(Yt(e))throw x("root node is clobbered and cannot be sanitized in-place");tn(e)}else if(Xt(e))n=jt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ae&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),tn(r);else{if(!at&&!tt&&!ot&&-1===e.indexOf("<"))return _e&&ct?De(e):e;if(n=jt(e),!n)return at?null:ct?Ne:""}n&&it&&Ht(n.firstChild);const c=Gt(pt?e:n);for(;a=c.nextNode();)Kt(a),Qt(a),qt(a.content)&&en(a.content);if(pt)return tt&&Wt(e),e;if(at){if(tt&&Wt(n),lt)for(l=ve.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ye.shadowroot||Ye.shadowrootmode)&&(l=xe.call(i,l,!0)),l}let s=ot?n.outerHTML:n.innerHTML;return ot&&Ge["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&C(re,n.ownerDocument.doctype.name)&&(s="\n"+s),tt&&p([Le,Me,Pe],e=>{s=E(s,e," ")}),_e&&ct?De(s):s},o.setConfig=function(){zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),rt=!0},o.clearConfig=function(){Lt=null,rt=!1},o.isValidAttribute=function(e,t,n){Lt||zt({});const o=kt(e),r=kt(t);return Vt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(ke[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(ke[e],t);return-1===n?void 0:y(ke[e],n,1)[0]}return h(ke[e])},o.removeHooks=function(e){ke[e]=[]},o.removeAllHooks=function(){ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return pe}); +/*! @license DOMPurify 3.4.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.10/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.10",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=!1,gt=!1,yt=!1,Tt=!1,bt=!0,St=!1;const Et="user-content-";let At=!0,Nt=!1,_t={},wt=null;const Ot=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let vt=null;const Dt=M({},["audio","video","img","source","image","track"]);let Rt=null;const Ct=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),It="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",xt="http://www.w3.org/1999/xhtml";let Lt=xt,Mt=!1,zt=null;const Pt=M({},[It,kt,xt],S),Ut=l(["mi","mo","mn","ms","mtext"]);let Ft=M({},Ut);const Ht=l(["annotation-xml"]);let jt=M({},Ht);const Bt=M({},["title","style","font","a","script"]);let Gt=null;const Wt=["application/xhtml+xml","text/html"];let Yt=null,qt=null;const Xt=r.createElement("form"),$t=function(e){return e instanceof RegExp||e instanceof Function},Kt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(qt&&qt===e)return;e&&"object"==typeof e||(e={}),e=P(e),Gt=-1===Wt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Yt="application/xhtml+xml"===Gt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Yt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Yt}),zt=ye(e,"ALLOWED_NAMESPACES",Pt,{transform:S}),Rt=ye(e,"ADD_URI_SAFE_ATTR",Ct,{transform:Yt,base:Ct}),vt=ye(e,"ADD_DATA_URI_TAGS",Dt,{transform:Yt,base:Dt}),wt=ye(e,"FORBID_CONTENTS",Ot,{transform:Yt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Yt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Yt}),_t=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,gt=e.RETURN_DOM||!1,yt=e.RETURN_DOM_FRAGMENT||!1,Tt=e.RETURN_TRUSTED_TYPE||!1,ht=e.FORCE_BODY||!1,bt=!1!==e.SANITIZE_DOM,St=e.SANITIZE_NAMED_PROPS||!1,At=!1!==e.KEEP_CONTENT,Nt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Lt="string"==typeof e.NAMESPACE?e.NAMESPACE:xt,Ft=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ut),jt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Ht);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&$t(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&$t(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),yt&&(gt=!0),_t&&(Qe=M({},Y),tt=s(null),!0===_t.html&&(M(Qe,F),M(tt,q)),!0===_t.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===_t.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===_t.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Yt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Yt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(Rt,e.ADD_URI_SAFE_ATTR,Yt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.FORBID_CONTENTS,Yt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.ADD_FORBID_CONTENTS,Yt)),At&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&Qe===et&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&tt===nt&&(tt=P(tt)),l&&l(e),qt=e},Vt=M({},[...H,...j,...B]),Zt=M({},[...G,...W]),Jt=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:Lt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!zt[e.namespaceURI]&&(e.namespaceURI===kt?function(e,t,n){return t.namespaceURI===xt?"svg"===e:t.namespaceURI===It?"svg"===e&&("annotation-xml"===n||Ft[n]):Boolean(Vt[e])}(n,t,o):e.namespaceURI===It?function(e,t,n){return t.namespaceURI===xt?"math"===e:t.namespaceURI===kt?"math"===e&&jt[n]:Boolean(Zt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return!(t.namespaceURI===kt&&!jt[n])&&!(t.namespaceURI===It&&!Ft[n])&&!Zt[e]&&(Bt[e]||!Vt[e])}(n,t,o):!("application/xhtml+xml"!==Gt||!zt[e.namespaceURI]))},Qt=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},en=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},tn=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(gt||yt)try{Qt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},nn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Yt(r)])try{e.removeAttribute(r)}catch(e){}}},on=function(e){let t=null,n=null;if(ht)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Gt&&Lt===xt&&(e=''+e+"");const o=Re?Me(e):e;if(Lt===xt)try{t=(new z).parseFromString(o,Gt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(Lt,"template",null);try{t.documentElement.innerHTML=Mt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Lt===xt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},rn=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},an=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},ln=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=an(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{sn(e.content)&&ln(e.content)})},cn=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Yt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},sn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},un=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function fn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,qt)})}const pn=function(e){if(fn(Ge.beforeSanitizeElements,e,null),cn(e))return Qt(e),!0;const t=Yt(De?De(e):e.nodeName);if(fn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!un(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==xt||"style"!==t||!un(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return Qt(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&hn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(At&&!wt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=Nt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return Qt(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!Jt(e))return Qt(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return Qt(e),!0;if(ft&&e.nodeType===fe){const t=an(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return fn(Ge.afterSanitizeElements,e,null),!1},mn=function(e,t,n){if(it[t])return!1;if(bt&&("id"===t||"name"===t)&&(n in r||n in Xt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(Rt[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!vt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(hn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},dn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),hn=function(e){return!dn[b(e)]&&I(Ze,e)},gn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},yn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),cn(e)?Qt(e):h(o.removed)}catch(n){tn(t,e)}},Tn=function(e){fn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||cn(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Yt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Yt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,fn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!St||"id"!==s&&"name"!==s||0===N(f,Et)||(tn(a,e),f=Et+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?tn(a,e):"attributename"===s&&E(f,"href")?tn(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=an(f)),mn(r,s,f)?(f=gn(r,s,l,f),f!==u&&yn(e,a,l,f)):tn(a,e)):tn(a,e))}fn(Ge.afterSanitizeAttributes,e,null)},bn=function(e){let t=null;const n=rn(e);for(fn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){fn(Ge.uponSanitizeShadowNode,t,null),pn(t),Tn(t),sn(t.content)&&bn(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);sn(e)&&(Sn(e),bn(e))}}fn(Ge.afterSanitizeShadowDOM,e,null)},Sn=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){bn(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Yt(e)){const e=n.content;sn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);sn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Mt=!e,Mt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!un(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt||Kt(t),o.removed=[];const c=Nt&&"string"!=typeof e&&un(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Yt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(cn(e))throw k("root node is clobbered and cannot be sanitized in-place");try{Sn(e)}catch(t){throw en(e),t}}else if(un(e))n=on("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),Sn(r);else{if(!gt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&Tt?Me(e):e;if(n=on(e),!n)return gt?null:Tt?Ie:""}n&&ht&&Qt(n.firstChild);const s=rn(c?e:n);try{for(;a=s.nextNode();)pn(a),Tn(a),sn(a.content)&&bn(a.content)}catch(t){throw c&&en(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&nn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&ln(e),e;if(gt){if(ft&&ln(n),yt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=an(u)),Re&&Tt?Me(u):u},o.setConfig=function(){Kt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0},o.clearConfig=function(){qt=null,dt=!1,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){qt||Kt({});const o=Yt(e),r=Yt(t);return mn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(Ge[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])},o.removeHooks=function(e){Ge[e]=[]},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); //# sourceMappingURL=purify.min.js.map diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js index dbf05df7541..e74386fed67 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.8/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function P(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=1,le=3,ce=7,se=8,ue=9,fe=11,me=function(){return"undefined"==typeof window?null:window};var pe=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:me();const o=t=>e(t);if(o.version="3.4.8",o.removed=[],!t||!t.document||t.document.nodeType!==ue||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const c=t.HTMLTemplateElement,u=t.Node,f=t.Element,m=t.NodeFilter,k=t.NamedNodeMap;void 0===k&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const L=t.DOMParser,P=t.trustedTypes,pe=f.prototype,de=U(pe,"cloneNode"),he=U(pe,"remove"),ge=U(pe,"nextSibling"),ye=U(pe,"childNodes"),Te=U(pe,"parentNode"),be=U(pe,"shadowRoot"),Ae=U(pe,"attributes"),Se=u&&u.prototype?U(u.prototype,"nodeType"):null,Ee=u&&u.prototype?U(u.prototype,"nodeName"):null;if("function"==typeof c){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let _e,Ne="",Oe=0;const De=function(e){if(Oe>0)throw x('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');Oe++;try{return _e.createHTML(e)}finally{Oe--}},Re=r,we=Re.implementation,Ie=Re.createNodeIterator,ve=Re.createDocumentFragment,Ce=Re.getElementsByTagName,xe=i.importNode;let ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof Te&&we&&void 0!==we.createHTMLDocument;const Le=V,Me=Z,Pe=J,ze=Q,Ue=ee,Fe=ne,He=oe,Be=ie;let je=te,Ge=null;const We=M({},[...F,...H,...B,...G,...Y]);let Ye=null;const qe=M({},[...q,...X,...$,...K]);let Xe=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),$e=null,Ke=null;const Ve=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Ze=!0,Je=!0,Qe=!1,et=!0,tt=!1,nt=!0,ot=!1,rt=!1,it=!1,at=!1,lt=!1,ct=!1,st=!0,ut=!1;const ft="user-content-";let mt=!0,pt=!1,dt={},ht=null;const gt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let yt=null;const Tt=M({},["audio","video","img","source","image","track"]);let bt=null;const At=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),St="http://www.w3.org/1998/Math/MathML",Et="http://www.w3.org/2000/svg",_t="http://www.w3.org/1999/xhtml";let Nt=_t,Ot=!1,Dt=null;const Rt=M({},[St,Et,_t],A);let wt=M({},["mi","mo","mn","ms","mtext"]),It=M({},["annotation-xml"]);const vt=M({},["title","style","font","a","script"]);let Ct=null;const xt=["application/xhtml+xml","text/html"];let kt=null,Lt=null;const Mt=r.createElement("form"),Pt=function(e){return e instanceof RegExp||e instanceof Function},zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(Lt&&Lt===e)return;e&&"object"==typeof e||(e={}),e=z(e),Ct=-1===xt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,kt="application/xhtml+xml"===Ct?A:b,Ge=I(e,"ALLOWED_TAGS")&&T(e.ALLOWED_TAGS)?M({},e.ALLOWED_TAGS,kt):We,Ye=I(e,"ALLOWED_ATTR")&&T(e.ALLOWED_ATTR)?M({},e.ALLOWED_ATTR,kt):qe,Dt=I(e,"ALLOWED_NAMESPACES")&&T(e.ALLOWED_NAMESPACES)?M({},e.ALLOWED_NAMESPACES,A):Rt,bt=I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)?M(z(At),e.ADD_URI_SAFE_ATTR,kt):At,yt=I(e,"ADD_DATA_URI_TAGS")&&T(e.ADD_DATA_URI_TAGS)?M(z(Tt),e.ADD_DATA_URI_TAGS,kt):Tt,ht=I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)?M({},e.FORBID_CONTENTS,kt):gt,$e=I(e,"FORBID_TAGS")&&T(e.FORBID_TAGS)?M({},e.FORBID_TAGS,kt):z({}),Ke=I(e,"FORBID_ATTR")&&T(e.FORBID_ATTR)?M({},e.FORBID_ATTR,kt):z({}),dt=!!I(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?z(e.USE_PROFILES):e.USE_PROFILES),Ze=!1!==e.ALLOW_ARIA_ATTR,Je=!1!==e.ALLOW_DATA_ATTR,Qe=e.ALLOW_UNKNOWN_PROTOCOLS||!1,et=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,tt=e.SAFE_FOR_TEMPLATES||!1,nt=!1!==e.SAFE_FOR_XML,ot=e.WHOLE_DOCUMENT||!1,at=e.RETURN_DOM||!1,lt=e.RETURN_DOM_FRAGMENT||!1,ct=e.RETURN_TRUSTED_TYPE||!1,it=e.FORCE_BODY||!1,st=!1!==e.SANITIZE_DOM,ut=e.SANITIZE_NAMED_PROPS||!1,mt=!1!==e.KEEP_CONTENT,pt=e.IN_PLACE||!1,je=function(e){try{return C(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Nt="string"==typeof e.NAMESPACE?e.NAMESPACE:_t,wt=I(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?z(e.MATHML_TEXT_INTEGRATION_POINTS):M({},["mi","mo","mn","ms","mtext"]),It=I(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?z(e.HTML_INTEGRATION_POINTS):M({},["annotation-xml"]);const t=I(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?z(e.CUSTOM_ELEMENT_HANDLING):s(null);if(Xe=s(null),I(t,"tagNameCheck")&&Pt(t.tagNameCheck)&&(Xe.tagNameCheck=t.tagNameCheck),I(t,"attributeNameCheck")&&Pt(t.attributeNameCheck)&&(Xe.attributeNameCheck=t.attributeNameCheck),I(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(Xe.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),tt&&(Je=!1),lt&&(at=!0),dt&&(Ge=M({},Y),Ye=s(null),!0===dt.html&&(M(Ge,F),M(Ye,q)),!0===dt.svg&&(M(Ge,H),M(Ye,X),M(Ye,K)),!0===dt.svgFilters&&(M(Ge,B),M(Ye,X),M(Ye,K)),!0===dt.mathMl&&(M(Ge,G),M(Ye,$),M(Ye,K))),Ve.tagCheck=null,Ve.attributeCheck=null,I(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Ve.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Ge===We&&(Ge=z(Ge)),M(Ge,e.ADD_TAGS,kt))),I(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Ve.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(Ye===qe&&(Ye=z(Ye)),M(Ye,e.ADD_ATTR,kt))),I(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(bt,e.ADD_URI_SAFE_ATTR,kt),I(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.FORBID_CONTENTS,kt)),I(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(ht===gt&&(ht=z(ht)),M(ht,e.ADD_FORBID_CONTENTS,kt)),mt&&(Ge["#text"]=!0),ot&&M(Ge,["html","head","body"]),Ge.table&&(M(Ge,["tbody"]),delete $e.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw x('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=_e;_e=e.TRUSTED_TYPES_POLICY;try{Ne=De("")}catch(e){throw _e=t,e}}else void 0===_e&&null!==e.TRUSTED_TYPES_POLICY&&(_e=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(P,a)),_e&&"string"==typeof Ne&&(Ne=De(""));(ke.uponSanitizeElement.length>0||ke.uponSanitizeAttribute.length>0)&&Ge===We&&(Ge=z(Ge)),ke.uponSanitizeAttribute.length>0&&Ye===qe&&(Ye=z(Ye)),l&&l(e),Lt=e},Ut=M({},[...H,...B,...j]),Ft=M({},[...G,...W]),Ht=function(e){g(o.removed,{element:e});try{Te(e).removeChild(e)}catch(t){he(e)}},Bt=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(at||lt)try{Ht(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},jt=function(e){let t=null,n=null;if(it)e=""+e;else{const t=S(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ct&&Nt===_t&&(e=''+e+"");const o=_e?De(e):e;if(Nt===_t)try{t=(new L).parseFromString(o,Ct)}catch(e){}if(!t||!t.documentElement){t=we.createDocument(Nt,"template",null);try{t.documentElement.innerHTML=Ot?Ne:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Nt===_t?Ce.call(t,ot?"html":"body")[0]:ot?t.documentElement:i},Gt=function(e){return Ie.call(e.ownerDocument||e,e,m.SHOW_ELEMENT|m.SHOW_COMMENT|m.SHOW_TEXT|m.SHOW_PROCESSING_INSTRUCTION|m.SHOW_CDATA_SECTION,null)},Wt=function(e){var t,n;e.normalize();const o=Ie.call(e.ownerDocument||e,e,m.SHOW_TEXT|m.SHOW_COMMENT|m.SHOW_CDATA_SECTION|m.SHOW_PROCESSING_INSTRUCTION,null);let r=o.nextNode();for(;r;){let e=r.data;p([Le,Me,Pe],t=>{e=E(e,t," ")}),r.data=e,r=o.nextNode()}const i=null!==(t=null===(n=e.querySelectorAll)||void 0===n?void 0:n.call(e,"template"))&&void 0!==t?t:[];p(Array.from(i),e=>{qt(e.content)&&Wt(e.content)})},Yt=function(e){const t=Ee?Ee(e):null;return"string"==typeof t&&("form"===kt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Ae(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==Se(e)||e.childNodes!==ye(e)))},qt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return Se(e)===fe}catch(e){return!1}},Xt=function(e){if(!Se||"object"!=typeof e||null===e)return!1;try{return"number"==typeof Se(e)}catch(e){return!1}};function $t(e,t,n){p(e,e=>{e.call(o,t,n,Lt)})}const Kt=function(e){let t=null;if($t(ke.beforeSanitizeElements,e,null),Yt(e))return Ht(e),!0;const n=kt(Ee?Ee(e):e.nodeName);if($t(ke.uponSanitizeElement,e,{tagName:n,allowedTags:Ge}),nt&&e.hasChildNodes()&&!Xt(e.firstElementChild)&&C(/<[/\w!]/g,e.innerHTML)&&C(/<[/\w!]/g,e.textContent))return Ht(e),!0;if(nt&&e.namespaceURI===_t&&"style"===n&&Xt(e.firstElementChild))return Ht(e),!0;if(e.nodeType===ce)return Ht(e),!0;if(nt&&e.nodeType===se&&C(/<[/\w]/g,e.data))return Ht(e),!0;if($e[n]||!(Ve.tagCheck instanceof Function&&Ve.tagCheck(n))&&!Ge[n]){if(!$e[n]&&Jt(n)){if(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n))return!1;if(Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))return!1}if(mt&&!ht[n]){const t=Te(e),n=ye(e);if(n&&t){for(let o=n.length-1;o>=0;--o){const r=de(n[o],!0);t.insertBefore(r,ge(e))}}}return Ht(e),!0}return((Se?Se(e):e.nodeType)!==ae||function(e){let t=Te(e);t&&t.tagName||(t={namespaceURI:Nt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Dt[e.namespaceURI]&&(e.namespaceURI===Et?t.namespaceURI===_t?"svg"===n:t.namespaceURI===St?"svg"===n&&("annotation-xml"===o||wt[o]):Boolean(Ut[n]):e.namespaceURI===St?t.namespaceURI===_t?"math"===n:t.namespaceURI===Et?"math"===n&&It[o]:Boolean(Ft[n]):e.namespaceURI===_t?!(t.namespaceURI===Et&&!It[o])&&!(t.namespaceURI===St&&!wt[o])&&!Ft[n]&&(vt[n]||!Ut[n]):!("application/xhtml+xml"!==Ct||!Dt[e.namespaceURI]))}(e))&&("noscript"!==n&&"noembed"!==n&&"noframes"!==n||!C(/<\/no(script|embed|frames)/i,e.innerHTML))?(tt&&e.nodeType===le&&(t=e.textContent,p([Le,Me,Pe],e=>{t=E(t,e," ")}),e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)),$t(ke.afterSanitizeElements,e,null),!1):(Ht(e),!0)},Vt=function(e,t,n){if(Ke[t])return!1;if(st&&("id"===t||"name"===t)&&(n in r||n in Mt))return!1;const o=Ye[t]||Ve.attributeCheck instanceof Function&&Ve.attributeCheck(t,e);if(Je&&!Ke[t]&&C(ze,t));else if(Ze&&C(Ue,t));else if(!o||Ke[t]){if(!(Jt(e)&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,e)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(e))&&(Xe.attributeNameCheck instanceof RegExp&&C(Xe.attributeNameCheck,t)||Xe.attributeNameCheck instanceof Function&&Xe.attributeNameCheck(t,e))||"is"===t&&Xe.allowCustomizedBuiltInElements&&(Xe.tagNameCheck instanceof RegExp&&C(Xe.tagNameCheck,n)||Xe.tagNameCheck instanceof Function&&Xe.tagNameCheck(n))))return!1}else if(bt[t]);else if(C(je,E(n,He,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==_(n,"data:")||!yt[e]){if(Qe&&!C(Fe,E(n,He,"")));else if(n)return!1}else;return!0},Zt=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Jt=function(e){return!Zt[b(e)]&&C(Be,e)},Qt=function(e){$t(ke.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||Yt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ye,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],a=i.name,l=i.namespaceURI,c=i.value,s=kt(a),u=c;let f="value"===a?u:N(u);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,$t(ke.uponSanitizeAttribute,e,n),f=n.attrValue,!ut||"id"!==s&&"name"!==s||0===_(f,ft)||(Bt(a,e),f=ft+f),nt&&C(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){Bt(a,e);continue}if("attributename"===s&&S(f,"href")){Bt(a,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){Bt(a,e);continue}if(!et&&C(/\/>/i,f)){Bt(a,e);continue}tt&&p([Le,Me,Pe],e=>{f=E(f,e," ")});const m=kt(e.nodeName);if(Vt(m,s,f)){if(_e&&"object"==typeof P&&"function"==typeof P.getAttributeType)if(l);else switch(P.getAttributeType(m,s)){case"TrustedHTML":f=De(f);break;case"TrustedScriptURL":f=_e.createScriptURL(f)}if(f!==u)try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),Yt(e)?Ht(e):h(o.removed)}catch(t){Bt(a,e)}}else Bt(a,e)}$t(ke.afterSanitizeAttributes,e,null)},en=function(e){let t=null;const n=Gt(e);for($t(ke.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){$t(ke.uponSanitizeShadowNode,t,null),Kt(t),Qt(t),qt(t.content)&&en(t.content);if((Se?Se(t):t.nodeType)===ae){const e=be?be(t):t.shadowRoot;qt(e)&&(tn(e),en(e))}}$t(ke.afterSanitizeShadowDOM,e,null)},tn=function(e){const t=Se?Se(e):e.nodeType;if(t===ae){const t=be?be(e):e.shadowRoot;qt(t)&&(tn(t),en(t))}const n=ye?ye(e):e.childNodes;if(!n)return;const o=[];p(n,e=>{g(o,e)});for(const e of o)tn(e);if(t===ae){const t=Ee?Ee(e):null;if("string"==typeof t&&"template"===kt(t)){const t=e.content;qt(t)&&tn(t)}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Ot=!e,Ot&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Xt(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return O(e);case"boolean":return D(e);case"bigint":return R?R(e):"0";case"symbol":return w?w(e):"Symbol()";case"undefined":default:return v(e);case"function":case"object":{if(null===e)return v(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:v(e)}return v(e)}}}(e)))throw x("dirty is not a string, aborting");if(!o.isSupported)return e;if(rt||zt(t),o.removed=[],"string"==typeof e&&(pt=!1),pt){const t=Ee?Ee(e):e.nodeName;if("string"==typeof t){const e=kt(t);if(!Ge[e]||$e[e])throw x("root node is forbidden and cannot be sanitized in-place")}if(Yt(e))throw x("root node is clobbered and cannot be sanitized in-place");tn(e)}else if(Xt(e))n=jt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ae&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),tn(r);else{if(!at&&!tt&&!ot&&-1===e.indexOf("<"))return _e&&ct?De(e):e;if(n=jt(e),!n)return at?null:ct?Ne:""}n&&it&&Ht(n.firstChild);const c=Gt(pt?e:n);for(;a=c.nextNode();)Kt(a),Qt(a),qt(a.content)&&en(a.content);if(pt)return tt&&Wt(e),e;if(at){if(tt&&Wt(n),lt)for(l=ve.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ye.shadowroot||Ye.shadowrootmode)&&(l=xe.call(i,l,!0)),l}let s=ot?n.outerHTML:n.innerHTML;return ot&&Ge["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&C(re,n.ownerDocument.doctype.name)&&(s="\n"+s),tt&&p([Le,Me,Pe],e=>{s=E(s,e," ")}),_e&&ct?De(s):s},o.setConfig=function(){zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),rt=!0},o.clearConfig=function(){Lt=null,rt=!1},o.isValidAttribute=function(e,t,n){Lt||zt({});const o=kt(e),r=kt(t);return Vt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(ke[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(ke[e],t);return-1===n?void 0:y(ke[e],n,1)[0]}return h(ke[e])},o.removeHooks=function(e){ke[e]=[]},o.removeAllHooks=function(){ke={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return pe}); +/*! @license DOMPurify 3.4.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.10/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.10",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=!1,gt=!1,yt=!1,Tt=!1,bt=!0,St=!1;const Et="user-content-";let At=!0,Nt=!1,_t={},wt=null;const Ot=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let vt=null;const Dt=M({},["audio","video","img","source","image","track"]);let Rt=null;const Ct=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),It="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",xt="http://www.w3.org/1999/xhtml";let Lt=xt,Mt=!1,zt=null;const Pt=M({},[It,kt,xt],S),Ut=l(["mi","mo","mn","ms","mtext"]);let Ft=M({},Ut);const Ht=l(["annotation-xml"]);let jt=M({},Ht);const Bt=M({},["title","style","font","a","script"]);let Gt=null;const Wt=["application/xhtml+xml","text/html"];let Yt=null,qt=null;const Xt=r.createElement("form"),$t=function(e){return e instanceof RegExp||e instanceof Function},Kt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(qt&&qt===e)return;e&&"object"==typeof e||(e={}),e=P(e),Gt=-1===Wt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Yt="application/xhtml+xml"===Gt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Yt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Yt}),zt=ye(e,"ALLOWED_NAMESPACES",Pt,{transform:S}),Rt=ye(e,"ADD_URI_SAFE_ATTR",Ct,{transform:Yt,base:Ct}),vt=ye(e,"ADD_DATA_URI_TAGS",Dt,{transform:Yt,base:Dt}),wt=ye(e,"FORBID_CONTENTS",Ot,{transform:Yt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Yt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Yt}),_t=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,gt=e.RETURN_DOM||!1,yt=e.RETURN_DOM_FRAGMENT||!1,Tt=e.RETURN_TRUSTED_TYPE||!1,ht=e.FORCE_BODY||!1,bt=!1!==e.SANITIZE_DOM,St=e.SANITIZE_NAMED_PROPS||!1,At=!1!==e.KEEP_CONTENT,Nt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Lt="string"==typeof e.NAMESPACE?e.NAMESPACE:xt,Ft=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ut),jt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Ht);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&$t(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&$t(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),yt&&(gt=!0),_t&&(Qe=M({},Y),tt=s(null),!0===_t.html&&(M(Qe,F),M(tt,q)),!0===_t.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===_t.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===_t.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Yt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Yt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(Rt,e.ADD_URI_SAFE_ATTR,Yt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.FORBID_CONTENTS,Yt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.ADD_FORBID_CONTENTS,Yt)),At&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&Qe===et&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&tt===nt&&(tt=P(tt)),l&&l(e),qt=e},Vt=M({},[...H,...j,...B]),Zt=M({},[...G,...W]),Jt=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:Lt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!zt[e.namespaceURI]&&(e.namespaceURI===kt?function(e,t,n){return t.namespaceURI===xt?"svg"===e:t.namespaceURI===It?"svg"===e&&("annotation-xml"===n||Ft[n]):Boolean(Vt[e])}(n,t,o):e.namespaceURI===It?function(e,t,n){return t.namespaceURI===xt?"math"===e:t.namespaceURI===kt?"math"===e&&jt[n]:Boolean(Zt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return!(t.namespaceURI===kt&&!jt[n])&&!(t.namespaceURI===It&&!Ft[n])&&!Zt[e]&&(Bt[e]||!Vt[e])}(n,t,o):!("application/xhtml+xml"!==Gt||!zt[e.namespaceURI]))},Qt=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},en=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},tn=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(gt||yt)try{Qt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},nn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Yt(r)])try{e.removeAttribute(r)}catch(e){}}},on=function(e){let t=null,n=null;if(ht)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Gt&&Lt===xt&&(e=''+e+"");const o=Re?Me(e):e;if(Lt===xt)try{t=(new z).parseFromString(o,Gt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(Lt,"template",null);try{t.documentElement.innerHTML=Mt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Lt===xt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},rn=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},an=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},ln=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=an(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{sn(e.content)&&ln(e.content)})},cn=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Yt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},sn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},un=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function fn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,qt)})}const pn=function(e){if(fn(Ge.beforeSanitizeElements,e,null),cn(e))return Qt(e),!0;const t=Yt(De?De(e):e.nodeName);if(fn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!un(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==xt||"style"!==t||!un(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return Qt(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&hn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(At&&!wt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=Nt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return Qt(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!Jt(e))return Qt(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return Qt(e),!0;if(ft&&e.nodeType===fe){const t=an(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return fn(Ge.afterSanitizeElements,e,null),!1},mn=function(e,t,n){if(it[t])return!1;if(bt&&("id"===t||"name"===t)&&(n in r||n in Xt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(Rt[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!vt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(hn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},dn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),hn=function(e){return!dn[b(e)]&&I(Ze,e)},gn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},yn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),cn(e)?Qt(e):h(o.removed)}catch(n){tn(t,e)}},Tn=function(e){fn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||cn(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Yt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Yt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,fn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!St||"id"!==s&&"name"!==s||0===N(f,Et)||(tn(a,e),f=Et+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?tn(a,e):"attributename"===s&&E(f,"href")?tn(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=an(f)),mn(r,s,f)?(f=gn(r,s,l,f),f!==u&&yn(e,a,l,f)):tn(a,e)):tn(a,e))}fn(Ge.afterSanitizeAttributes,e,null)},bn=function(e){let t=null;const n=rn(e);for(fn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){fn(Ge.uponSanitizeShadowNode,t,null),pn(t),Tn(t),sn(t.content)&&bn(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);sn(e)&&(Sn(e),bn(e))}}fn(Ge.afterSanitizeShadowDOM,e,null)},Sn=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){bn(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Yt(e)){const e=n.content;sn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);sn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Mt=!e,Mt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!un(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt||Kt(t),o.removed=[];const c=Nt&&"string"!=typeof e&&un(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Yt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(cn(e))throw k("root node is clobbered and cannot be sanitized in-place");try{Sn(e)}catch(t){throw en(e),t}}else if(un(e))n=on("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),Sn(r);else{if(!gt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&Tt?Me(e):e;if(n=on(e),!n)return gt?null:Tt?Ie:""}n&&ht&&Qt(n.firstChild);const s=rn(c?e:n);try{for(;a=s.nextNode();)pn(a),Tn(a),sn(a.content)&&bn(a.content)}catch(t){throw c&&en(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&nn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&ln(e),e;if(gt){if(ft&&ln(n),yt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=an(u)),Re&&Tt?Me(u):u},o.setConfig=function(){Kt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0},o.clearConfig=function(){qt=null,dt=!1,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){qt||Kt({});const o=Yt(e),r=Yt(t);return mn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(Ge[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])},o.removeHooks=function(e){Ge[e]=[]},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); //# sourceMappingURL=purify.min.js.map diff --git a/yarn.lock b/yarn.lock index 350609c72be..47a1b926560 100644 --- a/yarn.lock +++ b/yarn.lock @@ -537,7 +537,7 @@ __metadata: "@storybook/addon-onboarding": "npm:10.4.6" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" enzyme-to-json: "npm:^3.6.2" @@ -4821,7 +4821,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" es6-object-assign: "npm:1.1.0" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" @@ -7201,15 +7201,15 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.4.8": - version: 3.4.8 - resolution: "dompurify@npm:3.4.8" +"dompurify@npm:^3.4.10": + version: 3.4.10 + resolution: "dompurify@npm:3.4.10" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/d661322889a8938bfb99ee27853e9e78661949398e803f344865fd94f8378a494efadd329faea0b16e8085efae1bfeed5f5df372909c3a2be3e583686a0a48fa + checksum: 10/e051c70e7a0729d8cc04d40d7863dc8977495140857e81dc668fb548b7a43c7f80cfc973e3c9c0a6cd18b8eaa94ea7de9603daa02d38c8b15a9b32cc25a6f440 languageName: node linkType: hard @@ -8378,7 +8378,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" @@ -12956,7 +12956,7 @@ __metadata: "@types/redux": "npm:3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" eslint: "npm:^10.5.0" @@ -13841,7 +13841,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" enzyme: "npm:^3.11.0" enzyme-adapter-react-16: "npm:^1.15.8" es6-object-assign: "npm:1.1.0" @@ -15532,7 +15532,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" @@ -15700,7 +15700,7 @@ __metadata: "@types/redux": "npm:^3.6.31" create-react-class: "npm:^15.7.0" dayjs: "npm:^1.11.21" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" @@ -15912,7 +15912,7 @@ __metadata: "@rsbuild/plugin-react": "npm:^1.4.6" "@rsbuild/plugin-svgr": "npm:^1.3.1" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" globals: "npm:^17.6.0" @@ -15949,7 +15949,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" eslint: "npm:10.5.0" eslint-plugin-jest: "npm:^29.15.2" eslint-plugin-react: "npm:7.37.5" @@ -16766,7 +16766,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" es6-object-assign: "npm:1.1.0" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" @@ -16794,7 +16794,7 @@ __metadata: array.prototype.find: "npm:2.2.3" array.prototype.findindex: "npm:2.2.4" create-react-class: "npm:^15.7.0" - dompurify: "npm:^3.4.8" + dompurify: "npm:^3.4.10" es6-object-assign: "npm:1.1.0" eslint: "npm:10.5.0" eslint-plugin-react: "npm:7.37.5" From fcdb64ea043a4fb499bb1b3bc8952b68261cefd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 16:40:56 +0000 Subject: [PATCH 089/109] Bump tmp in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [tmp](https://github.com/raszi/node-tmp). Updates `tmp` from 0.2.6 to 0.2.7 - [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md) - [Commits](https://github.com/raszi/node-tmp/compare/v0.2.6...v0.2.7) --- updated-dependencies: - dependency-name: tmp dependency-version: 0.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 47a1b926560..f0f3c0e228c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16970,9 +16970,9 @@ __metadata: linkType: hard "tmp@npm:~0.2.1": - version: 0.2.6 - resolution: "tmp@npm:0.2.6" - checksum: 10/4ba072821d65f6ec0ae680dd49261bcc66c96a5a463c80ca040747256238aaad68ad5db7aa8367dd1554d22aa77c2988bdb1c5556ecfc4df105f5b73206b7d9b + version: 0.2.7 + resolution: "tmp@npm:0.2.7" + checksum: 10/0a3bc90beb0c6275273c3475fb57e466eaab1c9c4a101d029ff62b18146ce136e7f75d09de34863d9f2c2a492751402508f9e028bc98eb34a1416195d4b15619 languageName: node linkType: hard From 9c01f62d7c436aef3d2cce6371bbca5bedb644f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 22:22:52 +0000 Subject: [PATCH 090/109] Bump dotnet-sdk from 10.0.300 to 10.0.301 Bumps [dotnet-sdk](https://github.com/dotnet/sdk) from 10.0.300 to 10.0.301. - [Release notes](https://github.com/dotnet/sdk/releases) - [Commits](https://github.com/dotnet/sdk/compare/v10.0.300...v10.0.301) --- updated-dependencies: - dependency-name: dotnet-sdk dependency-version: 10.0.301 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- global.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global.json b/global.json index b897751910b..60fb48c8ad7 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.300", + "version": "10.0.301", "allowPrerelease": false, "rollForward": "latestMinor" } From 84afcb5bafa45a6bd64bd3bf535ca9c81b5065f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Jun 2026 06:34:57 +0000 Subject: [PATCH 091/109] Bump the npm_and_yarn group across 1 directory with 2 updates Bumps the npm_and_yarn group with 2 updates in the / directory: [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) and [form-data](https://github.com/form-data/form-data). Updates `@babel/core` from 7.29.0 to 7.29.7 - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.29.7/packages/babel-core) Updates `form-data` from 4.0.5 to 4.0.6 - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6) --- updated-dependencies: - dependency-name: "@babel/core" dependency-version: 7.29.7 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: form-data dependency-version: 4.0.6 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- yarn.lock | 200 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 146 insertions(+), 54 deletions(-) diff --git a/yarn.lock b/yarn.lock index f0f3c0e228c..951efb801d4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,33 +63,44 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.28.6": - version: 7.29.0 - resolution: "@babel/compat-data@npm:7.29.0" - checksum: 10/7f21beedb930ed8fbf7eabafc60e6e6521c1d905646bf1317a61b2163339157fe797efeb85962bf55136e166b01fd1a6b526a15974b92a8b877d564dcb6c9580 +"@babel/code-frame@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/84da552e51a55795a50b3589116edb2f9e368a647d266380683775f18effd9acd4521b0246bebd0b049a7f32af1f87b1e8475d3bcb665f876bd04ade8da99697 + languageName: node + linkType: hard + +"@babel/compat-data@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/compat-data@npm:7.29.7" + checksum: 10/ad2272714087f68970977f6e2b53597a8503fc9c3028c4a91686474bd77a707dd00903cdde4b73788972016d1bad4dc3fa4e5ff38e1ed8f1c3bde1095352973a languageName: node linkType: hard "@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4, @babel/core@npm:^7.28.0": - version: 7.29.0 - resolution: "@babel/core@npm:7.29.0" - dependencies: - "@babel/code-frame": "npm:^7.29.0" - "@babel/generator": "npm:^7.29.0" - "@babel/helper-compilation-targets": "npm:^7.28.6" - "@babel/helper-module-transforms": "npm:^7.28.6" - "@babel/helpers": "npm:^7.28.6" - "@babel/parser": "npm:^7.29.0" - "@babel/template": "npm:^7.28.6" - "@babel/traverse": "npm:^7.29.0" - "@babel/types": "npm:^7.29.0" + version: 7.29.7 + resolution: "@babel/core@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helpers": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/25f4e91688cdfbaf1365831f4f245b436cdaabe63d59389b75752013b8d61819ee4257101b52fc328b0546159fd7d0e74457ed7cf12c365fea54be4fb0a40229 + checksum: 10/38e71cf81db790b0bb2a3a0c8140c2b1c87576b61dc6be676de4fab8c3be871af590a739e8c489fe8e8f9a8e5899fa11e35e59e9e09d40b259c6a675f2f98928 languageName: node linkType: hard @@ -106,16 +117,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-compilation-targets@npm:7.28.6" +"@babel/generator@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/generator@npm:7.29.7" dependencies: - "@babel/compat-data": "npm:^7.28.6" - "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/60fb0432ebeab791b2d68e5fc49da6f8e8b68bcc4751211ccf08ac0101e9dcaddefd0cbbbd488afb1c1517515c7c3e76f63d9b05d06deaeb008afd499488db9c + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-compilation-targets@npm:7.29.7" + dependencies: + "@babel/compat-data": "npm:^7.29.7" + "@babel/helper-validator-option": "npm:^7.29.7" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 + checksum: 10/af9ed4299ad5cfbe48432a964f37cbbfc200bbeb0f8ba9cbc86448503fa929382d5161d32096274752230c9feb919c9ef595559498833da656fc6a8e24a62383 languageName: node linkType: hard @@ -126,26 +150,33 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-imports@npm:7.28.6" +"@babel/helper-globals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-globals@npm:7.29.7" + checksum: 10/e53203e87ae24a45f59639edea0c429bc3c63c6d74f1862fe60a35032d89478e7511d2f34855da0fcb65782668d72e59e93d1de5bc00121ba9bc1aa38f1f0ad3 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-imports@npm:7.29.7" dependencies: - "@babel/traverse": "npm:^7.28.6" - "@babel/types": "npm:^7.28.6" - checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/28ec6f7efd99588d6eebfb25c9f1ccc34cb0cdb0839c4c0f08b3ec0105ccaefbe7e8b4f651f3f55a4f5c4fcb1d979bd32a9b8ee23e3e62163ea22aaa7ee0dfa1 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.28.6": - version: 7.28.6 - resolution: "@babel/helper-module-transforms@npm:7.28.6" +"@babel/helper-module-transforms@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-transforms@npm:7.29.7" dependencies: - "@babel/helper-module-imports": "npm:^7.28.6" - "@babel/helper-validator-identifier": "npm:^7.28.5" - "@babel/traverse": "npm:^7.28.6" + "@babel/helper-module-imports": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b + checksum: 10/33251b1fb44d726194a974a0078b1269511d130a2609357ff829b479e9e4dca96ecd5384c534a477095f665ffb01503d3e680699c2002e5b62e6ca1a272f1892 languageName: node linkType: hard @@ -163,6 +194,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-string-parser@npm:7.29.7" + checksum: 10/4d8ef0ef7105f3d9fe4361137c8f42e5b4c7a52b5380b962762f2a528a1ba89064e2c6236090716ce34b63707b886ae0ebf36b2c2fcc2851f27e652febfc3648 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" @@ -170,20 +208,27 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-option@npm:7.27.1" - checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 +"@babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10/2efa42701eb05babf26dff3332109c9e5e1a3400a71fb9e68ee27af28235036a2a72c2494c04bdab3f909075f42a58b2e8271074372bc7f8e79ec02bd364d7a7 + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-option@npm:7.29.7" + checksum: 10/aeb6aa966f59300d3cc2fea7c68e1dfd7ad011fc10e535c8e2b2de3094b27c859428dc7220f16420350f8b1cde99da120b673be04bcb0c2f37b56258c96bed58 languageName: node linkType: hard -"@babel/helpers@npm:^7.28.6": - version: 7.29.2 - resolution: "@babel/helpers@npm:7.29.2" +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" dependencies: - "@babel/template": "npm:^7.28.6" - "@babel/types": "npm:^7.29.0" - checksum: 10/ad77706f3f917bd224e037fd0fbc67c45b240d2a45981321b093f70b7c535bee9bbddb0a19e34c362cb000ae21cdd8638f8a87a5f305a5bd7547e93fdcc524fe + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/b4d1ef12c19e896585c009ba29677839097ff04f8b11a2430d335c3fb6bd667b4f9e96a3b185a083fdde6b1137eabbbf2600c32425cb69cefc81d81d5cfe425d languageName: node linkType: hard @@ -198,6 +243,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/parser@npm:7.29.7" + dependencies: + "@babel/types": "npm:^7.29.7" + bin: + parser: ./bin/babel-parser.js + checksum: 10/da40c5928c95997b01aabe84fc3440881b8f20b866714fefa142961d37e82ffc03fbb9afed706f15f8a688278f95286ca0cea0d87ad6c77600f8c6c45d9824ee + languageName: node + linkType: hard + "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -403,7 +459,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": +"@babel/template@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/template@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10/da92f7a5b61e05d2fb3934a44f18cec6006ee3c595116c17a3b44cb9756ecd43205c7360dbfa326fa8f4d00aaeb9e777342a881070d11c2305e9c694bc3ca6ff + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.28.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" dependencies: @@ -418,6 +485,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/traverse@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-globals": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + debug: "npm:^4.3.1" + checksum: 10/ce24086a7dd8c408cbdb159437d3c8e02464a6d32b320d884fa742e2c5a3344b9342a923c7a371fc1789b4d82a59972a7008b5d8bbc1bc0c5ae42a39b28dc7f6 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" @@ -428,6 +510,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/types@npm:7.29.7" + dependencies: + "@babel/helper-string-parser": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + checksum: 10/bd4f5635db1057bd0abeebf93eb3ae38399e152271cea8dce8288350f0afa13ed3e2db2e16e22bd3303068890eec18965a83420539afbe0dde31432b4cf9636d + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -8599,15 +8691,15 @@ __metadata: linkType: hard "form-data@npm:^4.0.5": - version: 4.0.5 - resolution: "form-data@npm:4.0.5" + version: 4.0.6 + resolution: "form-data@npm:4.0.6" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" es-set-tostringtag: "npm:^2.1.0" - hasown: "npm:^2.0.2" - mime-types: "npm:^2.1.12" - checksum: 10/52ecd6e927c8c4e215e68a7ad5e0f7c1031397439672fd9741654b4a94722c4182e74cc815b225dcb5be3f4180f36428f67c6dd39eaa98af0dcfdd26c00c19cd + hasown: "npm:^2.0.4" + mime-types: "npm:^2.1.35" + checksum: 10/de6614c8537c92fa5fa3ee7e827758f98f5a9c033f348b7de81855ef36e5cb867e75d9f405d9483ab8d724a4a20d4e79926a299fa8dbba38f530eb659f0884e4 languageName: node linkType: hard @@ -9105,7 +9197,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.2, hasown@npm:^2.0.3": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2, hasown@npm:^2.0.3, hasown@npm:^2.0.4": version: 2.0.4 resolution: "hasown@npm:2.0.4" dependencies: @@ -11678,7 +11770,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.17, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.35, mime-types@npm:~2.1.17, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: From a23cc68bf8c735847a8f3c51cc56aaca663aa33f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 15:25:40 +0000 Subject: [PATCH 092/109] Bump the npm_and_yarn group across 1 directory with 3 updates Bumps the npm_and_yarn group with 3 updates in the / directory: [dompurify](https://github.com/cure53/DOMPurify), [jodit](https://github.com/xdan/jodit) and [undici](https://github.com/nodejs/undici). Updates `dompurify` from 3.4.10 to 3.4.11 - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/3.4.10...3.4.11) Updates `jodit` from 4.12.13 to 4.12.27 - [Release notes](https://github.com/xdan/jodit/releases) - [Changelog](https://github.com/xdan/jodit/blob/main/CHANGELOG.md) - [Commits](https://github.com/xdan/jodit/compare/4.12.13...4.12.27) Updates `undici` from 7.24.0 to 7.28.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v7.24.0...v7.28.0) --- updated-dependencies: - dependency-name: dompurify dependency-version: 3.4.11 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: jodit dependency-version: 4.12.27 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: undici dependency-version: 7.28.0 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 951efb801d4..42bac4ee5f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7294,14 +7294,14 @@ __metadata: linkType: hard "dompurify@npm:^3.4.10": - version: 3.4.10 - resolution: "dompurify@npm:3.4.10" + version: 3.4.11 + resolution: "dompurify@npm:3.4.11" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/e051c70e7a0729d8cc04d40d7863dc8977495140857e81dc668fb548b7a43c7f80cfc973e3c9c0a6cd18b8eaa94ea7de9603daa02d38c8b15a9b32cc25a6f440 + checksum: 10/d0473e1a22ed9cc23d86ef426717bce866913d1a725512a9478985bd917b272e0faba5f1d6ad8b2e37f3f4219206c4385162d7c984cfedcd23396e1e6ae0bc5e languageName: node linkType: hard @@ -10699,9 +10699,9 @@ __metadata: linkType: hard "jodit@npm:^4.11.15": - version: 4.12.13 - resolution: "jodit@npm:4.12.13" - checksum: 10/6e412bc8d68109103e6d02599c2a2eb0180940966dca616130a0e0063ae6c0139e07c3c835a99ea4cf1455652f39d046d2cca06033581eb3f9e52192dcb739ad + version: 4.12.27 + resolution: "jodit@npm:4.12.27" + checksum: 10/16d879414753666bdbda0fa92ad8ab67bd50bcf5d843cea24dc094ea98223f07238cab47873298a218fd7e0be22842a1a91347daba1e02dcbfc5b90c45fa61c9 languageName: node linkType: hard @@ -17496,9 +17496,9 @@ __metadata: linkType: hard "undici@npm:^7.10.0": - version: 7.24.0 - resolution: "undici@npm:7.24.0" - checksum: 10/663f08fe940e6cea3633748c82a77e975ab61d7e1d3fd9951a13213c4ddbc5c8196f741b57b52d0df9d08a34092b6aa31eeaff8cd545a0a23cacd0523c21a398 + version: 7.28.0 + resolution: "undici@npm:7.28.0" + checksum: 10/154423b280d623278a61decb437f8a7e581fb18b8c95556ef956b32a58cd668eadbb812d28e20678cb2dc545a566f35a3afc0962307ca801da30f4741117986d languageName: node linkType: hard From 7299ba25bcc9395f1b593d46871855716571bb4b Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Mon, 22 Jun 2026 10:32:07 -0500 Subject: [PATCH 093/109] Bump DOMPurify --- .../Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js | 4 ++-- .../admin/personaBar/scripts/contrib/purify.min.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js index e74386fed67..14c5715d2e8 100644 --- a/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/EditBar/Dnn.EditBar.UI/editBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.10/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.10",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=!1,gt=!1,yt=!1,Tt=!1,bt=!0,St=!1;const Et="user-content-";let At=!0,Nt=!1,_t={},wt=null;const Ot=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let vt=null;const Dt=M({},["audio","video","img","source","image","track"]);let Rt=null;const Ct=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),It="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",xt="http://www.w3.org/1999/xhtml";let Lt=xt,Mt=!1,zt=null;const Pt=M({},[It,kt,xt],S),Ut=l(["mi","mo","mn","ms","mtext"]);let Ft=M({},Ut);const Ht=l(["annotation-xml"]);let jt=M({},Ht);const Bt=M({},["title","style","font","a","script"]);let Gt=null;const Wt=["application/xhtml+xml","text/html"];let Yt=null,qt=null;const Xt=r.createElement("form"),$t=function(e){return e instanceof RegExp||e instanceof Function},Kt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(qt&&qt===e)return;e&&"object"==typeof e||(e={}),e=P(e),Gt=-1===Wt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Yt="application/xhtml+xml"===Gt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Yt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Yt}),zt=ye(e,"ALLOWED_NAMESPACES",Pt,{transform:S}),Rt=ye(e,"ADD_URI_SAFE_ATTR",Ct,{transform:Yt,base:Ct}),vt=ye(e,"ADD_DATA_URI_TAGS",Dt,{transform:Yt,base:Dt}),wt=ye(e,"FORBID_CONTENTS",Ot,{transform:Yt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Yt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Yt}),_t=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,gt=e.RETURN_DOM||!1,yt=e.RETURN_DOM_FRAGMENT||!1,Tt=e.RETURN_TRUSTED_TYPE||!1,ht=e.FORCE_BODY||!1,bt=!1!==e.SANITIZE_DOM,St=e.SANITIZE_NAMED_PROPS||!1,At=!1!==e.KEEP_CONTENT,Nt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Lt="string"==typeof e.NAMESPACE?e.NAMESPACE:xt,Ft=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ut),jt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Ht);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&$t(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&$t(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),yt&&(gt=!0),_t&&(Qe=M({},Y),tt=s(null),!0===_t.html&&(M(Qe,F),M(tt,q)),!0===_t.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===_t.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===_t.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Yt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Yt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(Rt,e.ADD_URI_SAFE_ATTR,Yt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.FORBID_CONTENTS,Yt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.ADD_FORBID_CONTENTS,Yt)),At&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&Qe===et&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&tt===nt&&(tt=P(tt)),l&&l(e),qt=e},Vt=M({},[...H,...j,...B]),Zt=M({},[...G,...W]),Jt=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:Lt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!zt[e.namespaceURI]&&(e.namespaceURI===kt?function(e,t,n){return t.namespaceURI===xt?"svg"===e:t.namespaceURI===It?"svg"===e&&("annotation-xml"===n||Ft[n]):Boolean(Vt[e])}(n,t,o):e.namespaceURI===It?function(e,t,n){return t.namespaceURI===xt?"math"===e:t.namespaceURI===kt?"math"===e&&jt[n]:Boolean(Zt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return!(t.namespaceURI===kt&&!jt[n])&&!(t.namespaceURI===It&&!Ft[n])&&!Zt[e]&&(Bt[e]||!Vt[e])}(n,t,o):!("application/xhtml+xml"!==Gt||!zt[e.namespaceURI]))},Qt=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},en=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},tn=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(gt||yt)try{Qt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},nn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Yt(r)])try{e.removeAttribute(r)}catch(e){}}},on=function(e){let t=null,n=null;if(ht)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Gt&&Lt===xt&&(e=''+e+"");const o=Re?Me(e):e;if(Lt===xt)try{t=(new z).parseFromString(o,Gt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(Lt,"template",null);try{t.documentElement.innerHTML=Mt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Lt===xt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},rn=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},an=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},ln=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=an(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{sn(e.content)&&ln(e.content)})},cn=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Yt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},sn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},un=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function fn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,qt)})}const pn=function(e){if(fn(Ge.beforeSanitizeElements,e,null),cn(e))return Qt(e),!0;const t=Yt(De?De(e):e.nodeName);if(fn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!un(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==xt||"style"!==t||!un(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return Qt(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&hn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(At&&!wt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=Nt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return Qt(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!Jt(e))return Qt(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return Qt(e),!0;if(ft&&e.nodeType===fe){const t=an(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return fn(Ge.afterSanitizeElements,e,null),!1},mn=function(e,t,n){if(it[t])return!1;if(bt&&("id"===t||"name"===t)&&(n in r||n in Xt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(Rt[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!vt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(hn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},dn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),hn=function(e){return!dn[b(e)]&&I(Ze,e)},gn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},yn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),cn(e)?Qt(e):h(o.removed)}catch(n){tn(t,e)}},Tn=function(e){fn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||cn(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Yt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Yt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,fn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!St||"id"!==s&&"name"!==s||0===N(f,Et)||(tn(a,e),f=Et+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?tn(a,e):"attributename"===s&&E(f,"href")?tn(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=an(f)),mn(r,s,f)?(f=gn(r,s,l,f),f!==u&&yn(e,a,l,f)):tn(a,e)):tn(a,e))}fn(Ge.afterSanitizeAttributes,e,null)},bn=function(e){let t=null;const n=rn(e);for(fn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){fn(Ge.uponSanitizeShadowNode,t,null),pn(t),Tn(t),sn(t.content)&&bn(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);sn(e)&&(Sn(e),bn(e))}}fn(Ge.afterSanitizeShadowDOM,e,null)},Sn=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){bn(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Yt(e)){const e=n.content;sn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);sn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Mt=!e,Mt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!un(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt||Kt(t),o.removed=[];const c=Nt&&"string"!=typeof e&&un(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Yt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(cn(e))throw k("root node is clobbered and cannot be sanitized in-place");try{Sn(e)}catch(t){throw en(e),t}}else if(un(e))n=on("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),Sn(r);else{if(!gt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&Tt?Me(e):e;if(n=on(e),!n)return gt?null:Tt?Ie:""}n&&ht&&Qt(n.firstChild);const s=rn(c?e:n);try{for(;a=s.nextNode();)pn(a),Tn(a),sn(a.content)&&bn(a.content)}catch(t){throw c&&en(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&nn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&ln(e),e;if(gt){if(ft&&ln(n),yt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=an(u)),Re&&Tt?Me(u):u},o.setConfig=function(){Kt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0},o.clearConfig=function(){qt=null,dt=!1,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){qt||Kt({});const o=Yt(e),r=Yt(t);return mn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(Ge[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])},o.removeHooks=function(e){Ge[e]=[]},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); +/*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.11",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=null,gt=null,yt=!1,Tt=!1,bt=!1,St=!1,Et=!0,At=!1;const Nt="user-content-";let _t=!0,wt=!1,Ot={},vt=null;const Dt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let Rt=null;const Ct=M({},["audio","video","img","source","image","track"]);let It=null;const kt=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),xt="http://www.w3.org/1998/Math/MathML",Lt="http://www.w3.org/2000/svg",Mt="http://www.w3.org/1999/xhtml";let zt=Mt,Pt=!1,Ut=null;const Ft=M({},[xt,Lt,Mt],S),Ht=l(["mi","mo","mn","ms","mtext"]);let jt=M({},Ht);const Bt=l(["annotation-xml"]);let Gt=M({},Bt);const Wt=M({},["title","style","font","a","script"]);let Yt=null;const qt=["application/xhtml+xml","text/html"];let Xt=null,$t=null;const Kt=r.createElement("form"),Vt=function(e){return e instanceof RegExp||e instanceof Function},Zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if($t&&$t===e)return;e&&"object"==typeof e||(e={}),e=P(e),Yt=-1===qt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Xt="application/xhtml+xml"===Yt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Xt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Xt}),Ut=ye(e,"ALLOWED_NAMESPACES",Ft,{transform:S}),It=ye(e,"ADD_URI_SAFE_ATTR",kt,{transform:Xt,base:kt}),Rt=ye(e,"ADD_DATA_URI_TAGS",Ct,{transform:Xt,base:Ct}),vt=ye(e,"FORBID_CONTENTS",Dt,{transform:Xt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Xt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Xt}),Ot=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,Tt=e.RETURN_DOM||!1,bt=e.RETURN_DOM_FRAGMENT||!1,St=e.RETURN_TRUSTED_TYPE||!1,yt=e.FORCE_BODY||!1,Et=!1!==e.SANITIZE_DOM,At=e.SANITIZE_NAMED_PROPS||!1,_t=!1!==e.KEEP_CONTENT,wt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,zt="string"==typeof e.NAMESPACE?e.NAMESPACE:Mt,jt=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ht),Gt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Bt);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&Vt(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&Vt(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),bt&&(Tt=!0),Ot&&(Qe=M({},Y),tt=s(null),!0===Ot.html&&(M(Qe,F),M(tt,q)),!0===Ot.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===Ot.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===Ot.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Xt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Xt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(It,e.ADD_URI_SAFE_ATTR,Xt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(vt===Dt&&(vt=P(vt)),M(vt,e.FORBID_CONTENTS,Xt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(vt===Dt&&(vt=P(vt)),M(vt,e.ADD_FORBID_CONTENTS,Xt)),_t&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));l&&l(e),$t=e},Jt=M({},[...H,...j,...B]),Qt=M({},[...G,...W]),en=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:zt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Ut[e.namespaceURI]&&(e.namespaceURI===Lt?function(e,t,n){return t.namespaceURI===Mt?"svg"===e:t.namespaceURI===xt?"svg"===e&&("annotation-xml"===n||jt[n]):Boolean(Jt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return t.namespaceURI===Mt?"math"===e:t.namespaceURI===Lt?"math"===e&&Gt[n]:Boolean(Qt[e])}(n,t,o):e.namespaceURI===Mt?function(e,t,n){return!(t.namespaceURI===Lt&&!Gt[n])&&!(t.namespaceURI===xt&&!jt[n])&&!Qt[e]&&(Wt[e]||!Jt[e])}(n,t,o):!("application/xhtml+xml"!==Yt||!Ut[e.namespaceURI]))},tn=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},nn=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},on=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Tt||bt)try{tn(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},rn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Xt(r)])try{e.removeAttribute(r)}catch(e){}}},an=function(e){let t=null,n=null;if(yt)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Yt&&zt===Mt&&(e=''+e+"");const o=Re?Me(e):e;if(zt===Mt)try{t=(new z).parseFromString(o,Yt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(zt,"template",null);try{t.documentElement.innerHTML=Pt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),zt===Mt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},ln=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},cn=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},sn=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=cn(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{fn(e.content)&&sn(e.content)})},un=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Xt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},fn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},pn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function mn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,$t)})}const dn=function(e){if(mn(Ge.beforeSanitizeElements,e,null),un(e))return tn(e),!0;const t=Xt(De?De(e):e.nodeName);if(mn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!pn(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==Mt||"style"!==t||!pn(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return tn(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&yn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(_t&&!vt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=wt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return tn(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!en(e))return tn(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return tn(e),!0;if(ft&&e.nodeType===fe){const t=cn(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return mn(Ge.afterSanitizeElements,e,null),!1},hn=function(e,t,n){if(it[t])return!1;if(Et&&("id"===t||"name"===t)&&(n in r||n in Kt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(It[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!Rt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(yn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},gn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),yn=function(e){return!gn[b(e)]&&I(Ze,e)},Tn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},bn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),un(e)?tn(e):h(o.removed)}catch(n){on(t,e)}},Sn=function(e){mn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||un(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Xt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Xt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,mn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!At||"id"!==s&&"name"!==s||0===N(f,Nt)||(on(a,e),f=Nt+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?on(a,e):"attributename"===s&&E(f,"href")?on(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=cn(f)),hn(r,s,f)?(f=Tn(r,s,l,f),f!==u&&bn(e,a,l,f)):on(a,e)):on(a,e))}mn(Ge.afterSanitizeAttributes,e,null)},En=function(e){let t=null;const n=ln(e);for(mn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){mn(Ge.uponSanitizeShadowNode,t,null),dn(t),Sn(t),fn(t.content)&&En(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);fn(e)&&(An(e),En(e))}}mn(Ge.afterSanitizeShadowDOM,e,null)},An=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){En(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Xt(e)){const e=n.content;fn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);fn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Pt=!e,Pt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!pn(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt?(Qe=ht,tt=gt):Zt(t),(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&(tt=P(tt)),o.removed=[];const c=wt&&"string"!=typeof e&&pn(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Xt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(un(e))throw k("root node is clobbered and cannot be sanitized in-place");try{An(e)}catch(t){throw nn(e),t}}else if(pn(e))n=an("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),An(r);else{if(!Tt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&St?Me(e):e;if(n=an(e),!n)return Tt?null:St?Ie:""}n&&yt&&tn(n.firstChild);const s=ln(c?e:n);try{for(;a=s.nextNode();)dn(a),Sn(a),fn(a.content)&&En(a.content)}catch(t){throw c&&nn(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&rn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&sn(e),e;if(Tt){if(ft&&sn(n),bt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=cn(u)),Re&&St?Me(u):u},o.setConfig=function(){Zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0,ht=Qe,gt=tt},o.clearConfig=function(){$t=null,dt=!1,ht=null,gt=null,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){$t||Zt({});const o=Xt(e),r=Xt(t);return hn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&R(Ge,e)&&g(Ge[e],t)},o.removeHook=function(e,t){if(R(Ge,e)){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])}},o.removeHooks=function(e){R(Ge,e)&&(Ge[e]=[])},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); //# sourceMappingURL=purify.min.js.map diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js index e74386fed67..14c5715d2e8 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.UI/admin/personaBar/scripts/contrib/purify.min.js @@ -1,3 +1,3 @@ -/*! @license DOMPurify 3.4.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.10/LICENSE */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.10",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=!1,gt=!1,yt=!1,Tt=!1,bt=!0,St=!1;const Et="user-content-";let At=!0,Nt=!1,_t={},wt=null;const Ot=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let vt=null;const Dt=M({},["audio","video","img","source","image","track"]);let Rt=null;const Ct=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),It="http://www.w3.org/1998/Math/MathML",kt="http://www.w3.org/2000/svg",xt="http://www.w3.org/1999/xhtml";let Lt=xt,Mt=!1,zt=null;const Pt=M({},[It,kt,xt],S),Ut=l(["mi","mo","mn","ms","mtext"]);let Ft=M({},Ut);const Ht=l(["annotation-xml"]);let jt=M({},Ht);const Bt=M({},["title","style","font","a","script"]);let Gt=null;const Wt=["application/xhtml+xml","text/html"];let Yt=null,qt=null;const Xt=r.createElement("form"),$t=function(e){return e instanceof RegExp||e instanceof Function},Kt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(qt&&qt===e)return;e&&"object"==typeof e||(e={}),e=P(e),Gt=-1===Wt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Yt="application/xhtml+xml"===Gt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Yt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Yt}),zt=ye(e,"ALLOWED_NAMESPACES",Pt,{transform:S}),Rt=ye(e,"ADD_URI_SAFE_ATTR",Ct,{transform:Yt,base:Ct}),vt=ye(e,"ADD_DATA_URI_TAGS",Dt,{transform:Yt,base:Dt}),wt=ye(e,"FORBID_CONTENTS",Ot,{transform:Yt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Yt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Yt}),_t=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,gt=e.RETURN_DOM||!1,yt=e.RETURN_DOM_FRAGMENT||!1,Tt=e.RETURN_TRUSTED_TYPE||!1,ht=e.FORCE_BODY||!1,bt=!1!==e.SANITIZE_DOM,St=e.SANITIZE_NAMED_PROPS||!1,At=!1!==e.KEEP_CONTENT,Nt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,Lt="string"==typeof e.NAMESPACE?e.NAMESPACE:xt,Ft=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ut),jt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Ht);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&$t(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&$t(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),yt&&(gt=!0),_t&&(Qe=M({},Y),tt=s(null),!0===_t.html&&(M(Qe,F),M(tt,q)),!0===_t.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===_t.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===_t.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Yt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Yt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(Rt,e.ADD_URI_SAFE_ATTR,Yt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.FORBID_CONTENTS,Yt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(wt===Ot&&(wt=P(wt)),M(wt,e.ADD_FORBID_CONTENTS,Yt)),At&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&Qe===et&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&tt===nt&&(tt=P(tt)),l&&l(e),qt=e},Vt=M({},[...H,...j,...B]),Zt=M({},[...G,...W]),Jt=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:Lt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!zt[e.namespaceURI]&&(e.namespaceURI===kt?function(e,t,n){return t.namespaceURI===xt?"svg"===e:t.namespaceURI===It?"svg"===e&&("annotation-xml"===n||Ft[n]):Boolean(Vt[e])}(n,t,o):e.namespaceURI===It?function(e,t,n){return t.namespaceURI===xt?"math"===e:t.namespaceURI===kt?"math"===e&&jt[n]:Boolean(Zt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return!(t.namespaceURI===kt&&!jt[n])&&!(t.namespaceURI===It&&!Ft[n])&&!Zt[e]&&(Bt[e]||!Vt[e])}(n,t,o):!("application/xhtml+xml"!==Gt||!zt[e.namespaceURI]))},Qt=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},en=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},tn=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(gt||yt)try{Qt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},nn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Yt(r)])try{e.removeAttribute(r)}catch(e){}}},on=function(e){let t=null,n=null;if(ht)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Gt&&Lt===xt&&(e=''+e+"");const o=Re?Me(e):e;if(Lt===xt)try{t=(new z).parseFromString(o,Gt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(Lt,"template",null);try{t.documentElement.innerHTML=Mt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Lt===xt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},rn=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},an=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},ln=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=an(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{sn(e.content)&&ln(e.content)})},cn=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Yt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},sn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},un=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function fn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,qt)})}const pn=function(e){if(fn(Ge.beforeSanitizeElements,e,null),cn(e))return Qt(e),!0;const t=Yt(De?De(e):e.nodeName);if(fn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!un(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==xt||"style"!==t||!un(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return Qt(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&hn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(At&&!wt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=Nt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return Qt(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!Jt(e))return Qt(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return Qt(e),!0;if(ft&&e.nodeType===fe){const t=an(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return fn(Ge.afterSanitizeElements,e,null),!1},mn=function(e,t,n){if(it[t])return!1;if(bt&&("id"===t||"name"===t)&&(n in r||n in Xt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(Rt[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!vt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(hn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},dn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),hn=function(e){return!dn[b(e)]&&I(Ze,e)},gn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},yn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),cn(e)?Qt(e):h(o.removed)}catch(n){tn(t,e)}},Tn=function(e){fn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||cn(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Yt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Yt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,fn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!St||"id"!==s&&"name"!==s||0===N(f,Et)||(tn(a,e),f=Et+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?tn(a,e):"attributename"===s&&E(f,"href")?tn(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=an(f)),mn(r,s,f)?(f=gn(r,s,l,f),f!==u&&yn(e,a,l,f)):tn(a,e)):tn(a,e))}fn(Ge.afterSanitizeAttributes,e,null)},bn=function(e){let t=null;const n=rn(e);for(fn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){fn(Ge.uponSanitizeShadowNode,t,null),pn(t),Tn(t),sn(t.content)&&bn(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);sn(e)&&(Sn(e),bn(e))}}fn(Ge.afterSanitizeShadowDOM,e,null)},Sn=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){bn(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Yt(e)){const e=n.content;sn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);sn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Mt=!e,Mt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!un(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt||Kt(t),o.removed=[];const c=Nt&&"string"!=typeof e&&un(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Yt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(cn(e))throw k("root node is clobbered and cannot be sanitized in-place");try{Sn(e)}catch(t){throw en(e),t}}else if(un(e))n=on("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),Sn(r);else{if(!gt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&Tt?Me(e):e;if(n=on(e),!n)return gt?null:Tt?Ie:""}n&&ht&&Qt(n.firstChild);const s=rn(c?e:n);try{for(;a=s.nextNode();)pn(a),Tn(a),sn(a.content)&&bn(a.content)}catch(t){throw c&&en(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&nn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&ln(e),e;if(gt){if(ft&&ln(n),yt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=an(u)),Re&&Tt?Me(u):u},o.setConfig=function(){Kt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0},o.clearConfig=function(){qt=null,dt=!1,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){qt||Kt({});const o=Yt(e),r=Yt(t);return mn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&g(Ge[e],t)},o.removeHook=function(e,t){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])},o.removeHooks=function(e){Ge[e]=[]},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); +/*! @license DOMPurify 3.4.11 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.11/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:b;if(o&&o(e,null),!T(t))return e;let i=t.length;for(;i--;){let o=t[i];if("string"==typeof o){const e=n(o);e!==o&&(r(t)||(t[i]=e),o=e)}e[o]=!0}return e}function z(e){for(let t=0;t/g),J=c(/\${[\w\W]*/g),Q=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),ee=c(/^aria-[\-\w]+$/),te=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ne=c(/^(?:\w+script|data):/i),oe=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),re=c(/^html$/i),ie=c(/^[a-z][.\w]*(-[.\w]+)+$/i),ae=c(/<[/\w!]/g),le=c(/<[/\w]/g),ce=c(/<\/no(script|embed|frames)/i),se=c(/\/>/i),ue=1,fe=3,pe=7,me=8,de=9,he=11,ge=function(){return"undefined"==typeof window?null:window},ye=function(e,t,n,o){return R(e,t)&&T(e[t])?M(o.base?P(o.base):{},e[t],o.transform):n};var Te=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ge();const o=t=>e(t);if(o.version="3.4.11",o.removed=[],!t||!t.document||t.document.nodeType!==de||!t.Element)return o.isSupported=!1,o;let r=t.document;const i=r,a=i.currentScript;t.DocumentFragment;const u=t.HTMLTemplateElement,f=t.Node,p=t.Element,x=t.NodeFilter,L=t.NamedNodeMap;void 0===L&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const z=t.DOMParser,Te=t.trustedTypes,be=p.prototype,Se=U(be,"cloneNode"),Ee=U(be,"remove"),Ae=U(be,"nextSibling"),Ne=U(be,"childNodes"),_e=U(be,"parentNode"),we=U(be,"shadowRoot"),Oe=U(be,"attributes"),ve=f&&f.prototype?U(f.prototype,"nodeType"):null,De=f&&f.prototype?U(f.prototype,"nodeName"):null;if("function"==typeof u){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Re,Ce,Ie="",ke=!1,xe=0;const Le=function(){if(xe>0)throw k('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},Me=function(e){Le(),xe++;try{return Re.createHTML(e)}finally{xe--}},ze=function(){return ke||(Ce=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(Te,a),ke=!0),Ce},Pe=r,Ue=Pe.implementation,Fe=Pe.createNodeIterator,He=Pe.createDocumentFragment,je=Pe.getElementsByTagName,Be=i.importNode;let Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof n&&"function"==typeof _e&&Ue&&void 0!==Ue.createHTMLDocument;const We=V,Ye=Z,qe=J,Xe=Q,$e=ee,Ke=ne,Ve=oe,Ze=ie;let Je=te,Qe=null;const et=M({},[...F,...H,...j,...G,...Y]);let tt=null;const nt=M({},[...q,...X,...$,...K]);let ot=Object.seal(s(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),rt=null,it=null;const at=Object.seal(s(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,ct=!0,st=!1,ut=!0,ft=!1,pt=!0,mt=!1,dt=!1,ht=null,gt=null,yt=!1,Tt=!1,bt=!1,St=!1,Et=!0,At=!1;const Nt="user-content-";let _t=!0,wt=!1,Ot={},vt=null;const Dt=M({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let Rt=null;const Ct=M({},["audio","video","img","source","image","track"]);let It=null;const kt=M({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),xt="http://www.w3.org/1998/Math/MathML",Lt="http://www.w3.org/2000/svg",Mt="http://www.w3.org/1999/xhtml";let zt=Mt,Pt=!1,Ut=null;const Ft=M({},[xt,Lt,Mt],S),Ht=l(["mi","mo","mn","ms","mtext"]);let jt=M({},Ht);const Bt=l(["annotation-xml"]);let Gt=M({},Bt);const Wt=M({},["title","style","font","a","script"]);let Yt=null;const qt=["application/xhtml+xml","text/html"];let Xt=null,$t=null;const Kt=r.createElement("form"),Vt=function(e){return e instanceof RegExp||e instanceof Function},Zt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if($t&&$t===e)return;e&&"object"==typeof e||(e={}),e=P(e),Yt=-1===qt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Xt="application/xhtml+xml"===Yt?S:b,Qe=ye(e,"ALLOWED_TAGS",et,{transform:Xt}),tt=ye(e,"ALLOWED_ATTR",nt,{transform:Xt}),Ut=ye(e,"ALLOWED_NAMESPACES",Ft,{transform:S}),It=ye(e,"ADD_URI_SAFE_ATTR",kt,{transform:Xt,base:kt}),Rt=ye(e,"ADD_DATA_URI_TAGS",Ct,{transform:Xt,base:Ct}),vt=ye(e,"FORBID_CONTENTS",Dt,{transform:Xt}),rt=ye(e,"FORBID_TAGS",P({}),{transform:Xt}),it=ye(e,"FORBID_ATTR",P({}),{transform:Xt}),Ot=!!R(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?P(e.USE_PROFILES):e.USE_PROFILES),lt=!1!==e.ALLOW_ARIA_ATTR,ct=!1!==e.ALLOW_DATA_ATTR,st=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ft=e.SAFE_FOR_TEMPLATES||!1,pt=!1!==e.SAFE_FOR_XML,mt=e.WHOLE_DOCUMENT||!1,Tt=e.RETURN_DOM||!1,bt=e.RETURN_DOM_FRAGMENT||!1,St=e.RETURN_TRUSTED_TYPE||!1,yt=e.FORCE_BODY||!1,Et=!1!==e.SANITIZE_DOM,At=e.SANITIZE_NAMED_PROPS||!1,_t=!1!==e.KEEP_CONTENT,wt=e.IN_PLACE||!1,Je=function(e){try{return I(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:te,zt="string"==typeof e.NAMESPACE?e.NAMESPACE:Mt,jt=R(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?P(e.MATHML_TEXT_INTEGRATION_POINTS):M({},Ht),Gt=R(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?P(e.HTML_INTEGRATION_POINTS):M({},Bt);const t=R(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?P(e.CUSTOM_ELEMENT_HANDLING):s(null);if(ot=s(null),R(t,"tagNameCheck")&&Vt(t.tagNameCheck)&&(ot.tagNameCheck=t.tagNameCheck),R(t,"attributeNameCheck")&&Vt(t.attributeNameCheck)&&(ot.attributeNameCheck=t.attributeNameCheck),R(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(ot.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),c(ot),ft&&(ct=!1),bt&&(Tt=!0),Ot&&(Qe=M({},Y),tt=s(null),!0===Ot.html&&(M(Qe,F),M(tt,q)),!0===Ot.svg&&(M(Qe,H),M(tt,X),M(tt,K)),!0===Ot.svgFilters&&(M(Qe,j),M(tt,X),M(tt,K)),!0===Ot.mathMl&&(M(Qe,G),M(tt,$),M(tt,K))),at.tagCheck=null,at.attributeCheck=null,R(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?at.tagCheck=e.ADD_TAGS:T(e.ADD_TAGS)&&(Qe===et&&(Qe=P(Qe)),M(Qe,e.ADD_TAGS,Xt))),R(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?at.attributeCheck=e.ADD_ATTR:T(e.ADD_ATTR)&&(tt===nt&&(tt=P(tt)),M(tt,e.ADD_ATTR,Xt))),R(e,"ADD_URI_SAFE_ATTR")&&T(e.ADD_URI_SAFE_ATTR)&&M(It,e.ADD_URI_SAFE_ATTR,Xt),R(e,"FORBID_CONTENTS")&&T(e.FORBID_CONTENTS)&&(vt===Dt&&(vt=P(vt)),M(vt,e.FORBID_CONTENTS,Xt)),R(e,"ADD_FORBID_CONTENTS")&&T(e.ADD_FORBID_CONTENTS)&&(vt===Dt&&(vt=P(vt)),M(vt,e.ADD_FORBID_CONTENTS,Xt)),_t&&(Qe["#text"]=!0),mt&&M(Qe,["html","head","body"]),Qe.table&&(M(Qe,["tbody"]),delete rt.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw k('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=Re;Re=e.TRUSTED_TYPES_POLICY;try{Ie=Me("")}catch(e){throw Re=t,e}}else null===e.TRUSTED_TYPES_POLICY?(Re=void 0,Ie=""):(void 0===Re&&(Re=ze()),Re&&"string"==typeof Ie&&(Ie=Me("")));l&&l(e),$t=e},Jt=M({},[...H,...j,...B]),Qt=M({},[...G,...W]),en=function(e){let t=_e(e);t&&t.tagName||(t={namespaceURI:zt,tagName:"template"});const n=b(e.tagName),o=b(t.tagName);return!!Ut[e.namespaceURI]&&(e.namespaceURI===Lt?function(e,t,n){return t.namespaceURI===Mt?"svg"===e:t.namespaceURI===xt?"svg"===e&&("annotation-xml"===n||jt[n]):Boolean(Jt[e])}(n,t,o):e.namespaceURI===xt?function(e,t,n){return t.namespaceURI===Mt?"math"===e:t.namespaceURI===Lt?"math"===e&&Gt[n]:Boolean(Qt[e])}(n,t,o):e.namespaceURI===Mt?function(e,t,n){return!(t.namespaceURI===Lt&&!Gt[n])&&!(t.namespaceURI===xt&&!jt[n])&&!Qt[e]&&(Wt[e]||!Jt[e])}(n,t,o):!("application/xhtml+xml"!==Yt||!Ut[e.namespaceURI]))},tn=function(e){g(o.removed,{element:e});try{_e(e).removeChild(e)}catch(t){if(Ee(e),!_e(e))throw k("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},nn=function(e){const t=Ne(e);if(t){const e=[];m(t,t=>{g(e,t)}),m(e,e=>{try{Ee(e)}catch(e){}})}const n=Oe(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},on=function(e,t){try{g(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){g(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Tt||bt)try{tn(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},rn=function(e){const t=Oe(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!tt[Xt(r)])try{e.removeAttribute(r)}catch(e){}}},an=function(e){let t=null,n=null;if(yt)e=""+e;else{const t=E(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Yt&&zt===Mt&&(e=''+e+"");const o=Re?Me(e):e;if(zt===Mt)try{t=(new z).parseFromString(o,Yt)}catch(e){}if(!t||!t.documentElement){t=Ue.createDocument(zt,"template",null);try{t.documentElement.innerHTML=Pt?Ie:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),zt===Mt?je.call(t,mt?"html":"body")[0]:mt?t.documentElement:i},ln=function(e){return Fe.call(e.ownerDocument||e,e,x.SHOW_ELEMENT|x.SHOW_COMMENT|x.SHOW_TEXT|x.SHOW_PROCESSING_INSTRUCTION|x.SHOW_CDATA_SECTION,null)},cn=function(e){return e=A(e,We," "),e=A(e,Ye," "),e=A(e,qe," ")},sn=function(e){var t;e.normalize();const n=Fe.call(e.ownerDocument||e,e,x.SHOW_TEXT|x.SHOW_COMMENT|x.SHOW_CDATA_SECTION|x.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=cn(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&m(r,e=>{fn(e.content)&&sn(e.content)})},un=function(e){const t=De?De(e):null;return"string"==typeof t&&("form"===Xt(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==Oe(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==ve(e)||e.childNodes!==Ne(e)))},fn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return ve(e)===he}catch(e){return!1}},pn=function(e){if(!ve||"object"!=typeof e||null===e)return!1;try{return"number"==typeof ve(e)}catch(e){return!1}};function mn(e,t,n){0!==e.length&&m(e,e=>{e.call(o,t,n,$t)})}const dn=function(e){if(mn(Ge.beforeSanitizeElements,e,null),un(e))return tn(e),!0;const t=Xt(De?De(e):e.nodeName);if(mn(Ge.uponSanitizeElement,e,{tagName:t,allowedTags:Qe}),function(e,t){return!!(pt&&e.hasChildNodes()&&!pn(e.firstElementChild)&&I(ae,e.textContent)&&I(ae,e.innerHTML))||!(!pt||e.namespaceURI!==Mt||"style"!==t||!pn(e.firstElementChild))||e.nodeType===pe||!(!pt||e.nodeType!==me||!I(le,e.data))}(e,t))return tn(e),!0;if(rt[t]||!(at.tagCheck instanceof Function&&at.tagCheck(t))&&!Qe[t])return function(e,t){if(!rt[t]&&yn(t)){if(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,t))return!1;if(ot.tagNameCheck instanceof Function&&ot.tagNameCheck(t))return!1}if(_t&&!vt[t]){const t=_e(e),n=Ne(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=wt?n[o]:Se(n[o],!0);t.insertBefore(r,Ae(e))}}return tn(e),!0}(e,t);if((ve?ve(e):e.nodeType)===ue&&!en(e))return tn(e),!0;if(("noscript"===t||"noembed"===t||"noframes"===t)&&I(ce,e.innerHTML))return tn(e),!0;if(ft&&e.nodeType===fe){const t=cn(e.textContent);e.textContent!==t&&(g(o.removed,{element:e.cloneNode()}),e.textContent=t)}return mn(Ge.afterSanitizeElements,e,null),!1},hn=function(e,t,n){if(it[t])return!1;if(Et&&("id"===t||"name"===t)&&(n in r||n in Kt))return!1;const o=tt[t]||at.attributeCheck instanceof Function&&at.attributeCheck(t,e);if(ct&&I(Xe,t));else if(lt&&I($e,t));else if(o)if(It[t]);else if(I(Je,A(n,Ve,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==N(n,"data:")||!Rt[e]){if(st&&!I(Ke,A(n,Ve,"")));else if(n)return!1}else;else if(!(yn(e)&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,e)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(e))&&(ot.attributeNameCheck instanceof RegExp&&I(ot.attributeNameCheck,t)||ot.attributeNameCheck instanceof Function&&ot.attributeNameCheck(t,e))||"is"===t&&ot.allowCustomizedBuiltInElements&&(ot.tagNameCheck instanceof RegExp&&I(ot.tagNameCheck,n)||ot.tagNameCheck instanceof Function&&ot.tagNameCheck(n))))return!1;return!0},gn=M({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),yn=function(e){return!gn[b(e)]&&I(Ze,e)},Tn=function(e,t,n,o){if(Re&&"object"==typeof Te&&"function"==typeof Te.getAttributeType&&!n)switch(Te.getAttributeType(e,t)){case"TrustedHTML":return Me(o);case"TrustedScriptURL":return function(e){Le(),xe++;try{return Re.createScriptURL(e)}finally{xe--}}(o)}return o},bn=function(e,t,n,r){try{n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),un(e)?tn(e):h(o.removed)}catch(n){on(t,e)}},Sn=function(e){mn(Ge.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||un(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:tt,forceKeepAttr:void 0};let o=t.length;const r=Xt(e.nodeName);for(;o--;){const i=t[o],a=i.name,l=i.namespaceURI,c=i.value,s=Xt(a),u=c;let f="value"===a?u:_(u);n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,mn(Ge.uponSanitizeAttribute,e,n),f=n.attrValue,!At||"id"!==s&&"name"!==s||0===N(f,Nt)||(on(a,e),f=Nt+f),pt&&I(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)?on(a,e):"attributename"===s&&E(f,"href")?on(a,e):n.forceKeepAttr||(n.keepAttr&&(ut||!I(se,f))?(ft&&(f=cn(f)),hn(r,s,f)?(f=Tn(r,s,l,f),f!==u&&bn(e,a,l,f)):on(a,e)):on(a,e))}mn(Ge.afterSanitizeAttributes,e,null)},En=function(e){let t=null;const n=ln(e);for(mn(Ge.beforeSanitizeShadowDOM,e,null);t=n.nextNode();){mn(Ge.uponSanitizeShadowNode,t,null),dn(t),Sn(t),fn(t.content)&&En(t.content);if((ve?ve(t):t.nodeType)===ue){const e=we(t);fn(e)&&(An(e),En(e))}}mn(Ge.afterSanitizeShadowDOM,e,null)},An=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){En(e.shadow);continue}const n=e.node,o=(ve?ve(n):n.nodeType)===ue,r=Ne(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=De?De(n):null;if("string"==typeof e&&"template"===Xt(e)){const e=n.content;fn(e)&&t.push({node:e,shadow:null})}}if(o){const e=we(n);fn(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,a=null,l=null;if(Pt=!e,Pt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!pn(e)&&"string"!=typeof(e=function(e){switch(typeof e){case"string":return e;case"number":return w(e);case"boolean":return O(e);case"bigint":return v?v(e):"0";case"symbol":return D?D(e):"Symbol()";case"undefined":default:return C(e);case"function":case"object":{if(null===e)return C(e);const t=e,n=U(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:C(e)}return C(e)}}}(e)))throw k("dirty is not a string, aborting");if(!o.isSupported)return e;dt?(Qe=ht,tt=gt):Zt(t),(Ge.uponSanitizeElement.length>0||Ge.uponSanitizeAttribute.length>0)&&(Qe=P(Qe)),Ge.uponSanitizeAttribute.length>0&&(tt=P(tt)),o.removed=[];const c=wt&&"string"!=typeof e&&pn(e);if(c){const t=De?De(e):e.nodeName;if("string"==typeof t){const e=Xt(t);if(!Qe[e]||rt[e])throw k("root node is forbidden and cannot be sanitized in-place")}if(un(e))throw k("root node is clobbered and cannot be sanitized in-place");try{An(e)}catch(t){throw nn(e),t}}else if(pn(e))n=an("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===ue&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r),An(r);else{if(!Tt&&!ft&&!mt&&-1===e.indexOf("<"))return Re&&St?Me(e):e;if(n=an(e),!n)return Tt?null:St?Ie:""}n&&yt&&tn(n.firstChild);const s=ln(c?e:n);try{for(;a=s.nextNode();)dn(a),Sn(a),fn(a.content)&&En(a.content)}catch(t){throw c&&nn(e),t}if(c)return m(o.removed,e=>{e.element&&function(e){const t=[e];for(;t.length>0;){const e=t.pop();(ve?ve(e):e.nodeType)===ue&&rn(e);const n=Ne(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}}(e.element)}),ft&&sn(e),e;if(Tt){if(ft&&sn(n),bt)for(l=He.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(tt.shadowroot||tt.shadowrootmode)&&(l=Be.call(i,l,!0)),l}let u=mt?n.outerHTML:n.innerHTML;return mt&&Qe["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&I(re,n.ownerDocument.doctype.name)&&(u="\n"+u),ft&&(u=cn(u)),Re&&St?Me(u):u},o.setConfig=function(){Zt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),dt=!0,ht=Qe,gt=tt},o.clearConfig=function(){$t=null,dt=!1,ht=null,gt=null,Re=Ce,Ie=""},o.isValidAttribute=function(e,t,n){$t||Zt({});const o=Xt(e),r=Xt(t);return hn(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&R(Ge,e)&&g(Ge[e],t)},o.removeHook=function(e,t){if(R(Ge,e)){if(void 0!==t){const n=d(Ge[e],t);return-1===n?void 0:y(Ge[e],n,1)[0]}return h(Ge[e])}},o.removeHooks=function(e){R(Ge,e)&&(Ge[e]=[])},o.removeAllHooks=function(){Ge={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return Te}); //# sourceMappingURL=purify.min.js.map From 9cc1536b75bf764420af61033d212b10675df759 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 23 Jun 2026 08:13:15 -0500 Subject: [PATCH 094/109] Simplify guard for PR step - Avoid using `contains` (see https://docs.github.com/en/actions/reference/workflows-and-actions/expressions#contains) - There is only one event that can trigger this workflow, `push`, that we would want to create a PR from - Don't accept `main` branch that this repo doesn't use --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60bdbb21786..60e02f1e245 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -141,7 +141,7 @@ jobs: overwrite: true - name: "Create GitHub Pull Request" - if: ${{ success() && !contains('pull_request', github.event_name) && (contains(fromJSON('["develop", "main"]'), github.ref_name) || startsWith('release/', github.ref_name)) }} + if: ${{ success() && github.event_name == 'push' && (github.ref_name == 'develop' || startsWith('release/', github.ref_name)) }} run: "./build.ps1 --target=CreateGitHubPullRequest --verbosity=$env:CAKE_VERBOSITY" env: GITHUB_APP_ID: ${{ secrets.GITHUB_APP_ID }} From 0722b3462c862396ac3a78b7c43a4cf579995911 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 23 Jun 2026 08:13:15 -0500 Subject: [PATCH 095/109] Provide default priority for CDF controls Fixes #7335 --- DNN Platform/DotNetNuke.Web.Client/Controls/DnnCssInclude.cs | 1 + DNN Platform/DotNetNuke.Web.Client/Controls/DnnJsInclude.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/DNN Platform/DotNetNuke.Web.Client/Controls/DnnCssInclude.cs b/DNN Platform/DotNetNuke.Web.Client/Controls/DnnCssInclude.cs index 1457c8a18da..9936529d1c2 100644 --- a/DNN Platform/DotNetNuke.Web.Client/Controls/DnnCssInclude.cs +++ b/DNN Platform/DotNetNuke.Web.Client/Controls/DnnCssInclude.cs @@ -31,6 +31,7 @@ public DnnCssInclude(IClientResourceController clientResourceController) this.clientResourceController = clientResourceController ?? DependencyInjection.GetCurrentServiceProvider().GetRequiredService(); this.ForceProvider = ClientResourceProviders.DefaultCssProvider; this.DependencyType = ClientDependencyType.Css; + this.Priority = (int)FileOrder.Css.DefaultPriority; } /// diff --git a/DNN Platform/DotNetNuke.Web.Client/Controls/DnnJsInclude.cs b/DNN Platform/DotNetNuke.Web.Client/Controls/DnnJsInclude.cs index 4313446085f..9ae393453c0 100644 --- a/DNN Platform/DotNetNuke.Web.Client/Controls/DnnJsInclude.cs +++ b/DNN Platform/DotNetNuke.Web.Client/Controls/DnnJsInclude.cs @@ -32,6 +32,7 @@ public DnnJsInclude(IClientResourceController clientResourceController) this.clientResourceController = clientResourceController ?? DependencyInjection.GetCurrentServiceProvider().GetRequiredService(); this.ForceProvider = ClientResourceProviders.DefaultJsProvider; this.DependencyType = ClientDependencyType.Javascript; + this.Priority = (int)FileOrder.Js.DefaultPriority; } /// From 49a1b2e51a9996d8a27d3ff757e5ede2ef739b4b Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Tue, 23 Jun 2026 08:13:15 -0500 Subject: [PATCH 096/109] Fix DnnCssInclude and DnnJsInclude skin objects Due to timing changes, they were not correctly registering anything --- .../Website/admin/Skins/DnnCssInclude.ascx.cs | 119 +++++++++++------ .../Website/admin/Skins/DnnJsInclude.ascx.cs | 123 ++++++++++++------ 2 files changed, 163 insertions(+), 79 deletions(-) diff --git a/DNN Platform/Website/admin/Skins/DnnCssInclude.ascx.cs b/DNN Platform/Website/admin/Skins/DnnCssInclude.ascx.cs index ca68ec6162e..8fbf4dec8af 100644 --- a/DNN Platform/Website/admin/Skins/DnnCssInclude.ascx.cs +++ b/DNN Platform/Website/admin/Skins/DnnCssInclude.ascx.cs @@ -11,71 +11,110 @@ namespace DotNetNuke.UI.Skins.Controls /// A control which causes CSS to be included on the page. public partial class DnnCssInclude : SkinObjectBase { - public CssMediaType CssMedia { get; set; } = CssMediaType.None; + public CssMediaType CssMedia + { + get => Enum.TryParse(this.ctlInclude.CssMedia, out var media) ? media : CssMediaType.None; + set => this.ctlInclude.CssMedia = value.ToString().ToLowerInvariant(); + } - public string FilePath { get; set; } + public string FilePath + { + get => this.ctlInclude.FilePath; + set => this.ctlInclude.FilePath = value; + } - public string PathNameAlias { get; set; } + public string PathNameAlias + { + get => this.ctlInclude.PathNameAlias; + set => this.ctlInclude.PathNameAlias = value; + } - public int Priority { get; set; } + public int Priority + { + get => this.ctlInclude.Priority; + set => this.ctlInclude.Priority = value; + } - public bool AddTag { get; set; } + public bool AddTag + { + get => this.ctlInclude.AddTag; + set => this.ctlInclude.AddTag = value; + } - public string Name { get; set; } + public string Name + { + get => this.ctlInclude.Name; + set => this.ctlInclude.Name = value; + } - public string Version { get; set; } + public string Version + { + get => this.ctlInclude.Version; + set => this.ctlInclude.Version = value; + } - public bool ForceVersion { get; set; } + public bool ForceVersion + { + get => this.ctlInclude.ForceVersion; + set => this.ctlInclude.ForceVersion = value; + } - public string ForceProvider { get; set; } + public string ForceProvider + { + get => this.ctlInclude.ForceProvider; + set => this.ctlInclude.ForceProvider = value; + } [Obsolete("Deprecated in DotNetNuke 10.2.0. Bundling is no longer supported, there is no replacement within DNN for this functionality. Scheduled removal in v12.0.0.")] public bool ForceBundle { get; set; } /// Gets or sets the CDN URL of the resource. - public string CdnUrl { get; set; } + public string CdnUrl + { + get => this.ctlInclude.CdnUrl; + set => this.ctlInclude.CdnUrl = value; + } /// Gets or sets a value indicating whether to render the blocking attribute. - public bool Blocking { get; set; } + public bool Blocking + { + get => this.ctlInclude.Blocking; + set => this.ctlInclude.Blocking = value; + } /// Gets or sets the integrity hash of the resource. - public string Integrity { get; set; } + public string Integrity + { + get => this.ctlInclude.Integrity; + set => this.ctlInclude.Integrity = value; + } /// Gets or sets the value of the crossorigin attribute. - public CrossOrigin CrossOrigin { get; set; } + public CrossOrigin CrossOrigin + { + get => this.ctlInclude.CrossOrigin; + set => this.ctlInclude.CrossOrigin = value; + } /// Gets or sets the value of the fetchpriority attribute. - public FetchPriority FetchPriority { get; set; } + public FetchPriority FetchPriority + { + get => this.ctlInclude.FetchPriority; + set => this.ctlInclude.FetchPriority = value; + } /// Gets or sets the value of the referrerpolicy attribute. - public ReferrerPolicy ReferrerPolicy { get; set; } + public ReferrerPolicy ReferrerPolicy + { + get => this.ctlInclude.ReferrerPolicy; + set => this.ctlInclude.ReferrerPolicy = value; + } /// Gets or sets a value indicating whether the client resource should be preloaded. - public bool Preload { get; set; } - - /// - protected override void OnInit(EventArgs e) - { - base.OnInit(e); - this.ctlInclude.AddTag = this.AddTag; - this.ctlInclude.FilePath = this.FilePath; - this.ctlInclude.ForceProvider = this.ForceProvider; - this.ctlInclude.ForceVersion = this.ForceVersion; - this.ctlInclude.Name = this.Name; - this.ctlInclude.PathNameAlias = this.PathNameAlias; - this.ctlInclude.Priority = this.Priority; - this.ctlInclude.Version = this.Version; - this.ctlInclude.CdnUrl = this.CdnUrl; - this.ctlInclude.Blocking = this.Blocking; - this.ctlInclude.Integrity = this.Integrity; - this.ctlInclude.CrossOrigin = this.CrossOrigin; - this.ctlInclude.FetchPriority = this.FetchPriority; - this.ctlInclude.ReferrerPolicy = this.ReferrerPolicy; - this.ctlInclude.Preload = this.Preload; - if (this.CssMedia != CssMediaType.None) - { - this.ctlInclude.CssMedia = this.CssMedia.ToString().ToLowerInvariant(); - } + public bool Preload + { + get => this.ctlInclude.Preload; + set => this.ctlInclude.Preload = value; } } } diff --git a/DNN Platform/Website/admin/Skins/DnnJsInclude.ascx.cs b/DNN Platform/Website/admin/Skins/DnnJsInclude.ascx.cs index d887fad321c..0f294b385cb 100644 --- a/DNN Platform/Website/admin/Skins/DnnJsInclude.ascx.cs +++ b/DNN Platform/Website/admin/Skins/DnnJsInclude.ascx.cs @@ -10,73 +10,118 @@ namespace DotNetNuke.UI.Skins.Controls /// A control which causes JavaScript to be included on the page. public partial class DnnJsInclude : SkinObjectBase { - public string FilePath { get; set; } + public string FilePath + { + get => this.ctlInclude.FilePath; + set => this.ctlInclude.FilePath = value; + } - public string PathNameAlias { get; set; } + public string PathNameAlias + { + get => this.ctlInclude.PathNameAlias; + set => this.ctlInclude.PathNameAlias = value; + } - public int Priority { get; set; } + public int Priority + { + get => this.ctlInclude.Priority; + set => this.ctlInclude.Priority = value; + } - public bool AddTag { get; set; } + public bool AddTag + { + get => this.ctlInclude.AddTag; + set => this.ctlInclude.AddTag = value; + } - public string Name { get; set; } + public string Name + { + get => this.ctlInclude.Name; + set => this.ctlInclude.Name = value; + } - public string Version { get; set; } + public string Version + { + get => this.ctlInclude.Version; + set => this.ctlInclude.Version = value; + } - public bool ForceVersion { get; set; } + public bool ForceVersion + { + get => this.ctlInclude.ForceVersion; + set => this.ctlInclude.ForceVersion = value; + } - public string ForceProvider { get; set; } + public string ForceProvider + { + get => this.ctlInclude.ForceProvider; + set => this.ctlInclude.ForceProvider = value; + } [Obsolete("Deprecated in DotNetNuke 10.2.0. Bundling is no longer supported, there is no replacement within DNN for this functionality. Scheduled removal in v12.0.0.")] public bool ForceBundle { get; set; } /// Gets or sets the CDN URL of the resource. - public string CdnUrl { get; set; } + public string CdnUrl + { + get => this.ctlInclude.CdnUrl; + set => this.ctlInclude.CdnUrl = value; + } /// Gets or sets a value indicating whether to render the blocking attribute. - public bool Blocking { get; set; } + public bool Blocking + { + get => this.ctlInclude.Blocking; + set => this.ctlInclude.Blocking = value; + } /// Gets or sets the integrity hash of the resource. - public string Integrity { get; set; } + public string Integrity + { + get => this.ctlInclude.Integrity; + set => this.ctlInclude.Integrity = value; + } /// Gets or sets the value of the crossorigin attribute. - public CrossOrigin CrossOrigin { get; set; } + public CrossOrigin CrossOrigin + { + get => this.ctlInclude.CrossOrigin; + set => this.ctlInclude.CrossOrigin = value; + } /// Gets or sets the value of the fetchpriority attribute. - public FetchPriority FetchPriority { get; set; } + public FetchPriority FetchPriority + { + get => this.ctlInclude.FetchPriority; + set => this.ctlInclude.FetchPriority = value; + } /// Gets or sets the value of the referrerpolicy attribute. - public ReferrerPolicy ReferrerPolicy { get; set; } + public ReferrerPolicy ReferrerPolicy + { + get => this.ctlInclude.ReferrerPolicy; + set => this.ctlInclude.ReferrerPolicy = value; + } /// - public bool Async { get; set; } + public bool Async + { + get => this.ctlInclude.Async; + set => this.ctlInclude.Async = value; + } /// - public bool Defer { get; set; } + public bool Defer + { + get => this.ctlInclude.Defer; + set => this.ctlInclude.Defer = value; + } /// - public bool NoModule { get; set; } - - /// - protected override void OnInit(EventArgs e) - { - base.OnInit(e); - this.ctlInclude.AddTag = this.AddTag; - this.ctlInclude.FilePath = this.FilePath; - this.ctlInclude.ForceProvider = this.ForceProvider; - this.ctlInclude.ForceVersion = this.ForceVersion; - this.ctlInclude.Name = this.Name; - this.ctlInclude.PathNameAlias = this.PathNameAlias; - this.ctlInclude.Priority = this.Priority; - this.ctlInclude.Version = this.Version; - this.ctlInclude.CdnUrl = this.CdnUrl; - this.ctlInclude.Blocking = this.Blocking; - this.ctlInclude.Integrity = this.Integrity; - this.ctlInclude.CrossOrigin = this.CrossOrigin; - this.ctlInclude.FetchPriority = this.FetchPriority; - this.ctlInclude.ReferrerPolicy = this.ReferrerPolicy; - this.ctlInclude.Async = this.Async; - this.ctlInclude.Defer = this.Defer; - this.ctlInclude.NoModule = this.NoModule; + public bool NoModule + { + get => this.ctlInclude.NoModule; + set => this.ctlInclude.NoModule = value; } } } From 2c6b272084064ab92f80ed3db05222a85a2f34c1 Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 14:47:24 -0500 Subject: [PATCH 097/109] remove manual version resolution for esbuild --- package.json | 6 ++---- yarn.lock | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4ec61e49a68..82a2c031782 100644 --- a/package.json +++ b/package.json @@ -43,12 +43,10 @@ "test": "lerna run test" }, "//resolutions-comments": { - "@types/ws": "Workaround for https://stackoverflow.com/questions/76436147/types-ws-type-server-is-not-generic/76570993#76570993", - "esbuild": "Workaround for https://github.com/storybookjs/storybook/pull/35157 we can remove this when they release a version with the update." + "@types/ws": "Workaround for https://stackoverflow.com/questions/76436147/types-ws-type-server-is-not-generic/76570993#76570993" }, "resolutions": { - "@types/ws": "8.5.4", - "esbuild": "0.28.1" + "@types/ws": "8.5.4" }, "packageManager": "yarn@4.16.0+sha512.5374c94eb4ef6aa8188fb112f20c1aa6569f248d676c5e576e1fd2a1a4d8d87a96df65d9dfe1c2a0252cbe38bda46cf18d955005b81b43cc7607a5c9d56fd2b6" } diff --git a/yarn.lock b/yarn.lock index 42bac4ee5f8..649403bcab3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7905,7 +7905,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:0.28.1": +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0 || ^0.28.0, esbuild@npm:^0.28.1, esbuild@npm:~0.28.0": version: 0.28.1 resolution: "esbuild@npm:0.28.1" dependencies: From 1e8787cbb8e9b0ea366259015b2a2cb8f04a1d4f Mon Sep 17 00:00:00 2001 From: Brian Dukes Date: Wed, 17 Jun 2026 14:50:16 -0500 Subject: [PATCH 098/109] yarn dedupe --- yarn.lock | 152 ++---------------------------------------------------- 1 file changed, 4 insertions(+), 148 deletions(-) diff --git a/yarn.lock b/yarn.lock index 649403bcab3..cf8fecfb543 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4396,19 +4396,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/project-service@npm:8.60.1" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.60.1" - "@typescript-eslint/types": "npm:^8.60.1" - debug: "npm:^4.4.3" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10/fec693dd79c3a1e6a24091127a37af4eb9d9cee8192cf2a434adae48543eadff834bc0623b5b563c8b592b250bc080570f9e7b42807252ea898442c525beeee9 - languageName: node - linkType: hard - "@typescript-eslint/project-service@npm:8.61.1": version: 8.61.1 resolution: "@typescript-eslint/project-service@npm:8.61.1" @@ -4422,16 +4409,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/scope-manager@npm:8.60.1" - dependencies: - "@typescript-eslint/types": "npm:8.60.1" - "@typescript-eslint/visitor-keys": "npm:8.60.1" - checksum: 10/7228c110410ff8cfc01e96d8f17c986f8b4dd447fe3a3291baaab8fe946026ccdf0291865f788f18cf538ab49bfc067fe797708b6b8590104a65f7e69f921cc5 - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:8.61.1": version: 8.61.1 resolution: "@typescript-eslint/scope-manager@npm:8.61.1" @@ -4442,15 +4419,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.60.1, @typescript-eslint/tsconfig-utils@npm:^8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.60.1" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10/afc78b19b856a71dc4e493f931ae44e1a91dc6441a14cb92e4063db880892f3874768f9d347d4b2f45362f2090e4455407c70f42027d77ddc85d6cba95cdb76c - languageName: node - linkType: hard - "@typescript-eslint/tsconfig-utils@npm:8.61.1, @typescript-eslint/tsconfig-utils@npm:^8.61.1": version: 8.61.1 resolution: "@typescript-eslint/tsconfig-utils@npm:8.61.1" @@ -4476,13 +4444,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.60.1, @typescript-eslint/types@npm:^8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/types@npm:8.60.1" - checksum: 10/c603417e621b5b1263c2f60fad9e202d560fd07fce7f40e9a356c0530e5eaf0ff1a9af865237bf93aa18a5a4e2f034ee0cce0fe6c070f08df33e35a099bdea47 - languageName: node - linkType: hard - "@typescript-eslint/types@npm:8.61.1, @typescript-eslint/types@npm:^8.61.1": version: 8.61.1 resolution: "@typescript-eslint/types@npm:8.61.1" @@ -4490,25 +4451,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.60.1" - dependencies: - "@typescript-eslint/project-service": "npm:8.60.1" - "@typescript-eslint/tsconfig-utils": "npm:8.60.1" - "@typescript-eslint/types": "npm:8.60.1" - "@typescript-eslint/visitor-keys": "npm:8.60.1" - debug: "npm:^4.4.3" - minimatch: "npm:^10.2.2" - semver: "npm:^7.7.3" - tinyglobby: "npm:^0.2.15" - ts-api-utils: "npm:^2.5.0" - peerDependencies: - typescript: ">=4.8.4 <6.1.0" - checksum: 10/9c3a56266aadf589bc6e770cd04cb3f55b1ee1507dcacda61866408c656ae4462aa7e11baf39eb939bc4d1e3b843cf58e60f3ebdeb3e75f042ff0f6fb39c311b - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.61.1": version: 8.61.1 resolution: "@typescript-eslint/typescript-estree@npm:8.61.1" @@ -4528,7 +4470,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.61.1, @typescript-eslint/utils@npm:^8.61.1": +"@typescript-eslint/utils@npm:8.61.1, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0, @typescript-eslint/utils@npm:^8.61.1": version: 8.61.1 resolution: "@typescript-eslint/utils@npm:8.61.1" dependencies: @@ -4543,31 +4485,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.48.0": - version: 8.60.1 - resolution: "@typescript-eslint/utils@npm:8.60.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.60.1" - "@typescript-eslint/types": "npm:8.60.1" - "@typescript-eslint/typescript-estree": "npm:8.60.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: ">=4.8.4 <6.1.0" - checksum: 10/a75f8714995b6280b4c15ca957bbc6634862453461111e4a2a07b8bc72b51a504484a9b957fc5b7a646c4bf09f1e414a0c52cd3b6798c42fb8c4de83b1b5a364 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.60.1": - version: 8.60.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.60.1" - dependencies: - "@typescript-eslint/types": "npm:8.60.1" - eslint-visitor-keys: "npm:^5.0.0" - checksum: 10/6d120b4a790477ae0291e69f6457686c71b929cc40519148f6b6c7fbc09604b15821ae8cf1005aa23acec5105b4016db256a68d68f30eda8d6c24d4fdb0ede86 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:8.61.1": version: 8.61.1 resolution: "@typescript-eslint/visitor-keys@npm:8.61.1" @@ -11033,7 +10950,7 @@ __metadata: languageName: node linkType: hard -"less@npm:4.6.6": +"less@npm:4.6.6, less@npm:^4.6.4": version: 4.6.6 resolution: "less@npm:4.6.6" dependencies: @@ -11067,40 +10984,6 @@ __metadata: languageName: node linkType: hard -"less@npm:^4.6.4": - version: 4.6.4 - resolution: "less@npm:4.6.4" - dependencies: - copy-anything: "npm:^3.0.5" - errno: "npm:^0.1.1" - graceful-fs: "npm:^4.1.2" - image-size: "npm:~0.5.0" - make-dir: "npm:^2.1.0" - mime: "npm:^1.4.1" - needle: "npm:^3.1.0" - parse-node-version: "npm:^1.0.1" - source-map: "npm:~0.6.0" - dependenciesMeta: - errno: - optional: true - graceful-fs: - optional: true - image-size: - optional: true - make-dir: - optional: true - mime: - optional: true - needle: - optional: true - source-map: - optional: true - bin: - lessc: bin/lessc - checksum: 10/8463c56e3eeac147ce4da7a2e7178e685fe2f8579c165c79381a3a4f87d70555058c9d1ebf420e272e90f3ee9b488cb3d418ed0c7a5681d26d20c5c1a956ea50 - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -11579,16 +11462,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: "npm:^4.0.1" - semver: "npm:^5.6.0" - checksum: 10/043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab - languageName: node - linkType: hard - "make-dir@npm:^3.0.2": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -13355,13 +13228,6 @@ __metadata: languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10/8b97cbf9dc6d4c1320cc238a2db0fc67547f9dc77011729ff353faf34f1936ea1a4d7f3c63b2f4980b253be77bcc72ea1e9e76ee3fd53cce2aafb6a8854d07ec - languageName: node - linkType: hard - "pirates@npm:^4.0.7": version: 4.0.7 resolution: "pirates@npm:4.0.7" @@ -13759,17 +13625,7 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^7.0.0": - version: 7.1.1 - resolution: "postcss-selector-parser@npm:7.1.1" - dependencies: - cssesc: "npm:^3.0.0" - util-deprecate: "npm:^1.0.2" - checksum: 10/bb3c6455b20af26a556e3021e21101d8470252644e673c1612f7348ff8dd41b11321329f0694cf299b5b94863f823480b72d3e2f4bd3a89dc43e2d8c0dbad341 - languageName: node - linkType: hard - -"postcss-selector-parser@npm:^7.1.2": +"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.2": version: 7.1.4 resolution: "postcss-selector-parser@npm:7.1.4" dependencies: @@ -15642,7 +15498,7 @@ __metadata: languageName: unknown linkType: soft -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0, semver@npm:^5.7.2": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.7.2": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: From bbc5a335f5510b9af30e826bde4588d31a181662 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:23:51 +0000 Subject: [PATCH 099/109] Bump EnricoMi/publish-unit-test-result-action from 2.23.0 to 2.24.0 Bumps [EnricoMi/publish-unit-test-result-action](https://github.com/enricomi/publish-unit-test-result-action) from 2.23.0 to 2.24.0. - [Release notes](https://github.com/enricomi/publish-unit-test-result-action/releases) - [Commits](https://github.com/enricomi/publish-unit-test-result-action/compare/c950f6fb443cb5af20a377fd0dfaa78838901040...d0a4676d0e0b938bc201470d88276b7c74c712b3) --- updated-dependencies: - dependency-name: EnricoMi/publish-unit-test-result-action dependency-version: 2.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 60e02f1e245..c5ef8fc5e43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -124,7 +124,7 @@ jobs: continue-on-error: true - name: "Publish Test Results" - uses: "EnricoMi/publish-unit-test-result-action/windows@c950f6fb443cb5af20a377fd0dfaa78838901040" # v2.23.0 + uses: "EnricoMi/publish-unit-test-result-action/windows@d0a4676d0e0b938bc201470d88276b7c74c712b3" # v2.24.0 if: ${{ !cancelled() && env.RUN_TESTS == 'true' }} with: files: "**/TestResults/*.trx" From 05f74eb1f5f781438f166d6094c0fd62e5a200e0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 23 Jun 2026 16:04:24 -0400 Subject: [PATCH 100/109] Avoids TypeLoadException in PreparePackaging redirect generation Replace Dnn.CakeUtils ParseAssemblies usage in Build/Tasks/PreparePackaging.cs with metadata-only assembly inspection using AssemblyName.GetAssemblyName. This prevents net10 packaging failures caused by reflection over legacy framework attributes (e.g., System.Web.UI.WebResourceAttribute) when parsing ClientDependency.Core and similar assemblies. --- Build/Tasks/PreparePackaging.cs | 48 +++++++++++++++++-- .../SqlDataProvider/10.03.03.SqlDataProvider | 9 ++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.03.03.SqlDataProvider diff --git a/Build/Tasks/PreparePackaging.cs b/Build/Tasks/PreparePackaging.cs index 40f9b980896..d11d4d3c45b 100644 --- a/Build/Tasks/PreparePackaging.cs +++ b/Build/Tasks/PreparePackaging.cs @@ -4,11 +4,15 @@ namespace DotNetNuke.Build.Tasks { using System; + using System.Collections.Generic; + using System.Globalization; using System.Linq; + using System.Reflection; using System.Xml.Linq; using Cake.Common.Diagnostics; using Cake.Common.IO; + using Cake.Core.IO; using Cake.Frosting; using Cake.Json; using Dnn.CakeUtils; @@ -60,14 +64,52 @@ private static void CreateWebConfig(Context context) context.PackagingPatterns = context.DeserializeJsonFromFile("./Build/Tasks/packaging.json"); var files = context.GetFilesByPatterns(context.WebsiteDir, BinFolderInclude, context.PackagingPatterns.InstallExclude); - var parsedAssemblies = files.ParseAssemblies(); - parsedAssemblies.RemoveAll(a => a.PublicKeyToken is null); - var redirects = parsedAssemblies.ConvertAll(a => a.AssemblyBindingRedirect()); + var redirects = BuildBindingRedirects(files); assemblyBinding.Add(redirects.ToArray()); // save XML document to target file var targetFile = context.WebsiteDir + context.File("web.config"); doc.Save(targetFile); } + + private static List BuildBindingRedirects(IEnumerable files) + { + XNamespace asm = "urn:schemas-microsoft-com:asm.v1"; + var redirects = new List(); + + foreach (var file in files) + { + AssemblyName assemblyName; + try + { + assemblyName = AssemblyName.GetAssemblyName(file.FullPath); + } + catch + { + continue; + } + + var tokenBytes = assemblyName.GetPublicKeyToken(); + if (tokenBytes == null || tokenBytes.Length == 0 || string.IsNullOrEmpty(assemblyName.Name) || assemblyName.Version == null) + { + continue; + } + + var token = string.Concat(tokenBytes.Select(static b => b.ToString("x2", CultureInfo.InvariantCulture))); + redirects.Add( + new XElement( + asm + "dependentAssembly", + new XElement( + asm + "assemblyIdentity", + new XAttribute("name", assemblyName.Name), + new XAttribute("publicKeyToken", token)), + new XElement( + asm + "bindingRedirect", + new XAttribute("oldVersion", "0.0.0.0-32767.32767.32767.32767"), + new XAttribute("newVersion", assemblyName.Version.ToString())))); + } + + return redirects; + } } } diff --git a/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.03.03.SqlDataProvider b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.03.03.SqlDataProvider new file mode 100644 index 00000000000..4412108fcf0 --- /dev/null +++ b/DNN Platform/Website/Providers/DataProviders/SqlDataProvider/10.03.03.SqlDataProvider @@ -0,0 +1,9 @@ +/************************************************************/ +/***** SqlDataProvider *****/ +/***** *****/ +/***** *****/ +/***** Note: To manually execute this script you must *****/ +/***** perform a search and replace operation *****/ +/***** for {databaseOwner} and {objectQualifier} *****/ +/***** *****/ +/************************************************************/ \ No newline at end of file From 163aad777361c9fc7262cd9c7666848ad38590c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 22:22:46 +0000 Subject: [PATCH 101/109] Bump actions/checkout from 6.0.3 to 7.0.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/browserslist-update-db.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/dependency-review.yml | 2 +- .github/workflows/image-actions.yml | 2 +- .github/workflows/ossf-scorecard.yml | 2 +- .github/workflows/zizmor.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/browserslist-update-db.yml b/.github/workflows/browserslist-update-db.yml index 80fa70ca969..251cb0d7a0f 100644 --- a/.github/workflows/browserslist-update-db.yml +++ b/.github/workflows/browserslist-update-db.yml @@ -19,7 +19,7 @@ jobs: pull-requests: "write" # creates a pull request if there's an update steps: - name: "Checkout repository" - uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + uses: "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0" # v7.0.0 with: fetch-depth: 0 persist-credentials: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5ef8fc5e43..2afe3e8cfa5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,7 +78,7 @@ jobs: RUN_TESTS: ${{ inputs.RUN_TESTS || env.RUN_TESTS }} - name: "Checkout" - uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + uses: "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0" # v7.0.0 with: fetch-depth: 0 # include all history for GitVersion persist-credentials: false diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 6e4acfc0b61..3541d46c08b 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -20,7 +20,7 @@ jobs: contents: "read" steps: - name: "Checkout Repository" - uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + uses: "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0" # v7.0.0 with: persist-credentials: false diff --git a/.github/workflows/image-actions.yml b/.github/workflows/image-actions.yml index f962eb3f440..621dd429c1c 100644 --- a/.github/workflows/image-actions.yml +++ b/.github/workflows/image-actions.yml @@ -36,7 +36,7 @@ jobs: contents: "read" steps: - name: "Checkout Repo" - uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + uses: "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0" # v7.0.0 with: persist-credentials: false diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index bb4ab8aa710..0e2765268f5 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -29,7 +29,7 @@ jobs: steps: - name: "Checkout code" - uses: "actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10" # v6.0.3 + uses: "actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0" # v7.0.0 with: persist-credentials: false diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml index 221aa95f73f..7e49d504429 100644 --- a/.github/workflows/zizmor.yml +++ b/.github/workflows/zizmor.yml @@ -28,7 +28,7 @@ jobs: actions: read # Only needed for private repos. Needed for upload-sarif to read workflow run info. steps: - name: Checkout repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 with: persist-credentials: false From f3749412f79b4fb5e64978a71c551b8270244d9c Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 25 Jun 2026 20:59:32 +0200 Subject: [PATCH 102/109] Revert "Increase version of IPortalSettings interface" This reverts commit 9004c9ca1d865e2d7ae81265404589387f900761. --- .../Common/Controllers/JwtController.cs | 4 +- .../INavigationManager.cs | 8 ++-- .../Logging/IEventLogger.cs | 12 +++--- .../Portals/IPortalSettings.cs | 3 ++ .../Portals/IPortalSettingsV2.cs | 19 ---------- .../Prompt/IConsoleCommand.cs | 2 +- .../Api/Auth/ApiTokens/ApiTokenController.cs | 2 +- .../InternalServices/FileUploadController.cs | 4 +- .../DotNetNuke.Web/Prompt/ListServices.cs | 2 +- .../UI/WebControls/DnnFileUpload.cs | 2 +- .../MobileRedirect/MobileRedirectModule.cs | 2 +- .../OutputCaching/OutputCacheModule.cs | 2 +- .../UrlRewrite/DNNFriendlyUrlProvider.cs | 2 +- DNN Platform/Library/Common/Globals.cs | 14 +++---- .../Library/Common/Internal/GlobalsImpl.cs | 4 +- .../Library/Common/NavigationManager.cs | 8 ++-- .../Library/Common/Utilities/UrlUtils.cs | 2 +- .../Content/Workflow/WorkflowSecurity.cs | 4 +- .../Entities/Modules/Prompt/AddModule.cs | 2 +- .../Entities/Modules/Prompt/ListModules.cs | 2 +- .../Extensions/IPortalSettingsExtensions.cs | 4 +- .../Entities/Portals/IPortalController.cs | 2 +- .../Entities/Portals/PortalController.cs | 2 +- .../Entities/Portals/PortalSettings.cs | 38 +++++++++---------- .../Urls/AdvancedFriendlyUrlProvider.cs | 2 +- .../Entities/Urls/BasicFriendlyUrlProvider.cs | 4 +- .../Entities/Urls/FriendlyUrlController.cs | 4 +- .../Entities/Urls/FriendlyUrlProviderBase.cs | 2 +- .../Entities/Urls/RewriteController.cs | 4 +- .../Users/Profile/ProfilePropertyAccess.cs | 6 +-- .../Library/Entities/Users/UserController.cs | 2 +- .../JavaScriptLibraries/JavaScript.cs | 16 ++++---- .../Library/Obsolete/EventLogController.cs | 24 ++++++------ DNN Platform/Library/Prompt/ConsoleCommand.cs | 4 +- .../Library/Security/PortalSecurity.cs | 16 ++++---- .../Library/Security/Roles/RoleController.cs | 10 ++--- .../Library/Services/FileSystem/FileInfo.cs | 2 +- .../Library/Services/FileSystem/FolderInfo.cs | 2 +- .../Installer/Packages/PackageController.cs | 2 +- .../Localization/Internal/LocalizationImpl.cs | 4 +- .../Services/Localization/Localization.cs | 20 +++++----- .../Localization/LocalizationProvider.cs | 2 +- .../Log/EventLog/EventLogController.cs | 12 +++--- .../Log/EventLog/IEventLogController.cs | 10 ++--- .../Services/Mail/SendTokenizedBulkEmail.cs | 2 +- .../Controllers/UserResultController.cs | 2 +- .../Services/Sitemap/CoreSitemapProvider.cs | 2 +- .../Services/Sitemap/SitemapBuilder.cs | 6 +-- .../Scheduler/CoreMessagingScheduler.cs | 2 +- .../Url/FriendlyUrl/FriendlyUrlProvider.cs | 4 +- .../Library/UI/Containers/ActionManager.cs | 2 +- .../Services/SubscriptionsController.cs | 2 +- DNN Platform/Modules/DDRMenu/MenuBase.cs | 6 +-- .../DNNConnect.CKE/Browser/Browser.aspx.cs | 6 +-- .../DNNConnect.CKE/CKEditorOptions.ascx.cs | 6 +-- .../DNNConnect.CKE/Options.aspx.cs | 8 ++-- .../DNNConnect.CKE/Utilities/SettingsUtil.cs | 8 ++-- .../DNNConnect.CKE/Utilities/Utility.cs | 10 ++--- .../Common/NavigationManagerTests.cs | 4 +- .../AdminLogs/AdminLogsController.cs | 2 +- .../Components/Pages/BulkPagesController.cs | 2 +- .../Security/Checks/CheckUserProfilePage.cs | 4 +- .../Components/Security/SecurityController.cs | 2 +- .../Components/Sites/SitesController.cs | 2 +- .../Components/Users/Dto/UserBasicDto.cs | 2 +- .../Controllers/TabsController.cs | 2 +- .../Checks/CheckUserProfilePageTests.cs | 4 +- 67 files changed, 184 insertions(+), 200 deletions(-) delete mode 100644 DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs diff --git a/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs b/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs index 34064e306d5..ea18e9ec363 100644 --- a/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs +++ b/DNN Platform/Dnn.AuthServices.Jwt/Components/Common/Controllers/JwtController.cs @@ -164,7 +164,7 @@ public LoginResultData LoginUser(HttpRequestMessage request, LoginData loginData } var obsoletePortalSettings = PortalSettings.Current; - IPortalSettingsV2 portalSettings = obsoletePortalSettings; + IPortalSettings portalSettings = obsoletePortalSettings; if (portalSettings == null) { Logger.Trace("portalSettings = null"); @@ -533,7 +533,7 @@ private LoginResultData UpdateToken(string renewalToken, PersistedToken persiste persistedToken.TokenExpiry = expiry; var obsoletePortalSettings = PortalSettings.Current; - IPortalSettingsV2 portalSettings = obsoletePortalSettings; + IPortalSettings portalSettings = obsoletePortalSettings; IPortalAliasInfo portalAlias = obsoletePortalSettings.PortalAlias; var secret = ObtainSecret(persistedToken.TokenId, portalSettings.GUID, userInfo.Membership.LastPasswordChangeDate); var accessToken = CreateJwtToken(secret, portalAlias.HttpAlias, persistedToken, userInfo.Roles); diff --git a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs index 06240060a2f..8bf5981a165 100644 --- a/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs +++ b/DNN Platform/DotNetNuke.Abstractions/INavigationManager.cs @@ -53,7 +53,7 @@ public interface INavigationManager /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters); + string NavigateURL(int tabID, IPortalSettings settings, string controlKey, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -62,7 +62,7 @@ public interface INavigationManager /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -72,7 +72,7 @@ public interface INavigationManager /// The language code. /// Any additional parameters. /// Formatted URL. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, params string[] additionalParameters); /// Gets the URL to show the given page. /// The tab ID. @@ -83,6 +83,6 @@ public interface INavigationManager /// The page name to pass. /// Any additional parameters. /// Formatted url. - string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, string pageName, params string[] additionalParameters); + string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, string pageName, params string[] additionalParameters); } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs b/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs index 2a2b2339035..d3892445f68 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Logging/IEventLogger.cs @@ -23,7 +23,7 @@ public interface IEventLogger /// The portal settings. /// The user id. /// The log type. - void AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, EventLogType logType); + void AddLog(string name, string value, IPortalSettings portalSettings, int userID, EventLogType logType); /// Adds an Event Log. /// The log property name. @@ -31,7 +31,7 @@ public interface IEventLogger /// The portal settings. /// The user id. /// The log type. - void AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, string logType); + void AddLog(string name, string value, IPortalSettings portalSettings, int userID, string logType); /// Adds an Event Log. /// The properties of the log. @@ -39,13 +39,13 @@ public interface IEventLogger /// The user id. /// The log type key. /// The bypass buffering. - void AddLog(ILogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering); + void AddLog(ILogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); /// Adds an Event Log. /// The portal settings. /// The user id. /// The log type. - void AddLog(IPortalSettingsV2 portalSettings, int userID, EventLogType logType); + void AddLog(IPortalSettings portalSettings, int userID, EventLogType logType); /// Adds an Event Log. /// The business object. @@ -53,7 +53,7 @@ public interface IEventLogger /// The user id. /// The user name. /// The log type. - void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogType logType); + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogType logType); /// Adds an Event Log. /// The business object. @@ -61,7 +61,7 @@ public interface IEventLogger /// The user id. /// The user name. /// The log type. - void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType); + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType); /// Adds an Event Log. /// The log info. diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 2da449d9001..48984d065b3 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -361,5 +361,8 @@ public interface IPortalSettings /// Gets a value indicating whether to display the dropdowns to quickly add a moduel to the page in the edit bar. bool ShowQuickModuleAddMenu { get; } + + /// Gets the pipeline type for the portal. + PagePipeline.PortalRenderingPipeline PagePipeline { get; } } } diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs deleted file mode 100644 index ceead420b83..00000000000 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettingsV2.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - -namespace DotNetNuke.Abstractions.Portals -{ - using DotNetNuke.Abstractions.Framework; - - /// - /// The PortalSettings class encapsulates all of the settings for the Portal, - /// as well as the configuration settings required to execute the current tab - /// view within the portal. - /// - public interface IPortalSettingsV2 : IPortalSettings - { - /// Gets the pipeline type for the portal. - PagePipeline.PortalRenderingPipeline PagePipeline { get; } - } -} diff --git a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs index a06de09090a..8cce25bc5f6 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Prompt/IConsoleCommand.cs @@ -25,7 +25,7 @@ public interface IConsoleCommand /// PortalSettings for the portal we're operating under or if PortalId is specified, that portal. /// Current user. /// Current page/tab. - void Initialize(string[] args, Portals.IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId); + void Initialize(string[] args, Portals.IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId); /// The main method of the command which executes it. /// A class used by the client to display results. diff --git a/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs b/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs index c2fcee37b41..ecc0752254c 100644 --- a/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs +++ b/DNN Platform/DotNetNuke.Web/Api/Auth/ApiTokens/ApiTokenController.cs @@ -63,7 +63,7 @@ public ApiTokenController(IApiTokenRepository apiTokenRepository, IEventLogger e /// public string SchemeType => "ApiToken"; - private static Abstractions.Portals.IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static Abstractions.Portals.IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); /// public (ApiToken Token, UserInfo User) ValidateToken(HttpRequestMessage request) diff --git a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs index 07e08e23455..06cece5d667 100644 --- a/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs +++ b/DNN Platform/DotNetNuke.Web/InternalServices/FileUploadController.cs @@ -170,7 +170,7 @@ public Task PostFile() var provider = new MultipartMemoryStreamProvider(); // local references for use in closure - IPortalSettingsV2 portalSettings = this.PortalSettings; + IPortalSettings portalSettings = this.PortalSettings; var currentSynchronizationContext = SynchronizationContext.Current; var userInfo = this.UserInfo; var task = request.Content.ReadAsMultipartAsync(provider) @@ -435,7 +435,7 @@ private static SavedFileDTO SaveFile( IApplicationStatusInfo appStatus, IPortalGroupController portalGroupController, IHostSettings hostSettings, - IPortalSettingsV2 portalSettings, + IPortalSettings portalSettings, UserInfo userInfo, string folder, string filter, diff --git a/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs index 1ae1d38274d..059ec1fa912 100644 --- a/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs +++ b/DNN Platform/DotNetNuke.Web/Prompt/ListServices.cs @@ -21,7 +21,7 @@ public class ListServices : ConsoleCommand public override string LocalResourceFile => Constants.DefaultPromptResourceFile; /// - public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); if (!userInfo.IsSuperUser) diff --git a/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs b/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs index 8968908ff22..ee6ced9498a 100644 --- a/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs +++ b/DNN Platform/DotNetNuke.Web/UI/WebControls/DnnFileUpload.cs @@ -130,7 +130,7 @@ protected override void OnPreRender(EventArgs e) this.RegisterStartupScript(); } - private static void RegisterClientScript(IClientResourceController clientResourceController, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string skin) + private static void RegisterClientScript(IClientResourceController clientResourceController, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string skin) { DnnDropDownList.RegisterClientScript(clientResourceController, skin); diff --git a/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs b/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs index 969c1d64771..6b1ca759504 100644 --- a/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs +++ b/DNN Platform/HttpModules/MobileRedirect/MobileRedirectModule.cs @@ -114,7 +114,7 @@ public void OnBeginRequest(object s, EventArgs e) app.Response.Redirect(redirectUrl); } - private bool IsRedirectAllowed(string url, HttpApplication app, IPortalSettingsV2 portalSettings) + private bool IsRedirectAllowed(string url, HttpApplication app, IPortalSettings portalSettings) { var urlAction = new UrlAction(app.Request); urlAction.SetRedirectAllowed(url, new FriendlyUrlSettings(this.portalController, this.hostSettings, this.hostSettingsService, portalSettings.PortalId)); diff --git a/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs b/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs index 6d28c298e69..ab7e663a4aa 100644 --- a/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs +++ b/DNN Platform/HttpModules/OutputCaching/OutputCacheModule.cs @@ -88,7 +88,7 @@ private void OnResolveRequestCache(object sender, EventArgs e) } int portalId = portalSettings.PortalId; - string locale = Localization.GetPageLocale((IPortalSettingsV2)portalSettings).Name; + string locale = Localization.GetPageLocale((IPortalSettings)portalSettings).Name; IncludeExcludeType includeExclude = IncludeExcludeType.ExcludeByDefault; if (tabSettings["CacheIncludeExclude"] != null && !string.IsNullOrEmpty(tabSettings["CacheIncludeExclude"].ToString())) diff --git a/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs b/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs index 65ff58a4c8e..9859fd8cc15 100644 --- a/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs +++ b/DNN Platform/HttpModules/UrlRewrite/DNNFriendlyUrlProvider.cs @@ -73,7 +73,7 @@ public DNNFriendlyUrlProvider() public override string FriendlyUrl(TabInfo tab, string path, string pageName) => this.providerInstance.FriendlyUrl(tab, path, pageName); /// - public override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) => this.providerInstance.FriendlyUrl(tab, path, pageName, settings); + public override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) => this.providerInstance.FriendlyUrl(tab, path, pageName, settings); /// public override string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias) => this.providerInstance.FriendlyUrl(tab, path, pageName, portalAlias); diff --git a/DNN Platform/Library/Common/Globals.cs b/DNN Platform/Library/Common/Globals.cs index 60f15ef630b..a58dc8af5f7 100644 --- a/DNN Platform/Library/Common/Globals.cs +++ b/DNN Platform/Library/Common/Globals.cs @@ -2344,7 +2344,7 @@ public static string FriendlyUrl(TabInfo tab, string path, string pageName) [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public static partial string FriendlyUrl(TabInfo tab, string path, PortalSettings settings) { - return FriendlyUrl(tab, path, (IPortalSettingsV2)settings); + return FriendlyUrl(tab, path, (IPortalSettings)settings); } /// Generates the correctly formatted friendly URL. @@ -2355,7 +2355,7 @@ public static partial string FriendlyUrl(TabInfo tab, string path, PortalSetting /// The path to format. /// The portal settings. /// The formatted (friendly) URL. - public static string FriendlyUrl(TabInfo tab, string path, IPortalSettingsV2 settings) + public static string FriendlyUrl(TabInfo tab, string path, IPortalSettings settings) { return FriendlyUrl(tab, path, glbDefaultPage, settings); } @@ -2373,7 +2373,7 @@ public static string FriendlyUrl(TabInfo tab, string path, IPortalSettingsV2 set [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public static partial string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); + return FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); } /// Generates the correctly formatted friendly URL. @@ -2386,7 +2386,7 @@ public static partial string FriendlyUrl(TabInfo tab, string path, string pageNa /// The page to include in the URL. /// The portal settings. /// The formatted (friendly) url. - public static string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) + public static string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) { return FriendlyUrlProvider.Instance().FriendlyUrl(tab, path, pageName, settings); } @@ -2553,7 +2553,7 @@ public static string LoginURL(string returnUrl, bool overrideSetting) [DnnDeprecated(9, 8, 1, "Use the overload that takes IPortalSettings instead")] public static partial string LoginURL(string returnUrl, bool overrideSetting, PortalSettings portalSettings) { - return LoginURL(returnUrl, overrideSetting, (IPortalSettingsV2)portalSettings); + return LoginURL(returnUrl, overrideSetting, (IPortalSettings)portalSettings); } /// Gets the login URL. @@ -2561,7 +2561,7 @@ public static partial string LoginURL(string returnUrl, bool overrideSetting, Po /// if set to , show the login control on the current page, even if there is a login page defined for the site. /// The Portal Settings. /// Formatted URL. - public static string LoginURL(string returnUrl, bool overrideSetting, IPortalSettingsV2 portalSettings) + public static string LoginURL(string returnUrl, bool overrideSetting, IPortalSettings portalSettings) { string loginUrl; var currentTabId = TabController.CurrentPage.TabID; @@ -3573,7 +3573,7 @@ public static partial string PreventSQLInjection(string strSQL) /// if set to [is super tab]. /// The settings. /// return the tab's culture code, if ths tab doesn't exist, it will return current culture name. - internal static string GetCultureCode(int tabId, bool isSuperTab, IPortalSettingsV2 settings) + internal static string GetCultureCode(int tabId, bool isSuperTab, IPortalSettings settings) { string cultureCode = Null.NullString; if (settings != null) diff --git a/DNN Platform/Library/Common/Internal/GlobalsImpl.cs b/DNN Platform/Library/Common/Internal/GlobalsImpl.cs index 5d48f84b246..5804b8fa314 100644 --- a/DNN Platform/Library/Common/Internal/GlobalsImpl.cs +++ b/DNN Platform/Library/Common/Internal/GlobalsImpl.cs @@ -282,13 +282,13 @@ public string FriendlyUrl(TabInfo tab, string path, string pageName) /// public string FriendlyUrl(TabInfo tab, string path, PortalSettings settings) { - return Globals.FriendlyUrl(tab, path, (IPortalSettingsV2)settings); + return Globals.FriendlyUrl(tab, path, (IPortalSettings)settings); } /// public string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return Globals.FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); + return Globals.FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); } /// diff --git a/DNN Platform/Library/Common/NavigationManager.cs b/DNN Platform/Library/Common/NavigationManager.cs index c1b665d825a..5f795d435f1 100644 --- a/DNN Platform/Library/Common/NavigationManager.cs +++ b/DNN Platform/Library/Common/NavigationManager.cs @@ -111,7 +111,7 @@ public string NavigateURL(int tabID, string controlKey, params string[] addition /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters) + public string NavigateURL(int tabID, IPortalSettings settings, string controlKey, params string[] additionalParameters) { var isSuperTab = Globals.IsHostTab(tabID); return this.NavigateURL(tabID, isSuperTab, settings, controlKey, additionalParameters); @@ -124,7 +124,7 @@ public string NavigateURL(int tabID, IPortalSettingsV2 settings, string controlK /// The control key, or or null. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, params string[] additionalParameters) { var cultureCode = Globals.GetCultureCode(tabID, isSuperTab, settings); return this.NavigateURL(tabID, isSuperTab, settings, controlKey, cultureCode, additionalParameters); @@ -138,7 +138,7 @@ public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings /// The language code. /// Any additional parameters. /// Formatted URL. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, params string[] additionalParameters) { return this.NavigateURL(tabID, isSuperTab, settings, controlKey, language, Globals.glbDefaultPage, additionalParameters); } @@ -152,7 +152,7 @@ public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings /// The page name to pass to . /// Any additional parameters. /// Formatted url. - public string NavigateURL(int tabID, bool isSuperTab, IPortalSettingsV2 settings, string controlKey, string language, string pageName, params string[] additionalParameters) + public string NavigateURL(int tabID, bool isSuperTab, IPortalSettings settings, string controlKey, string language, string pageName, params string[] additionalParameters) { var url = tabID == Null.NullInteger ? Globals.ApplicationURL() : Globals.ApplicationURL(tabID); if (!string.IsNullOrEmpty(controlKey)) diff --git a/DNN Platform/Library/Common/Utilities/UrlUtils.cs b/DNN Platform/Library/Common/Utilities/UrlUtils.cs index dbbf26a8821..6f2f07340b5 100644 --- a/DNN Platform/Library/Common/Utilities/UrlUtils.cs +++ b/DNN Platform/Library/Common/Utilities/UrlUtils.cs @@ -556,7 +556,7 @@ public static void Handle404Exception(HttpResponse response, PortalSettings port /// Redirect current response to 404 error page or output 404 content if error page not defined. /// The response. /// The portal settings. - public static void Handle404Exception(HttpResponseBase response, IPortalSettingsV2 portalSetting) + public static void Handle404Exception(HttpResponseBase response, IPortalSettings portalSetting) { if (portalSetting?.ErrorPage404 > Null.NullInteger) { diff --git a/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs b/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs index 2af5f436b42..05f86d258fe 100644 --- a/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs +++ b/DNN Platform/Library/Entities/Content/Workflow/WorkflowSecurity.cs @@ -41,10 +41,10 @@ public WorkflowSecurity() /// [SuppressMessage("Microsoft.Naming", "CA1725:ParameterNamesShouldMatchBaseDeclaration", Justification = "Breaking change")] public bool HasStateReviewerPermission(PortalSettings settings, UserInfo user, int stateId) - => this.HasStateReviewerPermission((IPortalSettingsV2)settings, user, stateId); + => this.HasStateReviewerPermission((IPortalSettings)settings, user, stateId); /// - public bool HasStateReviewerPermission(IPortalSettingsV2 settings, UserInfo user, int stateId) + public bool HasStateReviewerPermission(IPortalSettings settings, UserInfo user, int stateId) { var permissions = this.statePermissionsRepository.GetWorkflowStatePermissionByState(stateId); diff --git a/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs b/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs index 51e15d9b371..847f921a954 100644 --- a/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs +++ b/DNN Platform/Library/Entities/Modules/Prompt/AddModule.cs @@ -42,7 +42,7 @@ public class AddModule : ConsoleCommand public string ModuleTitle { get; set; } // title for the new module. defaults to friendly name /// - public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); this.ParseParameters(this); diff --git a/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs b/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs index 1ca6288e8c2..55bfbc372b8 100644 --- a/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs +++ b/DNN Platform/Library/Entities/Modules/Prompt/ListModules.cs @@ -40,7 +40,7 @@ public class ListModules : ConsoleCommand public bool? Deleted { get; set; } /// - public override void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) + public override void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) { base.Initialize(args, portalSettings, userInfo, activeTabId); this.ParseParameters(this); diff --git a/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs b/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs index 4e5e2fc18e1..9518c2fd467 100644 --- a/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs +++ b/DNN Platform/Library/Entities/Portals/Extensions/IPortalSettingsExtensions.cs @@ -7,7 +7,7 @@ namespace DotNetNuke.Entities.Portals.Extensions using DotNetNuke.Abstractions.Portals; /// - /// Extends the interface. + /// Extends the interface. /// public static class IPortalSettingsExtensions { @@ -16,7 +16,7 @@ public static class IPortalSettingsExtensions /// /// The portal settings to the the styles from. /// . - public static IPortalStyles GetStyles(this IPortalSettingsV2 portalSettings) + public static IPortalStyles GetStyles(this IPortalSettings portalSettings) { var repo = new PortalStylesRepository(); return repo.GetSettings(portalSettings.PortalId); diff --git a/DNN Platform/Library/Entities/Portals/IPortalController.cs b/DNN Platform/Library/Entities/Portals/IPortalController.cs index d20b6046e90..aa50d25cd91 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalController.cs @@ -102,7 +102,7 @@ public interface IPortalController /// Gets the current portal settings. /// portal settings. - IPortalSettingsV2 GetCurrentSettings(); + IPortalSettings GetCurrentSettings(); /// Gets information of a portal. /// ID of the portal. diff --git a/DNN Platform/Library/Entities/Portals/PortalController.cs b/DNN Platform/Library/Entities/Portals/PortalController.cs index bf651d62250..bbab9980100 100644 --- a/DNN Platform/Library/Entities/Portals/PortalController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalController.cs @@ -53,7 +53,7 @@ namespace DotNetNuke.Entities.Portals using Microsoft.Extensions.DependencyInjection; - using IAbPortalSettings = DotNetNuke.Abstractions.Portals.IPortalSettingsV2; + using IAbPortalSettings = DotNetNuke.Abstractions.Portals.IPortalSettings; using ICryptographyProvider = DotNetNuke.Abstractions.Security.ICryptographyProvider; /// PortalController provides business layer of portal. diff --git a/DNN Platform/Library/Entities/Portals/PortalSettings.cs b/DNN Platform/Library/Entities/Portals/PortalSettings.cs index 021d1048cb0..a84c0b8d279 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettings.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettings.cs @@ -25,7 +25,7 @@ namespace DotNetNuke.Entities.Portals /// view within the portal. /// [Serializable] - public partial class PortalSettings : BaseEntityInfo, IPropertyAccess, IPortalSettingsV2 + public partial class PortalSettings : BaseEntityInfo, IPropertyAccess, IPortalSettings { /// Initializes a new instance of the class. public PortalSettings() @@ -558,44 +558,44 @@ public string AddCompatibleHttpHeader /// public PagePipeline.PortalRenderingPipeline PagePipeline { get; internal set; } - /// Create an instance. - /// A new instance. - public static IPortalSettingsV2 Create() + /// Create an instance. + /// A new instance. + public static IPortalSettings Create() => new PortalSettings(); - /// Create an instance. + /// Create an instance. /// A portal controller. /// The portal ID. - /// A new instance. - public static IPortalSettingsV2 Create(IPortalController portalController, int portalId) + /// A new instance. + public static IPortalSettings Create(IPortalController portalController, int portalId) => new PortalSettings(Null.NullInteger, portalController.GetPortal(portalId)); - /// Create an instance. + /// Create an instance. /// A portal controller. /// The active tab ID. /// The portal ID. - /// A new instance. - public static IPortalSettingsV2 Create(IPortalController portalController, int tabId, int portalId) + /// A new instance. + public static IPortalSettings Create(IPortalController portalController, int tabId, int portalId) => new PortalSettings(tabId, portalController.GetPortal(portalId)); - /// Create an instance. + /// Create an instance. /// The active tab ID. /// The portal alias. - /// A new instance. - public static IPortalSettingsV2 Create(int tabId, IPortalAliasInfo portalAlias) + /// A new instance. + public static IPortalSettings Create(int tabId, IPortalAliasInfo portalAlias) => portalAlias is PortalAliasInfo alias ? new PortalSettings(tabId, alias) : new PortalSettings(tabId, portalAlias.PortalId); - /// Create an instance. + /// Create an instance. /// The portal info. - /// A new instance. - public static IPortalSettingsV2 Create(IPortalInfo portal) + /// A new instance. + public static IPortalSettings Create(IPortalInfo portal) => portal is PortalInfo portalInfo ? new PortalSettings(portalInfo) : new PortalSettings(Null.NullInteger, portal.PortalId); - /// Create an instance. + /// Create an instance. /// The tab ID. /// The portal info. - /// A new instance. - public static IPortalSettingsV2 Create(int tabId, IPortalInfo portal) + /// A new instance. + public static IPortalSettings Create(int tabId, IPortalInfo portal) => portal is PortalInfo portalInfo ? new PortalSettings(tabId, portalInfo) : new PortalSettings(tabId, portal.PortalId); /// diff --git a/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs b/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs index c5ee1a25248..720d7e184e0 100644 --- a/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs +++ b/DNN Platform/Library/Entities/Urls/AdvancedFriendlyUrlProvider.cs @@ -212,7 +212,7 @@ internal override string FriendlyUrl(TabInfo tab, string path, string pageName) } /// - internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 portalSettings) + internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings portalSettings) { if (portalSettings == null) { diff --git a/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs b/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs index c0ce9a6962f..b23c9706199 100644 --- a/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs +++ b/DNN Platform/Library/Entities/Urls/BasicFriendlyUrlProvider.cs @@ -65,7 +65,7 @@ internal override string FriendlyUrl(TabInfo tab, string path, string pageName) } /// - internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings) + internal override string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings) { IPortalAliasInfo portalAliasInfo = ((PortalSettings)settings)?.PortalAlias; return this.FriendlyUrl(tab, path, pageName, portalAliasInfo?.HttpAlias, settings); @@ -306,7 +306,7 @@ private string GetFriendlyQueryString(TabInfo tab, string path, string pageName) return AddPage(friendlyPath, pageName); } - private string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias, IPortalSettingsV2 portalSettings) + private string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias, IPortalSettings portalSettings) { string friendlyPath = path; bool isPagePath = tab != null; diff --git a/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs b/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs index 39146ac60b7..3b896db2cad 100644 --- a/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs +++ b/DNN Platform/Library/Entities/Urls/FriendlyUrlController.cs @@ -135,9 +135,9 @@ public static TabInfo GetTab(int tabId, bool addStdUrls) } public static TabInfo GetTab(int tabId, bool addStdUrls, PortalSettings portalSettings, FriendlyUrlSettings settings) - => GetTab(tabId, addStdUrls, (IPortalSettingsV2)portalSettings, settings); + => GetTab(tabId, addStdUrls, (IPortalSettings)portalSettings, settings); - public static TabInfo GetTab(int tabId, bool addStdUrls, IPortalSettingsV2 portalSettings, FriendlyUrlSettings settings) + public static TabInfo GetTab(int tabId, bool addStdUrls, IPortalSettings portalSettings, FriendlyUrlSettings settings) { TabInfo tab = TabController.Instance.GetTab(tabId, portalSettings.PortalId, false); if (addStdUrls) diff --git a/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs b/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs index 73f12e8e037..64a9ea64ec7 100644 --- a/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs +++ b/DNN Platform/Library/Entities/Urls/FriendlyUrlProviderBase.cs @@ -41,7 +41,7 @@ internal FriendlyUrlProviderBase(NameValueCollection attributes) internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName); - internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 portalSettings); + internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings portalSettings); internal abstract string FriendlyUrl(TabInfo tab, string path, string pageName, string portalAlias); } diff --git a/DNN Platform/Library/Entities/Urls/RewriteController.cs b/DNN Platform/Library/Entities/Urls/RewriteController.cs index 6c25016fe34..6801528e34d 100644 --- a/DNN Platform/Library/Entities/Urls/RewriteController.cs +++ b/DNN Platform/Library/Entities/Urls/RewriteController.cs @@ -960,7 +960,7 @@ internal static bool IdentifyByTabPathEx( PortalInfo portal = CacheController.GetPortal(result.PortalId, false); // DNN-3789 - culture is defined by GetPageLocale - IPortalSettingsV2 portalSettings = new PortalSettings(result.TabId, result.PortalAlias); + IPortalSettings portalSettings = new PortalSettings(result.TabId, result.PortalAlias); string currentLocale = Localization.GetPageLocale(portalSettings).Name; if (portal != null && !string.IsNullOrEmpty(currentLocale)) { @@ -1816,7 +1816,7 @@ private static bool CheckTabPath(IHostSettings hostSettings, IPortalController p var currentLocale = result.CultureCode; if (string.IsNullOrEmpty(currentLocale)) { - IPortalSettingsV2 portalSettings = new PortalSettings(result.PortalId); + IPortalSettings portalSettings = new PortalSettings(result.PortalId); currentLocale = Localization.GetPageLocale(portalSettings).Name; } diff --git a/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs b/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs index 9d939d0a1ae..88d49e47193 100644 --- a/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs +++ b/DNN Platform/Library/Entities/Users/Profile/ProfilePropertyAccess.cs @@ -59,7 +59,7 @@ public CacheLevel Cacheability [DnnDeprecated(9, 8, 0, "Use the overload that takes IPortalSettings instead")] public static partial bool CheckAccessLevel(PortalSettings portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) { - var portalSettingsAsInterface = (IPortalSettingsV2)portalSettings; + var portalSettingsAsInterface = (IPortalSettings)portalSettings; return CheckAccessLevel(portalSettingsAsInterface, property, accessingUser, targetUser); } @@ -69,7 +69,7 @@ public static partial bool CheckAccessLevel(PortalSettings portalSettings, Profi /// The accessing user. /// The target user. /// if property accessible, otherwise . - public static bool CheckAccessLevel(IPortalSettingsV2 portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) + public static bool CheckAccessLevel(IPortalSettings portalSettings, ProfilePropertyDefinition property, UserInfo accessingUser, UserInfo targetUser) { var isAdminUser = IsAdminUser(portalSettings, accessingUser, targetUser); @@ -258,7 +258,7 @@ public string GetProperty(string propertyName, string format, CultureInfo format return string.Empty; } - private static bool IsAdminUser(IPortalSettingsV2 portalSettings, UserInfo accessingUser, UserInfo targetUser) + private static bool IsAdminUser(IPortalSettings portalSettings, UserInfo accessingUser, UserInfo targetUser) { bool isAdmin = false; diff --git a/DNN Platform/Library/Entities/Users/UserController.cs b/DNN Platform/Library/Entities/Users/UserController.cs index ab65d687968..9550f941d0d 100644 --- a/DNN Platform/Library/Entities/Users/UserController.cs +++ b/DNN Platform/Library/Entities/Users/UserController.cs @@ -2089,7 +2089,7 @@ internal static void UpdateUser(IEventLogger eventLogger, int portalId, UserInfo if (loggedAction) { // if the HttpContext is null, then get portal settings by portal id. - IPortalSettingsV2 portalSettings = null; + IPortalSettings portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs b/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs index 383cd7f90d9..8bbf8dde359 100644 --- a/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs +++ b/DNN Platform/Library/Framework/JavaScriptLibraries/JavaScript.cs @@ -135,7 +135,7 @@ public static partial void RequestRegistration(string jsname) /// The event logger. /// The portal settings. /// the library name. - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -165,7 +165,7 @@ public static partial void RequestRegistration(string jsname, Version version) /// The portal settings. /// the library name. /// the library's version. - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -200,7 +200,7 @@ public static partial void RequestRegistration(string jsname, Version version, S /// When is passed, match the major and minor versions. /// When is passed, match all parts of the version. /// - public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version, SpecificVersion specific) + public static void RequestRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version, SpecificVersion specific) { appStatus ??= Globals.GetCurrentServiceProvider().GetRequiredService(); eventLogger ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -241,7 +241,7 @@ public static partial void Register(Page page) /// The event logger. /// The portal settings. /// reference to the current page. - public static void Register(IHostSettings hostSettings, IHostSettingsService hostSettingsService, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, Page page) + public static void Register(IHostSettings hostSettings, IHostSettingsService hostSettingsService, IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, Page page) { hostSettings ??= Globals.GetCurrentServiceProvider().GetRequiredService(); hostSettingsService ??= Globals.GetCurrentServiceProvider().GetRequiredService(); @@ -397,7 +397,7 @@ private static void RequestHighestVersionLibraryRegistration(IApplicationStatusI } } - private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version, SpecificVersion specific) + private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInfo appStatus, IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version, SpecificVersion specific) { Func isValidLibrary = specific == SpecificVersion.LatestMajor ? l => l.Version.Major == version.Major && l.Version.Minor >= version.Minor @@ -423,7 +423,7 @@ private static bool RequestLooseVersionLibraryRegistration(IApplicationStatusInf return false; } - private static void RequestSpecificVersionLibraryRegistration(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string jsname, Version version) + private static void RequestSpecificVersionLibraryRegistration(IEventLogger eventLogger, IPortalSettings portalSettings, string jsname, Version version) { var library = JavaScriptLibraryController.Instance.GetLibrary(l => l.LibraryName.Equals(jsname, StringComparison.OrdinalIgnoreCase) && l.Version == version); if (library != null) @@ -465,7 +465,7 @@ private static void AddPreInstallOrLegacyItemRequest(string jsl) HttpContextSource.Current.Items[LegacyPrefix + jsl] = true; } - private static List ResolveVersionConflicts(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, IEnumerable scripts) + private static List ResolveVersionConflicts(IEventLogger eventLogger, IPortalSettings portalSettings, IEnumerable scripts) { var finalScripts = new List(); foreach (var libraryId in scripts) @@ -615,7 +615,7 @@ private static IEnumerable GetAllDependencies(IApplicationSta } } - private static void LogCollision(IEventLogger eventLogger, IPortalSettingsV2 portalSettings, string collisionText) + private static void LogCollision(IEventLogger eventLogger, IPortalSettings portalSettings, string collisionText) { // need to log an event eventLogger.AddLog( diff --git a/DNN Platform/Library/Obsolete/EventLogController.cs b/DNN Platform/Library/Obsolete/EventLogController.cs index 585fb3cc8ae..93179605ce0 100644 --- a/DNN Platform/Library/Obsolete/EventLogController.cs +++ b/DNN Platform/Library/Obsolete/EventLogController.cs @@ -525,61 +525,61 @@ public partial void AddLog(string propertyName, string propertyValue, EventLogTy /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, EventLogType logType) => - this.AddLog(propertyName, propertyValue, (IPortalSettingsV2)portalSettings, userID, logType); + this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, EventLogType logType) => + public partial void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogType logType) => this.EventLogger.AddLog(propertyName, propertyValue, portalSettings, userID, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType) => - this.AddLog(propertyName, propertyValue, (IPortalSettingsV2)portalSettings, userID, logType); + this.AddLog(propertyName, propertyValue, (IPortalSettings)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, string logType) => + public partial void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType) => this.EventLogger.AddLog(propertyName, propertyValue, portalSettings, userID, logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(LogProperties properties, PortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) => - this.AddLog(properties, (IPortalSettingsV2)portalSettings, userID, logTypeKey, bypassBuffering); + this.AddLog(properties, (IPortalSettings)portalSettings, userID, logTypeKey, bypassBuffering); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(LogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering) => + public partial void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) => this.EventLogger.AddLog(properties, portalSettings, userID, logTypeKey, bypassBuffering); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(PortalSettings portalSettings, int userID, EventLogType logType) => - this.AddLog((IPortalSettingsV2)portalSettings, userID, logType); + this.AddLog((IPortalSettings)portalSettings, userID, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(IPortalSettingsV2 portalSettings, int userID, EventLogType logType) => + public partial void AddLog(IPortalSettings portalSettings, int userID, EventLogType logType) => this.EventLogger.AddLog(portalSettings, userID, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, EventLogType logType) => - this.AddLog(businessObject, (IPortalSettingsV2)portalSettings, userID, userName, logType); + this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogType logType) => + public partial void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogType logType) => this.EventLogger.AddLog(businessObject, portalSettings, userID, userName, (Abstractions.Logging.EventLogType)logType); /// [DnnDeprecated(9, 7, 0, "It has been replaced by the overload taking IPortalSettings")] public partial void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType) => - this.AddLog(businessObject, (IPortalSettingsV2)portalSettings, userID, userName, logType); + this.AddLog(businessObject, (IPortalSettings)portalSettings, userID, userName, logType); /// [DnnDeprecated(9, 8, 0, "Use Dependency Injection to resolve 'DotNetNuke.Abstractions.Logging.IEventLogger' instead")] - public partial void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType) => + public partial void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType) => this.EventLogger.AddLog(businessObject, portalSettings, userID, userName, logType); /// diff --git a/DNN Platform/Library/Prompt/ConsoleCommand.cs b/DNN Platform/Library/Prompt/ConsoleCommand.cs index f147971ec42..37a159d8efd 100644 --- a/DNN Platform/Library/Prompt/ConsoleCommand.cs +++ b/DNN Platform/Library/Prompt/ConsoleCommand.cs @@ -28,7 +28,7 @@ public abstract class ConsoleCommand : IConsoleCommand public virtual string ResultHtml => this.LocalizeString($"Prompt_{this.GetType().Name}_ResultHtml"); /// Gets the portal settings. - protected IPortalSettingsV2 PortalSettings { get; private set; } + protected IPortalSettings PortalSettings { get; private set; } /// Gets the current user. protected IUserInfo User { get; private set; } @@ -49,7 +49,7 @@ public abstract class ConsoleCommand : IConsoleCommand Common.Globals.GetCurrentServiceProvider().GetRequiredService(); /// - public virtual void Initialize(string[] args, IPortalSettingsV2 portalSettings, IUserInfo userInfo, int activeTabId) + public virtual void Initialize(string[] args, IPortalSettings portalSettings, IUserInfo userInfo, int activeTabId) { this.Args = args; this.PortalSettings = portalSettings; diff --git a/DNN Platform/Library/Security/PortalSecurity.cs b/DNN Platform/Library/Security/PortalSecurity.cs index 0919c8f1839..f987b98c51a 100644 --- a/DNN Platform/Library/Security/PortalSecurity.cs +++ b/DNN Platform/Library/Security/PortalSecurity.cs @@ -298,14 +298,14 @@ public static bool IsDenied(string roles) /// The semicolon separated list of roles. /// if the specified user is denied; otherwise, . public static bool IsDenied(UserInfo objUserInfo, PortalSettings settings, string roles) - => IsDenied(objUserInfo, (IPortalSettingsV2)settings, roles); + => IsDenied(objUserInfo, (IPortalSettings)settings, roles); /// Determines whether the specified user is denied for the given roles. /// The user information. /// The settings. /// The semicolon separated list of roles. /// if the specified user is denied; otherwise, . - public static bool IsDenied(UserInfo objUserInfo, IPortalSettingsV2 settings, string roles) + public static bool IsDenied(UserInfo objUserInfo, IPortalSettings settings, string roles) { // superuser always has full access if (objUserInfo.IsSuperUser) @@ -373,14 +373,14 @@ public static bool IsInRoles(string roles) /// if the provided user belongs to the specific roles; otherwise, . [DnnDeprecated(10, 0, 2, "Use overload taking IPortalSettings")] public static partial bool IsInRoles(UserInfo objUserInfo, PortalSettings settings, string roles) - => IsInRoles(objUserInfo, (IPortalSettingsV2)settings, roles); + => IsInRoles(objUserInfo, (IPortalSettings)settings, roles); /// Determines whether the provided user belongs to the specified roles. /// The user information. /// The settings. /// The semicolon separated list of roles. /// if the provided user belongs to the specific roles; otherwise, . - public static bool IsInRoles(UserInfo objUserInfo, IPortalSettingsV2 settings, string roles) + public static bool IsInRoles(UserInfo objUserInfo, IPortalSettings settings, string roles) { if (objUserInfo.IsSuperUser) { @@ -592,7 +592,7 @@ public string Replace(string inputString, ConfigType configType, string configSo const RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline; const string listName = "ProfanityFilter"; - IPortalSettingsV2 settings; + IPortalSettings settings; IEnumerable listEntryHostInfos; IEnumerable listEntryPortalInfos; @@ -649,7 +649,7 @@ public string Remove(string inputString, ConfigType configType, string configSou const RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Singleline; const string listName = "ProfanityFilter"; - IPortalSettingsV2 settings; + IPortalSettings settings; IEnumerable listEntryHostInfos; IEnumerable listEntryPortalInfos; @@ -907,7 +907,7 @@ public void CheckAllPortalFileExtensionWhitelists(string newMasterList) } } - private static void ProcessRole(UserInfo user, IPortalSettingsV2 settings, string roleName, out bool? roleAllowed) + private static void ProcessRole(UserInfo user, IPortalSettings settings, string roleName, out bool? roleAllowed) { var roleType = GetRoleType(roleName); switch (roleType) @@ -971,7 +971,7 @@ private static int GetEntityFromRoleName(string roleName) return Null.NullInteger; } - private static void ProcessSecurityRole(UserInfo user, IPortalSettingsV2 settings, string roleName, out bool? roleAllowed) + private static void ProcessSecurityRole(UserInfo user, IPortalSettings settings, string roleName, out bool? roleAllowed) { roleAllowed = null; diff --git a/DNN Platform/Library/Security/Roles/RoleController.cs b/DNN Platform/Library/Security/Roles/RoleController.cs index 05487b97c49..49c773d77e2 100644 --- a/DNN Platform/Library/Security/Roles/RoleController.cs +++ b/DNN Platform/Library/Security/Roles/RoleController.cs @@ -101,7 +101,7 @@ public static int AddRoleGroup(RoleGroupInfo objRoleGroupInfo) /// The portal settings. /// The RoleGroup to Add. /// The ID of the new role. - public static int AddRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroupInfo) + public static int AddRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroupInfo) { var id = roleProvider.CreateRoleGroup(roleGroupInfo); eventLogger.AddLog( @@ -238,7 +238,7 @@ public static void DeleteRoleGroup(int portalID, int roleGroupId) /// The portal ID of the role group. /// The role group ID. [Obsolete("Deprecated in DotNetNuke 10.0.2. Please use overload with RoleProvider. Scheduled removal in v12.0.0.")] - public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, int portalId, int roleGroupId) + public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, int portalId, int roleGroupId) => DeleteRoleGroup(roleProvider, eventLogger, userController, portalSettings, GetRoleGroup(portalId, roleGroupId)); /// Deletes a Role Group. @@ -258,7 +258,7 @@ public static void DeleteRoleGroup(RoleGroupInfo objRoleGroupInfo) /// The user controller. /// The portal settings. /// The RoleGroup to Delete. - public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroupInfo) + public static void DeleteRoleGroup(RoleProvider roleProvider, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroupInfo) { roleProvider.DeleteRoleGroup(roleGroupInfo); eventLogger.AddLog( @@ -418,7 +418,7 @@ public static void UpdateRoleGroup(RoleGroupInfo roleGroup) /// The user controller. /// The portal settings. /// The RoleGroup to Update. - public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroup) + public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroup) { UpdateRoleGroup(roleProvider, roleController, eventLogger, userController, portalSettings, roleGroup, false); } @@ -433,7 +433,7 @@ public static void UpdateRoleGroup(RoleGroupInfo roleGroup, bool includeRoles) roleGroup, includeRoles); - public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettingsV2 portalSettings, RoleGroupInfo roleGroup, bool includeRoles) + public static void UpdateRoleGroup(RoleProvider roleProvider, IRoleController roleController, IEventLogger eventLogger, IUserController userController, IPortalSettings portalSettings, RoleGroupInfo roleGroup, bool includeRoles) { roleProvider.UpdateRoleGroup(roleGroup); eventLogger.AddLog(roleGroup, portalSettings, userController.GetCurrentUserInfo().UserID, string.Empty, EventLogType.USER_ROLE_UPDATED); diff --git a/DNN Platform/Library/Services/FileSystem/FileInfo.cs b/DNN Platform/Library/Services/FileSystem/FileInfo.cs index a99e5be02ba..7011581c0ed 100644 --- a/DNN Platform/Library/Services/FileSystem/FileInfo.cs +++ b/DNN Platform/Library/Services/FileSystem/FileInfo.cs @@ -141,7 +141,7 @@ public string PhysicalPath get { string physicalPath = Null.NullString; - IPortalSettingsV2 portalSettings = null; + IPortalSettings portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Services/FileSystem/FolderInfo.cs b/DNN Platform/Library/Services/FileSystem/FolderInfo.cs index d4fdef3b35a..fd843c4bb95 100644 --- a/DNN Platform/Library/Services/FileSystem/FolderInfo.cs +++ b/DNN Platform/Library/Services/FileSystem/FolderInfo.cs @@ -97,7 +97,7 @@ public string PhysicalPath get { string physicalPath; - IPortalSettingsV2 portalSettings = null; + IPortalSettings portalSettings = null; if (HttpContext.Current != null) { portalSettings = PortalController.Instance.GetCurrentSettings(); diff --git a/DNN Platform/Library/Services/Installer/Packages/PackageController.cs b/DNN Platform/Library/Services/Installer/Packages/PackageController.cs index 44f79df5d9c..8d4f6b5227f 100644 --- a/DNN Platform/Library/Services/Installer/Packages/PackageController.cs +++ b/DNN Platform/Library/Services/Installer/Packages/PackageController.cs @@ -68,7 +68,7 @@ public static partial bool CanDeletePackage(PackageInfo package, PortalSettings /// The package. /// The portal settings. /// if the package can be deleted, otherwise . - public static bool CanDeletePackage(IHostSettings hostSettings, IApplicationStatusInfo appStatus, PackageInfo package, IPortalSettingsV2 portalSettings) + public static bool CanDeletePackage(IHostSettings hostSettings, IApplicationStatusInfo appStatus, PackageInfo package, IPortalSettings portalSettings) { bool bCanDelete = true; diff --git a/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs b/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs index 7f3b367fdcc..3351f23c207 100644 --- a/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs +++ b/DNN Platform/Library/Services/Localization/Internal/LocalizationImpl.cs @@ -73,13 +73,13 @@ public string BestCultureCodeBasedOnBrowserLanguages(IEnumerable culture /// public CultureInfo GetPageLocale(PortalSettings portalSettings) { - return Localization.GetPageLocale((IPortalSettingsV2)portalSettings); + return Localization.GetPageLocale((IPortalSettings)portalSettings); } /// public void SetThreadCultures(CultureInfo cultureInfo, PortalSettings portalSettings) { - Localization.SetThreadCultures(cultureInfo, (IPortalSettingsV2)portalSettings); + Localization.SetThreadCultures(cultureInfo, (IPortalSettings)portalSettings); } } } diff --git a/DNN Platform/Library/Services/Localization/Localization.cs b/DNN Platform/Library/Services/Localization/Localization.cs index 324ff0675df..e1baad4cc33 100644 --- a/DNN Platform/Library/Services/Localization/Localization.cs +++ b/DNN Platform/Library/Services/Localization/Localization.cs @@ -573,7 +573,7 @@ public static string GetLocaleName(string code, CultureDropDownTypes displayType [DnnDeprecated(9, 8, 0, "Use overload taking IPortalSettings instead")] public static partial CultureInfo GetPageLocale(PortalSettings portalSettings) { - return GetPageLocale((IPortalSettingsV2)portalSettings); + return GetPageLocale((IPortalSettings)portalSettings); } /// @@ -591,7 +591,7 @@ public static partial CultureInfo GetPageLocale(PortalSettings portalSettings) /// /// Current PortalSettings. /// A valid CultureInfo. - public static CultureInfo GetPageLocale(IPortalSettingsV2 portalSettings) + public static CultureInfo GetPageLocale(IPortalSettings portalSettings) { CultureInfo pageCulture = null; @@ -1577,7 +1577,7 @@ public static void SetLanguage(string value) [DnnDeprecated(9, 8, 0, "Use overload taking IPortalSettings instead")] public static partial void SetThreadCultures(CultureInfo cultureInfo, PortalSettings portalSettings) { - SetThreadCultures(cultureInfo, (IPortalSettingsV2)portalSettings); + SetThreadCultures(cultureInfo, (IPortalSettings)portalSettings); } /// Sets the culture codes on the current Thread. @@ -1587,7 +1587,7 @@ public static partial void SetThreadCultures(CultureInfo cultureInfo, PortalSett /// This method will configure the Thread culture codes. Any page which does not derive from should /// be sure to call this method in to ensure localization works correctly. /// - public static void SetThreadCultures(CultureInfo cultureInfo, IPortalSettingsV2 portalSettings) + public static void SetThreadCultures(CultureInfo cultureInfo, IPortalSettings portalSettings) { if (cultureInfo == null) { @@ -1888,7 +1888,7 @@ private static string GetValidLanguageUrl(int portalId, string httpAlias, string /// Tries to get a valid language from the querystring. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromQs(IPortalSettingsV2 portalSettings) + private static CultureInfo GetCultureFromQs(IPortalSettings portalSettings) { if (HttpContext.Current == null || HttpContext.Current.Request["language"] == null) { @@ -1903,7 +1903,7 @@ private static CultureInfo GetCultureFromQs(IPortalSettingsV2 portalSettings) /// Tries to get a valid language from the cookie. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromCookie(IPortalSettingsV2 portalSettings) + private static CultureInfo GetCultureFromCookie(IPortalSettings portalSettings) { CultureInfo culture; if (HttpContext.Current == null || HttpContext.Current.Request.Cookies["language"] == null) @@ -1919,7 +1919,7 @@ private static CultureInfo GetCultureFromCookie(IPortalSettingsV2 portalSettings /// Tries to get a valid language from the user profile. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromProfile(IPortalSettingsV2 portalSettings) + private static CultureInfo GetCultureFromProfile(IPortalSettings portalSettings) { UserInfo objUserInfo = UserController.Instance.GetCurrentUserInfo(); @@ -1936,7 +1936,7 @@ private static CultureInfo GetCultureFromProfile(IPortalSettingsV2 portalSetting /// Tries to get a valid language from the browser preferences if the portal has the setting to use browser languages enabled. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromBrowser(IPortalSettingsV2 portalSettings) + private static CultureInfo GetCultureFromBrowser(IPortalSettings portalSettings) { if (!portalSettings.EnableBrowserLanguage) { @@ -1951,7 +1951,7 @@ private static CultureInfo GetCultureFromBrowser(IPortalSettingsV2 portalSetting /// Tries to get a valid language from the portal default preferences. /// Current PortalSettings. /// A valid CultureInfo if any is found. - private static CultureInfo GetCultureFromPortal(IPortalSettingsV2 portalSettings) + private static CultureInfo GetCultureFromPortal(IPortalSettings portalSettings) { CultureInfo culture = null; if (!string.IsNullOrEmpty(portalSettings.DefaultLanguage)) @@ -1994,7 +1994,7 @@ private static List GetPortalLocalizations(int portalId) /// Current culture. /// Portal settings for the current request. /// A instance representing the user's UI culture. - private static CultureInfo GetUserUICulture(CultureInfo currentCulture, IPortalSettingsV2 portalSettings) + private static CultureInfo GetUserUICulture(CultureInfo currentCulture, IPortalSettings portalSettings) { CultureInfo uiCulture = currentCulture; try diff --git a/DNN Platform/Library/Services/Localization/LocalizationProvider.cs b/DNN Platform/Library/Services/Localization/LocalizationProvider.cs index a9fce7c7adc..b803c669eb0 100644 --- a/DNN Platform/Library/Services/Localization/LocalizationProvider.cs +++ b/DNN Platform/Library/Services/Localization/LocalizationProvider.cs @@ -219,7 +219,7 @@ private static object GetCompiledResourceFileCallBack(CacheItemArgs cacheItemArg { var resourceFile = (string)cacheItemArgs.Params[0]; var locale = (string)cacheItemArgs.Params[1]; - var portalSettings = (IPortalSettingsV2)cacheItemArgs.Params[2]; + var portalSettings = (IPortalSettings)cacheItemArgs.Params[2]; var hostSettings = (IHostSettings)cacheItemArgs.Params[3]; string systemLanguage = Localization.SystemLocale; string defaultLanguage = portalSettings.DefaultLanguage; diff --git a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs index 40fb6a4dfdf..57f4f48a14e 100644 --- a/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/EventLogController.cs @@ -33,13 +33,13 @@ void IEventLogger.AddLog(string name, string value, Abstractions.Logging.EventLo } /// - void IEventLogger.AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(string name, string value, IPortalSettings portalSettings, int userID, Abstractions.Logging.EventLogType logType) { this.EventLogger.AddLog(name, value, portalSettings, userID, logType.ToString()); } /// - void IEventLogger.AddLog(string name, string value, IPortalSettingsV2 portalSettings, int userID, string logType) + void IEventLogger.AddLog(string name, string value, IPortalSettings portalSettings, int userID, string logType) { var properties = new LogProperties(); var logDetailInfo = new LogDetailInfo { PropertyName = name, PropertyValue = value }; @@ -48,7 +48,7 @@ void IEventLogger.AddLog(string name, string value, IPortalSettingsV2 portalSett } /// - void IEventLogger.AddLog(ILogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering) + void IEventLogger.AddLog(ILogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering) { // supports adding a custom string for LogType var log = new LogInfo @@ -69,19 +69,19 @@ void IEventLogger.AddLog(ILogProperties properties, IPortalSettingsV2 portalSett } /// - void IEventLogger.AddLog(IPortalSettingsV2 portalSettings, int userID, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(IPortalSettings portalSettings, int userID, Abstractions.Logging.EventLogType logType) { this.EventLogger.AddLog(new LogProperties(), portalSettings, userID, logType.ToString(), false); } /// - void IEventLogger.AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, Abstractions.Logging.EventLogType logType) + void IEventLogger.AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, Abstractions.Logging.EventLogType logType) { this.AddLog(businessObject, portalSettings, userID, userName, logType.ToString()); } /// - void IEventLogger.AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType) + void IEventLogger.AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType) { var log = new LogInfo { LogUserID = userID, LogTypeKey = logType }; if (portalSettings != null) diff --git a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs index a1fcfc6b944..114d84d112a 100644 --- a/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs +++ b/DNN Platform/Library/Services/Log/EventLog/IEventLogController.cs @@ -25,9 +25,9 @@ public partial interface IEventLogController : ILogController [Obsolete("Deprecated in DotNetNuke 9.7.0. It has been replaced by the overload taking IPortalSettings. Scheduled for removal in v11.0.0.")] void AddLog(string propertyName, string propertyValue, PortalSettings portalSettings, int userID, string logType); - void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, EventLogController.EventLogType logType); + void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, EventLogController.EventLogType logType); - void AddLog(string propertyName, string propertyValue, IPortalSettingsV2 portalSettings, int userID, string logType); + void AddLog(string propertyName, string propertyValue, IPortalSettings portalSettings, int userID, string logType); void AddLog(PortalSettings portalSettings, int userID, EventLogController.EventLogType logType); @@ -40,11 +40,11 @@ public partial interface IEventLogController : ILogController [Obsolete("Deprecated in DotNetNuke 9.7.0. It has been replaced by the overload taking IPortalSettings. Scheduled for removal in v11.0.0.")] void AddLog(object businessObject, PortalSettings portalSettings, int userID, string userName, string logType); - void AddLog(LogProperties properties, IPortalSettingsV2 portalSettings, int userID, string logTypeKey, bool bypassBuffering); + void AddLog(LogProperties properties, IPortalSettings portalSettings, int userID, string logTypeKey, bool bypassBuffering); - void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, EventLogController.EventLogType logType); + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, EventLogController.EventLogType logType); - void AddLog(object businessObject, IPortalSettingsV2 portalSettings, int userID, string userName, string logType); + void AddLog(object businessObject, IPortalSettings portalSettings, int userID, string userName, string logType); #pragma warning restore SA1600 // Elements should be documented } } diff --git a/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs b/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs index 5826197ad7a..c251e46dfd5 100644 --- a/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs +++ b/DNN Platform/Library/Services/Mail/SendTokenizedBulkEmail.cs @@ -44,7 +44,7 @@ public class SendTokenizedBulkEmail : IDisposable private UserInfo replyToUser; private bool smtpEnableSSL; private TokenReplace tokenReplace; - private IPortalSettingsV2 portalSettings; + private IPortalSettings portalSettings; private UserInfo sendingUser; private string body = string.Empty; private string confirmBodyHTML; diff --git a/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs b/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs index 4b2092aa8a1..ed52266befb 100644 --- a/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs +++ b/DNN Platform/Library/Services/Search/Controllers/UserResultController.cs @@ -31,7 +31,7 @@ public class UserResultController : BaseResultController /// public override string LocalizedSearchTypeName => Localization.GetString("Crawler_user", LocalizedResxFile); - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); /// public override bool HasViewPermission(SearchResult searchResult) diff --git a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs index ab065f3dea6..ac31ba03d3d 100644 --- a/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs +++ b/DNN Platform/Library/Services/Sitemap/CoreSitemapProvider.cs @@ -41,7 +41,7 @@ public override List GetUrls(int portalId, PortalSettings ps, string var currentLanguage = ps.CultureCode; if (string.IsNullOrEmpty(currentLanguage)) { - currentLanguage = Localization.GetPageLocale((IPortalSettingsV2)ps).Name; + currentLanguage = Localization.GetPageLocale((IPortalSettings)ps).Name; } var languagePublished = LocaleController.Instance.GetLocale(ps.PortalId, currentLanguage).IsPublished; diff --git a/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs b/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs index 4af3738e0c3..19dab45e5b2 100644 --- a/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs +++ b/DNN Platform/Library/Services/Sitemap/SitemapBuilder.cs @@ -51,7 +51,7 @@ public string CacheFileName var currentCulture = this.portalSettings.CultureCode?.ToLowerInvariant(); if (string.IsNullOrEmpty(currentCulture)) { - currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); + currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); } this.cacheFileName = $"sitemap.{currentCulture}.xml"; @@ -67,7 +67,7 @@ public string CacheIndexFileNameFormat { if (string.IsNullOrEmpty(this.cacheIndexFileNameFormat)) { - var currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); + var currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); this.cacheIndexFileNameFormat = $"sitemap_{{0}}.{currentCulture}.xml"; } @@ -207,7 +207,7 @@ public void GetSitemapIndexFile(string index, TextWriter output) return; } - var currentCulture = Localization.GetPageLocale((IPortalSettingsV2)this.portalSettings).Name.ToLowerInvariant(); + var currentCulture = Localization.GetPageLocale((IPortalSettings)this.portalSettings).Name.ToLowerInvariant(); this.WriteSitemapFileToOutput($"sitemap_{theIndex}.{currentCulture}.xml", output); } diff --git a/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs b/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs index fb0ee29c9b5..cc217465921 100644 --- a/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs +++ b/DNN Platform/Library/Services/Social/Messaging/Scheduler/CoreMessagingScheduler.cs @@ -395,7 +395,7 @@ private static int GetMessageTab(IHostSettings hostSettings, PortalSettings send /// The tab ID for the Message Center OR the user profile page tab ID. private static object GetMessageTabCallback(CacheItemArgs cacheItemArgs) { - var portalSettings = (IPortalSettingsV2)cacheItemArgs.Params[0]; + var portalSettings = (IPortalSettings)cacheItemArgs.Params[0]; var profileTab = TabController.Instance.GetTab(portalSettings.UserTabId, portalSettings.PortalId, false); if (profileTab != null) diff --git a/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs b/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs index b3d5b8ab629..586f68580e2 100644 --- a/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs +++ b/DNN Platform/Library/Services/Url/FriendlyUrl/FriendlyUrlProvider.cs @@ -41,7 +41,7 @@ public static FriendlyUrlProvider Instance() [DnnDeprecated(9, 4, 3, "Use the IPortalSettings overload")] public virtual partial string FriendlyUrl(TabInfo tab, string path, string pageName, PortalSettings settings) { - return this.FriendlyUrl(tab, path, pageName, (IPortalSettingsV2)settings); + return this.FriendlyUrl(tab, path, pageName, (IPortalSettings)settings); } /// Generate a friendly URL. @@ -50,7 +50,7 @@ public virtual partial string FriendlyUrl(TabInfo tab, string path, string pageN /// The page name. /// The portal settings. /// The friendly URL. - public abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettingsV2 settings); + public abstract string FriendlyUrl(TabInfo tab, string path, string pageName, IPortalSettings settings); /// Generate a friendly URL. /// The page. diff --git a/DNN Platform/Library/UI/Containers/ActionManager.cs b/DNN Platform/Library/UI/Containers/ActionManager.cs index f70d715715e..d17cc7740b1 100644 --- a/DNN Platform/Library/UI/Containers/ActionManager.cs +++ b/DNN Platform/Library/UI/Containers/ActionManager.cs @@ -30,7 +30,7 @@ namespace DotNetNuke.UI.Containers /// ActionManager is a helper class that provides common Action Behaviors that can be used by any implementation. public class ActionManager { - private readonly IPortalSettingsV2 portalSettings = PortalController.Instance.GetCurrentSettings(); + private readonly IPortalSettings portalSettings = PortalController.Instance.GetCurrentSettings(); private readonly HttpRequest request = HttpContext.Current.Request; private readonly HttpResponse response = HttpContext.Current.Response; private readonly IEventLogger eventLogger; diff --git a/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs b/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs index 530523a1089..3f99abf9f9f 100644 --- a/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs +++ b/DNN Platform/Modules/CoreMessaging/Services/SubscriptionsController.cs @@ -178,7 +178,7 @@ public HttpResponseMessage GetLocalizationTable(string culture) { if (!string.IsNullOrEmpty(culture)) { - Localization.SetThreadCultures(new CultureInfo(culture), (IPortalSettingsV2)this.PortalSettings); + Localization.SetThreadCultures(new CultureInfo(culture), (IPortalSettings)this.PortalSettings); } var dictionary = new Dictionary(); diff --git a/DNN Platform/Modules/DDRMenu/MenuBase.cs b/DNN Platform/Modules/DDRMenu/MenuBase.cs index c4a82ed70b8..56241588bc0 100644 --- a/DNN Platform/Modules/DDRMenu/MenuBase.cs +++ b/DNN Platform/Modules/DDRMenu/MenuBase.cs @@ -75,7 +75,7 @@ public MenuBase(ILocaliser localiser, IHostSettings hostSettings, ITabController public TemplateDefinition TemplateDef { get; set; } /// Gets the portal settings for the current portal. - // TODO: In v11 we should replace this by IPortalSettingsV2 and make it private or instantiate PortalSettings in the constructor. + // TODO: In v11 we should replace this by IPortalSettings and make it private or instantiate PortalSettings in the constructor. [Obsolete("Deprecated in DotNetNuke 9.8.1. This should not have been public. Scheduled removal in v11.0.0.")] internal PortalSettings HostPortalSettings => this.hostPortalSettings ??= PortalSettings.Current; @@ -158,7 +158,7 @@ internal virtual void PreRender() { #pragma warning disable CS0618 // Type or member is obsolete - // TODO: In Dnn v11, replace this to use IPortalSettingsV2 private field instantiate in constructor + // TODO: In Dnn v11, replace this to use IPortalSettings private field instantiate in constructor this.localiser.LocaliseNode(this.RootNode, this.HostPortalSettings.PortalId); #pragma warning restore CS0618 // Type or member is obsolete } @@ -440,7 +440,7 @@ private void ApplyNodeSelector() private void ApplyNodeManipulator() { - // TODO: In Dnn v11, replace this.HostPortalSettings to use IPortalSettingsV2 private field instantiate in constructor + // TODO: In Dnn v11, replace this.HostPortalSettings to use IPortalSettings private field instantiate in constructor #pragma warning disable CS0618 // Type or member is obsolete this.RootNode = new MenuNode( diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs index 72c882e7b71..84e6e9a92b1 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Browser/Browser.aspx.cs @@ -94,7 +94,7 @@ public partial class Browser : PageBase private EditorProviderSettings allPortalsSettings = new EditorProviderSettings(); /// The portal settings. - private IPortalSettingsV2 portalSettings; + private IPortalSettings portalSettings; /// The extension white list. private IFileExtensionAllowList extensionWhiteList; @@ -1520,7 +1520,7 @@ private void FillQualityPercentages() /// The get portal settings. /// Current Portal Settings. - private IPortalSettingsV2 GetPortalSettings() + private IPortalSettings GetPortalSettings() { int iTabId = 0, iPortalId = 0; @@ -1545,7 +1545,7 @@ private IPortalSettingsV2 GetPortalSettings() } catch (Exception) { - return (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; + return (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; } } diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs index bbfc97b14e7..3e16cffdeca 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/CKEditorOptions.ascx.cs @@ -79,7 +79,7 @@ public partial class CKEditorOptions : PortalModuleBase private readonly HttpRequest request = HttpContext.Current.Request; /// The _portal settings. - private IPortalSettingsV2 portalSettings; + private IPortalSettings portalSettings; /// Override Default Config Folder from Web.config. private string configFolder = string.Empty; @@ -1234,7 +1234,7 @@ private void FillFolders() /// Gets the portal settings. /// Returns the Current Portal Settings. - private IPortalSettingsV2 GetPortalSettings() + private IPortalSettings GetPortalSettings() { try { @@ -1267,7 +1267,7 @@ private IPortalSettingsV2 GetPortalSettings() } catch (Exception) { - return (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; + return (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; } } diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs index 11ddf43110a..d7661291134 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Options.aspx.cs @@ -37,7 +37,7 @@ public partial class Options : PageBase private readonly HttpRequest request = HttpContext.Current.Request; /// The portal settings. - private IPortalSettingsV2 curPortalSettings; + private IPortalSettings curPortalSettings; /// Initializes a new instance of the class. [Obsolete("Deprecated in DotNetNuke 10.2.2. Please use overload with IUserController. Scheduled removal in v12.0.0.")] @@ -183,11 +183,11 @@ private void ClosePage() /// Gets the portal settings. /// The Portal Settings. - private IPortalSettingsV2 GetPortalSettings() + private IPortalSettings GetPortalSettings() { int iTabId = 0, iPortalId = 0; - IPortalSettingsV2 portalSettings; + IPortalSettings portalSettings; try { @@ -210,7 +210,7 @@ private IPortalSettingsV2 GetPortalSettings() } catch (Exception) { - portalSettings = (IPortalSettingsV2)HttpContext.Current.Items["PortalSettings"]; + portalSettings = (IPortalSettings)HttpContext.Current.Items["PortalSettings"]; } return portalSettings; diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs index c4d2a67feed..0276e9ca082 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/SettingsUtil.cs @@ -94,7 +94,7 @@ internal static bool CheckExistsModuleInstanceSettings(string moduleKey, int mod /// Returns the Filled Settings. /// internal static EditorProviderSettings LoadEditorSettingsByKey( - IPortalSettingsV2 portalSettings, + IPortalSettings portalSettings, EditorProviderSettings currentSettings, List editorHostSettings, string key, @@ -1001,7 +1001,7 @@ internal static EditorProviderSettings LoadEditorSettingsByKey( /// /// Returns the filled Module Settings. /// - internal static EditorProviderSettings LoadModuleSettings(IPortalSettingsV2 portalSettings, EditorProviderSettings currentSettings, string key, int moduleId, IList portalRoles) + internal static EditorProviderSettings LoadModuleSettings(IPortalSettings portalSettings, EditorProviderSettings currentSettings, string key, int moduleId, IList portalRoles) { Hashtable hshModSet = null; var module = ModuleController.Instance.GetModule(moduleId, Null.NullInteger, false); @@ -1516,7 +1516,7 @@ PropertyInfo info in /// The alternate Sub Folder. /// The portal roles. /// Returns the Default Provider Settings. - internal static EditorProviderSettings GetDefaultSettings(IPortalSettingsV2 portalSettings, IHostSettings hostSettings, string homeDirPath, string alternateSubFolder, IList portalRoles) + internal static EditorProviderSettings GetDefaultSettings(IPortalSettings portalSettings, IHostSettings hostSettings, string homeDirPath, string alternateSubFolder, IList portalRoles) { var roles = new ArrayList(); @@ -1850,7 +1850,7 @@ internal static partial void ImportSettingBaseXml(string homeDirPath, bool isDef /// The portal settings. /// The HTTP request. /// Returns the MAX. upload file size for the current user. - internal static int GetCurrentUserUploadSize(EditorProviderSettings settings, IPortalSettingsV2 portalSettings, HttpRequest httpRequest) + internal static int GetCurrentUserUploadSize(EditorProviderSettings settings, IPortalSettings portalSettings, HttpRequest httpRequest) { var uploadFileLimitForPortal = Convert.ToInt32(Utility.GetMaxUploadSize()); diff --git a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs index 3e953c93c54..826d6cdcddd 100644 --- a/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs +++ b/DNN Platform/Providers/HtmlEditorProviders/DNNConnect.CKE/Utilities/Utility.cs @@ -245,7 +245,7 @@ public static string ConvertUnicodeChars(string input) /// /// Returns if the user has write access to the folder. /// - public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettingsV2 portalSettings) + public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettings portalSettings) { return CheckIfUserHasFolderAccess(folderId, portalSettings, "WRITE"); } @@ -256,7 +256,7 @@ public static bool CheckIfUserHasFolderWriteAccess(int folderId, IPortalSettings /// /// Returns if the user has write access to the folder. /// - public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettingsV2 portalSettings) + public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettings portalSettings) { return CheckIfUserHasFolderAccess(folderId, portalSettings, "READ"); } @@ -267,7 +267,7 @@ public static bool CheckIfUserHasFolderReadAccess(int folderId, IPortalSettingsV /// /// Returns the Folder Info. /// - public static IFolderInfo ConvertFilePathToFolderInfo(string folderPath, IPortalSettingsV2 portalSettings) + public static IFolderInfo ConvertFilePathToFolderInfo(string folderPath, IPortalSettings portalSettings) { if (!string.IsNullOrEmpty(portalSettings.HomeDirectoryMapPath) && folderPath.Length >= portalSettings.HomeDirectoryMapPath.Length) { @@ -348,7 +348,7 @@ public static void SortDescending(List source, Func /// if [is in roles] [the specified roles]; otherwise, . /// - public static bool IsInRoles(string roles, IPortalSettingsV2 settings) + public static bool IsInRoles(string roles, IPortalSettings settings) { var objUserInfo = UserController.Instance.GetCurrentUserInfo(); @@ -510,7 +510,7 @@ public static IFolderInfo EnsureGetFolder(int portalId, string folderPath) return null; } - private static bool CheckIfUserHasFolderAccess(int folderId, IPortalSettingsV2 portalSettings, string permissionKey) + private static bool CheckIfUserHasFolderAccess(int folderId, IPortalSettings portalSettings, string permissionKey) { try { diff --git a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs index 233e1688f67..3049a665829 100644 --- a/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs +++ b/DNN Platform/Tests/DotNetNuke.Tests.Core/Common/NavigationManagerTests.cs @@ -383,7 +383,7 @@ public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlK var expected = string.Format(DefaultURLPattern, tabId) + string.Format(ControlKeyPattern, controlKey); - var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettingsV2), controlKey, null); + var actual = this.navigationManager.NavigateURL(tabId, default(IPortalSettings), controlKey, null); Assert.That(actual, Is.Not.Null); Assert.That(actual, Is.EqualTo(expected)); @@ -402,7 +402,7 @@ public void NavigateUrl_TabId_NullSettings_ControlKey(int tabId, string controlK [TestCase(10, "My-Control-Key-10")] public void NavigateUrl_TabId_Settings_ControlKey(int tabId, string controlKey) { - var mockSettings = new Mock(); + var mockSettings = new Mock(); mockSettings .Setup(x => x.ContentLocalizationEnabled) .Returns(true); diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs index 6364cecd16c..dad48d210e0 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/AdminLogs/AdminLogsController.cs @@ -48,7 +48,7 @@ public AdminLogsController(IEventLogger eventLogger) protected Dictionary LogTypeDictionary => this.logTypeDictionary = LogController.Instance.GetLogTypeInfoDictionary(); - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); public LogTypeInfo GetMyLogType(string logTypeKey) { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs index 725bde616c4..2d0a4e52203 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Pages/BulkPagesController.cs @@ -285,7 +285,7 @@ private static bool IsValidTabPath(TabInfo tab, string newTabPath, out string er return valid; } - private int CreateTabFromParent(IPortalSettingsV2 portalSettings, TabInfo objRoot, TabInfo oTab, int parentId, bool validateOnly, out string errorMessage) + private int CreateTabFromParent(IPortalSettings portalSettings, TabInfo objRoot, TabInfo oTab, int parentId, bool validateOnly, out string errorMessage) { var tab = new TabInfo { diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs index 1caf60c14d3..13e7afc12c5 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/Checks/CheckUserProfilePage.cs @@ -42,7 +42,7 @@ public class CheckUserProfilePage : BaseCheck private readonly ITabController tabController; private readonly IPagesController pagesController; - private readonly Lazy portalSettings; + private readonly Lazy portalSettings; /// Initializes a new instance of the class. [Obsolete("Deprecated in DotNetNuke 10.0.0. Please use overload with IPagesController. Scheduled removal in v12.0.0.")] @@ -75,7 +75,7 @@ internal CheckUserProfilePage( throw new ArgumentNullException(nameof(portalController)); } - this.portalSettings = new Lazy(portalController.GetCurrentSettings); + this.portalSettings = new Lazy(portalController.GetCurrentSettings); } private int PortalId => this.portalSettings.Value.PortalId; diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs index 98dccaed5c5..dea1a4e06f0 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Security/SecurityController.cs @@ -29,7 +29,7 @@ namespace Dnn.PersonaBar.Security.Components public class SecurityController { - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] public IEnumerable GetAuthenticationProviders() diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs index de135db314c..8c0ef863a56 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Sites/SitesController.cs @@ -50,7 +50,7 @@ public class SitesController [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification = "Breaking change")] public string LocalResourcesFile => Path.Combine("~/DesktopModules/admin/Dnn.PersonaBar/Modules/Dnn.Sites/App_LocalResources/Sites.resx"); - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); private CultureDropDownTypes DisplayType { get; set; } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs index 7e6b115d0f6..57a39cc572a 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Components/Users/Dto/UserBasicDto.cs @@ -82,7 +82,7 @@ public UserBasicDto(UserInfo user) [DataMember(Name = "isAdmin")] public bool IsAdmin { get; set; } - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); public static UserBasicDto FromUserInfo(UserInfo user) { diff --git a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs index d9987655500..86dadc7972a 100644 --- a/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs +++ b/Dnn.AdminExperience/Library/Dnn.PersonaBar.Library/Controllers/TabsController.cs @@ -43,7 +43,7 @@ public class TabsController private static string AllUsersIcon => Globals.ResolveUrl("~/DesktopModules/Admin/Tabs/images/Icon_Everyone.png"); - private static IPortalSettingsV2 PortalSettings => PortalController.Instance.GetCurrentSettings(); + private static IPortalSettings PortalSettings => PortalController.Instance.GetCurrentSettings(); public TabDto GetPortalTabs(UserInfo userInfo, int portalId, string cultureCode, bool isMultiLanguage, bool excludeAdminTabs = true, string roles = "", bool disabledNotSelectable = false, int sortOrder = 0, int selectedTabId = -1, string validateTab = "", bool includeHostPages = false, bool includeDisabled = false, bool includeDeleted = false, bool includeDeletedChildren = true) { diff --git a/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs b/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs index 644a8c19d56..2578f504b0c 100644 --- a/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs +++ b/Dnn.AdminExperience/Tests/Dnn.PersonaBar.Security.Tests/Checks/CheckUserProfilePageTests.cs @@ -298,9 +298,9 @@ private static PagePermissions BuildPermissionsData(bool allUsersCanView) return permissionsData; } - private static Mock SetupPortalSettingsMock(int portalId, int userTabId) + private static Mock SetupPortalSettingsMock(int portalId, int userTabId) { - var mock = new Mock(); + var mock = new Mock(); mock.SetupGet(x => x.PortalId).Returns(portalId); mock.SetupGet(x => x.UserTabId).Returns(userTabId); return mock; From f95404951e636702c4d51b31e04d34061fa75886 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 25 Jun 2026 22:34:05 +0200 Subject: [PATCH 103/109] New approach to the page pipeline setting --- .../Framework/PagePipeline.cs | 2 +- .../Portals/IPortalSettings.cs | 3 -- .../Entities/Portals/PortalSettings.cs | 3 -- .../Portals/PortalSettingsController.cs | 1 - .../MvcPipeline/MvcPipelineSettings.cs | 15 +++++++++ .../MvcPipelineSettingsRepository.cs | 33 +++++++++++++++++++ DNN Platform/Library/Startup.cs | 5 +++ .../Services/SiteSettingsController.cs | 4 ++- 8 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettings.cs create mode 100644 DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs diff --git a/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs b/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs index 3c08407a885..1467d38cd3c 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Framework/PagePipeline.cs @@ -19,7 +19,7 @@ public static class PagePipeline public const string QueryStringMvc = "mvc"; /// Setting name for the page pipeline configuration. - public const string SettingName = "PagePipeline"; + public const string SettingName = "DefaultPagePipeline"; /// /// Defines the pipeline types for rendering pages in a portal. diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 48984d065b3..2da449d9001 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -361,8 +361,5 @@ public interface IPortalSettings /// Gets a value indicating whether to display the dropdowns to quickly add a moduel to the page in the edit bar. bool ShowQuickModuleAddMenu { get; } - - /// Gets the pipeline type for the portal. - PagePipeline.PortalRenderingPipeline PagePipeline { get; } } } diff --git a/DNN Platform/Library/Entities/Portals/PortalSettings.cs b/DNN Platform/Library/Entities/Portals/PortalSettings.cs index a84c0b8d279..aa264c8820a 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettings.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettings.cs @@ -555,9 +555,6 @@ public string AddCompatibleHttpHeader /// public bool ShowQuickModuleAddMenu => PortalController.GetPortalSettingAsBoolean("ShowQuickModuleAddMenu", this.PortalId, false); - /// - public PagePipeline.PortalRenderingPipeline PagePipeline { get; internal set; } - /// Create an instance. /// A new instance. public static IPortalSettings Create() diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs index b7902ad4709..cabfa43fe4e 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsController.cs @@ -282,7 +282,6 @@ public virtual void LoadPortalSettings(PortalSettings portalSettings) portalSettings.DataConsentDelayMeasurement = setting; setting = settings.GetValueOrDefault("AllowedExtensionsWhitelist", this.hostSettingsService.GetString("DefaultEndUserExtensionWhitelist")); portalSettings.AllowedExtensionsWhitelist = new FileExtensionWhitelist(setting); - portalSettings.PagePipeline = settings.GetPortalPipeline(PagePipeline.SettingName); setting = settings.GetValueOrDefault("CspHeaderMode", "OFF"); switch (setting.ToUpperInvariant()) { diff --git a/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettings.cs b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettings.cs new file mode 100644 index 00000000000..6fcb1e51695 --- /dev/null +++ b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettings.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Framework.MvcPipeline +{ + using DotNetNuke.Abstractions.Framework; + using DotNetNuke.Entities.Modules.Settings; + + internal class MvcPipelineSettings + { + [PortalSetting] + public PagePipeline.PortalRenderingPipeline DefaultPagePipeline { get; set; } + } +} diff --git a/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs new file mode 100644 index 00000000000..75638849fdb --- /dev/null +++ b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs @@ -0,0 +1,33 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information + +namespace DotNetNuke.Framework.MvcPipeline +{ + using DotNetNuke.Abstractions.Application; + using DotNetNuke.Abstractions.Portals; + using DotNetNuke.Entities.Modules; + using DotNetNuke.Entities.Modules.Settings; + using DotNetNuke.Entities.Portals; + + internal class MvcPipelineSettingsRepository : SettingsRepository + { + private readonly IPortalSettings portalSettings; + + public MvcPipelineSettingsRepository( + IModuleController moduleController, + IHostSettings hostSettings, + IHostSettingsService hostSettingsService, + IPortalController portalController, + IPortalSettings portalSettings) + : base(moduleController, hostSettings, hostSettingsService, portalController) + { + this.portalSettings = portalSettings; + } + + public MvcPipelineSettings GetSettings() + { + return this.GetSettings(this.portalSettings.PortalId); + } + } +} diff --git a/DNN Platform/Library/Startup.cs b/DNN Platform/Library/Startup.cs index 0b45945a739..f90b212c291 100644 --- a/DNN Platform/Library/Startup.cs +++ b/DNN Platform/Library/Startup.cs @@ -41,6 +41,7 @@ namespace DotNetNuke using DotNetNuke.Entities.Users; using DotNetNuke.Framework; using DotNetNuke.Framework.JavaScriptLibraries; + using DotNetNuke.Framework.MvcPipeline; using DotNetNuke.Framework.Reflections; using DotNetNuke.Instrumentation; using DotNetNuke.Prompt; @@ -200,6 +201,10 @@ public void ConfigureServices(IServiceCollection services) services.AddTransient(); services.AddTransient(); RegisterModuleInjectionFilters(services); + + services.AddScoped(serviceProvider => PortalController.Instance.GetCurrentSettings()); + services.AddScoped(); + services.AddScoped(serviceProvider => serviceProvider.GetRequiredService().GetSettings()); } private static void RegisterModuleInjectionFilters(IServiceCollection services) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs index 07b7f7d80ab..9422afe86d7 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs @@ -40,6 +40,7 @@ namespace Dnn.PersonaBar.SiteSettings.Services using DotNetNuke.Entities.Tabs.TabVersions; using DotNetNuke.Entities.Urls; using DotNetNuke.Entities.Users; + using DotNetNuke.Framework.MvcPipeline; using DotNetNuke.Instrumentation; using DotNetNuke.Security.Roles; using DotNetNuke.Services.Exceptions; @@ -108,6 +109,7 @@ public class SiteSettingsController(INavigationManager navigationManager, IAppli private readonly IPortalAliasService portalAliasService = portalAliasService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); private readonly RoleProvider roleProvider = roleProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); private readonly ITabController tabController = tabController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly MvcPipelineSettings mvcPipelineSettings = Globals.GetCurrentServiceProvider().GetRequiredService(); /// Initializes a new instance of the class. /// A manager to provide navigation services. @@ -3161,7 +3163,7 @@ public HttpResponseMessage GetOtherSettings(int? portalId) MaxNumberOfVersions = TabVersionSettings.Instance.GetMaxNumberOfVersions(pid), WorkflowEnabled = TabWorkflowSettings.Instance.IsWorkflowEnabled(pid), DefaultTabWorkflowId = TabWorkflowSettings.Instance.GetDefaultTabWorkflowId(pid), - PagePipeline = ((int)portalSettings.PagePipeline).ToString(System.Globalization.CultureInfo.InvariantCulture), + PagePipeline = ((int)this.mvcPipelineSettings.DefaultPagePipeline).ToString(System.Globalization.CultureInfo.InvariantCulture), }, Workflows = WorkflowManager.Instance.GetWorkflows(pid).Select(w => new { label = w.WorkflowName, value = w.WorkflowID }).ToList(), }); From c3702a1638a547c7285af13014b668a88fa52215 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 25 Jun 2026 22:37:06 +0200 Subject: [PATCH 104/109] Cleaning up --- DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs index 2da449d9001..7b18617461b 100644 --- a/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs +++ b/DNN Platform/DotNetNuke.Abstractions/Portals/IPortalSettings.cs @@ -6,8 +6,6 @@ namespace DotNetNuke.Abstractions.Portals using System; using System.Diagnostics.CodeAnalysis; - using DotNetNuke.Abstractions.Framework; - /// /// The PortalSettings class encapsulates all of the settings for the Portal, /// as well as the configuration settings required to execute the current tab From de8daea764f9a7630658b96602044c94c2cbedea Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 25 Jun 2026 22:38:25 +0200 Subject: [PATCH 105/109] Cleaning up 2 --- .../Library/Entities/Portals/IPortalSettingsController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs index 1bfba00e3c1..177f3bda2dd 100644 --- a/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs +++ b/DNN Platform/Library/Entities/Portals/IPortalSettingsController.cs @@ -5,7 +5,6 @@ namespace DotNetNuke.Entities.Portals { using System.Collections.Generic; - using DotNetNuke.Abstractions.Framework; using DotNetNuke.Entities.Modules; using DotNetNuke.Entities.Tabs; From 6920a6f3ff206820611a8fd921158a6b8e5fc008 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Thu, 25 Jun 2026 22:44:03 +0200 Subject: [PATCH 106/109] Cleaning up 3 --- .../Portals/PortalSettingsExtensions.cs | 9 ---- .../Framework/PagePipelineExtensions.cs | 52 ------------------- 2 files changed, 61 deletions(-) delete mode 100644 DNN Platform/Library/Framework/PagePipelineExtensions.cs diff --git a/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs b/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs index cd5e3d11859..f3e8678583c 100644 --- a/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs +++ b/DNN Platform/Library/Entities/Portals/PortalSettingsExtensions.cs @@ -1,12 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information - namespace DotNetNuke.Entities.Portals { - using DotNetNuke.Abstractions.Framework; - using DotNetNuke.Framework; - public static class PortalSettingsExtensions { /// Detect whether current page is custom error page. @@ -17,10 +13,5 @@ public static bool InErrorPageRequest(this PortalSettings portalSettings) return portalSettings.ActiveTab.TabID == portalSettings.ErrorPage404 || portalSettings.ActiveTab.TabID == portalSettings.ErrorPage500; } - - public static PagePipeline.PortalRenderingPipeline GetPortalPagePipeline(this IPortalSettingsController portalSettingsController, int portalId) - { - return PortalController.Instance.GetPortalSettings(portalId).GetPortalPipeline(PagePipeline.SettingName); - } } } diff --git a/DNN Platform/Library/Framework/PagePipelineExtensions.cs b/DNN Platform/Library/Framework/PagePipelineExtensions.cs deleted file mode 100644 index 549c7a914ba..00000000000 --- a/DNN Platform/Library/Framework/PagePipelineExtensions.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information - -namespace DotNetNuke.Framework -{ - using System; - using System.Collections; - using System.Collections.Generic; - - using DotNetNuke.Abstractions.Framework; - - public static class PagePipelineExtensions - { - /// - /// Gets the portal rendering pipeline configuration from the specified dictionary. - /// - /// The dictionary containing the portal settings. - /// The name of the setting to retrieve. - /// The portal rendering pipeline configuration, or WebForms if not found or invalid. - public static PagePipeline.PortalRenderingPipeline GetPortalPipeline(this Dictionary input, string settingName) - { - if (input != null && input.TryGetValue(settingName, out var pipeline)) - { - return string.IsNullOrEmpty(pipeline) ? - PagePipeline.PortalRenderingPipeline.WebForms : - Enum.TryParse(pipeline, true, out var result) ? result : PagePipeline.PortalRenderingPipeline.WebForms; - } - - return PagePipeline.PortalRenderingPipeline.WebForms; - } - - /// - /// Gets the page rendering pipeline configuration from the specified hashtable. - /// - /// The hashtable containing the page settings. - /// The name of the setting to retrieve. - /// The page rendering pipeline configuration, or Inherited if not found or invalid. - public static PagePipeline.PageRenderingPipeline GetPagePipeline(this Hashtable input, string settingName) - { - if (input != null && input.ContainsKey(settingName)) - { - var pipeline = Convert.ToString(input[settingName], System.Globalization.CultureInfo.InvariantCulture); - return string.IsNullOrEmpty(pipeline) ? - PagePipeline.PageRenderingPipeline.Inherited : - Enum.TryParse(pipeline, true, out var result) ? result : PagePipeline.PageRenderingPipeline.Inherited; - } - - return PagePipeline.PageRenderingPipeline.Inherited; - } - } -} From 3d284ce6ba27f13655ff1e6693effd0b226d8fa8 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Sun, 28 Jun 2026 10:39:29 +0200 Subject: [PATCH 107/109] Deprecate and overload dataprovider method --- DNN Platform/Library/Data/DataProvider.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/DNN Platform/Library/Data/DataProvider.cs b/DNN Platform/Library/Data/DataProvider.cs index a5bb921a88c..2baac1d5103 100644 --- a/DNN Platform/Library/Data/DataProvider.cs +++ b/DNN Platform/Library/Data/DataProvider.cs @@ -18,6 +18,7 @@ namespace DotNetNuke.Data using System.Web.Hosting; using DotNetNuke.Abstractions.Application; + using DotNetNuke.Abstractions.Framework; using DotNetNuke.Common; using DotNetNuke.Common.Utilities; using DotNetNuke.ComponentModel; @@ -889,6 +890,14 @@ public virtual int SaveTabVersionDetail(int tabVersionDetailId, int tabVersionId return this.ExecuteScalar("SaveTabVersionDetail", tabVersionDetailId, tabVersionId, moduleId, moduleVersion, paneName, moduleOrder, action, createdByUserID, modifiedByUserID); } + [DnnDeprecated(11, 0, 0, "Use UpdateTab with pagePipeline parameter instead.")] +#pragma warning disable SA1601 // Partial elements should be documented + public virtual partial void UpdateTab(int tabId, int contentItemId, int portalId, Guid versionGuid, Guid defaultLanguageGuid, Guid localizedVersionGuid, string tabName, bool isVisible, bool disableLink, int parentId, string iconFile, string iconFileLarge, string title, string description, string keyWords, bool isDeleted, string url, string skinSrc, string containerSrc, DateTime startDate, DateTime endDate, int refreshInterval, string pageHeadText, bool isSecure, bool permanentRedirect, float siteMapPriority, int lastModifiedByuserID, string cultureCode, bool isSystem) +#pragma warning restore SA1601 // Partial elements should be documented + { + this.UpdateTab(tabId, contentItemId, portalId, versionGuid, defaultLanguageGuid, localizedVersionGuid, tabName, isVisible, disableLink, parentId, iconFile, iconFileLarge, title, description, keyWords, isDeleted, url, skinSrc, containerSrc, startDate, endDate, refreshInterval, pageHeadText, isSecure, permanentRedirect, siteMapPriority, lastModifiedByuserID, cultureCode, isSystem, (int)PagePipeline.PageRenderingPipeline.Inherited); + } + public virtual void UpdateTab(int tabId, int contentItemId, int portalId, Guid versionGuid, Guid defaultLanguageGuid, Guid localizedVersionGuid, string tabName, bool isVisible, bool disableLink, int parentId, string iconFile, string iconFileLarge, string title, string description, string keyWords, bool isDeleted, string url, string skinSrc, string containerSrc, DateTime startDate, DateTime endDate, int refreshInterval, string pageHeadText, bool isSecure, bool permanentRedirect, float siteMapPriority, int lastModifiedByuserID, string cultureCode, bool isSystem, int pagePipeline) { this.ExecuteNonQuery( From 90f194b2906e0cbc6149d94c9392fe682eb7a995 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Sun, 28 Jun 2026 10:56:11 +0200 Subject: [PATCH 108/109] Fix to mvc site settings controller --- .../Framework/MvcPipeline/MvcPipelineSettingsRepository.cs | 5 +++++ .../Services/SiteSettingsController.cs | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs index 75638849fdb..6cd72780359 100644 --- a/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs +++ b/DNN Platform/Library/Framework/MvcPipeline/MvcPipelineSettingsRepository.cs @@ -29,5 +29,10 @@ public MvcPipelineSettings GetSettings() { return this.GetSettings(this.portalSettings.PortalId); } + + public void SaveSettings(MvcPipelineSettings settings) + { + this.SaveSettings(this.portalSettings.PortalId, settings); + } } } diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs index 9422afe86d7..1ee26e77edf 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs @@ -109,6 +109,7 @@ public class SiteSettingsController(INavigationManager navigationManager, IAppli private readonly IPortalAliasService portalAliasService = portalAliasService ?? Globals.GetCurrentServiceProvider().GetRequiredService(); private readonly RoleProvider roleProvider = roleProvider ?? Globals.GetCurrentServiceProvider().GetRequiredService(); private readonly ITabController tabController = tabController ?? Globals.GetCurrentServiceProvider().GetRequiredService(); + private readonly MvcPipelineSettingsRepository mvcPipelineSettingsRepository = Globals.GetCurrentServiceProvider().GetRequiredService(); private readonly MvcPipelineSettings mvcPipelineSettings = Globals.GetCurrentServiceProvider().GetRequiredService(); /// Initializes a new instance of the class. @@ -3194,6 +3195,9 @@ public HttpResponseMessage UpdateOtherSettings(UpdateOtherSettingsRequest reques PortalController.Instance.UpdatePortalSetting(pid, "AllowJsInModuleFooters", request.AllowJsInModuleFooters.ToString(), false, null, false); PortalController.Instance.UpdatePortalSetting(pid, "ShowQuickModuleAddMenu", request.ShowQuickModuleAddMenu.ToString(), false, null, false); PortalController.Instance.UpdatePortalSetting(pid, PagePipeline.SettingName, request.PagePipeline, false, null, false); + var pagePipeline = (PagePipeline.PortalRenderingPipeline)Enum.Parse(typeof(PagePipeline.PortalRenderingPipeline), request.PagePipeline, true); + this.mvcPipelineSettings.DefaultPagePipeline = pagePipeline; + this.mvcPipelineSettingsRepository.SaveSettings(this.mvcPipelineSettings); if (request.AllowedExtensionsWhitelist == this.hostSettings.DefaultEndUserExtensionAllowList.ToStorageString()) { PortalController.Instance.UpdatePortalSetting(pid, "AllowedExtensionsWhitelist", null, false, null, false); From 901168fcaad7da4309319362c79a74ae5171c520 Mon Sep 17 00:00:00 2001 From: Peter Donker Date: Sun, 28 Jun 2026 11:05:44 +0200 Subject: [PATCH 109/109] With previous --- .../Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs index 1ee26e77edf..513ffdce4aa 100644 --- a/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs +++ b/Dnn.AdminExperience/Dnn.PersonaBar.Extensions/Services/SiteSettingsController.cs @@ -3194,7 +3194,6 @@ public HttpResponseMessage UpdateOtherSettings(UpdateOtherSettingsRequest reques PortalController.Instance.UpdatePortalSetting(pid, "AllowJsInModuleHeaders", request.AllowJsInModuleHeaders.ToString(), false, null, false); PortalController.Instance.UpdatePortalSetting(pid, "AllowJsInModuleFooters", request.AllowJsInModuleFooters.ToString(), false, null, false); PortalController.Instance.UpdatePortalSetting(pid, "ShowQuickModuleAddMenu", request.ShowQuickModuleAddMenu.ToString(), false, null, false); - PortalController.Instance.UpdatePortalSetting(pid, PagePipeline.SettingName, request.PagePipeline, false, null, false); var pagePipeline = (PagePipeline.PortalRenderingPipeline)Enum.Parse(typeof(PagePipeline.PortalRenderingPipeline), request.PagePipeline, true); this.mvcPipelineSettings.DefaultPagePipeline = pagePipeline; this.mvcPipelineSettingsRepository.SaveSettings(this.mvcPipelineSettings);