diff --git a/build/NuSpecs/UmbracoCms.StaticAssets.nuspec b/build/NuSpecs/UmbracoCms.StaticAssets.nuspec deleted file mode 100644 index 86ad68dd5f..0000000000 --- a/build/NuSpecs/UmbracoCms.StaticAssets.nuspec +++ /dev/null @@ -1,29 +0,0 @@ - - - - Umbraco.Cms.StaticAssets - 9.0.0 - Umbraco Cms Static Assets - Umbraco HQ - Umbraco HQ - MIT - https://umbraco.com/ - https://umbraco.com/dist/nuget/logo-small.png - false - Contains the static assets that is required to run Umbraco CMS. - Contains the static assets that is required to run Umbraco CMS. - en-US - umbraco - - - - - - - - - - - - - diff --git a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.props b/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.props deleted file mode 100644 index ea0b013665..0000000000 --- a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.props +++ /dev/null @@ -1,8 +0,0 @@ - - - $(DefaultItemExcludes);App_Plugins/** - $(DefaultItemExcludes);umbraco/Data/** - $(DefaultItemExcludes);umbraco/Logs/** - $(DefaultItemExcludes);wwwroot/media/** - - diff --git a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets b/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets deleted file mode 100644 index 2ef0a44a9c..0000000000 --- a/build/NuSpecs/buildTransitive/Umbraco.Cms.StaticAssets.targets +++ /dev/null @@ -1,91 +0,0 @@ - - - - $(MSBuildThisFileDirectory)..\content\umbraco\**\*.* - $(MSBuildThisFileDirectory)..\content\wwwroot\umbraco\**\*.* - umbraco - - - - - - - - - - - - - - - - <_AppPluginsFiles Include="App_Plugins\**" /> - - - - - - - - - <_UmbracoFolderFiles Include="umbraco\config\**" /> - <_UmbracoFolderFiles Include="umbraco\PartialViewMacros\**" /> - <_UmbracoFolderFiles Include="umbraco\UmbracoBackOffice\**" /> - <_UmbracoFolderFiles Include="umbraco\UmbracoInstall\**" /> - <_UmbracoFolderFiles Include="umbraco\UmbracoWebsite\**" /> - <_UmbracoFolderFiles Include="umbraco\UmbracoWebsite\**" /> - <_UmbracoFolderFiles Include="umbraco\Licenses\**" /> - - - <_UmbracoFolderFiles Include="umbraco\Deploy\**" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/build.ps1 b/build/build.ps1 index c2be223a2c..3a581456a9 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -301,13 +301,6 @@ $_.CreationTime = $_.CreationTime.AddHours(-11) $_.LastWriteTime = $_.LastWriteTime.AddHours(-11) } - - # copy Belle - Write-Host "Copy Belle" - $this.CopyFiles("$src\Umbraco.Web.UI\wwwroot\umbraco\assets", "*", "$tmp\WebApp\wwwroot\umbraco\assets") - $this.CopyFiles("$src\Umbraco.Web.UI\wwwroot\umbraco\js", "*", "$tmp\WebApp\wwwroot\umbraco\js") - $this.CopyFiles("$src\Umbraco.Web.UI\wwwroot\umbraco\lib", "*", "$tmp\WebApp\wwwroot\umbraco\lib") - $this.CopyFiles("$src\Umbraco.Web.UI\wwwroot\umbraco\views", "*", "$tmp\WebApp\wwwroot\umbraco\views") }) @@ -365,12 +358,6 @@ -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cms.log" if (-not $?) { throw "Failed to pack NuGet UmbracoCms." } - &$this.BuildEnv.NuGet Pack "$nuspecs\UmbracoCms.StaticAssets.nuspec" ` - -Properties BuildTmp="$($this.BuildTemp)" ` - -Version "$($this.Version.Semver.ToString())" ` - -Verbosity detailed -outputDirectory "$($this.BuildOutput)" > "$($this.BuildTemp)\nupack.cmsstaticassets.log" - if (-not $?) { throw "Failed to pack NuGet UmbracoCms.StaticAssets." } - &$this.BuildEnv.NuGet Pack "$templates\Umbraco.Templates.nuspec" ` -Properties BuildTmp="$($this.BuildTemp)" ` -Version "$($this.Version.Semver.ToString())" ` diff --git a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj new file mode 100644 index 0000000000..65d4c8aa9d --- /dev/null +++ b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj @@ -0,0 +1,58 @@ + + + + net6.0 + true + Umbraco.Cms.StaticAssets + Contains the static assets that is required to run Umbraco CMS. + / + + + + + + + + + + + + + $(ProjectDir)wwwroot/umbraco + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml similarity index 93% rename from src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml index e45d48a911..ab45a61ed0 100644 --- a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml +++ b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/AuthorizeUpgrade.cshtml @@ -59,15 +59,15 @@ @*And finally we can load in our angular app*@ - + diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Default.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml similarity index 96% rename from src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Default.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml index 3b9c48800d..599dff7a2a 100644 --- a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Default.cshtml +++ b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml @@ -120,8 +120,8 @@ - + @if (isDebug) { diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Preview.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Preview.cshtml similarity index 98% rename from src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Preview.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Preview.cshtml index 7d9a9a39c4..80231d3ac5 100644 --- a/src/Umbraco.Web.UI/umbraco/UmbracoBackOffice/Preview.cshtml +++ b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Preview.cshtml @@ -108,7 +108,7 @@ @await Html.BareMinimumServerVariablesScriptAsync(BackOfficeServerVariables) - + diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoInstall/Index.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoInstall/Index.cshtml similarity index 97% rename from src/Umbraco.Web.UI/umbraco/UmbracoInstall/Index.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoInstall/Index.cshtml index 2223d2ec6b..797c647049 100644 --- a/src/Umbraco.Web.UI/umbraco/UmbracoInstall/Index.cshtml +++ b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoInstall/Index.cshtml @@ -69,7 +69,7 @@ "installApiBaseUrl": "@ViewData.GetInstallApiBaseUrl()", "umbracoBaseUrl": "@ViewData.GetUmbracoBaseFolder()", "application": { - version: "@ViewData.GetUmbracoVersion().Major" + version: "@ViewData.GetUmbracoVersion()?.Major" } }; diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoWebsite/NoNodes.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoWebsite/NoNodes.cshtml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/UmbracoWebsite/NoNodes.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoWebsite/NoNodes.cshtml diff --git a/src/Umbraco.Web.UI/umbraco/UmbracoWebsite/NotFound.cshtml b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoWebsite/NotFound.cshtml similarity index 95% rename from src/Umbraco.Web.UI/umbraco/UmbracoWebsite/NotFound.cshtml rename to src/Umbraco.Cms.StaticAssets/umbraco/UmbracoWebsite/NotFound.cshtml index 62a149f2ab..ea9d0d41aa 100644 --- a/src/Umbraco.Web.UI/umbraco/UmbracoWebsite/NotFound.cshtml +++ b/src/Umbraco.Cms.StaticAssets/umbraco/UmbracoWebsite/NotFound.cshtml @@ -42,8 +42,8 @@ @if (hostingEnvironment.IsDebugMode) { - var reason = (string)Context.Items["reason"]; - var message = (string)Context.Items["message"]; + var reason = (string?)Context.Items["reason"]; + var message = (string?)Context.Items["message"]; if (!reason.IsNullOrWhiteSpace()) { diff --git a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs index 38e00b876b..8d00d58198 100644 --- a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs @@ -20,7 +20,7 @@ namespace Umbraco.Cms.Core.Configuration.Models internal const bool StaticUseHttps = false; internal const int StaticVersionCheckPeriod = 7; internal const string StaticUmbracoPath = Constants.System.DefaultUmbracoPath; - internal const string StaticIconsPath = "~/umbraco/assets/icons"; + internal const string StaticIconsPath = "umbraco/assets/icons"; internal const string StaticUmbracoCssPath = "~/css"; internal const string StaticUmbracoScriptsPath = "~/scripts"; internal const string StaticUmbracoMediaPath = "~/media"; diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/cs.xml b/src/Umbraco.Core/EmbeddedResources/Lang/cs.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/cs.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/cs.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/cy.xml b/src/Umbraco.Core/EmbeddedResources/Lang/cy.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/cy.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/cy.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/da.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/da.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/de.xml b/src/Umbraco.Core/EmbeddedResources/Lang/de.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/de.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/de.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/en.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/en.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/es.xml b/src/Umbraco.Core/EmbeddedResources/Lang/es.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/es.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/es.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/fr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/fr.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/fr.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/fr.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/he.xml b/src/Umbraco.Core/EmbeddedResources/Lang/he.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/he.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/he.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/it.xml b/src/Umbraco.Core/EmbeddedResources/Lang/it.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/it.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/it.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ja.xml b/src/Umbraco.Core/EmbeddedResources/Lang/ja.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/ja.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/ja.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ko.xml b/src/Umbraco.Core/EmbeddedResources/Lang/ko.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/ko.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/ko.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nb.xml b/src/Umbraco.Core/EmbeddedResources/Lang/nb.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/nb.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/nb.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/nl.xml b/src/Umbraco.Core/EmbeddedResources/Lang/nl.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/nl.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/nl.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pl.xml b/src/Umbraco.Core/EmbeddedResources/Lang/pl.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/pl.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/pl.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/pt.xml b/src/Umbraco.Core/EmbeddedResources/Lang/pt.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/pt.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/pt.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/ru.xml b/src/Umbraco.Core/EmbeddedResources/Lang/ru.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/ru.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/ru.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/sv.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/sv.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/tr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/tr.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/tr.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/tr.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Core/EmbeddedResources/Lang/zh.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/zh.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/zh.xml diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml b/src/Umbraco.Core/EmbeddedResources/Lang/zh_tw.xml similarity index 100% rename from src/Umbraco.Web.UI/umbraco/config/lang/zh_tw.xml rename to src/Umbraco.Core/EmbeddedResources/Lang/zh_tw.xml diff --git a/src/Umbraco.Core/Services/LocalizedTextServiceFileSources.cs b/src/Umbraco.Core/Services/LocalizedTextServiceFileSources.cs index f26843b028..41d12f9a45 100644 --- a/src/Umbraco.Core/Services/LocalizedTextServiceFileSources.cs +++ b/src/Umbraco.Core/Services/LocalizedTextServiceFileSources.cs @@ -5,6 +5,8 @@ using System.IO; using System.Linq; using System.Xml; using System.Xml.Linq; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.FileProviders.Internal; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Cache; using Umbraco.Extensions; @@ -17,6 +19,7 @@ namespace Umbraco.Cms.Core.Services public class LocalizedTextServiceFileSources { private readonly ILogger _logger; + private readonly IDirectoryContents _directoryContents; private readonly IAppPolicyCache _cache; private readonly IEnumerable? _supplementFileSources; private readonly DirectoryInfo? _fileSourceFolder; @@ -26,6 +29,21 @@ namespace Umbraco.Cms.Core.Services private readonly Lazy>> _xmlSources; + [Obsolete("Use ctor with all params. This will be removed in Umbraco 12")] + public LocalizedTextServiceFileSources( + ILogger logger, + AppCaches appCaches, + DirectoryInfo fileSourceFolder, + IEnumerable supplementFileSources) + :this( + logger, + appCaches, + fileSourceFolder, + supplementFileSources, new NotFoundDirectoryContents()) + { + + } + /// /// This is used to configure the file sources with the main file sources shipped with Umbraco and also including supplemental/plugin based /// localization files. The supplemental files will be loaded in and merged in after the primary files. @@ -39,36 +57,37 @@ namespace Umbraco.Cms.Core.Services ILogger logger, AppCaches appCaches, DirectoryInfo fileSourceFolder, - IEnumerable supplementFileSources) + IEnumerable supplementFileSources, + IDirectoryContents directoryContents + ) { if (logger == null) throw new ArgumentNullException("logger"); if (appCaches == null) throw new ArgumentNullException("cache"); if (fileSourceFolder == null) throw new ArgumentNullException("fileSourceFolder"); _logger = logger; + _directoryContents = directoryContents; _cache = appCaches.RuntimeCache; - - if (fileSourceFolder.Exists == false) - { - _logger.LogWarning("The folder does not exist: {FileSourceFolder}, therefore no sources will be discovered", fileSourceFolder.FullName); - } - else - { - _fileSourceFolder = fileSourceFolder; - _supplementFileSources = supplementFileSources; - } + _fileSourceFolder = fileSourceFolder; + _supplementFileSources = supplementFileSources; //Create the lazy source for the _xmlSources _xmlSources = new Lazy>>(() => { var result = new Dictionary>(); - if (_fileSourceFolder == null) return result; - foreach (var fileInfo in _fileSourceFolder.GetFiles("*.xml")) + var files = GetLanguageFiles(); + + if (!files.Any()) + { + return result; + } + + foreach (var fileInfo in files) { var localCopy = fileInfo; - var filename = Path.GetFileNameWithoutExtension(localCopy.FullName).Replace("_", "-"); + var filename = Path.GetFileNameWithoutExtension(localCopy.Name).Replace("_", "-"); // TODO: Fix this nonsense... would have to wait until v8 to store the language files with their correct // names instead of storing them as 2 letters but actually having a 4 letter culture. So now, we @@ -80,7 +99,7 @@ namespace Umbraco.Cms.Core.Services { //we need to open the file to see if we can read it's 'real' culture, we'll use XmlReader since we don't //want to load in the entire doc into mem just to read a single value - using (var fs = fileInfo.OpenRead()) + using (var fs = fileInfo.CreateReadStream()) using (var reader = XmlReader.Create(fs)) { if (reader.IsStartElement()) @@ -98,7 +117,7 @@ namespace Umbraco.Cms.Core.Services } catch (CultureNotFoundException) { - _logger.LogWarning("The culture {CultureValue} found in the file {CultureFile} is not a valid culture", cultureVal, fileInfo.FullName); + _logger.LogWarning("The culture {CultureValue} found in the file {CultureFile} is not a valid culture", cultureVal, fileInfo.Name); //If the culture in the file is invalid, we'll just hope the file name is a valid culture below, otherwise // an exception will be thrown. } @@ -119,7 +138,7 @@ namespace Umbraco.Cms.Core.Services XDocument xdoc; //load in primary - using (var fs = localCopy.OpenRead()) + using (var fs = localCopy.CreateReadStream()) { xdoc = XDocument.Load(fs); } @@ -128,7 +147,7 @@ namespace Umbraco.Cms.Core.Services MergeSupplementaryFiles(culture, xdoc); return xdoc; - }, isSliding: true, timeout: TimeSpan.FromMinutes(10), dependentFiles: new[] { localCopy.FullName })!); + }, isSliding: true, timeout: TimeSpan.FromMinutes(10))!); } return result; }); @@ -136,6 +155,30 @@ namespace Umbraco.Cms.Core.Services } + private IEnumerable GetLanguageFiles() + { + var result = new List(); + + if (_fileSourceFolder is not null && _fileSourceFolder.Exists) + { + + result.AddRange( + new PhysicalDirectoryContents(_fileSourceFolder.FullName) + .Where(x => !x.IsDirectory && x.Name.EndsWith(".xml")) + ); + } + + if (_directoryContents.Exists) + { + result.AddRange( + _directoryContents + .Where(x => !x.IsDirectory && x.Name.EndsWith(".xml")) + ); + } + + return result; + } + /// /// Constructor /// diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.FileSystems.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.FileSystems.cs index fbb32671a1..310ae0b302 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.FileSystems.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.FileSystems.cs @@ -1,13 +1,12 @@ -using System.IO; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; -using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.IO.MediaPathSchemes; using Umbraco.Extensions; +using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment; namespace Umbraco.Cms.Infrastructure.DependencyInjection { diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs index eff921077c..7e0802d558 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs @@ -1,9 +1,11 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Extensions; @@ -24,6 +26,7 @@ using Umbraco.Cms.Infrastructure.Telemetry.Providers; using Umbraco.Cms.Infrastructure.Templates; using Umbraco.Extensions; using CacheInstructionService = Umbraco.Cms.Core.Services.Implement.CacheInstructionService; +using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment; namespace Umbraco.Cms.Infrastructure.DependencyInjection { @@ -61,17 +64,6 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection return builder; } - private static LocalizedTextServiceFileSources CreateLocalizedTextServiceFileSourcesFactory(IServiceProvider container) - { - var hostEnvironment = container.GetRequiredService(); - var mainLangFolder = new DirectoryInfo(hostEnvironment.MapPathContentRoot(WebPath.Combine(Constants.SystemDirectories.Umbraco, "config", "lang"))); - - return new LocalizedTextServiceFileSources( - container.GetRequiredService>(), - container.GetRequiredService(), - mainLangFolder, - container.GetServices()); - } private static PackagesRepository CreatePackageRepository(IServiceProvider factory, string packageRepoFileName) => new PackagesRepository( @@ -109,5 +101,18 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection factory.GetRequiredService(), factory.GetRequiredService()); + private static LocalizedTextServiceFileSources CreateLocalizedTextServiceFileSourcesFactory(IServiceProvider container) + { + var hostingEnvironment = container.GetRequiredService(); + var subPath = WebPath.Combine(Constants.SystemDirectories.Umbraco, "config", "lang"); + var mainLangFolder = new DirectoryInfo(hostingEnvironment.MapPathContentRoot(subPath)); + + return new LocalizedTextServiceFileSources( + container.GetRequiredService>(), + container.GetRequiredService(), + mainLangFolder, + container.GetServices(), + new EmbeddedFileProvider(typeof(IAssemblyProvider).Assembly, "Umbraco.Cms.Core.EmbeddedResources.Lang").GetDirectoryContents(string.Empty)); + } } } diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index a96fce0bd8..adde7948ef 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -116,5 +116,4 @@ - diff --git a/src/Umbraco.Web.BackOffice/Extensions/UmbracoApplicationBuilder.BackOffice.cs b/src/Umbraco.Web.BackOffice/Extensions/UmbracoApplicationBuilder.BackOffice.cs index 83c1b4b5f2..cd041521b0 100644 --- a/src/Umbraco.Web.BackOffice/Extensions/UmbracoApplicationBuilder.BackOffice.cs +++ b/src/Umbraco.Web.BackOffice/Extensions/UmbracoApplicationBuilder.BackOffice.cs @@ -7,8 +7,7 @@ using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Web.BackOffice.Middleware; using Umbraco.Cms.Web.BackOffice.Routing; using Umbraco.Cms.Web.Common.ApplicationBuilder; -using Umbraco.Cms.Web.Common.Extensions; -using Umbraco.Cms.Web.Common.Middleware; + namespace Umbraco.Extensions { diff --git a/src/Umbraco.Web.BackOffice/Services/IconService.cs b/src/Umbraco.Web.BackOffice/Services/IconService.cs index e4ad1fe053..53c50e1e40 100644 --- a/src/Umbraco.Web.BackOffice/Services/IconService.cs +++ b/src/Umbraco.Web.BackOffice/Services/IconService.cs @@ -2,14 +2,18 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Configuration.Models; -using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Web.Common.DependencyInjection; using Umbraco.Extensions; +using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment; namespace Umbraco.Cms.Web.BackOffice.Services { @@ -17,15 +21,32 @@ namespace Umbraco.Cms.Web.BackOffice.Services { private GlobalSettings _globalSettings; private readonly IHostingEnvironment _hostingEnvironment; + private readonly IWebHostEnvironment _webHostEnvironment; private readonly IAppPolicyCache _cache; + [Obsolete("Use other ctor - Will be removed in Umbraco 12")] public IconService( IOptionsMonitor globalSettings, IHostingEnvironment hostingEnvironment, AppCaches appCaches) + : this(globalSettings, + hostingEnvironment, + appCaches, + StaticServiceProvider.Instance.GetRequiredService()) + { + + } + + [Obsolete("Use other ctor - Will be removed in Umbraco 12")] + public IconService( + IOptionsMonitor globalSettings, + IHostingEnvironment hostingEnvironment, + AppCaches appCaches, + IWebHostEnvironment webHostEnvironment) { _globalSettings = globalSettings.CurrentValue; _hostingEnvironment = hostingEnvironment; + _webHostEnvironment = webHostEnvironment; _cache = appCaches.RuntimeCache; globalSettings.OnChange(x => _globalSettings = x); @@ -125,9 +146,11 @@ namespace Umbraco.Cms.Web.BackOffice.Services } } - // add icons from IconsPath if not already added from plugins - var coreIconsDirectory = new DirectoryInfo(_hostingEnvironment.MapPathWebRoot($"{_globalSettings.IconsPath}/")); - var coreIcons = coreIconsDirectory.GetFiles("*.svg"); + var iconFolder = _webHostEnvironment.WebRootFileProvider.GetDirectoryContents(_globalSettings.IconsPath); + + var coreIcons = iconFolder + .Where(x => !x.IsDirectory && x.Name.EndsWith(".svg")) + .Select(x => new FileInfo(x.PhysicalPath)); icons.UnionWith(coreIcons); diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs index 6ebb825eae..644938082f 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -9,7 +9,6 @@ using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Extensions; using Umbraco.Cms.Core.Models.PublishedContent; -using Umbraco.Cms.Web.Common.Extensions; using Umbraco.Extensions; using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment; diff --git a/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs b/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs index d6e439f328..cb403e5e7e 100644 --- a/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs @@ -2,7 +2,7 @@ using System; using Microsoft.AspNetCore.DataProtection.Infrastructure; using Umbraco.Extensions; -namespace Umbraco.Cms.Web.Common.Extensions +namespace Umbraco.Extensions { /// /// Contains extension methods for the interface. diff --git a/src/Umbraco.Web.Common/Extensions/UmbracoApplicationBuilder.RuntimeMinification.cs b/src/Umbraco.Web.Common/Extensions/UmbracoApplicationBuilder.RuntimeMinification.cs index 74b67c36a6..4a7b0cf6de 100644 --- a/src/Umbraco.Web.Common/Extensions/UmbracoApplicationBuilder.RuntimeMinification.cs +++ b/src/Umbraco.Web.Common/Extensions/UmbracoApplicationBuilder.RuntimeMinification.cs @@ -4,7 +4,7 @@ using Smidge.Nuglify; using Umbraco.Cms.Web.Common.ApplicationBuilder; using Umbraco.Extensions; -namespace Umbraco.Cms.Web.Common.Extensions +namespace Umbraco.Extensions { public static partial class UmbracoApplicationBuilderExtensions { diff --git a/src/Umbraco.Web.Common/Extensions/WebHostEnvironmentExtensions.cs b/src/Umbraco.Web.Common/Extensions/WebHostEnvironmentExtensions.cs index 78587db1fe..fce5cf92ed 100644 --- a/src/Umbraco.Web.Common/Extensions/WebHostEnvironmentExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/WebHostEnvironmentExtensions.cs @@ -1,8 +1,9 @@ using System; using System.IO; using Microsoft.AspNetCore.Hosting; +using Umbraco.Cms.Core; -namespace Umbraco.Cms.Web.Common.Extensions +namespace Umbraco.Extensions { /// /// Contains extension methods for the interface. @@ -20,6 +21,12 @@ namespace Umbraco.Cms.Web.Common.Extensions { var root = webHostEnvironment.WebRootPath; + //Create if missing + if (string.IsNullOrWhiteSpace(root)) + { + root = webHostEnvironment.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"); + } + var newPath = path.Replace('/', Path.DirectorySeparatorChar).Replace('\\', Path.DirectorySeparatorChar); // TODO: This is a temporary error because we switched from IOHelper.MapPath to HostingEnvironment.MapPathXXX @@ -32,7 +39,7 @@ namespace Umbraco.Cms.Web.Common.Extensions throw new ArgumentException("The path appears to already be fully qualified. Please remove the call to MapPathWebRoot"); } - return Path.Combine(root, newPath.TrimStart(Core.Constants.CharArrays.TildeForwardSlashBackSlash)); + return Path.Combine(root, newPath.TrimStart(Constants.CharArrays.TildeForwardSlashBackSlash)); } } } diff --git a/src/Umbraco.Web.Common/Logging/Enrichers/ApplicationIdEnricher.cs b/src/Umbraco.Web.Common/Logging/Enrichers/ApplicationIdEnricher.cs index b314745fae..9086cd04ec 100644 --- a/src/Umbraco.Web.Common/Logging/Enrichers/ApplicationIdEnricher.cs +++ b/src/Umbraco.Web.Common/Logging/Enrichers/ApplicationIdEnricher.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.DataProtection.Infrastructure; using Serilog.Core; using Serilog.Events; -using Umbraco.Cms.Web.Common.Extensions; +using Umbraco.Extensions; namespace Umbraco.Cms.Web.Common.Logging.Enrichers; diff --git a/src/Umbraco.Web.UI.Client/gulp/config.js b/src/Umbraco.Web.UI.Client/gulp/config.js index 3ff4cf366b..d32d806dae 100755 --- a/src/Umbraco.Web.UI.Client/gulp/config.js +++ b/src/Umbraco.Web.UI.Client/gulp/config.js @@ -81,7 +81,7 @@ module.exports = { assets: "./src/assets/**" } }, - roots: ["../Umbraco.Web.UI/wwwroot/"], + roots: ["../Umbraco.Cms.StaticAssets/wwwroot/"], targets: { js: "umbraco/js/", lib: "umbraco/lib/", diff --git a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js index c58502dc1b..6619754315 100644 --- a/src/Umbraco.Web.UI.Client/test/config/karma.conf.js +++ b/src/Umbraco.Web.UI.Client/test/config/karma.conf.js @@ -34,12 +34,12 @@ module.exports = function (config) { 'test/config/app.unit.js', //application files - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.controllers.min.js', - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.directives.min.js', - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.filters.min.js', - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.services.min.js', - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.interceptors.min.js', - '../Umbraco.Web.UI/wwwroot/umbraco/js/*.resources.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.controllers.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.directives.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.filters.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.services.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.interceptors.min.js', + '../Umbraco.Cms.StaticAssets/wwwroot/umbraco/js/*.resources.min.js', //mocked data and routing 'src/common/mocks/umbraco.servervariables.js', diff --git a/src/Umbraco.Web.UI/Program.cs b/src/Umbraco.Web.UI/Program.cs index ee0a4774be..44c045800d 100644 --- a/src/Umbraco.Web.UI/Program.cs +++ b/src/Umbraco.Web.UI/Program.cs @@ -14,6 +14,10 @@ namespace Umbraco.Cms.Web.UI public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureUmbracoDefaults() - .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup()); + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStaticWebAssets(); + webBuilder.UseStartup(); + }); } } diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e4a681ccea..622c0f7dd7 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -4,12 +4,7 @@ net6.0 Umbraco.Cms.Web.UI - - - - $(DefaultItemExcludes);wwwroot/umbraco/** - - + bin/Release/Umbraco.Web.UI.xml @@ -23,6 +18,7 @@ + @@ -50,7 +46,6 @@ all - <_ContentIncludedByDefault Remove="wwwroot\umbraco\views\common\infiniteeditors\twofactor\enabletwofactor.html" /> @@ -60,22 +55,13 @@ - $(ProjectDir)wwwroot/umbraco $(ProjectDir)umbraco/config/appsettings-schema.json - - - - - - - - @@ -83,10 +69,7 @@ - - - - + @@ -101,19 +84,5 @@ - - - - - - - - - - - - - - - + diff --git a/templates/UmbracoProject/UmbracoProject.csproj b/templates/UmbracoProject/UmbracoProject.csproj index 14d49df963..182c1241ed 100644 --- a/templates/UmbracoProject/UmbracoProject.csproj +++ b/templates/UmbracoProject/UmbracoProject.csproj @@ -25,6 +25,10 @@ true + + + + false diff --git a/tests/Umbraco.Tests.Integration/DependencyInjection/UmbracoBuilderExtensions.cs b/tests/Umbraco.Tests.Integration/DependencyInjection/UmbracoBuilderExtensions.cs index b5c917a337..6798883c44 100644 --- a/tests/Umbraco.Tests.Integration/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/tests/Umbraco.Tests.Integration/DependencyInjection/UmbracoBuilderExtensions.cs @@ -8,11 +8,13 @@ using System.Linq; using Examine; using Examine.Lucene.Directories; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Logging; @@ -90,7 +92,9 @@ namespace Umbraco.Cms.Tests.Integration.DependencyInjection return new LocalizedTextServiceFileSources( loggerFactory.CreateLogger(), appCaches, - mainLangFolder); + mainLangFolder, + Array.Empty(), + new EmbeddedFileProvider(typeof(IAssemblyProvider).Assembly, "Umbraco.Cms.Core.EmbeddedResources.Lang").GetDirectoryContents(string.Empty)); }), loggerFactory.CreateLogger()); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj index ec5380f9f3..3bf6907aa8 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj +++ b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj @@ -88,7 +88,6 @@ - diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Configurations/LanguageXmlTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Configurations/LanguageXmlTests.cs deleted file mode 100644 index 623d207687..0000000000 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Configurations/LanguageXmlTests.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Xml; -using NUnit.Framework; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Configurations -{ - [TestFixture] - public class LanguageXmlTests - { - [Test] - [Platform("Win")] //TODO figure out why Path.GetFullPath("/mnt/c/...") is not considered an absolute path on linux + mac - public void Can_Load_Language_Xml_Files() - { - var languageDirectoryPath = GetLanguageDirectory(); - var readFilesCount = 0; - var xmlDocument = new XmlDocument(); - - var directoryInfo = new DirectoryInfo(languageDirectoryPath); - - foreach (var languageFile in directoryInfo.GetFiles("*.xml", SearchOption.TopDirectoryOnly)) - { - // Load will throw an exception if the XML isn't valid. - xmlDocument.Load(languageFile.FullName); - readFilesCount++; - } - - // Ensure that at least one file was read. - Assert.AreNotEqual(0, readFilesCount); - } - - private static string GetLanguageDirectory() - { - var testDirectoryPathParts = Path.GetDirectoryName(TestContext.CurrentContext.TestDirectory) - .Split(new[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries); - - var solutionDirectoryPathParts = testDirectoryPathParts - .Take(Array.IndexOf(testDirectoryPathParts, "tests")); - var languageFolderPathParts = new List(solutionDirectoryPathParts); - var additionalPathParts = new[] { "Umbraco.Web.UI", "umbraco", "config", "lang" }; - languageFolderPathParts.AddRange(additionalPathParts); - - // Hack for build-server - when this path is generated in that envrionment it's missing the "src" folder. - // Not sure why, but if it's missing we'll add it in the right place. - if (!languageFolderPathParts.Contains("src")) - { - languageFolderPathParts.Insert(languageFolderPathParts.Count - additionalPathParts.Length, "src"); - } - - return string.Join(Path.DirectorySeparatorChar.ToString(), languageFolderPathParts); - } - } -} diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/FileNameTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/FileNameTests.cs index 2bf1dcb5c7..d9237d903e 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/FileNameTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/FileNameTests.cs @@ -33,7 +33,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common private IEnumerable GetUiFiles(IEnumerable pathFromNetCore) { var root = TestContext.CurrentContext.TestDirectory.Split("tests")[0]; - var pathToFiles = Path.Combine(root, "src", "Umbraco.Web.UI"); + var pathToFiles = Path.Combine(root, "src", "Umbraco.Cms.StaticAssets"); foreach (var pathSection in pathFromNetCore) { pathToFiles = Path.Combine(pathToFiles, pathSection); @@ -94,18 +94,6 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common Assert.True(views.Contains(fileName), $"Expected {fileName} to exist, but it didn't"); } - - [Test] - public void LanguageFilesAreLowercase() - { - IEnumerable files = GetUiFiles(new[] { "umbraco", "config", "lang" }); - foreach (var fileName in files) - { - Assert.AreEqual( - fileName.ToLower(), - fileName, - $"Language files must be all lowercase but {fileName} is not lowercase."); - } - } + } } diff --git a/umbraco.sln b/umbraco.sln index 4ad2828396..ab90d22d0d 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -29,7 +29,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuSpecs", "NuSpecs", "{227C3B55-80E5-4E7E-A802-BE16C5128B9D}" ProjectSection(SolutionItems) = preProject build\NuSpecs\UmbracoCms.nuspec = build\NuSpecs\UmbracoCms.nuspec - build\NuSpecs\UmbracoCms.StaticAssets.nuspec = build\NuSpecs\UmbracoCms.StaticAssets.nuspec EndProjectSection EndProject Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Umbraco.Web.UI.Client", "http://localhost:3961", "{3819A550-DCEC-4153-91B4-8BA9F7F0B9B4}" @@ -78,12 +77,6 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Umbraco.Tests.AcceptanceTes StartServerOnDebug = "false" EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "buildTransitive", "buildTransitive", "{5B03EF4E-E0AC-4905-861B-8C3EC1A0D458}" - ProjectSection(SolutionItems) = preProject - build\NuSpecs\buildTransitive\Umbraco.Cms.StaticAssets.props = build\NuSpecs\buildTransitive\Umbraco.Cms.StaticAssets.props - build\NuSpecs\buildTransitive\Umbraco.Cms.StaticAssets.targets = build\NuSpecs\buildTransitive\Umbraco.Cms.StaticAssets.targets - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DocTools", "DocTools", "{53594E5B-64A2-4545-8367-E3627D266AE8}" ProjectSection(SolutionItems) = preProject src\ApiDocs\docfx.filter.yml = src\ApiDocs\docfx.filter.yml @@ -131,6 +124,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Persistence.Sql EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Persistence.SqlServer", "src\Umbraco.Cms.Persistence.SqlServer\Umbraco.Cms.Persistence.SqlServer.csproj", "{93C5910D-2E36-475D-88EB-A11BA5B50F65}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Cms.StaticAssets", "src\Umbraco.Cms.StaticAssets\Umbraco.Cms.StaticAssets.csproj", "{D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -235,6 +230,12 @@ Global {93C5910D-2E36-475D-88EB-A11BA5B50F65}.Release|Any CPU.Build.0 = Release|Any CPU {93C5910D-2E36-475D-88EB-A11BA5B50F65}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU {93C5910D-2E36-475D-88EB-A11BA5B50F65}.SkipTests|Any CPU.Build.0 = Debug|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.Release|Any CPU.Build.0 = Release|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU + {D2FD54E8-3470-4A98-8B0C-A9ACB59BED48}.SkipTests|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -242,7 +243,6 @@ Global GlobalSection(NestedProjects) = preSolution {227C3B55-80E5-4E7E-A802-BE16C5128B9D} = {2849E9D4-3B4E-40A3-A309-F3CB4F0E125F} {9E4C8A12-FBE0-4673-8CE2-DF99D5D57817} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} - {5B03EF4E-E0AC-4905-861B-8C3EC1A0D458} = {227C3B55-80E5-4E7E-A802-BE16C5128B9D} {53594E5B-64A2-4545-8367-E3627D266AE8} = {FD962632-184C-4005-A5F3-E705D92FC645} {3A33ADC9-C6C0-4DB1-A613-A9AF0210DF3D} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} {C7311C00-2184-409B-B506-52A5FAEA8736} = {FD962632-184C-4005-A5F3-E705D92FC645}