From 3873a0735cde27bfd9692f4c7370613730ef4fd0 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Tue, 27 Sep 2022 14:22:34 +0200 Subject: [PATCH] v11: Decouple dependencies (#12907) * Move core dependencies and MSBuild targets from Umbraco.Cms to Umbraco.Cms.Targets * Re-add appsettings.Tests.json * Include appsettings-schema.json * Use .NET 7.x in CodeQL build * Fix duplicate Directory.Build.props import * Decouple ImageSharp/ImageSharp.Web implementations * Further decouple SqlServer implementation * Add SupportedImageFileTypes to IImageDimensionExtractor * Update descriptions * Update project metadata * Re-enable package validation * Add embedded package icon * Move ContinuousIntegrationBuild to build script * Move shared properties to root Directory.Build.props * Fix GetInstallState throwing exception when default provider isn't configured * Remove redundant PackageRequireLicenseAcceptance and update version to 11.0.0-rc1 * Update build script * Remove LangVersion preview * Disable app-local ICU for MacOS integration test * Disable app-local ICU for all integration tests * Fix RuntimeState_Run test assertion * Update projects and build script to require Node.js 16.17 (latest LTS) * Remove app-local ICU from unit tests * Add missing project reference * Generate XML documentation files * Expose management API in Web.UI project * Update .NET 7 dependencies to RC1 * Update package-lock.json files * Downgrade Cypress version --- .github/New BackOffice - README.md | 8 +- .gitignore | 3 +- Directory.Build.props | 50 ++++- build/azure-pipelines.yml | 72 +++--- icon.png | Bin 0 -> 2013 bytes opened-issue-first-comment.yml | 53 ----- src/Directory.Build.props | 54 ----- src/JsonSchema/JsonSchema.csproj | 28 +-- src/JsonSchema/Options.cs | 2 +- .../ConfigureImageSharpMiddlewareOptions.cs | 2 +- ...ConfigurePhysicalFileSystemCacheOptions.cs | 2 +- .../ImageProcessors/CropWebProcessor.cs | 15 +- .../ImageSharpComposer.cs | 16 ++ .../Media/ImageSharpDimensionExtractor.cs | 23 +- .../Media/ImageSharpImageUrlGenerator.cs | 15 +- .../Umbraco.Cms.Imaging.ImageSharp.csproj | 24 ++ .../UmbracoBuilderExtensions.cs | 54 +++++ .../Umbraco.Cms.ManagementApi.csproj | 55 ++--- .../CompatibilitySuppressions.xml | 7 + .../FaultHandling/RetryPolicyFactory.cs | 7 +- ...tworkConnectivityErrorDetectionStrategy.cs | 3 +- ...SqlAzureTransientErrorDetectionStrategy.cs | 5 +- .../Strategies}/ThrottlingCondition.cs | 4 +- .../SqlServerAddRetryPolicyInterceptor.cs | 9 +- .../LocalDb.cs | 12 +- .../NPocoSqlServerDatabaseExtensions.cs | 29 +++ .../SqlServerBulkSqlInsertProvider.cs | 6 +- .../Umbraco.Cms.Persistence.SqlServer.csproj | 11 +- .../UmbracoBuilderExtensions.cs | 2 + .../CompatibilitySuppressions.xml | 7 + .../SqliteDistributedLockingMechanism.cs | 3 +- .../Umbraco.Cms.Persistence.Sqlite.csproj | 15 +- .../CompatibilitySuppressions.xml | 7 + .../Umbraco.Cms.StaticAssets.csproj | 61 ++--- .../Umbraco.Cms.Targets.csproj | 32 +++ .../Umbraco.Cms.Targets.props} | 8 +- .../Umbraco.Cms.Targets.targets} | 23 +- src/Umbraco.Cms/Umbraco.Cms.csproj | 44 +--- .../Media/IImageDimensionExtractor.cs | 20 +- .../ImageDimensionExtractorExtensions.cs | 23 ++ .../Media/ImageUrlGeneratorExtensions.cs | 18 +- .../Media/NoopImageDimensionExtractor.cs | 10 + .../Media/NoopImageUrlGenerator.cs | 10 + .../Media/UploadAutoFillProperties.cs | 137 ++++-------- src/Umbraco.Core/Umbraco.Core.csproj | 46 ++-- .../CompatibilitySuppressions.xml | 10 - .../Umbraco.Examine.Lucene.csproj | 29 +-- .../UmbracoBuilder.CoreServices.cs | 8 +- .../Install/InstallSteps/NewInstallStep.cs | 33 ++- .../NPocoDatabaseExtensions-Bulk.cs | 22 -- .../Persistence/NPocoDatabaseExtensions.cs | 3 +- .../NPocoDatabaseTypeExtensions.cs | 8 +- .../Implement/TwoFactorLoginRepository.cs | 29 +-- .../Persistence/UmbracoDatabase.cs | 1 - .../Umbraco.Infrastructure.csproj | 194 +++++++--------- .../WebAssets/Resources.Designer.cs | 69 +++--- .../Umbraco.New.Cms.Core.csproj | 24 +- .../Umbraco.New.Cms.Infrastructure.csproj | 26 +-- .../Umbraco.New.Cms.Web.Common.csproj | 25 +-- .../Umbraco.PublishedCache.NuCache.csproj | 19 +- .../Umbraco.Web.BackOffice.csproj | 85 +++---- .../UmbracoApplicationBuilder.cs | 4 - .../UmbracoBuilder.ImageSharp.cs | 43 ---- .../UmbracoBuilderExtensions.cs | 1 - .../Umbraco.Web.Common.csproj | 46 ++-- src/Umbraco.Web.UI.Client/package-lock.json | 4 +- src/Umbraco.Web.UI.Client/package.json | 4 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 58 +---- .../Umbraco.Web.Website.csproj | 66 ++---- templates/Umbraco.Templates.csproj | 8 +- templates/icon.png | Bin 22265 -> 0 bytes tests/Directory.Build.props | 4 + .../Umbraco.TestData/Umbraco.TestData.csproj | 7 +- .../package-lock.json | 210 ++++++++++++------ .../Umbraco.Tests.AcceptanceTest/package.json | 8 +- .../Umbraco.Tests.Benchmarks.csproj | 27 +-- .../Umbraco.Tests.Common.csproj | 16 +- .../UmbracoTestServerTestBase.cs | 5 - .../Testing/LocalDbTestDatabase.cs | 1 + .../Testing/SqlServerTestDatabase.cs | 1 + .../Testing/TestDatabaseFactory.cs | 2 +- .../UmbracoExamine/IndexInitializer.cs | 5 +- .../PublishedContentQueryTests.cs | 5 +- .../Umbraco.Tests.Integration.csproj | 128 +++-------- .../Umbraco.Tests.UnitTests.csproj | 43 +--- .../ImageProcessors/CropWebProcessorTests.cs | 2 +- .../Media/ImageSharpImageUrlGeneratorTests.cs | 2 +- .../Routing/InstallAreaRoutesTests.cs | 4 +- umbraco.sln | 80 +++++-- version.json | 7 +- 90 files changed, 1061 insertions(+), 1350 deletions(-) create mode 100644 icon.png delete mode 100644 opened-issue-first-comment.yml delete mode 100644 src/Directory.Build.props rename src/{Umbraco.Web.Common/DependencyInjection => Umbraco.Cms.Imaging.ImageSharp}/ConfigureImageSharpMiddlewareOptions.cs (98%) rename src/{Umbraco.Web.Common/DependencyInjection => Umbraco.Cms.Imaging.ImageSharp}/ConfigurePhysicalFileSystemCacheOptions.cs (96%) rename src/{Umbraco.Web.Common => Umbraco.Cms.Imaging.ImageSharp}/ImageProcessors/CropWebProcessor.cs (84%) create mode 100644 src/Umbraco.Cms.Imaging.ImageSharp/ImageSharpComposer.cs rename src/{Umbraco.Infrastructure => Umbraco.Cms.Imaging.ImageSharp}/Media/ImageSharpDimensionExtractor.cs (74%) rename src/{Umbraco.Web.Common => Umbraco.Cms.Imaging.ImageSharp}/Media/ImageSharpImageUrlGenerator.cs (95%) create mode 100644 src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj create mode 100644 src/Umbraco.Cms.Imaging.ImageSharp/UmbracoBuilderExtensions.cs create mode 100644 src/Umbraco.Cms.Persistence.SqlServer/CompatibilitySuppressions.xml rename src/{Umbraco.Infrastructure/Persistence => Umbraco.Cms.Persistence.SqlServer}/FaultHandling/RetryPolicyFactory.cs (91%) rename src/{Umbraco.Infrastructure/Persistence => Umbraco.Cms.Persistence.SqlServer}/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs (87%) rename src/{Umbraco.Infrastructure/Persistence => Umbraco.Cms.Persistence.SqlServer}/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs (97%) rename src/{Umbraco.Infrastructure/Persistence/FaultHandling => Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies}/ThrottlingCondition.cs (98%) rename src/{Umbraco.Infrastructure/Persistence => Umbraco.Cms.Persistence.SqlServer}/LocalDb.cs (99%) create mode 100644 src/Umbraco.Cms.Persistence.SqlServer/NPocoSqlServerDatabaseExtensions.cs create mode 100644 src/Umbraco.Cms.Persistence.Sqlite/CompatibilitySuppressions.xml create mode 100644 src/Umbraco.Cms.StaticAssets/CompatibilitySuppressions.xml create mode 100644 src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj rename src/{Umbraco.Cms/buildTransitive/Umbraco.Cms.props => Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props} (56%) rename src/{Umbraco.Cms/buildTransitive/Umbraco.Cms.targets => Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets} (62%) create mode 100644 src/Umbraco.Core/Media/ImageDimensionExtractorExtensions.cs create mode 100644 src/Umbraco.Core/Media/NoopImageDimensionExtractor.cs create mode 100644 src/Umbraco.Core/Media/NoopImageUrlGenerator.cs delete mode 100644 src/Umbraco.Examine.Lucene/CompatibilitySuppressions.xml delete mode 100644 src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs delete mode 100644 templates/icon.png diff --git a/.github/New BackOffice - README.md b/.github/New BackOffice - README.md index 3d04ef2e36..c67ebdea93 100644 --- a/.github/New BackOffice - README.md +++ b/.github/New BackOffice - README.md @@ -1,13 +1,13 @@ -# New Backoffice +# New backoffice > **Warning**: -> This is an early WIP, and is set not to be packable since we don't want to release this yet. There will be breaking changes in these projects +> This is an early WIP and is set not to be packable since we don't want to release this yet. There will be breaking changes in these projects. -This solution folder contains the projects for the new BackOffice. If you're looking to fix or improve the existing CMS, this is not the place to do it, although we do very much appreciate your efforts. +This solution folder contains the projects for the new backoffice. If you're looking to fix or improve the existing CMS, this is not the place to do it, although we do very much appreciate your efforts. ### Project structure -Since the new backoffice API is still very much a work in progress we've created new projects for the new backoffice API: +Since the new backoffice API is still very much a work in progress, we've created new projects for the new backoffice API: * Umbrao.Cms.ManagementApi - The "presentation layer" for the management API * "New" versions of existing projects, should be merged with the existing projects when the new API is released: diff --git a/.gitignore b/.gitignore index 26f96f89b7..8f50db79d0 100644 --- a/.gitignore +++ b/.gitignore @@ -104,5 +104,6 @@ cypress.env.json /tests/Umbraco.Tests.UnitTests/[Uu]mbraco/[Dd]ata/TEMP/ # Ignore auto-generated schema +/src/Umbraco.Cms.Targets/appsettings-schema.json /src/Umbraco.Web.UI/appsettings-schema.json -/src/Umbraco.Cms/appsettings-schema.json +/tests/Umbraco.Tests.Integration/appsettings-schema.json diff --git a/Directory.Build.props b/Directory.Build.props index 9c1e87df49..90bc46c6eb 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,18 +1,48 @@ - + + Umbraco HQ + Umbraco + Copyright © Umbraco $([System.DateTime]::Today.ToString('yyyy')) + Umbraco CMS + https://umbraco.com/ + https://umbraco.com/dist/nuget/logo-small.png + icon.png + MIT + umbraco + en-US + enable + nullable + enable + true + + + + + true + true + true + snupkg + + + + + true + + 10.1.0 + true + true + + - + + + + + - - all - 3.5.113 - - - - all - + diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 606e0b6a67..3f0ed57cb1 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -23,12 +23,15 @@ parameters: default: false variables: + nodeVersion: 16.17.0 + dotnetVersion: 7.x + solution: umbraco.sln buildConfiguration: Release - SA_PASSWORD: UmbracoIntegration123! - UMBRACO__CMS_GLOBAL__ID: 00000000-0000-0000-0000-000000000042 - nodeVersion: 14.18.1 - DOTNET_NOLOGO: 1 - DOTNET_CLI_TELEMETRY_OPTOUT: 1 + UMBRACO__CMS__GLOBAL__ID: 00000000-0000-0000-0000-000000000042 + DOTNET_NOLOGO: true + DOTNET_GENERATE_ASPNET_CERTIFICATE: false + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true stages: ############################################### @@ -44,7 +47,7 @@ stages: vmImage: 'ubuntu-latest' steps: - task: NodeTool@0 - displayName: Use node $(nodeVersion) + displayName: Use Node.js $(nodeVersion) inputs: versionSpec: $(nodeVersion) - task: Cache@2 @@ -65,16 +68,22 @@ stages: targets: coreBuild workingDirectory: src/Umbraco.Web.UI.Client - task: UseDotNet@2 - displayName: Use .NET 7.x + displayName: Use .NET $(dotnetVersion) inputs: - version: 7.x + version: $(dotnetVersion) + performMultiLevelLookup: true includePreviewVersions: true + - task: DotNetCoreCLI@2 + displayName: Run dotnet restore + inputs: + command: restore + projects: $(solution) - task: DotNetCoreCLI@2 displayName: Run dotnet build inputs: command: build - projects: umbraco.sln - arguments: '--configuration $(buildConfiguration)' + projects: $(solution) + arguments: '--configuration $(buildConfiguration) --no-restore -p:ContinuousIntegrationBuild=true' - script: | version="$(Build.BuildNumber)" echo "varsion: $version" @@ -101,7 +110,7 @@ stages: } } - dotnet pack --configuration $(buildConfiguration) umbraco.sln -o $(Build.ArtifactStagingDirectory)/nupkg + dotnet pack $(solution) --configuration $(buildConfiguration) --no-build --output $(Build.ArtifactStagingDirectory)/nupkg - script: | sha="$(Build.SourceVersion)" sha=${sha:0:7} @@ -178,9 +187,9 @@ stages: vmImage: 'ubuntu-latest' steps: - task: NodeTool@0 - displayName: Use Node 10.15.0 + displayName: Use Node.js 10.15.0 inputs: - versionSpec: 10.15.0 # Won't work with 14.18.1 + versionSpec: 10.15.0 # Won't work with higher versions - script: | npm ci --no-fund --no-audit --prefer-offline npx gulp docs @@ -233,16 +242,17 @@ stages: artifact: build_output path: $(Build.SourcesDirectory) - task: UseDotNet@2 - displayName: Use net7 + displayName: Use .NET $(dotnetVersion) inputs: - version: 7.x + version: $(dotnetVersion) + performMultiLevelLookup: true includePreviewVersions: true - task: DotNetCoreCLI@2 displayName: Run dotnet test inputs: command: test projects: '**/*.Tests.UnitTests.csproj' - arguments: '--no-build --configuration $(buildConfiguration)' + arguments: '--configuration $(buildConfiguration) --no-build' testRunTitle: Unit Tests - $(Agent.OS) - stage: Integration @@ -269,16 +279,17 @@ stages: artifact: build_output path: $(Build.SourcesDirectory) - task: UseDotNet@2 - displayName: Use net7 + displayName: Use .NET $(dotnetVersion) inputs: - version: 7.x + version: $(dotnetVersion) + performMultiLevelLookup: true includePreviewVersions: true - task: DotNetCoreCLI@2 displayName: Run dotnet test inputs: command: test projects: '**/*.Tests.Integration.csproj' - arguments: '--no-build --configuration $(buildConfiguration)' + arguments: '--configuration $(buildConfiguration) --no-build' testRunTitle: Integration Tests SQLite - $(Agent.OS) env: Tests__Database__DatabaseType: 'Sqlite' @@ -301,6 +312,8 @@ stages: connectionString: 'Server=localhost,1433;User Id=sa;Password=$(SA_PASSWORD);' pool: vmImage: $(vmImage) + variables: + SA_PASSWORD: UmbracoIntegration123! steps: - task: DownloadPipelineArtifact@2 displayName: Download build artifacts @@ -318,7 +331,7 @@ stages: inputs: command: test projects: '**/*.Tests.Integration.csproj' - arguments: '--no-build --configuration $(buildConfiguration)' + arguments: '--configuration $(buildConfiguration) --no-build' testRunTitle: Integration Tests SQL Server - $(Agent.OS) env: Tests__Database__DatabaseType: $(testDb) @@ -371,7 +384,7 @@ stages: artifact: nupkg path: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/misc/nupkg - task: NodeTool@0 - displayName: Use Node $(nodeVersion) + displayName: Use Node.js $(nodeVersion) inputs: versionSpec: $(nodeVersion) - task: Cache@2 @@ -403,9 +416,10 @@ stages: displayName: Create database (Windows only) condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT')) - task: UseDotNet@2 - displayName: Use .Net 7.x + displayName: Use .NET $(dotnetVersion) inputs: - version: 7.x + version: $(dotnetVersion) + performMultiLevelLookup: true includePreviewVersions: true # Linux containers smooth - task: PowerShell@2 @@ -419,7 +433,7 @@ stages: docker build -t $(dockerImageName):$sha -f $(dockerfile) . mkdir -p $(Build.ArtifactStagingDirectory)/docker-images docker save -o $(Build.ArtifactStagingDirectory)/docker-images/$(dockerImageName).$sha.tar $(dockerImageName):$sha - docker run --name $(dockerImageName) -dp 8080:5000 -e UMBRACO__CMS_GLOBAL__ID=$(UMBRACO__CMS_GLOBAL__ID) $(dockerImageName):$sha + docker run --name $(dockerImageName) -dp 8080:5000 -e UMBRACO__CMS__GLOBAL__ID=$(UMBRACO__CMS__GLOBAL__ID) $(dockerImageName):$sha docker ps # Windows containers take forever. # --no-launch-profile stops ASPNETCORE_ENVIRONMENT=Development which breaks the users.ts tests (smtp config = invite user button) @@ -434,8 +448,8 @@ stages: dotnet new --install ./nupkg/Umbraco.Templates.*.nupkg dotnet new umbraco --name Cypress -o . --no-restore dotnet restore --configfile ./nuget.config - dotnet build --no-restore -c Release - Start-Process -FilePath "dotnet" -ArgumentList "run --no-build -c Release --no-launch-profile --urls $(CYPRESS_BASE_URL)" + dotnet build --configuration $(buildConfiguration) --no-restore + Start-Process -FilePath "dotnet" -ArgumentList "run --configuration $(buildConfiguration) --no-build --no-launch-profile --urls $(CYPRESS_BASE_URL)" - task: PowerShell@2 displayName: Wait for app inputs: @@ -496,12 +510,12 @@ stages: displayName: dotnet restore inputs: command: restore - projects: '**/umbraco.sln' + projects: $(solution) # TODO: Use NuGetCommand instead of DotNetCoreCLI # - task: NuGetCommand@2 # displayName: Restore NuGet Packages # inputs: - # restoreSolution: 'umbraco.sln' + # restoreSolution: $(solution) # feedsToUse: config - stage: Deploy_NuGet displayName: NuGet release @@ -523,7 +537,7 @@ stages: displayName: dotnet restore inputs: command: restore - projects: '**/umbraco.sln' + projects: $(solution) - stage: Upload_API_Docs pool: diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8f01fe7aebb0bc698a7d0076f068e9c6f49bd2aa GIT binary patch literal 2013 zcmXX`3pkWp7yimjMfIqq`egrq^DNF|z! zaT|9Pa%mb7O0It{Q)67lZHD3hKIc5o-fQo**Sp@e-u*rM`-^H%Qc}=X002PA&KBjcs4i=94m#+aV!%8_aK^SiRGYh zY$T2ehLHGIAbul-4W@$_6doi2N3n@X6|~2)EQyui#vBXLLLm&qiNcp4Au#I@rWmvb zNlYjN<(8nZ5CDnH+}N{__!1-A@(s>^7+4mz`7a^pS`tCR4Hy=zwQ-JP znBy2AxdoPa7|*dF6hhK)P?I17*bj=xMEwf}6*0{)U>0e|}cx`TVo5nGN#BAfiND4JgW+&8_r zwA$G{^?@&R@vh5y+Sl`C`ixiIgkaIj|1GP0WJW^K*ColRRWcOgH z<<{g<4tF#(w*AHHfy%o7l~s=>rhRH`ns9Wl@u9tKcsKrvJxB|CpOD&FR5BEm$oo6J zi(Nj#>lCKluly-oN_+JA?)^`;XDU7acw={lyR^J2mCD8^7u>HjdR%RE^{M|OxH%^2 zBk6SI(8yd+L|ZHG2fu6T`}jQOWO)bwC-0Mx-#rC>3vT^)G^JELFAaxd@_G!Wi9vl*O$ye!H>l=7wfuuM1kS0 z--hO1Fa}!M1-?N|ZkHSS2WL|=KW9AY^$%%LI>C(tAIPmBNBdI%OkOg(Rv@=&TC7?q zL#XIv*<4p17^aUdFU1&+Wao*7^j|shw`)&;`B0tUUP*mK{*TXBFk7zlOn!6cRxnZv zbe$9^EqAMq-}GQ!a9!4O`OI{T9~3AzxgzwouU%a|Oe>X$LF9nRgZ~Pm4}bOpb3$FM#h0uuF@RwmF+`8Id9%EU%02 z85Qhiy6hL$-Xa8sI*$0~S?|c#9vd;C#}>rW+-CNnFKn*Q^SrlBqWK#=DW^ld@9(s2 z_YO|nDn6j{+a8z1Qb8d;9SLt}%r^bvnm`_unBAL!`zGF0&#Th*{J!U6?c5H3)eHjojd@=hwf3Ea4&K`Ile?UeV!d@DpF17};GUPlZM z)Jjw=55K7D?T?dI1R12;k45fG%0pyueie9h6&{QKYItWUV;`C7=2y8e|Ir&At0=bi zR!!9>r_9Lv4uy5qBTrLTJ%;^npWppmPpa~JF8ax~yEw0saiKiPBIg88`p~3R&nh6c z9M);9)OSE1_6vQ4Npqil!5gX*Cgz9C%~#bNC|ZJRT+R9OPLKm!d`?9zH#hl6LBjFb zCR`QaCj(c{?d{>%#gsj%f{ knkh%Go{vagN3^x9qk$PUqKHB%1phdI9l;*Yz - - - - - 10.0.0 - 10.0.0 - 10.0.0-rc1 - 10.0.0 - preview - en-US - Umbraco CMS - Copyright © Umbraco 2021 - Umbraco HQ - https://umbraco.com/ - https://umbraco.com/dist/nuget/logo-small.png - https://opensource.org/licenses/MIT - false - umbraco - git - https://github.com/umbraco/umbraco-cms - enable - Nullable - enable - - - - - true - - - true - - - true - snupkg - - - - - - - true - - - - - - - - - - - diff --git a/src/JsonSchema/JsonSchema.csproj b/src/JsonSchema/JsonSchema.csproj index 66e57588b2..0769f11d94 100644 --- a/src/JsonSchema/JsonSchema.csproj +++ b/src/JsonSchema/JsonSchema.csproj @@ -1,33 +1,19 @@ - Exe net7.0 - true + Exe false false - - - - - - - + + + + + + - - - - $(UserProfile)\.nuget\packages\ - - - - - - - - diff --git a/src/JsonSchema/Options.cs b/src/JsonSchema/Options.cs index 4471ee49ce..00cb670953 100644 --- a/src/JsonSchema/Options.cs +++ b/src/JsonSchema/Options.cs @@ -7,7 +7,7 @@ namespace JsonSchema { internal class Options { - [Option('o', "outputFile", Required = false, HelpText = "Set path of the output file.", Default = "../../../../Umbraco.Web.UI/appsettings-schema.json")] + [Option('o', "outputFile", Required = false, HelpText = "Set path of the output file.", Default = "appsettings-schema.json")] public string OutputFile { get; set; } = null!; } } diff --git a/src/Umbraco.Web.Common/DependencyInjection/ConfigureImageSharpMiddlewareOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs similarity index 98% rename from src/Umbraco.Web.Common/DependencyInjection/ConfigureImageSharpMiddlewareOptions.cs rename to src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs index 2b372992cc..8daa1b689b 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/ConfigureImageSharpMiddlewareOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs @@ -8,7 +8,7 @@ using SixLabors.ImageSharp.Web.Middleware; using SixLabors.ImageSharp.Web.Processors; using Umbraco.Cms.Core.Configuration.Models; -namespace Umbraco.Cms.Web.Common.DependencyInjection; +namespace Umbraco.Cms.Imaging.ImageSharp; /// /// Configures the ImageSharp middleware options. diff --git a/src/Umbraco.Web.Common/DependencyInjection/ConfigurePhysicalFileSystemCacheOptions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigurePhysicalFileSystemCacheOptions.cs similarity index 96% rename from src/Umbraco.Web.Common/DependencyInjection/ConfigurePhysicalFileSystemCacheOptions.cs rename to src/Umbraco.Cms.Imaging.ImageSharp/ConfigurePhysicalFileSystemCacheOptions.cs index 4f4b337021..3b2cd7f867 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/ConfigurePhysicalFileSystemCacheOptions.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ConfigurePhysicalFileSystemCacheOptions.cs @@ -4,7 +4,7 @@ using SixLabors.ImageSharp.Web.Caching; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Extensions; -namespace Umbraco.Cms.Web.Common.DependencyInjection; +namespace Umbraco.Cms.Imaging.ImageSharp; /// /// Configures the ImageSharp physical file system cache options. diff --git a/src/Umbraco.Web.Common/ImageProcessors/CropWebProcessor.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ImageProcessors/CropWebProcessor.cs similarity index 84% rename from src/Umbraco.Web.Common/ImageProcessors/CropWebProcessor.cs rename to src/Umbraco.Cms.Imaging.ImageSharp/ImageProcessors/CropWebProcessor.cs index 0d48ac4cc4..eda49fa9d0 100644 --- a/src/Umbraco.Web.Common/ImageProcessors/CropWebProcessor.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ImageProcessors/CropWebProcessor.cs @@ -8,20 +8,21 @@ using SixLabors.ImageSharp.Web; using SixLabors.ImageSharp.Web.Commands; using SixLabors.ImageSharp.Web.Processors; -namespace Umbraco.Cms.Web.Common.ImageProcessors; +namespace Umbraco.Cms.Imaging.ImageSharp.ImageProcessors; /// -/// Allows the cropping of images. +/// Allows the cropping of images. /// +/// public class CropWebProcessor : IImageWebProcessor { /// - /// The command constant for the crop coordinates. + /// The command constant for the crop coordinates. /// public const string Coordinates = "cc"; /// - /// The command constant for the resize orientation handling mode. + /// The command constant for the resize orientation handling mode. /// public const string Orient = "orient"; @@ -59,10 +60,8 @@ public class CropWebProcessor : IImageWebProcessor var right = Math.Clamp(1 - coordinates[2], 0, 1); var bottom = Math.Clamp(1 - coordinates[3], 0, 1); var orientation = GetExifOrientation(image, commands, parser, culture); - Vector2 xy1 = - ExifOrientationUtilities.Transform(new Vector2(left, top), Vector2.Zero, Vector2.One, orientation); - Vector2 xy2 = - ExifOrientationUtilities.Transform(new Vector2(right, bottom), Vector2.Zero, Vector2.One, orientation); + Vector2 xy1 = ExifOrientationUtilities.Transform(new Vector2(left, top), Vector2.Zero, Vector2.One, orientation); + Vector2 xy2 = ExifOrientationUtilities.Transform(new Vector2(right, bottom), Vector2.Zero, Vector2.One, orientation); // Scale points to a pixel based rectangle Size size = image.Image.Size(); diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/ImageSharpComposer.cs b/src/Umbraco.Cms.Imaging.ImageSharp/ImageSharpComposer.cs new file mode 100644 index 0000000000..9a77bc28b2 --- /dev/null +++ b/src/Umbraco.Cms.Imaging.ImageSharp/ImageSharpComposer.cs @@ -0,0 +1,16 @@ +using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Imaging.ImageSharp; + +/// +/// Adds imaging support using ImageSharp/ImageSharp.Web. +/// +/// +public sealed class ImageSharpComposer : IComposer +{ + /// + public void Compose(IUmbracoBuilder builder) + => builder.AddUmbracoImageSharp(); +} diff --git a/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs b/src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpDimensionExtractor.cs similarity index 74% rename from src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs rename to src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpDimensionExtractor.cs index fbc2add152..409b6e2726 100644 --- a/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpDimensionExtractor.cs @@ -3,26 +3,27 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; using Umbraco.Cms.Core.Media; using Size = System.Drawing.Size; -namespace Umbraco.Cms.Infrastructure.Media; +namespace Umbraco.Cms.Imaging.ImageSharp.Media; -internal class ImageSharpDimensionExtractor : IImageDimensionExtractor +public sealed class ImageSharpDimensionExtractor : IImageDimensionExtractor { private readonly Configuration _configuration; + /// + public IEnumerable SupportedImageFileTypes { get; } + /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The configuration. public ImageSharpDimensionExtractor(Configuration configuration) - => _configuration = configuration; + { + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); - /// - /// Gets the dimensions of an image. - /// - /// A stream containing the image bytes. - /// - /// The dimension of the image. - /// + SupportedImageFileTypes = configuration.ImageFormats.SelectMany(f => f.FileExtensions).ToArray(); + } + + /// public Size? GetDimensions(Stream? stream) { Size? size = null; diff --git a/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs b/src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpImageUrlGenerator.cs similarity index 95% rename from src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs rename to src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpImageUrlGenerator.cs index d91b6706c9..b7560853d7 100644 --- a/src/Umbraco.Web.Common/Media/ImageSharpImageUrlGenerator.cs +++ b/src/Umbraco.Cms.Imaging.ImageSharp/Media/ImageSharpImageUrlGenerator.cs @@ -5,25 +5,27 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.Web.Processors; using Umbraco.Cms.Core.Media; using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Web.Common.ImageProcessors; +using Umbraco.Cms.Imaging.ImageSharp.ImageProcessors; using static Umbraco.Cms.Core.Models.ImageUrlGenerationOptions; -namespace Umbraco.Cms.Web.Common.Media; +namespace Umbraco.Cms.Imaging.ImageSharp.Media; /// /// Exposes a method that generates an image URL based on the specified options that can be processed by ImageSharp. /// /// -public class ImageSharpImageUrlGenerator : IImageUrlGenerator +public sealed class ImageSharpImageUrlGenerator : IImageUrlGenerator { + /// + public IEnumerable SupportedImageFileTypes { get; } + /// /// Initializes a new instance of the class. /// /// The ImageSharp configuration. public ImageSharpImageUrlGenerator(Configuration configuration) : this(configuration.ImageFormats.SelectMany(f => f.FileExtensions).ToArray()) - { - } + { } /// /// Initializes a new instance of the class. @@ -35,9 +37,6 @@ public class ImageSharpImageUrlGenerator : IImageUrlGenerator internal ImageSharpImageUrlGenerator(IEnumerable supportedImageFileTypes) => SupportedImageFileTypes = supportedImageFileTypes; - /// - public IEnumerable SupportedImageFileTypes { get; } - /// public string? GetImageUrl(ImageUrlGenerationOptions? options) { diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj b/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj new file mode 100644 index 0000000000..ef6ef5f095 --- /dev/null +++ b/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj @@ -0,0 +1,24 @@ + + + Umbraco CMS - Imaging - ImageSharp + Adds imaging support using ImageSharp/ImageSharp.Web to Umbraco CMS. + net7.0 + + false + + + + + + + + + + + + + + <_Parameter1>Umbraco.Tests.UnitTests + + + diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/UmbracoBuilderExtensions.cs b/src/Umbraco.Cms.Imaging.ImageSharp/UmbracoBuilderExtensions.cs new file mode 100644 index 0000000000..4bd50034ab --- /dev/null +++ b/src/Umbraco.Cms.Imaging.ImageSharp/UmbracoBuilderExtensions.cs @@ -0,0 +1,54 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Web.Caching; +using SixLabors.ImageSharp.Web.DependencyInjection; +using SixLabors.ImageSharp.Web.Middleware; +using SixLabors.ImageSharp.Web.Providers; +using Umbraco.Cms.Core.DependencyInjection; +using Umbraco.Cms.Core.Media; +using Umbraco.Cms.Imaging.ImageSharp.ImageProcessors; +using Umbraco.Cms.Imaging.ImageSharp.Media; +using Umbraco.Cms.Web.Common.ApplicationBuilder; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Imaging.ImageSharp; + +public static class UmbracoBuilderExtensions +{ + /// + /// Adds Image Sharp with Umbraco settings + /// + public static IServiceCollection AddUmbracoImageSharp(this IUmbracoBuilder builder) + { + // Add default ImageSharp configuration and service implementations + builder.Services.AddSingleton(Configuration.Default); + builder.Services.AddUnique(); + + builder.Services.AddSingleton(); + + builder.Services.AddImageSharp() + // Replace default image provider + .ClearProviders() + .AddProvider() + // Add custom processors + .AddProcessor(); + + // Configure middleware + builder.Services.AddTransient, ConfigureImageSharpMiddlewareOptions>(); + + // Configure cache options + builder.Services.AddTransient, ConfigurePhysicalFileSystemCacheOptions>(); + + // Important we handle image manipulations before the static files, otherwise the querystring is just ignored + builder.Services.Configure(options => + { + options.AddFilter(new UmbracoPipelineFilter(nameof(ImageSharpComposer)) + { + PrePipeline = prePipeline => prePipeline.UseImageSharp() + }); + }); + + return builder.Services; + } +} diff --git a/src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj b/src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj index 2f4296cb89..283b447ab0 100644 --- a/src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj +++ b/src/Umbraco.Cms.ManagementApi/Umbraco.Cms.ManagementApi.csproj @@ -1,34 +1,27 @@ + + Umbraco CMS - Management API + Contains the presentation layer for the Umbraco CMS Management API. + net7.0 + false + false + - - net7.0 - enable - enable - nullable - Umbraco.Cms.ManagementApi - false - false - - - - - - - - - - - - - - - - all - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Cms.Persistence.SqlServer/CompatibilitySuppressions.xml b/src/Umbraco.Cms.Persistence.SqlServer/CompatibilitySuppressions.xml new file mode 100644 index 0000000000..7baad05aa0 --- /dev/null +++ b/src/Umbraco.Cms.Persistence.SqlServer/CompatibilitySuppressions.xml @@ -0,0 +1,7 @@ + + + + PKV006 + net6.0 + + \ No newline at end of file diff --git a/src/Umbraco.Infrastructure/Persistence/FaultHandling/RetryPolicyFactory.cs b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/RetryPolicyFactory.cs similarity index 91% rename from src/Umbraco.Infrastructure/Persistence/FaultHandling/RetryPolicyFactory.cs rename to src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/RetryPolicyFactory.cs index 785c6cebe5..1e8026a81c 100644 --- a/src/Umbraco.Infrastructure/Persistence/FaultHandling/RetryPolicyFactory.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/RetryPolicyFactory.cs @@ -1,8 +1,7 @@ -using Umbraco.Cms.Infrastructure.Persistence.FaultHandling.Strategies; +using Umbraco.Cms.Infrastructure.Persistence.FaultHandling; +using Umbraco.Cms.Persistence.SqlServer.FaultHandling.Strategies; -namespace Umbraco.Cms.Infrastructure.Persistence.FaultHandling; - -// TODO: These should move to Persistence.SqlServer +namespace Umbraco.Cms.Persistence.SqlServer.FaultHandling; /// /// Provides a factory class for instantiating application-specific retry policies. diff --git a/src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs similarity index 87% rename from src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs rename to src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs index e046f8592d..e3995e13ae 100644 --- a/src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/NetworkConnectivityErrorDetectionStrategy.cs @@ -1,6 +1,7 @@ using Microsoft.Data.SqlClient; +using Umbraco.Cms.Infrastructure.Persistence.FaultHandling; -namespace Umbraco.Cms.Infrastructure.Persistence.FaultHandling.Strategies; +namespace Umbraco.Cms.Persistence.SqlServer.FaultHandling.Strategies; /// /// Implements a strategy that detects network connectivity errors such as host not found. diff --git a/src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs similarity index 97% rename from src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs rename to src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs index b4ae18d55a..70c0f36de8 100644 --- a/src/Umbraco.Infrastructure/Persistence/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/SqlAzureTransientErrorDetectionStrategy.cs @@ -1,6 +1,7 @@ -using Microsoft.Data.SqlClient; +using Microsoft.Data.SqlClient; +using Umbraco.Cms.Infrastructure.Persistence.FaultHandling; -namespace Umbraco.Cms.Infrastructure.Persistence.FaultHandling.Strategies; +namespace Umbraco.Cms.Persistence.SqlServer.FaultHandling.Strategies; // See https://docs.microsoft.com/en-us/azure/azure-sql/database/troubleshoot-common-connectivity-issues // Also we could just use the nuget package instead https://www.nuget.org/packages/EnterpriseLibrary.TransientFaultHandling/ ? diff --git a/src/Umbraco.Infrastructure/Persistence/FaultHandling/ThrottlingCondition.cs b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/ThrottlingCondition.cs similarity index 98% rename from src/Umbraco.Infrastructure/Persistence/FaultHandling/ThrottlingCondition.cs rename to src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/ThrottlingCondition.cs index 24ba741c06..52e48b7aef 100644 --- a/src/Umbraco.Infrastructure/Persistence/FaultHandling/ThrottlingCondition.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/FaultHandling/Strategies/ThrottlingCondition.cs @@ -3,7 +3,7 @@ using System.Text; using System.Text.RegularExpressions; using Microsoft.Data.SqlClient; -namespace Umbraco.Cms.Infrastructure.Persistence.FaultHandling; +namespace Umbraco.Cms.Persistence.SqlServer.FaultHandling.Strategies; /// /// Defines the possible throttling modes in SQL Azure. @@ -299,7 +299,7 @@ public class ThrottlingCondition condition._throttledResources.Add(Tuple.Create(ThrottledResourceType.DatabaseSize, (ThrottlingType)((groupCode >>= 2) & 3))); condition._throttledResources.Add(Tuple.Create(ThrottledResourceType.Internal, (ThrottlingType)((groupCode >>= 2) & 3))); condition._throttledResources.Add(Tuple.Create(ThrottledResourceType.WorkerThreads, (ThrottlingType)((groupCode >>= 2) & 3))); - condition._throttledResources.Add(Tuple.Create(ThrottledResourceType.Internal, (ThrottlingType)((groupCode >> 2) & 3))); + condition._throttledResources.Add(Tuple.Create(ThrottledResourceType.Internal, (ThrottlingType)(groupCode >> 2 & 3))); return condition; } diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Interceptors/SqlServerAddRetryPolicyInterceptor.cs b/src/Umbraco.Cms.Persistence.SqlServer/Interceptors/SqlServerAddRetryPolicyInterceptor.cs index 139efea85f..b4b6018aea 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Interceptors/SqlServerAddRetryPolicyInterceptor.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Interceptors/SqlServerAddRetryPolicyInterceptor.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Options; using NPoco; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Infrastructure.Persistence.FaultHandling; +using Umbraco.Cms.Persistence.SqlServer.FaultHandling; using Umbraco.Extensions; namespace Umbraco.Cms.Persistence.SqlServer.Interceptors; @@ -21,12 +22,8 @@ public class SqlServerAddRetryPolicyInterceptor : SqlServerConnectionInterceptor return conn; } - RetryPolicy? connectionRetryPolicy = - RetryPolicyFactory.GetDefaultSqlConnectionRetryPolicyByConnectionString(_connectionStrings.CurrentValue - .ConnectionString); - RetryPolicy? commandRetryPolicy = - RetryPolicyFactory.GetDefaultSqlCommandRetryPolicyByConnectionString(_connectionStrings.CurrentValue - .ConnectionString); + RetryPolicy? connectionRetryPolicy = RetryPolicyFactory.GetDefaultSqlConnectionRetryPolicyByConnectionString(_connectionStrings.CurrentValue.ConnectionString); + RetryPolicy? commandRetryPolicy = RetryPolicyFactory.GetDefaultSqlCommandRetryPolicyByConnectionString(_connectionStrings.CurrentValue.ConnectionString); if (connectionRetryPolicy == null && commandRetryPolicy == null) { diff --git a/src/Umbraco.Infrastructure/Persistence/LocalDb.cs b/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs similarity index 99% rename from src/Umbraco.Infrastructure/Persistence/LocalDb.cs rename to src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs index d6c23abba8..6fcdfca76a 100644 --- a/src/Umbraco.Infrastructure/Persistence/LocalDb.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs @@ -2,7 +2,7 @@ using System.Data; using System.Diagnostics; using Microsoft.Data.SqlClient; -namespace Umbraco.Cms.Infrastructure.Persistence; +namespace Umbraco.Cms.Persistence.SqlServer; /// /// Manages LocalDB databases. @@ -153,7 +153,7 @@ public class LocalDb return null; } - return output.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); + return output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); } /// @@ -861,7 +861,7 @@ public class LocalDb { var nop = (targetFilesPath == null || targetFilesPath == filesPath) && (targetDatabaseName == null || targetDatabaseName == databaseName) - && ((sourceExtension == null && targetExtension == null) || sourceExtension == targetExtension); + && (sourceExtension == null && targetExtension == null || sourceExtension == targetExtension); if (nop && delete == false) { return; @@ -994,8 +994,8 @@ public class LocalDb } using (var p = new Process - { - StartInfo = + { + StartInfo = { UseShellExecute = false, RedirectStandardOutput = true, @@ -1005,7 +1005,7 @@ public class LocalDb CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden } - }) + }) { p.Start(); output = p.StandardOutput.ReadToEnd(); diff --git a/src/Umbraco.Cms.Persistence.SqlServer/NPocoSqlServerDatabaseExtensions.cs b/src/Umbraco.Cms.Persistence.SqlServer/NPocoSqlServerDatabaseExtensions.cs new file mode 100644 index 0000000000..3d875a243a --- /dev/null +++ b/src/Umbraco.Cms.Persistence.SqlServer/NPocoSqlServerDatabaseExtensions.cs @@ -0,0 +1,29 @@ +using Microsoft.Data.SqlClient; +using NPoco; +using NPoco.SqlServer; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Persistence.SqlServer; + +public static class NPocoSqlServerDatabaseExtensions +{ + /// + /// Configures NPoco's SqlBulkCopyHelper to use the correct SqlConnection and SqlTransaction instances from the + /// underlying RetryDbConnection and ProfiledDbTransaction + /// + /// + /// This is required to use NPoco's own method because we use + /// wrapped DbConnection and DbTransaction instances. + /// NPoco's InsertBulk method only caters for efficient bulk inserting records for Sql Server, it does not cater for + /// bulk inserting of records for + /// any other database type and in which case will just insert records one at a time. + /// NPoco's InsertBulk method also deals with updating the passed in entity's PK/ID once it's inserted whereas our own + /// BulkInsertRecords methods + /// do not handle this scenario. + /// + public static void ConfigureNPocoBulkExtensions() + { + SqlBulkCopyHelper.SqlConnectionResolver = NPocoDatabaseExtensions.GetTypedConnection; + SqlBulkCopyHelper.SqlTransactionResolver = NPocoDatabaseExtensions.GetTypedTransaction; + } +} diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerBulkSqlInsertProvider.cs b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerBulkSqlInsertProvider.cs index dbaab82ad4..d87fa99d5e 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerBulkSqlInsertProvider.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/Services/SqlServerBulkSqlInsertProvider.cs @@ -50,8 +50,7 @@ public class SqlServerBulkSqlInsertProvider : IBulkSqlInsertProvider { // use typed connection and transaction or SqlBulkCopy SqlConnection tConnection = NPocoDatabaseExtensions.GetTypedConnection(database.Connection); - SqlTransaction tTransaction = - NPocoDatabaseExtensions.GetTypedTransaction(command.Transaction); + SqlTransaction tTransaction = NPocoDatabaseExtensions.GetTypedTransaction(command.Transaction); var tableName = pocoData.TableInfo.TableName; if (database.SqlContext.SqlSyntax is not SqlServerSyntaxProvider syntax) @@ -62,9 +61,8 @@ public class SqlServerBulkSqlInsertProvider : IBulkSqlInsertProvider using (var copy = new SqlBulkCopy(tConnection, SqlBulkCopyOptions.Default, tTransaction) { // 0 = no bulk copy timeout. If a timeout occurs it will be an connection/command timeout. - BulkCopyTimeout = 0, + BulkCopyTimeout = 0, DestinationTableName = tableName, - // be consistent with NPoco: https://github.com/schotime/NPoco/blob/5117a55fde57547e928246c044fd40bd00b2d7d1/src/NPoco.SqlServer/SqlBulkCopyHelper.cs#L50 BatchSize = 4096, }) diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj index e78c210ae2..d2cfff9a2e 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj @@ -1,12 +1,14 @@ - - net7.0 - Umbraco.Cms.Persistence.SqlServer - Umbraco.Cms.Persistence.SqlServer + Umbraco CMS - Persistence - SQL Server Adds support for SQL Server to Umbraco CMS. + net7.0 + + + + @@ -19,5 +21,4 @@ <_Parameter1>Umbraco.Tests.UnitTests - diff --git a/src/Umbraco.Cms.Persistence.SqlServer/UmbracoBuilderExtensions.cs b/src/Umbraco.Cms.Persistence.SqlServer/UmbracoBuilderExtensions.cs index a47e92bf2e..aa4743faf8 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/UmbracoBuilderExtensions.cs @@ -45,6 +45,8 @@ public static class UmbracoBuilderExtensions DbProviderFactories.UnregisterFactory(Constants.ProviderName); DbProviderFactories.RegisterFactory(Constants.ProviderName, SqlClientFactory.Instance); + NPocoSqlServerDatabaseExtensions.ConfigureNPocoBulkExtensions(); + // Support provider name set by the configuration API for connection string environment variables builder.Services.ConfigureAll(options => { diff --git a/src/Umbraco.Cms.Persistence.Sqlite/CompatibilitySuppressions.xml b/src/Umbraco.Cms.Persistence.Sqlite/CompatibilitySuppressions.xml new file mode 100644 index 0000000000..7baad05aa0 --- /dev/null +++ b/src/Umbraco.Cms.Persistence.Sqlite/CompatibilitySuppressions.xml @@ -0,0 +1,7 @@ + + + + PKV006 + net6.0 + + \ No newline at end of file diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDistributedLockingMechanism.cs b/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDistributedLockingMechanism.cs index a4a31416fa..009f0cc122 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDistributedLockingMechanism.cs +++ b/src/Umbraco.Cms.Persistence.Sqlite/Services/SqliteDistributedLockingMechanism.cs @@ -1,6 +1,5 @@ using System.Data; using System.Data.Common; -using Microsoft.Data.SqlClient; using Microsoft.Data.Sqlite; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -83,7 +82,7 @@ public class SqliteDistributedLockingMechanism : IDistributedLockingMechanism throw new ArgumentOutOfRangeException(nameof(lockType), lockType, @"Unsupported lockType"); } } - catch (SqlException ex) when (ex.Number == 1222) + catch (SqliteException ex) when (ex.SqliteErrorCode == SQLitePCL.raw.SQLITE_BUSY) { if (LockType == DistributedLockType.ReadLock) { diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj index 5e0b1653cf..c0a8b649fe 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj @@ -1,18 +1,15 @@ - - net7.0 - Umbraco.Cms.Persistence.Sqlite - Umbraco.Cms.Persistence.Sqlite + Umbraco CMS - Persistence - SQLite Adds support for SQLite to Umbraco CMS. + net7.0 + + + + - - - - - diff --git a/src/Umbraco.Cms.StaticAssets/CompatibilitySuppressions.xml b/src/Umbraco.Cms.StaticAssets/CompatibilitySuppressions.xml new file mode 100644 index 0000000000..7baad05aa0 --- /dev/null +++ b/src/Umbraco.Cms.StaticAssets/CompatibilitySuppressions.xml @@ -0,0 +1,7 @@ + + + + PKV006 + net6.0 + + \ No newline at end of file diff --git a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj index 89cb8a44aa..e88b83bbbe 100644 --- a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj +++ b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj @@ -1,20 +1,12 @@ - + Umbraco CMS - Static assets + Contains the static assets needed to run Umbraco CMS. net7.0 true - Umbraco.Cms.StaticAssets - Contains the static assets that is required to run Umbraco CMS. / - - - true - buildTransitive - - - @@ -25,43 +17,32 @@ - $(ProjectDir)wwwroot/umbraco + $(ProjectDir)wwwroot\umbraco - - - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - - - - + + - + - - - - diff --git a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj new file mode 100644 index 0000000000..98d5b0741b --- /dev/null +++ b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj @@ -0,0 +1,32 @@ + + + Umbraco CMS + Installs Umbraco CMS with minimal dependencies in your ASP.NET Core project. + net7.0 + false + false + + false + + + + + + + + + + + + + + + + $(MSBuildThisFileDirectory)appsettings-schema.json + $(MSBuildThisFileDirectory)..\JsonSchema\ + + + + + + diff --git a/src/Umbraco.Cms/buildTransitive/Umbraco.Cms.props b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props similarity index 56% rename from src/Umbraco.Cms/buildTransitive/Umbraco.Cms.props rename to src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props index 7266a05f6e..a967c4fd33 100644 --- a/src/Umbraco.Cms/buildTransitive/Umbraco.Cms.props +++ b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props @@ -1,9 +1,9 @@ - $(DefaultItemExcludes);App_Plugins/** - $(DefaultItemExcludes);umbraco/Data/** - $(DefaultItemExcludes);umbraco/Logs/** - $(DefaultItemExcludes);wwwroot/media/** + $(DefaultItemExcludes);App_Plugins\** + $(DefaultItemExcludes);umbraco\Data\** + $(DefaultItemExcludes);umbraco\Logs\** + $(DefaultItemExcludes);wwwroot\media\** diff --git a/src/Umbraco.Cms/buildTransitive/Umbraco.Cms.targets b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets similarity index 62% rename from src/Umbraco.Cms/buildTransitive/Umbraco.Cms.targets rename to src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets index bd0fdbf304..03b6f90812 100644 --- a/src/Umbraco.Cms/buildTransitive/Umbraco.Cms.targets +++ b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets @@ -3,31 +3,22 @@ $(MSBuildThisFileDirectory)..\appsettings-schema.json - + - + - - - + + - + <_AppPluginsFiles Include="App_Plugins\**" /> - - + - + <_UmbracoFolderFiles Include="umbraco\config\**" /> <_UmbracoFolderFiles Include="umbraco\PartialViewMacros\**" /> diff --git a/src/Umbraco.Cms/Umbraco.Cms.csproj b/src/Umbraco.Cms/Umbraco.Cms.csproj index ce43dc67fc..2b710029be 100644 --- a/src/Umbraco.Cms/Umbraco.Cms.csproj +++ b/src/Umbraco.Cms/Umbraco.Cms.csproj @@ -1,50 +1,16 @@ + Umbraco CMS + Installs Umbraco CMS with all default dependencies in your ASP.NET Core project. net7.0 false - Umbraco.Cms - Umbraco.Cms - Installs Umbraco CMS in your ASP.NET Core project false - + + + - - - - - - - - - - - $(ProjectDir)appsettings-schema.json - $(ProjectDir)../JsonSchema/ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Core/Media/IImageDimensionExtractor.cs b/src/Umbraco.Core/Media/IImageDimensionExtractor.cs index 67f11415d3..632b29118c 100644 --- a/src/Umbraco.Core/Media/IImageDimensionExtractor.cs +++ b/src/Umbraco.Core/Media/IImageDimensionExtractor.cs @@ -2,7 +2,25 @@ using System.Drawing; namespace Umbraco.Cms.Core.Media; +/// +/// Allows extracting the image dimensions from a stream. +/// public interface IImageDimensionExtractor { - public Size? GetDimensions(Stream? stream); + /// + /// Gets the supported image file types/extensions. + /// + /// + /// The supported image file types/extensions. + /// + IEnumerable SupportedImageFileTypes { get; } + + /// + /// Gets the dimensions. + /// + /// The stream. + /// + /// The dimensions of the image if the stream was parsable; otherwise, null. + /// + public Size? GetDimensions(Stream stream); } diff --git a/src/Umbraco.Core/Media/ImageDimensionExtractorExtensions.cs b/src/Umbraco.Core/Media/ImageDimensionExtractorExtensions.cs new file mode 100644 index 0000000000..64efb7e0ec --- /dev/null +++ b/src/Umbraco.Core/Media/ImageDimensionExtractorExtensions.cs @@ -0,0 +1,23 @@ +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Media; + +namespace Umbraco.Extensions; + +public static class ImageDimensionExtractorExtensions +{ + /// + /// Gets a value indicating whether the file extension corresponds to a supported image. + /// + /// The image dimension extractor implementation that provides detail on which image extensions are supported. + /// The file extension. + /// + /// A value indicating whether the file extension corresponds to an image. + /// + public static bool IsSupportedImageFormat(this IImageDimensionExtractor imageDimensionExtractor, string extension) + { + ArgumentNullException.ThrowIfNull(imageDimensionExtractor); + + return string.IsNullOrWhiteSpace(extension) == false && + imageDimensionExtractor.SupportedImageFileTypes.InvariantContains(extension.TrimStart(Constants.CharArrays.Period)); + } +} diff --git a/src/Umbraco.Core/Media/ImageUrlGeneratorExtensions.cs b/src/Umbraco.Core/Media/ImageUrlGeneratorExtensions.cs index ab904f2094..bc75f1176a 100644 --- a/src/Umbraco.Core/Media/ImageUrlGeneratorExtensions.cs +++ b/src/Umbraco.Core/Media/ImageUrlGeneratorExtensions.cs @@ -6,26 +6,18 @@ namespace Umbraco.Extensions; public static class ImageUrlGeneratorExtensions { /// - /// Gets a value indicating whether the file extension corresponds to a supported image. + /// Gets a value indicating whether the file extension corresponds to a supported image. /// - /// - /// The image URL generator implementation that provides detail on which image extensions - /// are supported. - /// + /// The image URL generator implementation that provides detail on which image extensions are supported. /// The file extension. /// - /// A value indicating whether the file extension corresponds to an image. + /// A value indicating whether the file extension corresponds to an image. /// - /// imageUrlGenerator public static bool IsSupportedImageFormat(this IImageUrlGenerator imageUrlGenerator, string extension) { - if (imageUrlGenerator == null) - { - throw new ArgumentNullException(nameof(imageUrlGenerator)); - } + ArgumentNullException.ThrowIfNull(imageUrlGenerator); return string.IsNullOrWhiteSpace(extension) == false && - imageUrlGenerator.SupportedImageFileTypes.InvariantContains( - extension.TrimStart(Constants.CharArrays.Period)); + imageUrlGenerator.SupportedImageFileTypes.InvariantContains(extension.TrimStart(Constants.CharArrays.Period)); } } diff --git a/src/Umbraco.Core/Media/NoopImageDimensionExtractor.cs b/src/Umbraco.Core/Media/NoopImageDimensionExtractor.cs new file mode 100644 index 0000000000..da5dc1f9ef --- /dev/null +++ b/src/Umbraco.Core/Media/NoopImageDimensionExtractor.cs @@ -0,0 +1,10 @@ +using System.Drawing; + +namespace Umbraco.Cms.Core.Media; + +public sealed class NoopImageDimensionExtractor : IImageDimensionExtractor +{ + public IEnumerable SupportedImageFileTypes { get; } = Enumerable.Empty(); + + public Size? GetDimensions(Stream stream) => null; +} diff --git a/src/Umbraco.Core/Media/NoopImageUrlGenerator.cs b/src/Umbraco.Core/Media/NoopImageUrlGenerator.cs new file mode 100644 index 0000000000..de2338a632 --- /dev/null +++ b/src/Umbraco.Core/Media/NoopImageUrlGenerator.cs @@ -0,0 +1,10 @@ +using Umbraco.Cms.Core.Models; + +namespace Umbraco.Cms.Core.Media; + +public sealed class NoopImageUrlGenerator : IImageUrlGenerator +{ + public IEnumerable SupportedImageFileTypes { get; } = Enumerable.Empty(); + + public string? GetImageUrl(ImageUrlGenerationOptions options) => options?.ImageUrl; +} diff --git a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs index 6a5ffd23d7..654d23135e 100644 --- a/src/Umbraco.Core/Media/UploadAutoFillProperties.cs +++ b/src/Umbraco.Core/Media/UploadAutoFillProperties.cs @@ -8,30 +8,26 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Core.Media; /// -/// Provides methods to manage auto-fill properties for upload fields. +/// Provides methods to manage auto-fill properties for upload fields. /// public class UploadAutoFillProperties { private readonly IImageDimensionExtractor _imageDimensionExtractor; - private readonly IImageUrlGenerator _imageUrlGenerator; private readonly ILogger _logger; private readonly MediaFileManager _mediaFileManager; public UploadAutoFillProperties( MediaFileManager mediaFileManager, ILogger logger, - IImageUrlGenerator imageUrlGenerator, IImageDimensionExtractor imageDimensionExtractor) { _mediaFileManager = mediaFileManager ?? throw new ArgumentNullException(nameof(mediaFileManager)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _imageUrlGenerator = imageUrlGenerator ?? throw new ArgumentNullException(nameof(imageUrlGenerator)); - _imageDimensionExtractor = - imageDimensionExtractor ?? throw new ArgumentNullException(nameof(imageDimensionExtractor)); + _imageDimensionExtractor = imageDimensionExtractor ?? throw new ArgumentNullException(nameof(imageDimensionExtractor)); } /// - /// Resets the auto-fill properties of a content item, for a specified auto-fill configuration. + /// Resets the auto-fill properties of a content item, for a specified auto-fill configuration. /// /// The content item. /// The auto-fill configuration. @@ -39,39 +35,27 @@ public class UploadAutoFillProperties /// Variation segment. public void Reset(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string? culture, string? segment) { - if (content == null) - { - throw new ArgumentNullException(nameof(content)); - } - - if (autoFillConfig == null) - { - throw new ArgumentNullException(nameof(autoFillConfig)); - } + ArgumentNullException.ThrowIfNull(content); + ArgumentNullException.ThrowIfNull(autoFillConfig); ResetProperties(content, autoFillConfig, culture, segment); } /// - /// Populates the auto-fill properties of a content item, for a specified auto-fill configuration. + /// Populates the auto-fill properties of a content item, for a specified auto-fill configuration. /// /// The content item. /// The auto-fill configuration. /// The filesystem path to the uploaded file. - /// The parameter is the path relative to the filesystem. /// Variation language. /// Variation segment. + /// + /// The parameter is the path relative to the filesystem. + /// public void Populate(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string filepath, string? culture, string? segment) { - if (content == null) - { - throw new ArgumentNullException(nameof(content)); - } - - if (autoFillConfig == null) - { - throw new ArgumentNullException(nameof(autoFillConfig)); - } + ArgumentNullException.ThrowIfNull(content); + ArgumentNullException.ThrowIfNull(autoFillConfig); // no file = reset, file = auto-fill if (filepath.IsNullOrWhiteSpace()) @@ -101,25 +85,18 @@ public class UploadAutoFillProperties } /// - /// Populates the auto-fill properties of a content item. + /// Populates the auto-fill properties of a content item. /// /// The content item. - /// + /// The automatic fill configuration. /// The filesystem-relative filepath, or null to clear properties. /// The stream containing the file data. /// Variation language. /// Variation segment. public void Populate(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string filepath, Stream filestream, string culture, string segment) { - if (content == null) - { - throw new ArgumentNullException(nameof(content)); - } - - if (autoFillConfig == null) - { - throw new ArgumentNullException(nameof(autoFillConfig)); - } + ArgumentNullException.ThrowIfNull(content); + ArgumentNullException.ThrowIfNull(autoFillConfig); // no file = reset, file = auto-fill if (filepath.IsNullOrWhiteSpace() || filestream == null) @@ -134,50 +111,23 @@ public class UploadAutoFillProperties private static void SetProperties(IContentBase content, ImagingAutoFillUploadField autoFillConfig, Size? size, long? length, string extension, string? culture, string? segment) { - if (content == null) - { - throw new ArgumentNullException(nameof(content)); - } + ArgumentNullException.ThrowIfNull(content); + ArgumentNullException.ThrowIfNull(autoFillConfig); - if (autoFillConfig == null) - { - throw new ArgumentNullException(nameof(autoFillConfig)); - } + void SetProperty(string alias, object? value) => UploadAutoFillProperties.SetProperty(content, alias, value, culture, segment); - if (!string.IsNullOrWhiteSpace(autoFillConfig.WidthFieldAlias) && - content.Properties.Contains(autoFillConfig.WidthFieldAlias)) - { - content.Properties[autoFillConfig.WidthFieldAlias]!.SetValue( - size.HasValue ? size.Value.Width.ToInvariantString() : string.Empty, culture, segment); - } - - if (!string.IsNullOrWhiteSpace(autoFillConfig.HeightFieldAlias) && - content.Properties.Contains(autoFillConfig.HeightFieldAlias)) - { - content.Properties[autoFillConfig.HeightFieldAlias]!.SetValue( - size.HasValue ? size.Value.Height.ToInvariantString() : string.Empty, culture, segment); - } - - if (!string.IsNullOrWhiteSpace(autoFillConfig.LengthFieldAlias) && - content.Properties.Contains(autoFillConfig.LengthFieldAlias)) - { - content.Properties[autoFillConfig.LengthFieldAlias]!.SetValue(length, culture, segment); - } - - if (!string.IsNullOrWhiteSpace(autoFillConfig.ExtensionFieldAlias) && - content.Properties.Contains(autoFillConfig.ExtensionFieldAlias)) - { - content.Properties[autoFillConfig.ExtensionFieldAlias]!.SetValue(extension, culture, segment); - } + SetProperty(autoFillConfig.WidthFieldAlias, size.HasValue ? size.Value.Width.ToInvariantString() : null); + SetProperty(autoFillConfig.HeightFieldAlias, size.HasValue ? size.Value.Height.ToInvariantString() : null); + SetProperty(autoFillConfig.LengthFieldAlias, length); + SetProperty(autoFillConfig.ExtensionFieldAlias, extension); } - private void SetProperties(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string filepath, Stream? filestream, string? culture, string? segment) + private void SetProperties(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string filepath, Stream filestream, string? culture, string? segment) { var extension = (Path.GetExtension(filepath) ?? string.Empty).TrimStart(Constants.CharArrays.Period); - Size? size = _imageUrlGenerator.IsSupportedImageFormat(extension) - ? _imageDimensionExtractor.GetDimensions(filestream) ?? - (Size?)new Size(Constants.Conventions.Media.DefaultSize, Constants.Conventions.Media.DefaultSize) + Size? size = _imageDimensionExtractor.IsSupportedImageFormat(extension) + ? _imageDimensionExtractor.GetDimensions(filestream) ?? new Size(Constants.Conventions.Media.DefaultSize, Constants.Conventions.Media.DefaultSize) : null; SetProperties(content, autoFillConfig, size, filestream?.Length, extension, culture, segment); @@ -185,34 +135,23 @@ public class UploadAutoFillProperties private static void ResetProperties(IContentBase content, ImagingAutoFillUploadField autoFillConfig, string? culture, string? segment) { - if (content == null) - { - throw new ArgumentNullException(nameof(content)); - } + ArgumentNullException.ThrowIfNull(content); + ArgumentNullException.ThrowIfNull(autoFillConfig); - if (autoFillConfig == null) - { - throw new ArgumentNullException(nameof(autoFillConfig)); - } + void ResetProperty(string alias) => SetProperty(content, alias, null, culture, segment); - if (content.Properties.Contains(autoFillConfig.WidthFieldAlias)) - { - content.Properties[autoFillConfig.WidthFieldAlias]?.SetValue(string.Empty, culture, segment); - } + ResetProperty(autoFillConfig.WidthFieldAlias); + ResetProperty(autoFillConfig.HeightFieldAlias); + ResetProperty(autoFillConfig.LengthFieldAlias); + ResetProperty(autoFillConfig.ExtensionFieldAlias); + } - if (content.Properties.Contains(autoFillConfig.HeightFieldAlias)) + private static void SetProperty(IContentBase content, string alias, object? value, string? culture, string? segment) + { + if (!string.IsNullOrEmpty(alias) && + content.Properties.TryGetValue(alias, out var property)) { - content.Properties[autoFillConfig.HeightFieldAlias]?.SetValue(string.Empty, culture, segment); - } - - if (content.Properties.Contains(autoFillConfig.LengthFieldAlias)) - { - content.Properties[autoFillConfig.LengthFieldAlias]?.SetValue(string.Empty, culture, segment); - } - - if (content.Properties.Contains(autoFillConfig.ExtensionFieldAlias)) - { - content.Properties[autoFillConfig.ExtensionFieldAlias]?.SetValue(string.Empty, culture, segment); + property.SetValue(value, culture, segment); } } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 3593c6b0c7..969a489d81 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -1,39 +1,25 @@ - - + + Umbraco.Cms.Core + Umbraco CMS - Core + Contains the core assembly needed to run Umbraco CMS. net7.0 Umbraco.Cms.Core - Umbraco CMS - Umbraco.Cms.Core - Umbraco CMS Core - Contains the core assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - Umbraco CMS - - - - bin\Release\Umbraco.Core.xml - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + + + + + + - - - all - + @@ -60,8 +46,4 @@ - - - - diff --git a/src/Umbraco.Examine.Lucene/CompatibilitySuppressions.xml b/src/Umbraco.Examine.Lucene/CompatibilitySuppressions.xml deleted file mode 100644 index 681c7cdab5..0000000000 --- a/src/Umbraco.Examine.Lucene/CompatibilitySuppressions.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - CP0008 - T:Umbraco.Cms.Infrastructure.Examine.UmbracoContentIndex - lib/net6.0/Umbraco.Examine.Lucene.dll - lib/net6.0/Umbraco.Examine.Lucene.dll - true - - \ No newline at end of file diff --git a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj index e7ea0f8087..5da47eb04a 100644 --- a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj +++ b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj @@ -1,35 +1,16 @@ + Umbraco.Cms.Examine.Lucene + Umbraco CMS - Examine - Lucene + Adds Examine searching support using Lucene to Umbraco CMS. net7.0 Umbraco.Cms.Infrastructure.Examine - Umbraco CMS - Umbraco.Examine.Lucene - - Umbraco.Cms.Examine.Lucene - - true - bin\Release\Umbraco.Examine.Lucene.xml - - - - - - - - - - + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - + diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index 62bafcd28e..0757afe434 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -3,7 +3,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Serilog; -using SixLabors.ImageSharp; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Configuration; @@ -43,7 +42,6 @@ using Umbraco.Cms.Infrastructure.HealthChecks; using Umbraco.Cms.Infrastructure.HostedServices; using Umbraco.Cms.Infrastructure.Install; using Umbraco.Cms.Infrastructure.Mail; -using Umbraco.Cms.Infrastructure.Media; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Install; using Umbraco.Cms.Infrastructure.Migrations.PostMigrations; @@ -208,13 +206,11 @@ public static partial class UmbracoBuilderExtensions builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); - // Add default ImageSharp configuration and service implementations - builder.Services.AddSingleton(Configuration.Default); - builder.Services.AddSingleton(); - builder.Services.AddTransient(); builder.AddInstaller(); diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs index cf984aed59..386d0ac251 100644 --- a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs +++ b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs @@ -209,30 +209,29 @@ namespace Umbraco.Cms.Infrastructure.Install.InstallSteps } ConnectionStrings? umbracoConnectionString = _connectionStrings.CurrentValue; - var isConnectionStringConfigured = umbracoConnectionString.IsConnectionStringConfigured(); if (isConnectionStringConfigured) { installState = (installState | InstallState.ConnectionStringConfigured) & ~InstallState.Unknown; - } - DbProviderFactory? factory = _dbProviderFactoryCreator.CreateFactory(umbracoConnectionString.ProviderName); - var isConnectionAvailable = isConnectionStringConfigured && DbConnectionExtensions.IsConnectionAvailable(umbracoConnectionString.ConnectionString, factory); - if (isConnectionAvailable) - { - installState = (installState | InstallState.CanConnect) & ~InstallState.Unknown; - } + DbProviderFactory? factory = _dbProviderFactoryCreator.CreateFactory(umbracoConnectionString.ProviderName); + var isConnectionAvailable = isConnectionStringConfigured && DbConnectionExtensions.IsConnectionAvailable(umbracoConnectionString.ConnectionString, factory); + if (isConnectionAvailable) + { + installState = (installState | InstallState.CanConnect) & ~InstallState.Unknown; + } - var isUmbracoInstalled = isConnectionAvailable && _databaseBuilder.IsUmbracoInstalled(); - if (isUmbracoInstalled) - { - installState = (installState | InstallState.UmbracoInstalled) & ~InstallState.Unknown; - } + var isUmbracoInstalled = isConnectionAvailable && _databaseBuilder.IsUmbracoInstalled(); + if (isUmbracoInstalled) + { + installState = (installState | InstallState.UmbracoInstalled) & ~InstallState.Unknown; + } - var hasSomeNonDefaultUser = isUmbracoInstalled && _databaseBuilder.HasSomeNonDefaultUser(); - if (hasSomeNonDefaultUser) - { - installState = (installState | InstallState.HasNonDefaultUser) & ~InstallState.Unknown; + var hasSomeNonDefaultUser = isUmbracoInstalled && _databaseBuilder.HasSomeNonDefaultUser(); + if (hasSomeNonDefaultUser) + { + installState = (installState | InstallState.HasNonDefaultUser) & ~InstallState.Unknown; + } } return installState; diff --git a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions-Bulk.cs b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions-Bulk.cs index 92ccb0fc81..fec87921a6 100644 --- a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions-Bulk.cs +++ b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions-Bulk.cs @@ -1,8 +1,6 @@ using System.Data; using System.Data.Common; -using Microsoft.Data.SqlClient; using NPoco; -using NPoco.SqlServer; using Umbraco.Cms.Core; using Umbraco.Cms.Infrastructure.Persistence; @@ -13,26 +11,6 @@ namespace Umbraco.Extensions; /// public static partial class NPocoDatabaseExtensions { - /// - /// Configures NPoco's SqlBulkCopyHelper to use the correct SqlConnection and SqlTransaction instances from the - /// underlying RetryDbConnection and ProfiledDbTransaction - /// - /// - /// This is required to use NPoco's own method because we use - /// wrapped DbConnection and DbTransaction instances. - /// NPoco's InsertBulk method only caters for efficient bulk inserting records for Sql Server, it does not cater for - /// bulk inserting of records for - /// any other database type and in which case will just insert records one at a time. - /// NPoco's InsertBulk method also deals with updating the passed in entity's PK/ID once it's inserted whereas our own - /// BulkInsertRecords methods - /// do not handle this scenario. - /// - public static void ConfigureNPocoBulkExtensions() - { - SqlBulkCopyHelper.SqlConnectionResolver = dbConn => GetTypedConnection(dbConn); - SqlBulkCopyHelper.SqlTransactionResolver = dbTran => GetTypedTransaction(dbTran); - } - /// /// Determines whether a column should be part of a bulk-insert. /// diff --git a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions.cs b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions.cs index 1a64b44aa6..1dc12a805f 100644 --- a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions.cs +++ b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseExtensions.cs @@ -1,7 +1,6 @@ using System.Data; using System.Data.Common; using System.Text.RegularExpressions; -using Microsoft.Data.SqlClient; using NPoco; using StackExchange.Profiling.Data; using Umbraco.Cms.Infrastructure.Persistence; @@ -186,7 +185,7 @@ public static partial class NPocoDatabaseExtensions db.Insert(poco); return RecordPersistenceType.Insert; } - catch (SqlException) + catch (DbException) { // assuming all db engines will throw SQLException exception // failed: exists (due to race cond RC1) diff --git a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseTypeExtensions.cs b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseTypeExtensions.cs index 3159cf34e1..4dd63c9919 100644 --- a/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseTypeExtensions.cs +++ b/src/Umbraco.Infrastructure/Persistence/NPocoDatabaseTypeExtensions.cs @@ -6,12 +6,8 @@ namespace Umbraco.Cms.Infrastructure.Persistence; internal static class NPocoDatabaseTypeExtensions { [Obsolete("Usage of this method indicates a code smell.")] - public static bool IsSqlServer(this DatabaseType databaseType) => - - // note that because SqlServerDatabaseType is the base class for - // all Sql Server types eg SqlServer2012DatabaseType, this will - // test *any* version of Sql Server. - databaseType is SqlServerDatabaseType; + public static bool IsSqlServer(this DatabaseType databaseType) + => databaseType is not null && databaseType.GetProviderName() == "Microsoft.Data.SqlClient"; [Obsolete("Usage of this method indicates a code smell.")] public static bool IsSqlite(this DatabaseType databaseType) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TwoFactorLoginRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TwoFactorLoginRepository.cs index efcd6f1d5c..9467ec9be4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TwoFactorLoginRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/TwoFactorLoginRepository.cs @@ -1,4 +1,3 @@ -using Microsoft.Data.SqlClient; using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Cms.Core; @@ -43,25 +42,14 @@ internal class TwoFactorLoginRepository : EntityRepositoryBase> GetByUserOrMemberKeyAsync(Guid userOrMemberKey) { - try - { - Sql sql = Sql() - .Select() - .From() - .Where(x => x.UserOrMemberKey == userOrMemberKey); - List? dtos = await Database.FetchAsync(sql); - return dtos.WhereNotNull().Select(Map).WhereNotNull(); - } - - // TODO (v11): Remove this as the table should always exist when upgrading from 10.x - // SQL Server - table doesn't exist, likely upgrading from < 9.3.0. - catch (SqlException ex) when (ex.Number == 208 && ex.Message.Contains(TwoFactorLoginDto.TableName)) - { - return Enumerable.Empty(); - } + Sql sql = Sql() + .Select() + .From() + .Where(x => x.UserOrMemberKey == userOrMemberKey); + List? dtos = await Database.FetchAsync(sql); + return dtos.WhereNotNull().Select(Map).WhereNotNull(); } - protected override Sql GetBaseQuery(bool isCount) { Sql sql = SqlContext.Sql(); @@ -142,7 +130,10 @@ internal class TwoFactorLoginRepository : EntityRepositoryBase + + Umbraco.Cms.Infrastructure + Umbraco CMS - Infrastructure + Contains the infrastructure assembly needed to run Umbraco CMS. + net7.0 + Umbraco.Cms.Infrastructure + - - net7.0 - Umbraco.Cms.Infrastructure - Umbraco.Cms.Infrastructure - Umbraco CMS Infrastructure - Contains the infrastructure assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - + + $(DefineConstants);TRACE_SCOPES + - - bin\Release\Umbraco.Infrastructure.xml - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - TRACE_SCOPES; - + + + - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - all - - + + + <_Parameter1>Umbraco.Tests + + + <_Parameter1>Umbraco.Tests.Benchmarks + + + <_Parameter1>Umbraco.Tests.Integration + + + <_Parameter1>Umbraco.Tests.Common + + + <_Parameter1>Umbraco.Tests.UnitTests + + + <_Parameter1>DynamicProxyGenAssembly2 + + + <_Parameter1>Umbraco.New.Cms.Infrastructure + + - - <_UnmanagedRegistrationCache Remove="obj\Umbraco.Infrastructure.csproj.UnmanagedRegistration.cache" /> - - - - - - - True - True - Resources.resx - - - - - - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - - - - - - - - <_Parameter1>Umbraco.Tests - - - <_Parameter1>Umbraco.Tests.Benchmarks - - - <_Parameter1>Umbraco.Tests.Integration - - - <_Parameter1>Umbraco.Tests.Common - - - <_Parameter1>Umbraco.Tests.UnitTests - - - <_Parameter1>DynamicProxyGenAssembly2 - - - <_Parameter1>Umbraco.New.Cms.Infrastructure - - - - - - - - - - + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + True + True + Resources.resx + + diff --git a/src/Umbraco.Infrastructure/WebAssets/Resources.Designer.cs b/src/Umbraco.Infrastructure/WebAssets/Resources.Designer.cs index 319a8b09ef..cf2b36fdde 100644 --- a/src/Umbraco.Infrastructure/WebAssets/Resources.Designer.cs +++ b/src/Umbraco.Infrastructure/WebAssets/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -19,19 +19,19 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. @@ -59,34 +59,33 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { resourceCulture = value; } } - + /// /// Looks up a localized string similar to [ - /// + /// /// 'lib/jquery/jquery.min.js', /// 'lib/jquery-ui/jquery-ui.min.js', /// 'lib/jquery-ui-touch-punch/jquery.ui.touch-punch.min.js', /// - /// 'lib/angular/angular.js', + /// 'lib/angular/angular.min.js', /// 'lib/underscore/underscore-min.js', /// /// 'lib/moment/moment.min.js', - /// 'lib/flatpickr/flatpickr.js', + /// 'lib/flatpickr/flatpickr.min.js', /// /// 'lib/animejs/anime.min.js', /// - /// 'lib/angular-route/angular-route.js', - /// 'lib/angular-cookies/angular-cookies.js', + /// 'lib/angular-route/angular-route.min.js', + /// 'lib/angular-cookies/angular-cookies.min.js', /// 'lib/angular-aria/angular-aria.min.js', - /// 'lib/angular-touch/angular-touch.js', - /// 'lib/ [rest of string was truncated]";. + /// 'lib/angular-touch/angular-touch [rest of string was truncated]";. /// internal static string JsInitialize { get { return ResourceManager.GetString("JsInitialize", resourceCulture); } } - + /// /// Looks up a localized string similar to LazyLoad.js("##JsInitialize##", function () { /// //we need to set the legacy UmbClientMgr path @@ -107,21 +106,21 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { return ResourceManager.GetString("Main", resourceCulture); } } - + /// /// Looks up a localized string similar to [ /// 'lib/jquery/jquery.min.js', - /// 'lib/angular/angular.js', + /// 'lib/angular/angular.min.js', /// 'lib/underscore/underscore-min.js', /// 'lib/umbraco/Extensions.js', - /// 'js/utilities.js', - /// 'js/app.js', - /// 'js/umbraco.resources.js', - /// 'js/umbraco.services.js', - /// 'js/umbraco.interceptors.js', + /// 'js/utilities.min.js', + /// 'js/app.min.js', + /// 'js/umbraco.resources.min.js', + /// 'js/umbraco.services.min.js', + /// 'js/umbraco.interceptors.min.js', /// 'ServerVariables', /// 'lib/signalr/signalr.min.js', - /// 'js/umbraco.preview.js' + /// 'js/umbraco.preview.min.js' ///] ///. /// @@ -130,24 +129,24 @@ namespace Umbraco.Cms.Infrastructure.WebAssets { return ResourceManager.GetString("PreviewInitialize", resourceCulture); } } - + /// - /// Looks up a localized string similar to // TODO: This would be nicer as an angular module so it can be injected into stuff... that'd be heaps nicer, but - /// how to do that when this is not a regular JS file, it is a server side JS file and RequireJS seems to only want - /// to force load JS files ? + /// Looks up a localized string similar to // TODO: This would be nicer as an angular module so it can be injected into stuff... that'd be heaps nicer, but + ///// how to do that when this is not a regular JS file, it is a server side JS file and RequireJS seems to only want + ///// to force load JS files ? /// - /// create the namespace (NOTE: This loads before any dependencies so we don't have a namespace mgr so we just create it manually) - /// var Umbraco = {}; - /// Umbraco.Sys = {}; - /// define a global static object - /// Umbraco.Sys.ServerVariables = ##Variables## ;. + /////create the namespace (NOTE: This loads before any dependencies so we don't have a namespace mgr so we just create it manually) + ///var Umbraco = {}; + ///Umbraco.Sys = {}; + /////define a global static object + ///Umbraco.Sys.ServerVariables = ##Variables## ;. /// internal static string ServerVariables { get { return ResourceManager.GetString("ServerVariables", resourceCulture); } } - + /// /// Looks up a localized string similar to [ /// 'lib/tinymce/tinymce.min.js', diff --git a/src/Umbraco.New.Cms.Core/Umbraco.New.Cms.Core.csproj b/src/Umbraco.New.Cms.Core/Umbraco.New.Cms.Core.csproj index 0e0cb355cb..25ce2bfabd 100644 --- a/src/Umbraco.New.Cms.Core/Umbraco.New.Cms.Core.csproj +++ b/src/Umbraco.New.Cms.Core/Umbraco.New.Cms.Core.csproj @@ -1,17 +1,13 @@ + + Umbraco CMS - Core + Contains the core assembly needed to run Umbraco CMS. + net7.0 + false + false + - - net7.0 - enable - enable - Umbraco.New.Cms.Core - false - nullable - false - - - - - - + + + diff --git a/src/Umbraco.New.Cms.Infrastructure/Umbraco.New.Cms.Infrastructure.csproj b/src/Umbraco.New.Cms.Infrastructure/Umbraco.New.Cms.Infrastructure.csproj index 37a91d4599..5d8ee6698f 100644 --- a/src/Umbraco.New.Cms.Infrastructure/Umbraco.New.Cms.Infrastructure.csproj +++ b/src/Umbraco.New.Cms.Infrastructure/Umbraco.New.Cms.Infrastructure.csproj @@ -1,18 +1,14 @@ + + Umbraco CMS - Infrastructure + Contains the infrastructure assembly needed to run Umbraco CMS. + net7.0 + false + false + - - net7.0 - enable - enable - Umbraco.New.Cms.Infrastructure - false - nullable - false - - - - - - - + + + + diff --git a/src/Umbraco.New.Cms.Web.Common/Umbraco.New.Cms.Web.Common.csproj b/src/Umbraco.New.Cms.Web.Common/Umbraco.New.Cms.Web.Common.csproj index d9826126de..01a4cb93de 100644 --- a/src/Umbraco.New.Cms.Web.Common/Umbraco.New.Cms.Web.Common.csproj +++ b/src/Umbraco.New.Cms.Web.Common/Umbraco.New.Cms.Web.Common.csproj @@ -1,17 +1,14 @@ + + Umbraco CMS - Web + Contains the web assembly needed to run Umbraco CMS. + net7.0 + false + false + - - net7.0 - enable - enable - false - nullable - false - - - - - - - + + + + diff --git a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj index 4a2f763d36..6cdec8ce08 100644 --- a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj +++ b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj @@ -1,29 +1,17 @@ - + Umbraco.Cms.PublishedCache.NuCache + Umbraco CMS - Published cache - NuCache + Contains the published cache assembly needed to run Umbraco CMS. net7.0 Umbraco.Cms.Infrastructure.PublishedCache - Umbraco.Cms.PublishedCache.NuCache - Umbraco CMS Published Cache - Contains the Published Cache assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - - - - bin\Release\Umbraco.PublishedCache.NuCache.xml - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - @@ -48,5 +36,4 @@ <_Parameter1>DynamicProxyGenAssembly2 - diff --git a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj index d556786dec..450d146502 100644 --- a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj +++ b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj @@ -1,56 +1,39 @@ + + Umbraco.Cms.Web.BackOffice + Umbraco CMS - Web - Backoffice + Contains the backoffice assembly needed to run the backend of Umbraco CMS. + net7.0 + Library + Umbraco.Cms.Web.BackOffice + - - net7.0 - Library - Umbraco.Cms.Web.BackOffice - Umbraco.Cms.Web.BackOffice - Umbraco CMS Back Office - Contains the Back Office assembly needed to run the back office of Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - - - - bin\Release\Umbraco.Web.BackOffice.xml - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - - - - - - <_Parameter1>Umbraco.Tests.UnitTests - - - <_Parameter1>Umbraco.Tests.Integration - - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + + <_Parameter1>Umbraco.Tests.UnitTests + + + <_Parameter1>Umbraco.Tests.Integration + + + + + + diff --git a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs index 2212dec425..91456565b1 100644 --- a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs +++ b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; -using SixLabors.ImageSharp.Web.DependencyInjection; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; @@ -78,9 +77,6 @@ public class UmbracoApplicationBuilder : IUmbracoApplicationBuilder, IUmbracoEnd { UseUmbracoCoreMiddleware(); - // Important we handle image manipulations before the static files, otherwise the querystring is just ignored. - AppBuilder.UseImageSharp(); - // Get media file provider and request path/URL MediaFileManager mediaFileManager = AppBuilder.ApplicationServices.GetRequiredService(); if (mediaFileManager.FileSystem.TryCreateFileProvider(out IFileProvider? mediaFileProvider)) diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs deleted file mode 100644 index e5e642f4a3..0000000000 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilder.ImageSharp.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using SixLabors.ImageSharp.Web.Caching; -using SixLabors.ImageSharp.Web.DependencyInjection; -using SixLabors.ImageSharp.Web.Middleware; -using SixLabors.ImageSharp.Web.Providers; -using Umbraco.Cms.Core.DependencyInjection; -using Umbraco.Cms.Core.Media; -using Umbraco.Cms.Web.Common.DependencyInjection; -using Umbraco.Cms.Web.Common.ImageProcessors; -using Umbraco.Cms.Web.Common.Media; - -namespace Umbraco.Extensions; - -public static partial class UmbracoBuilderExtensions -{ - /// - /// Adds Image Sharp with Umbraco settings - /// - public static IServiceCollection AddUmbracoImageSharp(this IUmbracoBuilder builder) - { - builder.Services.AddSingleton(); - - builder.Services.AddImageSharp() - - // Replace default image provider - .ClearProviders() - .AddProvider() - - // Add custom processors - .AddProcessor(); - - // Configure middleware - builder.Services - .AddTransient, ConfigureImageSharpMiddlewareOptions>(); - - // Configure cache options - builder.Services - .AddTransient, ConfigurePhysicalFileSystemCacheOptions>(); - - return builder.Services; - } -} diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs index 40b84a0987..f9ea5c99c1 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs @@ -293,7 +293,6 @@ public static partial class UmbracoBuilderExtensions .Transient()); builder.Services.TryAddEnumerable(ServiceDescriptor .Transient()); - builder.AddUmbracoImageSharp(); // AspNetCore specific services builder.Services.AddUnique(); diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index 06ae26d19d..b8e79d3b9d 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -1,31 +1,26 @@ - - - net7.0 - Library - Umbraco.Cms.Web.Common - Umbraco.Cms.Web.Common - Umbraco CMS Web - Contains the Web assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - - net7.0 - Library - Umbraco.Cms.Web.Common Umbraco.Cms.Web.Common - Umbraco CMS Web - Contains the Web assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - enable - - - - bin\Release\Umbraco.Web.Common.xml + Umbraco CMS - Web + Contains the web assembly needed to run Umbraco CMS. + net7.0 + Umbraco.Cms.Web.Common + + + + + + + + + + @@ -33,19 +28,6 @@ - - - - - - - - - - - - - <_Parameter1>Umbraco.Tests.UnitTests diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 7cad29e790..44254f7bed 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -81,8 +81,8 @@ "run-sequence": "2.2.1" }, "engines": { - "node": ">=14.0.0 <17", - "npm": ">=8.0.0 < 9" + "node": ">=16.17", + "npm": ">=8.15" } }, "node_modules/@ampproject/remapping": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 969fa65292..e632cf1e5d 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -13,8 +13,8 @@ "watch": "gulp watch" }, "engines": { - "node": ">=14.0.0 <17", - "npm": ">=8.0.0 < 9" + "node": ">=16.17", + "npm": ">=8.15" }, "dependencies": { "@microsoft/signalr": "6.0.9", diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index d732e2aca8..2ff2dd0674 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -5,34 +5,14 @@ false - - - - bin/Release/Umbraco.Web.UI.xml - - - - true - - - + + + - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - @@ -49,33 +29,13 @@ false - - $(ProjectDir)appsettings-schema.json - $(ProjectDir)../JsonSchema/JsonSchema.csproj - - - - - - - - + + + - - - - + + + - - - - - - - - - - - diff --git a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj index 8d5bb1249c..2215d3f4bb 100644 --- a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj +++ b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj @@ -1,47 +1,29 @@ + + Umbraco.Cms.Web.Website + Umbraco CMS - Web - Website + Contains the website assembly needed to run the frontend of Umbraco CMS. + net7.0 + Library + Umbraco.Cms.Web.Website + - - net7.0 - Library - Umbraco.Cms.Web.Website - Umbraco.Cms.Web.Website - Umbraco CMS Website - Contains the Website assembly needed to run Umbraco Cms (Front office). This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - + + + - - bin\Release\Umbraco.Web.Website.xml - + + + + + - - bin\Release\Umbraco.Web.Website.xml - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - - - - - <_Parameter1>Umbraco.Tests.UnitTests - - - <_Parameter1>Umbraco.Tests.Integration - - + + + <_Parameter1>Umbraco.Tests.UnitTests + + + <_Parameter1>Umbraco.Tests.Integration + + diff --git a/templates/Umbraco.Templates.csproj b/templates/Umbraco.Templates.csproj index eef2c96ec9..f902f91b90 100644 --- a/templates/Umbraco.Templates.csproj +++ b/templates/Umbraco.Templates.csproj @@ -1,19 +1,17 @@ + Umbraco CMS - Templates + Coontains templates for Umbraco CMS. net7.0 Template false - . + false true true - false . - true - false - diff --git a/templates/icon.png b/templates/icon.png deleted file mode 100644 index 6e94105808e0f05cb21726b4f729c979ed7d33ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22265 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 diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 0726083c36..62031665f7 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -2,6 +2,10 @@ + + annotations + + $(MSBuildThisFileDirectory)codeanalysis.ruleset diff --git a/tests/Umbraco.TestData/Umbraco.TestData.csproj b/tests/Umbraco.TestData/Umbraco.TestData.csproj index b2c9fa7236..eeb21db8fe 100644 --- a/tests/Umbraco.TestData/Umbraco.TestData.csproj +++ b/tests/Umbraco.TestData/Umbraco.TestData.csproj @@ -1,9 +1,9 @@ - - false - Umbraco.TestData net7.0 + Umbraco.TestData + false + false @@ -16,5 +16,4 @@ - diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 223f83c12b..e7b6ae9b72 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -7,16 +7,20 @@ "name": "acceptancetest", "hasInstallScript": true, "dependencies": { - "typescript": "^3.9.2" + "typescript": "^4.6.3" }, "devDependencies": { - "cross-env": "^7.0.2", + "cross-env": "^7.0.3", "cy-verify-downloads": "0.0.5", "cypress": "8.4.1", "del": "^6.0.0", "ncp": "^2.0.0", "prompt": "^1.2.0", "umbraco-cypress-testhelpers": "^1.0.0-beta-73" + }, + "engines": { + "node": ">=16.17", + "npm": ">=8.15" } }, "node_modules/@cypress/request": { @@ -2164,9 +2168,9 @@ } }, "node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2339,16 +2343,10 @@ } }, "dependencies": { - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, "@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "version": "2.88.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.7.tgz", + "integrity": "sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -2358,7 +2356,8 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "http-signature": "~1.3.6", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", @@ -2464,6 +2463,18 @@ } } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2528,9 +2539,9 @@ "dev": true }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", "dev": true }, "asynckit": { @@ -2676,12 +2687,13 @@ } }, "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", "dev": true, "requires": { - "@colors/colors": "1.5.0", + "colors": "^1.1.2", + "object-assign": "^4.1.0", "string-width": "^4.2.0" } }, @@ -2722,6 +2734,12 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2776,9 +2794,9 @@ } }, "cy-verify-downloads": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/cy-verify-downloads/-/cy-verify-downloads-0.1.5.tgz", - "integrity": "sha512-8iviQ+LhZ9z7bUEfN5YOGqYy292tSDHVDNsz9eaGZ97dVybgx9NhkSyk//2rVXIV97JBIdx8GIeGBBD+JBB27w==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/cy-verify-downloads/-/cy-verify-downloads-0.0.5.tgz", + "integrity": "sha512-aRK7VvKG5rmDJK4hjZ27KM2oOOz0cMO7z/j4zX8qCc4ffXZS1XRJkofUY0w5u6MCB/wUsNMs03VuvkeR2tNPoQ==", "dev": true }, "cycle": { @@ -2788,9 +2806,9 @@ "dev": true }, "cypress": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.7.0.tgz", - "integrity": "sha512-b1bMC3VQydC6sXzBMFnSqcvwc9dTZMgcaOzT0vpSD+Gq1yFc+72JDWi55sfUK5eIeNLAtWOGy1NNb6UlhMvB+Q==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.4.1.tgz", + "integrity": "sha512-itJXq0Vx3sXCUrDyBi2IUrkxVu/gTTp1VhjB5tzGgkeCR8Ae+/T8WV63rsZ7fS8Tpq7LPPXiyoM/sEdOX7cR6A==", "dev": true, "requires": { "@cypress/request": "^2.88.6", @@ -2827,7 +2845,6 @@ "minimist": "^1.2.5", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", - "proxy-from-env": "1.0.0", "ramda": "~0.27.1", "request-progress": "^3.0.0", "supports-color": "^8.1.1", @@ -3008,6 +3025,12 @@ "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=", "dev": true }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -3021,6 +3044,12 @@ "micromatch": "^4.0.4" } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -3171,6 +3200,22 @@ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3178,14 +3223,14 @@ "dev": true }, "http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "human-signals": { @@ -3317,9 +3362,15 @@ "dev": true }, "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stringify-safe": { @@ -3339,14 +3390,14 @@ } }, "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.4.0", + "json-schema": "0.2.3", "verror": "1.10.0" } }, @@ -3453,18 +3504,18 @@ } }, "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.52.0" + "mime-db": "1.51.0" } }, "mimic-fn": { @@ -3515,6 +3566,12 @@ "path-key": "^3.0.0" } }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3597,24 +3654,26 @@ "dev": true }, "prompt": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.3.0.tgz", - "integrity": "sha512-ZkaRWtaLBZl7KKAKndKYUL8WqNT+cQHKRZnT4RYYms48jQkFw3rrBL+/N5K/KtdEveHkxs982MX2BkDKub2ZMg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.2.0.tgz", + "integrity": "sha512-iGerYRpRUg5ZyC+FJ/25G5PUKuWAGRjW1uOlhX7Pi3O5YygdK6R+KEaBjRbHSkU5vfS5PZCltSPZdDtUYwRCZA==", "dev": true, "requires": { - "@colors/colors": "1.5.0", - "async": "3.2.3", + "async": "~0.9.0", + "colors": "^1.1.2", "read": "1.0.x", "revalidator": "0.1.x", "winston": "2.x" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } } }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", @@ -3638,9 +3697,9 @@ "dev": true }, "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "querystring": { @@ -3656,9 +3715,9 @@ "dev": true }, "ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", "dev": true }, "read": { @@ -3779,9 +3838,9 @@ } }, "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -3904,9 +3963,9 @@ "dev": true }, "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==" }, "umbraco-cypress-testhelpers": { "version": "1.0.0-beta-73", @@ -3930,6 +3989,15 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", diff --git a/tests/Umbraco.Tests.AcceptanceTest/package.json b/tests/Umbraco.Tests.AcceptanceTest/package.json index 34c82f4441..d0ad3e133e 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package.json @@ -8,13 +8,13 @@ "ui": "npx cypress open" }, "engines": { - "node": ">=14.0.0 <17", - "npm": ">=8.0.0 < 9" + "node": ">=16.17", + "npm": ">=8.15" }, "devDependencies": { "cross-env": "^7.0.3", - "cypress": "8.7.0", - "cy-verify-downloads": "0.1.5", + "cypress": "8.4.1", + "cy-verify-downloads": "0.0.5", "del": "^6.0.0", "ncp": "^2.0.0", "prompt": "^1.2.0", diff --git a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index 6b7ad5d5a8..b39a03fd99 100644 --- a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -4,15 +4,15 @@ Exe false false + false - - - - - - + + + + + @@ -20,19 +20,4 @@ - - - - 0.13.2 - - - 7.0.0-rc.1.* - - - 4.18.1 - - - - - diff --git a/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj b/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj index 4fee3d2091..3a1f04cefb 100644 --- a/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj +++ b/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj @@ -1,20 +1,14 @@ - - net7.0 - Umbraco.Cms.Tests.Common - Umbraco.Cms.Tests - Umbraco CMS Test Tools - Contains commonly used tools to write tests for Umbraco CMS, such as various builders for content etc. - true + Umbraco.Cms.Tests + Umbraco CMS - Test tools + Contains commonly used tools to write tests for Umbraco CMS, such as various builders for content etc. + net7.0 + Umbraco.Cms.Tests.Common - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - diff --git a/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs b/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs index 92909149d1..2437d9a7a5 100644 --- a/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs +++ b/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs @@ -1,6 +1,4 @@ -using System; using System.Linq.Expressions; -using System.Net.Http; using System.Reflection; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Builder; @@ -16,11 +14,9 @@ using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Composing; -using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Web; using Umbraco.Cms.ManagementApi; -using Umbraco.Cms.ManagementApi.Configuration; using Umbraco.Cms.ManagementApi.Controllers.Install; using Umbraco.Cms.Persistence.Sqlite; using Umbraco.Cms.Persistence.SqlServer; @@ -30,7 +26,6 @@ using Umbraco.Cms.Tests.Integration.Testing; using Umbraco.Cms.Web.BackOffice.Controllers; using Umbraco.Cms.Web.Common.Controllers; using Umbraco.Cms.Web.Website.Controllers; -using Umbraco.Extensions; namespace Umbraco.Cms.Tests.Integration.TestServerTest { diff --git a/tests/Umbraco.Tests.Integration/Testing/LocalDbTestDatabase.cs b/tests/Umbraco.Tests.Integration/Testing/LocalDbTestDatabase.cs index 28a7370b5d..38da6ad7a4 100644 --- a/tests/Umbraco.Tests.Integration/Testing/LocalDbTestDatabase.cs +++ b/tests/Umbraco.Tests.Integration/Testing/LocalDbTestDatabase.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Persistence.SqlServer; namespace Umbraco.Cms.Tests.Integration.Testing; diff --git a/tests/Umbraco.Tests.Integration/Testing/SqlServerTestDatabase.cs b/tests/Umbraco.Tests.Integration/Testing/SqlServerTestDatabase.cs index ff000c75b7..e489081e60 100644 --- a/tests/Umbraco.Tests.Integration/Testing/SqlServerTestDatabase.cs +++ b/tests/Umbraco.Tests.Integration/Testing/SqlServerTestDatabase.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using Microsoft.Data.SqlClient; using Microsoft.Extensions.Logging; using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Persistence.SqlServer; // ReSharper disable ConvertToUsingDeclaration namespace Umbraco.Cms.Tests.Integration.Testing; diff --git a/tests/Umbraco.Tests.Integration/Testing/TestDatabaseFactory.cs b/tests/Umbraco.Tests.Integration/Testing/TestDatabaseFactory.cs index 78ed442db5..350d7ce975 100644 --- a/tests/Umbraco.Tests.Integration/Testing/TestDatabaseFactory.cs +++ b/tests/Umbraco.Tests.Integration/Testing/TestDatabaseFactory.cs @@ -3,7 +3,7 @@ using System; using Microsoft.Extensions.Logging; -using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Persistence.SqlServer; namespace Umbraco.Cms.Tests.Integration.Testing; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/IndexInitializer.cs b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/IndexInitializer.cs index ae99c7e009..6ae7f3628e 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/IndexInitializer.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/IndexInitializer.cs @@ -1,12 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; using Examine; using Examine.Lucene; using Examine.Lucene.Directories; using Lucene.Net.Analysis; using Lucene.Net.Analysis.Standard; -using Lucene.Net.Store; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Moq; @@ -22,6 +18,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Examine; using Umbraco.Cms.Infrastructure.Persistence; +using Directory = Lucene.Net.Store.Directory; namespace Umbraco.Cms.Tests.Integration.Umbraco.Examine.Lucene.UmbracoExamine; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs index 0d5a6bf0be..1a9a37fd3b 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Examine.Lucene/UmbracoExamine/PublishedContentQueryTests.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; using Examine; using Examine.Lucene; using Examine.Lucene.Directories; using Examine.Lucene.Providers; -using Lucene.Net.Store; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; @@ -14,6 +10,7 @@ using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Infrastructure; using Umbraco.Cms.Infrastructure.Examine; using Umbraco.Cms.Tests.Common.Testing; +using Directory = Lucene.Net.Store.Directory; namespace Umbraco.Cms.Tests.Integration.Umbraco.Examine.Lucene.UmbracoExamine; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj index 4df31ee009..38a9ae4787 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj +++ b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj @@ -1,122 +1,52 @@ - - net7.0 - Umbraco.Cms.Tests.Integration Umbraco.Cms.Tests.Integration - Umbraco CMS Integration Tests - Contains helper classes for integration tests with Umbraco, including all internal integration tests. - true + Umbraco CMS - Integration tests + Contains helper classes for integration tests with Umbraco CMS, including all internal integration tests. + net7.0 true - - - - - - - - - IS_WINDOWS + Umbraco.Cms.Tests.Integration - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + ResXFileCodeGenerator - TestFiles.Designer.cs - - - ResXFileCodeGenerator - ImportResources.Designer.cs Designer + TestFiles.Designer.cs True True TestFiles.resx + + + ResXFileCodeGenerator + Designer + ImportResources.Designer.cs + - True True + True ImportResources.resx - + - - - - - - - - - Designer - - - - - - - - - Designer - - - - - - - PreserveNewest - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - Designer - - - diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index 8561face40..9b82d90f67 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -1,46 +1,27 @@ - - Exe net7.0 + Exe + true Umbraco.Cms.Tests.UnitTests false - true + false - - - - - - - - - - - - - - - - + + - + - + + + + + + - - - - - - - - - - diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/ImageProcessors/CropWebProcessorTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/ImageProcessors/CropWebProcessorTests.cs index d9110bc558..ea1a51fae6 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/ImageProcessors/CropWebProcessorTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/ImageProcessors/CropWebProcessorTests.cs @@ -11,7 +11,7 @@ using SixLabors.ImageSharp.Web; using SixLabors.ImageSharp.Web.Commands; using SixLabors.ImageSharp.Web.Commands.Converters; using SixLabors.ImageSharp.Web.Middleware; -using Umbraco.Cms.Web.Common.ImageProcessors; +using Umbraco.Cms.Imaging.ImageSharp.ImageProcessors; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.ImageProcessors; diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Media/ImageSharpImageUrlGeneratorTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Media/ImageSharpImageUrlGeneratorTests.cs index bc2c26727f..3a882d8b91 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Media/ImageSharpImageUrlGeneratorTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Media/ImageSharpImageUrlGeneratorTests.cs @@ -3,7 +3,7 @@ using NUnit.Framework; using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Web.Common.Media; +using Umbraco.Cms.Imaging.ImageSharp.Media; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Media; diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Routing/InstallAreaRoutesTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Routing/InstallAreaRoutesTests.cs index c5a8eb5201..48e9f4f904 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Routing/InstallAreaRoutesTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Web.Common/Routing/InstallAreaRoutesTests.cs @@ -81,8 +81,8 @@ public class InstallAreaRoutesTests var route = endpoints.DataSources.First(); Assert.AreEqual(1, route.Endpoints.Count); - var routeEndpoint = (RouteEndpoint)route.Endpoints[0]; - Assert.AreEqual("install/{controller?}/{action?}", routeEndpoint.RoutePattern.RawText); + var endpoint = (RouteEndpoint)route.Endpoints[0]; + Assert.AreEqual("install/{controller?}/{action?}", endpoint.RoutePattern.RawText); } private InstallAreaRoutes GetInstallAreaRoutes(RuntimeLevel level) => diff --git a/umbraco.sln b/umbraco.sln index e0ff14115c..70f299236a 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -4,13 +4,12 @@ VisualStudioVersion = 17.1.32328.378 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Web.UI", "src\Umbraco.Web.UI\Umbraco.Web.UI.csproj", "{DCDFE97C-5630-4F6F-855D-8AEEB96556A5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2849E9D4-3B4E-40A3-A309-F3CB4F0E125F}" - ProjectSection(SolutionItems) = preProject - build\azure-pipelines.yml = build\azure-pipelines.yml - version.json = version.json - EndProjectSection -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{B5BD12C1-A454-435E-8A46-FF4A364C0382}" + ProjectSection(SolutionItems) = preProject + tests\.editorconfig = tests\.editorconfig + tests\codeanalysis.ruleset = tests\codeanalysis.ruleset + tests\Directory.Build.props = tests\Directory.Build.props + EndProjectSection EndProject Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Umbraco.Web.UI.Client", "http://localhost:3961", "{3819A550-DCEC-4153-91B4-8BA9F7F0B9B4}" ProjectSection(WebsiteProperties) = preProject @@ -101,24 +100,46 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NewBackoffice", "NewBackoff .github\New BackOffice - README.md = .github\New BackOffice - README.md EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Cms.ManagementApi", "src\Umbraco.Cms.ManagementApi\Umbraco.Cms.ManagementApi.csproj", "{0946531B-F06D-415B-A4E3-6CBFF5DB1C12}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.ManagementApi", "src\Umbraco.Cms.ManagementApi\Umbraco.Cms.ManagementApi.csproj", "{0946531B-F06D-415B-A4E3-6CBFF5DB1C12}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.New.Cms.Core", "src\Umbraco.New.Cms.Core\Umbraco.New.Cms.Core.csproj", "{CBCE0A1E-BF29-49A6-9581-EAB3587D823A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.New.Cms.Core", "src\Umbraco.New.Cms.Core\Umbraco.New.Cms.Core.csproj", "{CBCE0A1E-BF29-49A6-9581-EAB3587D823A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.New.Cms.Infrastructure", "src\Umbraco.New.Cms.Infrastructure\Umbraco.New.Cms.Infrastructure.csproj", "{2D978DAF-8F48-4D59-8FEA-7EF0F40DBC2C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.New.Cms.Infrastructure", "src\Umbraco.New.Cms.Infrastructure\Umbraco.New.Cms.Infrastructure.csproj", "{2D978DAF-8F48-4D59-8FEA-7EF0F40DBC2C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.New.Cms.Web.Common", "src\Umbraco.New.Cms.Web.Common\Umbraco.New.Cms.Web.Common.csproj", "{5ED13EC6-399E-49D5-9D26-86501729B08D}" -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{D4C3395A-BA9D-4032-9ED3-09F1FC032CBC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.New.Cms.Web.Common", "src\Umbraco.New.Cms.Web.Common\Umbraco.New.Cms.Web.Common.csproj", "{5ED13EC6-399E-49D5-9D26-86501729B08D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E5D4B5F9-6CCE-46CE-8985-9A350445F92B}" ProjectSection(SolutionItems) = preProject - build\csharp-docs\docfx.filter.yml = build\csharp-docs\docfx.filter.yml - build\csharp-docs\toc.yml = build\csharp-docs\toc.yml - build\csharp-docs\docfx.json = build\csharp-docs\docfx.json - build\csharp-docs\index.md = build\csharp-docs\index.md + .artifactignore = .artifactignore + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + .globalconfig = .globalconfig + Directory.Build.props = Directory.Build.props + icon.png = icon.png + LICENSE.md = LICENSE.md + umbraco.sln.DotSettings = umbraco.sln.DotSettings + version.json = version.json EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Templating", "Templating", "{5FBDD50D-7A86-4F4D-BEB9-7967FBA4ED2C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Targets", "src\Umbraco.Cms.Targets\Umbraco.Cms.Targets.csproj", "{B51C10FC-FD20-451E-90DD-A117133403DF}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Partials", "Partials", "{55B028A8-6294-46A4-BED5-7888ADB92368}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{20CE9C97-9314-4A19-BCF1-D12CF49B7205}" + ProjectSection(SolutionItems) = preProject + build\azure-pipelines.yml = build\azure-pipelines.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "csharp-docs", "csharp-docs", "{F2BF84D9-0A14-40AF-A0F3-B9BBBBC16A44}" + ProjectSection(SolutionItems) = preProject + build\csharp-docs\docfx.filter.yml = build\csharp-docs\docfx.filter.yml + build\csharp-docs\docfx.json = build\csharp-docs\docfx.json + build\csharp-docs\index.md = build\csharp-docs\index.md + build\csharp-docs\toc.yml = build\csharp-docs\toc.yml + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "umbracotemplate", "umbracotemplate", "{2B47AD9F-FFF1-448A-88F1-D4F568811738}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "partials", "partials", "{25AECCB5-B187-4406-844B-91B8FF0FCB37}" ProjectSection(SolutionItems) = preProject build\csharp-docs\umbracotemplate\partials\class.tmpl.partial = build\csharp-docs\umbracotemplate\partials\class.tmpl.partial build\csharp-docs\umbracotemplate\partials\footer.tmpl.partial = build\csharp-docs\umbracotemplate\partials\footer.tmpl.partial @@ -128,11 +149,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Partials", "Partials", "{55 build\csharp-docs\umbracotemplate\partials\rest.tmpl.partial = build\csharp-docs\umbracotemplate\partials\rest.tmpl.partial EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Styles", "Styles", "{6499F81C-CFF2-4F83-9105-83F7880879F8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "styles", "styles", "{EA628ABD-624E-4AF3-B548-6710D4D66531}" ProjectSection(SolutionItems) = preProject build\csharp-docs\umbracotemplate\styles\main.css = build\csharp-docs\umbracotemplate\styles\main.css EndProjectSection EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Imaging.ImageSharp", "src\Umbraco.Cms.Imaging.ImageSharp\Umbraco.Cms.Imaging.ImageSharp.csproj", "{C280181E-597B-4AA5-82E7-D7017E928749}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -279,6 +302,18 @@ Global {5ED13EC6-399E-49D5-9D26-86501729B08D}.Release|Any CPU.Build.0 = Release|Any CPU {5ED13EC6-399E-49D5-9D26-86501729B08D}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU {5ED13EC6-399E-49D5-9D26-86501729B08D}.SkipTests|Any CPU.Build.0 = Debug|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.Release|Any CPU.Build.0 = Release|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU + {B51C10FC-FD20-451E-90DD-A117133403DF}.SkipTests|Any CPU.Build.0 = Debug|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.Release|Any CPU.Build.0 = Release|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.SkipTests|Any CPU.ActiveCfg = Debug|Any CPU + {C280181E-597B-4AA5-82E7-D7017E928749}.SkipTests|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -295,10 +330,11 @@ Global {CBCE0A1E-BF29-49A6-9581-EAB3587D823A} = {995D9EFA-8BB1-4333-80AD-C525A06FD984} {2D978DAF-8F48-4D59-8FEA-7EF0F40DBC2C} = {995D9EFA-8BB1-4333-80AD-C525A06FD984} {5ED13EC6-399E-49D5-9D26-86501729B08D} = {995D9EFA-8BB1-4333-80AD-C525A06FD984} - {D4C3395A-BA9D-4032-9ED3-09F1FC032CBC} = {2849E9D4-3B4E-40A3-A309-F3CB4F0E125F} - {5FBDD50D-7A86-4F4D-BEB9-7967FBA4ED2C} = {D4C3395A-BA9D-4032-9ED3-09F1FC032CBC} - {55B028A8-6294-46A4-BED5-7888ADB92368} = {5FBDD50D-7A86-4F4D-BEB9-7967FBA4ED2C} - {6499F81C-CFF2-4F83-9105-83F7880879F8} = {5FBDD50D-7A86-4F4D-BEB9-7967FBA4ED2C} + {20CE9C97-9314-4A19-BCF1-D12CF49B7205} = {E5D4B5F9-6CCE-46CE-8985-9A350445F92B} + {F2BF84D9-0A14-40AF-A0F3-B9BBBBC16A44} = {20CE9C97-9314-4A19-BCF1-D12CF49B7205} + {2B47AD9F-FFF1-448A-88F1-D4F568811738} = {F2BF84D9-0A14-40AF-A0F3-B9BBBBC16A44} + {25AECCB5-B187-4406-844B-91B8FF0FCB37} = {2B47AD9F-FFF1-448A-88F1-D4F568811738} + {EA628ABD-624E-4AF3-B548-6710D4D66531} = {2B47AD9F-FFF1-448A-88F1-D4F568811738} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7A0F2E34-D2AF-4DAB-86A0-7D7764B3D0EC} diff --git a/version.json b/version.json index 157ba1125f..bd1e9b0edd 100644 --- a/version.json +++ b/version.json @@ -1,14 +1,13 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "11.0.0", + "version": "11.0.0-rc1", "assemblyVersion": { - "precision": "Build" // optional. Use when you want a more precise assembly version than the default major.minor. + "precision": "build" }, "gitCommitIdShortFixedLength": 7, "publicReleaseRefSpec": [ - "^refs/heads/master$", "^refs/heads/main$", - "^refs/heads/release/\\d+\\.\\d+\\.\\d+" + "^refs/heads/release/" ], "cloudBuild": { "buildNumber": {