From de2fb47b78bdfa88aade984ae4a2a4a1a509485a Mon Sep 17 00:00:00 2001 From: Shannon Deminick Date: Tue, 15 Jun 2021 15:05:57 +1000 Subject: [PATCH] Implements unattended package migrations for both explicit and implicit migrations (#10418) * Clean up and changes to backoffice for the nuget only packages * temp commit of package logic removal * Lots of package code cleanup and removal * Removes old package data from the test package xml * Updates packaging code to take in XDocument instead of a file since we'll not be dealing with files, starts creating expressions for the package migrations scripting. * fixing tests * Fixes runtime state and boot failed middleware so that it actually runs. Separates out unattended install/upgrade into notification handlers. * Gets unattended package migrations working and running * Gets embedded package.xml resources able to install from package migration. * Implements automatic package migrations for package that just declare an xml data manifest. * fix build * small cleanups * fix build * adds some tests * Fix export test * Fix newlines in test for linux * Typo * removes old todos and updates AutomaticPackgeMigrationPlan to use getter with backing field. Co-authored-by: Bjarke Berg --- .../Extensions/RuntimeStateExtensions.cs | 5 +- .../InstallSteps/StarterKitCleanupStep.cs | 54 - .../InstallSteps/StarterKitInstallStep.cs | 66 - src/Umbraco.Core/Migrations/IMigration.cs | 4 +- src/Umbraco.Core/Migrations/MigrationPlan.cs | 4 +- .../Models/LocalPackageInstallModel.cs | 94 -- .../Models/PackageInstallModel.cs | 25 - .../Models/PackageInstallResult.cs | 13 - .../Models/Packaging/CompiledPackage.cs | 23 +- .../Models/Packaging/CompiledPackageFile.cs | 25 - .../Models/Packaging/IPackageInfo.cs | 26 - ...eInstallWarnings.cs => InstallWarnings.cs} | 8 +- .../Models/Packaging/RequirementsType.cs | 8 - .../ImportedPackageNotification.cs | 6 +- .../ImportingPackageNotification.cs | 7 +- .../RuntimeUnattendedInstallNotification.cs | 13 + .../RuntimeUnattendedUpgradeNotification.cs | 25 + .../UninstallPackageNotification.cs | 14 - .../Packaging/CompiledPackageXmlParser.cs | 113 +- .../Packaging/ICreatedPackagesRepository.cs | 2 +- .../Packaging/IInstalledPackagesRepository.cs | 9 - .../Packaging/IPackageInstallation.cs | 30 +- .../Packaging/InstallationSummary.cs | 78 +- .../Packaging/PackageDefinition.cs | 81 +- .../Packaging/PackageDefinitionXmlParser.cs | 63 +- .../Packaging/PackageExtraction.cs | 186 --- .../Packaging/PackageFileInstallation.cs | 89 -- .../Packaging/PackageInstallType.cs | 9 - .../Packaging/PackageMigrationPlan.cs | 7 +- .../Packaging/PackageMigrationResource.cs | 28 + .../Packaging/PackagesRepository.cs | 220 +--- .../Packaging/PendingPackageMigrations.cs | 65 + .../Packaging/UninstallationSummary.cs | 25 - .../Services/IPackagingService.cs | 79 +- src/Umbraco.Core/Services/IRuntimeState.cs | 10 +- .../UmbracoBuilder.CoreServices.cs | 5 + .../UmbracoBuilder.Installer.cs | 4 - .../UmbracoBuilder.Services.cs | 5 +- .../Install/InstallHelper.cs | 27 - .../InstallSteps/StarterKitDownloadStep.cs | 108 -- .../Install/UnattendedInstaller.cs | 134 ++ .../Install/UnattendedUpgrader.cs | 157 +++ .../Migrations/IMigrationContext.cs | 7 +- .../Migrations/MigrationBase.cs | 4 +- .../Migrations/MigrationContext.cs | 14 +- .../Migrations/MigrationExpressionBase.cs | 2 +- .../Migrations/MigrationPlanExecutor.cs | 3 +- .../AutomaticPackageMigrationPlan.cs | 62 + .../Packaging/IImportPackageBuilder.cs | 17 + .../Packaging/ImportPackageBuilder.cs | 38 + .../ImportPackageBuilderExpression.cs | 56 + .../Packaging/PackageDataInstallation.cs | 220 +--- .../Packaging/PackageInstallation.cs | 130 +- .../Packaging/PackageMigrationBase.cs | 19 + .../Runtime/CoreRuntime.cs | 52 +- .../{ => Runtime}/RuntimeState.cs | 140 +-- .../Services/Implement/PackagingService.cs | 187 +-- .../Document_Type_Picker_1.1.package.xml | 17 + .../Packages/Document_Type_Picker_1.1.umb | Bin 6147 -> 0 bytes .../Packages/Document_Type_Picker_1.1.zip | Bin 6147 -> 0 bytes .../TestData/Packages/Hello_1.0.0.package.xml | 90 ++ .../TestData/Packages/Hello_1.0.0.zip | Bin 1529 -> 0 bytes .../CreatedPackagesRepositoryTests.cs | 67 +- .../Packaging/PackageDataInstallationTests.cs | 6 +- .../Packaging/PackageInstallationTest.cs | 75 +- .../Umbraco.Core/RuntimeStateTests.cs | 8 +- .../SqlServerSyntaxProviderTests.cs | 43 +- .../CheckboxList-Content-Package.xml | 21 +- .../CompositionsTestPackage-Random.xml | 17 +- .../Importing/CompositionsTestPackage.xml | 19 +- .../Services/Importing/Dictionary-Package.xml | 17 +- .../Services/Importing/Fanoe-Package.xml | 1054 +--------------- .../Importing/InheritedDocTypes-Package.xml | 19 +- .../Importing/MediaTypesAndMedia-Package.xml | 21 +- .../Importing/StandardMvc-Package.xml | 202 +-- .../Importing/TemplateOnly-Package.xml | 17 +- .../TemplateOnly-Updated-Package.xml | 17 +- .../Services/Importing/XsltSearch-Package.xml | 57 +- .../Services/Importing/uBlogsy-Package.xml | 355 +----- .../Packaging/PackageExtractionTests.cs | 51 - .../Packages/Document_Type_Picker_1.1.umb | Bin 6147 -> 0 bytes .../PendingPackageMigrationsTests.cs | 84 ++ .../Migrations/AlterMigrationTests.cs | 26 +- .../Migrations/MigrationTests.cs | 17 +- .../Migrations/PostMigrationTests.cs | 2 +- .../Controllers/BackOfficeServerVariables.cs | 4 - .../Controllers/ContentTypeController.cs | 2 +- .../Controllers/PackageController.cs | 26 +- .../Controllers/PackageInstallController.cs | 389 ------ .../Controllers/UsersController.cs | 6 +- .../Install/InstallApiController.cs | 6 - .../Install/InstallController.cs | 3 +- .../Middleware/BootFailedMiddleware.cs | 6 +- src/Umbraco.Web.UI.Client/package-lock.json | 1080 +++++++++-------- .../src/common/resources/package.resource.js | 132 +- .../src/less/components/umb-packages.less | 23 +- .../dashboard/dashboard.tabs.controller.js | 87 -- .../dashboard/forms/formsdashboardintro.html | 41 +- .../src/views/packages/edit.controller.js | 76 -- .../src/views/packages/edit.html | 147 +-- .../src/views/packages/overview.controller.js | 12 +- .../src/views/packages/views/created.html | 5 +- .../views/install-local.controller.js | 220 ---- .../views/packages/views/install-local.html | 190 --- .../packages/views/installed.controller.js | 35 +- .../views/packages/views/repo.controller.js | 129 +- .../src/views/packages/views/repo.html | 125 +- .../appsettings.Development.json | 91 +- .../umbraco/config/lang/cs.xml | 9 - .../umbraco/config/lang/da.xml | 14 - .../umbraco/config/lang/de.xml | 26 +- .../umbraco/config/lang/en.xml | 16 +- .../umbraco/config/lang/en_us.xml | 14 - .../umbraco/config/lang/es.xml | 17 +- .../umbraco/config/lang/fr.xml | 18 +- .../umbraco/config/lang/nl.xml | 7 - .../umbraco/config/lang/pl.xml | 13 - .../umbraco/config/lang/ru.xml | 13 - .../umbraco/config/lang/tr.xml | 46 +- src/umbraco.sln | 12 - 120 files changed, 1963 insertions(+), 6284 deletions(-) delete mode 100644 src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs delete mode 100644 src/Umbraco.Core/Install/InstallSteps/StarterKitInstallStep.cs delete mode 100644 src/Umbraco.Core/Models/LocalPackageInstallModel.cs delete mode 100644 src/Umbraco.Core/Models/PackageInstallModel.cs delete mode 100644 src/Umbraco.Core/Models/PackageInstallResult.cs delete mode 100644 src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs delete mode 100644 src/Umbraco.Core/Models/Packaging/IPackageInfo.cs rename src/Umbraco.Core/Models/Packaging/{PreInstallWarnings.cs => InstallWarnings.cs} (63%) delete mode 100644 src/Umbraco.Core/Models/Packaging/RequirementsType.cs create mode 100644 src/Umbraco.Core/Notifications/RuntimeUnattendedInstallNotification.cs create mode 100644 src/Umbraco.Core/Notifications/RuntimeUnattendedUpgradeNotification.cs delete mode 100644 src/Umbraco.Core/Notifications/UninstallPackageNotification.cs delete mode 100644 src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs delete mode 100644 src/Umbraco.Core/Packaging/PackageExtraction.cs delete mode 100644 src/Umbraco.Core/Packaging/PackageFileInstallation.cs delete mode 100644 src/Umbraco.Core/Packaging/PackageInstallType.cs create mode 100644 src/Umbraco.Core/Packaging/PackageMigrationResource.cs create mode 100644 src/Umbraco.Core/Packaging/PendingPackageMigrations.cs delete mode 100644 src/Umbraco.Core/Packaging/UninstallationSummary.cs delete mode 100644 src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs create mode 100644 src/Umbraco.Infrastructure/Install/UnattendedInstaller.cs create mode 100644 src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs create mode 100644 src/Umbraco.Infrastructure/Packaging/AutomaticPackageMigrationPlan.cs create mode 100644 src/Umbraco.Infrastructure/Packaging/IImportPackageBuilder.cs create mode 100644 src/Umbraco.Infrastructure/Packaging/ImportPackageBuilder.cs create mode 100644 src/Umbraco.Infrastructure/Packaging/ImportPackageBuilderExpression.cs create mode 100644 src/Umbraco.Infrastructure/Packaging/PackageMigrationBase.cs rename src/Umbraco.Infrastructure/{ => Runtime}/RuntimeState.cs (67%) create mode 100644 src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.package.xml delete mode 100644 src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.umb delete mode 100644 src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.zip create mode 100644 src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.package.xml delete mode 100644 src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.zip delete mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PackageExtractionTests.cs delete mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/Packages/Document_Type_Picker_1.1.umb create mode 100644 src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PendingPackageMigrationsTests.cs delete mode 100644 src/Umbraco.Web.BackOffice/Controllers/PackageInstallController.cs delete mode 100644 src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.controller.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.html diff --git a/src/Umbraco.Core/Extensions/RuntimeStateExtensions.cs b/src/Umbraco.Core/Extensions/RuntimeStateExtensions.cs index c3ef7af561..72930b89f8 100644 --- a/src/Umbraco.Core/Extensions/RuntimeStateExtensions.cs +++ b/src/Umbraco.Core/Extensions/RuntimeStateExtensions.cs @@ -11,7 +11,10 @@ namespace Umbraco.Extensions /// /// public static bool EnableInstaller(this IRuntimeState state) - => state.Level == RuntimeLevel.Install || state.Level == RuntimeLevel.Upgrade || state.Level == RuntimeLevel.PackageMigrations; + => state.Level == RuntimeLevel.Install || state.Level == RuntimeLevel.Upgrade; + // TODO: If we want to enable the installer for package migrations, but IMO i think we should do migrations in the back office + // if they are not unattended. + //=> state.Level == RuntimeLevel.Install || state.Level == RuntimeLevel.Upgrade || state.Level == RuntimeLevel.PackageMigrations; /// /// Returns true if Umbraco is greater than diff --git a/src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs b/src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs deleted file mode 100644 index 1370158eff..0000000000 --- a/src/Umbraco.Core/Install/InstallSteps/StarterKitCleanupStep.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Net; -using System.Threading.Tasks; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.Install.Models; - -namespace Umbraco.Cms.Core.Install.InstallSteps -{ - [InstallSetupStep(InstallationType.NewInstall, - "StarterKitCleanup", 32, "Almost done")] - internal class StarterKitCleanupStep : InstallSetupStep - { - private readonly IHostingEnvironment _hostingEnvironment; - - public StarterKitCleanupStep(IHostingEnvironment hostingEnvironment) - { - _hostingEnvironment = hostingEnvironment; - } - - public override Task ExecuteAsync(object model) - { - var installSteps = InstallStatusTracker.GetStatus().ToArray(); - var previousStep = installSteps.Single(x => x.Name == "StarterKitDownload"); - var packageId = Convert.ToInt32(previousStep.AdditionalData["packageId"]); - var packageFile = (string)previousStep.AdditionalData["packageFile"]; - - CleanupInstallation(packageId, packageFile); - - return Task.FromResult(null); - } - - private void CleanupInstallation(int packageId, string packageFile) - { - var zipFile = new FileInfo(Path.Combine(_hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.Packages), WebUtility.UrlDecode(packageFile))); - - if (zipFile.Exists) - zipFile.Delete(); - } - - public override bool RequiresExecution(object model) - { - var installSteps = InstallStatusTracker.GetStatus().ToArray(); - //this step relies on the previous one completed - because it has stored some information we need - if (installSteps.Any(x => x.Name == "StarterKitDownload" && x.AdditionalData.ContainsKey("packageId")) == false) - { - return false; - } - - return true; - } - } -} diff --git a/src/Umbraco.Core/Install/InstallSteps/StarterKitInstallStep.cs b/src/Umbraco.Core/Install/InstallSteps/StarterKitInstallStep.cs deleted file mode 100644 index 00b2ab33e4..0000000000 --- a/src/Umbraco.Core/Install/InstallSteps/StarterKitInstallStep.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.Install.Models; -using Umbraco.Cms.Core.Security; -using Umbraco.Cms.Core.Services; - -namespace Umbraco.Cms.Core.Install.InstallSteps -{ - [InstallSetupStep(InstallationType.NewInstall, - "StarterKitInstall", 31, "", - PerformsAppRestart = true)] - internal class StarterKitInstallStep : InstallSetupStep - { - private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; - private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor; - private readonly IPackagingService _packagingService; - - public StarterKitInstallStep(IUmbracoApplicationLifetime umbracoApplicationLifetime, IBackOfficeSecurityAccessor backofficeSecurityAccessor, IPackagingService packagingService) - { - _umbracoApplicationLifetime = umbracoApplicationLifetime; - _backofficeSecurityAccessor = backofficeSecurityAccessor; - _packagingService = packagingService; - } - - - public override Task ExecuteAsync(object model) - { - var installSteps = InstallStatusTracker.GetStatus().ToArray(); - var previousStep = installSteps.Single(x => x.Name == "StarterKitDownload"); - var packageId = Convert.ToInt32(previousStep.AdditionalData["packageId"]); - - InstallBusinessLogic(packageId); - - _umbracoApplicationLifetime.Restart(); - - - - return Task.FromResult(null); - } - - private void InstallBusinessLogic(int packageId) - { - var definition = _packagingService.GetInstalledPackageById(packageId); - if (definition == null) throw new InvalidOperationException("Not package definition found with id " + packageId); - - var packageFile = new FileInfo(definition.PackagePath); - - _packagingService.InstallCompiledPackageData(definition, packageFile, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(-1)); - } - - public override bool RequiresExecution(object model) - { - var installSteps = InstallStatusTracker.GetStatus().ToArray(); - //this step relies on the previous one completed - because it has stored some information we need - if (installSteps.Any(x => x.Name == "StarterKitDownload" && x.AdditionalData.ContainsKey("packageId")) == false) - { - return false; - } - - return true; - } - } -} diff --git a/src/Umbraco.Core/Migrations/IMigration.cs b/src/Umbraco.Core/Migrations/IMigration.cs index 059ab4f2f5..dbdf2d2449 100644 --- a/src/Umbraco.Core/Migrations/IMigration.cs +++ b/src/Umbraco.Core/Migrations/IMigration.cs @@ -1,11 +1,11 @@ -using Umbraco.Cms.Core.Composing; +using Umbraco.Cms.Core.Composing; namespace Umbraco.Cms.Core.Migrations { /// /// Represents a migration. /// - public interface IMigration : IDiscoverable + public interface IMigration { /// /// Executes the migration. diff --git a/src/Umbraco.Core/Migrations/MigrationPlan.cs b/src/Umbraco.Core/Migrations/MigrationPlan.cs index 05726f8448..8a35e21c67 100644 --- a/src/Umbraco.Core/Migrations/MigrationPlan.cs +++ b/src/Umbraco.Core/Migrations/MigrationPlan.cs @@ -12,7 +12,7 @@ namespace Umbraco.Cms.Core.Migrations /// public class MigrationPlan { - private readonly Dictionary _transitions = new Dictionary(); + private readonly Dictionary _transitions = new Dictionary(StringComparer.InvariantCultureIgnoreCase); private readonly List _postMigrationTypes = new List(); private string _prevState; @@ -95,9 +95,9 @@ namespace Umbraco.Cms.Core.Migrations public MigrationPlan To(string targetState) => To(targetState); - public MigrationPlan To(Guid targetState) => To(targetState.ToString()); + /// /// Adds a transition to a target state through a migration. /// diff --git a/src/Umbraco.Core/Models/LocalPackageInstallModel.cs b/src/Umbraco.Core/Models/LocalPackageInstallModel.cs deleted file mode 100644 index 6cd35ab3d9..0000000000 --- a/src/Umbraco.Core/Models/LocalPackageInstallModel.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; -using Umbraco.Cms.Core.Models.ContentEditing; - -namespace Umbraco.Cms.Core.Models -{ - /// - /// A model that represents uploading a local package - /// - [DataContract(Name = "localPackageInstallModel")] - public class LocalPackageInstallModel : PackageInstallModel, INotificationModel - { - [DataMember(Name = "notifications")] - public List Notifications { get; } = new List(); - - /// - /// A flag to determine if this package is compatible to be installed - /// - [DataMember(Name = "isCompatible")] - public bool IsCompatible { get; set; } - - /// - /// The minimum umbraco version that this package is pinned to - /// - [DataMember(Name = "umbracoVersion")] - public string UmbracoVersion { get; set; } - - [DataMember(Name = "name")] - public string Name { get; set; } - - [DataMember(Name = "url")] - public string Url { get; set; } - - [DataMember(Name = "version")] - public string Version { get; set; } - - /// - /// If this is not null then it means the package is being from this version - /// - [DataMember(Name = "originalVersion")] - public string OriginalVersion { get; set; } - - [DataMember(Name = "containsUnsecureFiles")] - public bool ContainsUnsecureFiles { get; set; } - - [DataMember(Name = "containsTemplateConflicts")] - public bool ContainsTemplateConflicts => ConflictingTemplateAliases != null && ConflictingTemplateAliases.Count > 0; - - [DataMember(Name = "containsStyleSheetConflicts")] - public bool ContainsStyleSheetConflicts => ConflictingStyleSheetNames != null && ConflictingStyleSheetNames.Count > 0; - - [DataMember(Name = "containsMacroConflict")] - public bool ContainsMacroConflict => ConflictingMacroAliases != null && ConflictingMacroAliases.Count > 0; - - /// - /// Key value of name + alias - /// - [DataMember(Name = "conflictingTemplateAliases")] - public IDictionary ConflictingTemplateAliases { get; set; } - - /// - /// Key value of name + alias - /// - [DataMember(Name = "conflictingStyleSheetNames")] - public IDictionary ConflictingStyleSheetNames { get; set; } - - /// - /// Key value of name + alias - /// - [DataMember(Name = "conflictingMacroAliases")] - public IDictionary ConflictingMacroAliases { get; set; } - - [DataMember(Name = "readme")] - public string Readme { get; set; } - - [DataMember(Name = "licenseUrl")] - public string LicenseUrl { get; set; } - - [DataMember(Name = "license")] - public string License { get; set; } - - [DataMember(Name = "authorUrl")] - public string AuthorUrl { get; set; } - - [DataMember(Name = "author")] - public string Author { get; set; } - - [DataMember(Name = "contributors")] - public IList Contributors { get; set; } - - [DataMember(Name = "iconUrl")] - public string IconUrl { get; set; } - } -} diff --git a/src/Umbraco.Core/Models/PackageInstallModel.cs b/src/Umbraco.Core/Models/PackageInstallModel.cs deleted file mode 100644 index e1f61647b5..0000000000 --- a/src/Umbraco.Core/Models/PackageInstallModel.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Runtime.Serialization; - -namespace Umbraco.Cms.Core.Models -{ - [DataContract(Name = "packageInstallModel")] - public class PackageInstallModel - { - [DataMember(Name = "id")] - public int Id { get; set; } - - [DataMember(Name = "packageGuid")] - public Guid PackageGuid { get; set; } - - [DataMember(Name = "zipFileName")] - public string ZipFileName { get; set; } - - /// - /// During installation this can be used to track any pending AppDomain restarts - /// - [DataMember(Name = "isRestarting")] - public bool IsRestarting { get; set; } - - } -} diff --git a/src/Umbraco.Core/Models/PackageInstallResult.cs b/src/Umbraco.Core/Models/PackageInstallResult.cs deleted file mode 100644 index 6e1a7c747e..0000000000 --- a/src/Umbraco.Core/Models/PackageInstallResult.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Runtime.Serialization; - -namespace Umbraco.Cms.Core.Models -{ - /// - /// Model that is returned when a package is totally finished installing - /// - public class PackageInstallResult : PackageInstallModel - { - [DataMember(Name = "postInstallationPath")] - public string PostInstallationPath { get; set; } - } -} diff --git a/src/Umbraco.Core/Models/Packaging/CompiledPackage.cs b/src/Umbraco.Core/Models/Packaging/CompiledPackage.cs index db448a2c0a..5f6c3991a0 100644 --- a/src/Umbraco.Core/Models/Packaging/CompiledPackage.cs +++ b/src/Umbraco.Core/Models/Packaging/CompiledPackage.cs @@ -6,30 +6,13 @@ using System.Xml.Linq; namespace Umbraco.Cms.Core.Models.Packaging { /// - /// The model of the package definition within an umbraco (zip) package file + /// The model of the umbraco package data manifest (xml file) /// - public class CompiledPackage : IPackageInfo + public class CompiledPackage { public FileInfo PackageFile { get; set; } - public string Name { get; set; } - public string Version { get; set; } - public string Url { get; set; } - public string License { get; set; } - public string LicenseUrl { get; set; } - public Version UmbracoVersion { get; set; } - public RequirementsType UmbracoVersionRequirementsType { get; set; } - public string Author { get; set; } - public string AuthorUrl { get; set; } - public IList Contributors { get; set; } - public string Readme { get; set; } - public string PackageView { get; set; } - public string IconUrl { get; set; } - - public PreInstallWarnings Warnings { get; set; } = new PreInstallWarnings(); - - public List Files { get; set; } = new List(); - + public InstallWarnings Warnings { get; set; } = new InstallWarnings(); public IEnumerable Macros { get; set; } // TODO: make strongly typed public IEnumerable Templates { get; set; } // TODO: make strongly typed public IEnumerable Stylesheets { get; set; } // TODO: make strongly typed diff --git a/src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs b/src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs deleted file mode 100644 index c8f1423cbf..0000000000 --- a/src/Umbraco.Core/Models/Packaging/CompiledPackageFile.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Xml.Linq; - -namespace Umbraco.Cms.Core.Models.Packaging -{ - public class CompiledPackageFile - { - public static CompiledPackageFile Create(XElement xml) - { - if (xml.Name.LocalName != "file") - throw new ArgumentException("The xml isn't formatted correctly, a file element is defined by ", nameof(xml)); - return new CompiledPackageFile - { - UniqueFileName = xml.Element("guid")?.Value, - OriginalName = xml.Element("orgName")?.Value, - OriginalPath = xml.Element("orgPath")?.Value - }; - } - - public string OriginalPath { get; set; } - public string UniqueFileName { get; set; } - public string OriginalName { get; set; } - - } -} diff --git a/src/Umbraco.Core/Models/Packaging/IPackageInfo.cs b/src/Umbraco.Core/Models/Packaging/IPackageInfo.cs deleted file mode 100644 index 817ef086c9..0000000000 --- a/src/Umbraco.Core/Models/Packaging/IPackageInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Umbraco.Cms.Core.Models.Packaging -{ - public interface IPackageInfo - { - string Name { get; } - string Version { get; } - string Url { get; } - string License { get; } - string LicenseUrl { get; } - Version UmbracoVersion { get; } - string Author { get; } - string AuthorUrl { get; } - IList Contributors { get; } - string Readme { get; } - - /// - /// This is the angular view path that will be loaded when the package installs - /// - string PackageView { get; } - - string IconUrl { get; } - } -} diff --git a/src/Umbraco.Core/Models/Packaging/PreInstallWarnings.cs b/src/Umbraco.Core/Models/Packaging/InstallWarnings.cs similarity index 63% rename from src/Umbraco.Core/Models/Packaging/PreInstallWarnings.cs rename to src/Umbraco.Core/Models/Packaging/InstallWarnings.cs index 646084bbdf..61e8c5f4c5 100644 --- a/src/Umbraco.Core/Models/Packaging/PreInstallWarnings.cs +++ b/src/Umbraco.Core/Models/Packaging/InstallWarnings.cs @@ -1,13 +1,11 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; namespace Umbraco.Cms.Core.Models.Packaging { - public class PreInstallWarnings - { - public IEnumerable UnsecureFiles { get; set; } = Enumerable.Empty(); - public IEnumerable FilesReplaced { get; set; } = Enumerable.Empty(); + public class InstallWarnings + { // TODO: Shouldn't we detect other conflicting entities too ? public IEnumerable ConflictingMacros { get; set; } = Enumerable.Empty(); public IEnumerable ConflictingTemplates { get; set; } = Enumerable.Empty(); diff --git a/src/Umbraco.Core/Models/Packaging/RequirementsType.cs b/src/Umbraco.Core/Models/Packaging/RequirementsType.cs deleted file mode 100644 index 114c95bfcb..0000000000 --- a/src/Umbraco.Core/Models/Packaging/RequirementsType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Umbraco.Cms.Core.Models.Packaging -{ - public enum RequirementsType - { - Strict, - Legacy - } -} diff --git a/src/Umbraco.Core/Notifications/ImportedPackageNotification.cs b/src/Umbraco.Core/Notifications/ImportedPackageNotification.cs index ada7a0aef9..8f3538d448 100644 --- a/src/Umbraco.Core/Notifications/ImportedPackageNotification.cs +++ b/src/Umbraco.Core/Notifications/ImportedPackageNotification.cs @@ -5,15 +5,11 @@ namespace Umbraco.Cms.Core.Notifications { public class ImportedPackageNotification : StatefulNotification { - - public ImportedPackageNotification(InstallationSummary installationSummary, IPackageInfo packageMetaData) + public ImportedPackageNotification(InstallationSummary installationSummary) { InstallationSummary = installationSummary; - PackageMetaData = packageMetaData; } - public IPackageInfo PackageMetaData { get; } - public InstallationSummary InstallationSummary { get; } } } diff --git a/src/Umbraco.Core/Notifications/ImportingPackageNotification.cs b/src/Umbraco.Core/Notifications/ImportingPackageNotification.cs index d9a8763e3a..7fb6c8f9fc 100644 --- a/src/Umbraco.Core/Notifications/ImportingPackageNotification.cs +++ b/src/Umbraco.Core/Notifications/ImportingPackageNotification.cs @@ -4,16 +4,13 @@ namespace Umbraco.Cms.Core.Notifications { public class ImportingPackageNotification : StatefulNotification, ICancelableNotification { - public ImportingPackageNotification(string packageName, IPackageInfo packageMetaData) + public ImportingPackageNotification(string packageName) { - PackageName = packageName; - PackageMetaData = packageMetaData; + PackageName = packageName; } public string PackageName { get; } - public IPackageInfo PackageMetaData { get; } - public bool Cancel { get; set; } } } diff --git a/src/Umbraco.Core/Notifications/RuntimeUnattendedInstallNotification.cs b/src/Umbraco.Core/Notifications/RuntimeUnattendedInstallNotification.cs new file mode 100644 index 0000000000..f638ec2d3c --- /dev/null +++ b/src/Umbraco.Core/Notifications/RuntimeUnattendedInstallNotification.cs @@ -0,0 +1,13 @@ +namespace Umbraco.Cms.Core.Notifications +{ + /// + /// Used to notify when the core runtime can do an unattended install. + /// + /// + /// It is entirely up to the handler to determine if an unattended installation should occur and + /// to perform the logic. + /// + public class RuntimeUnattendedInstallNotification : INotification + { + } +} diff --git a/src/Umbraco.Core/Notifications/RuntimeUnattendedUpgradeNotification.cs b/src/Umbraco.Core/Notifications/RuntimeUnattendedUpgradeNotification.cs new file mode 100644 index 0000000000..50c02cbad5 --- /dev/null +++ b/src/Umbraco.Core/Notifications/RuntimeUnattendedUpgradeNotification.cs @@ -0,0 +1,25 @@ +namespace Umbraco.Cms.Core.Notifications +{ + /// + /// Used to notify when the core runtime can do an unattended upgrade. + /// + /// + /// It is entirely up to the handler to determine if an unattended upgrade should occur and + /// to perform the logic. + /// + public class RuntimeUnattendedUpgradeNotification : INotification + { + /// + /// Gets/sets the result of the unattended upgrade + /// + public UpgradeResult UnattendedUpgradeResult { get; set; } = UpgradeResult.NotRequired; + + public enum UpgradeResult + { + NotRequired = 0, + HasErrors = 1, + CoreUpgradeComplete = 100, + PackageMigrationComplete = 101 + } + } +} diff --git a/src/Umbraco.Core/Notifications/UninstallPackageNotification.cs b/src/Umbraco.Core/Notifications/UninstallPackageNotification.cs deleted file mode 100644 index de6afc4eb6..0000000000 --- a/src/Umbraco.Core/Notifications/UninstallPackageNotification.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using Umbraco.Cms.Core.Packaging; - -namespace Umbraco.Cms.Core.Notifications -{ - public class UninstallPackageNotification : INotification - { - public UninstallPackageNotification(IEnumerable uninstallationSummary) => UninstallationSummary = uninstallationSummary; - - public IEnumerable UninstallationSummary { get; } - } -} - - diff --git a/src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs b/src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs index f4780c4791..2a4929930e 100644 --- a/src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs +++ b/src/Umbraco.Core/Packaging/CompiledPackageXmlParser.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; -using Microsoft.Extensions.Options; -using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Extensions; @@ -16,46 +13,30 @@ namespace Umbraco.Cms.Core.Packaging public class CompiledPackageXmlParser { private readonly ConflictingPackageData _conflictingPackageData; - private readonly GlobalSettings _globalSettings; - public CompiledPackageXmlParser(ConflictingPackageData conflictingPackageData, IOptions globalSettings) - { - _conflictingPackageData = conflictingPackageData; - _globalSettings = globalSettings.Value; - } + public CompiledPackageXmlParser(ConflictingPackageData conflictingPackageData) => _conflictingPackageData = conflictingPackageData; - public CompiledPackage ToCompiledPackage(XDocument xml, FileInfo packageFile, string applicationRootFolder) + public CompiledPackage ToCompiledPackage(XDocument xml) { - if (xml == null) throw new ArgumentNullException(nameof(xml)); - if (xml.Root == null) throw new ArgumentException(nameof(xml), "The xml document is invalid"); + if (xml is null) + { + throw new ArgumentNullException(nameof(xml)); + } + + if (xml.Root == null) throw new InvalidOperationException("The xml document is invalid"); if (xml.Root.Name != "umbPackage") throw new FormatException("The xml document is invalid"); var info = xml.Root.Element("info"); if (info == null) throw new FormatException("The xml document is invalid"); var package = info.Element("package"); if (package == null) throw new FormatException("The xml document is invalid"); - var author = info.Element("author"); - if (author == null) throw new FormatException("The xml document is invalid"); - var requirements = package.Element("requirements"); - if (requirements == null) throw new FormatException("The xml document is invalid"); - + var def = new CompiledPackage { - PackageFile = packageFile, + // will be null because we don't know where this data is coming from and + // this value is irrelevant during install. + PackageFile = null, Name = package.Element("name")?.Value, - Author = author.Element("name")?.Value, - AuthorUrl = author.Element("website")?.Value, - Contributors = info.Element("contributors")?.Elements("contributor").Select(x => x.Value).ToList() ?? new List(), - Version = package.Element("version")?.Value, - Readme = info.Element("readme")?.Value, - License = package.Element("license")?.Value, - LicenseUrl = package.Element("license")?.AttributeValue("url"), - Url = package.Element("url")?.Value, - IconUrl = package.Element("iconUrl")?.Value, - UmbracoVersion = new Version((int)requirements.Element("major"), (int)requirements.Element("minor"), (int)requirements.Element("patch")), - UmbracoVersionRequirementsType = requirements.AttributeValue("type").IsNullOrWhiteSpace() ? RequirementsType.Legacy : Enum.Parse(requirements.AttributeValue("type"), true), - PackageView = xml.Root.Element("view")?.Value, - Files = xml.Root.Element("files")?.Elements("file")?.Select(CompiledPackageFile.Create).ToList() ?? new List(), Macros = xml.Root.Element("Macros")?.Elements("macro") ?? Enumerable.Empty(), Templates = xml.Root.Element("Templates")?.Elements("Template") ?? Enumerable.Empty(), Stylesheets = xml.Root.Element("Stylesheets")?.Elements("styleSheet") ?? Enumerable.Empty(), @@ -68,84 +49,22 @@ namespace Umbraco.Cms.Core.Packaging Media = xml.Root.Element("MediaItems")?.Elements()?.Select(CompiledPackageContentBase.Create) ?? Enumerable.Empty(), }; - def.Warnings = GetPreInstallWarnings(def, applicationRootFolder); + def.Warnings = GetInstallWarnings(def); return def; } - private PreInstallWarnings GetPreInstallWarnings(CompiledPackage package, string applicationRootFolder) + private InstallWarnings GetInstallWarnings(CompiledPackage package) { - var sourceDestination = ExtractSourceDestinationFileInformation(package.Files); - - var installWarnings = new PreInstallWarnings + var installWarnings = new InstallWarnings { ConflictingMacros = _conflictingPackageData.FindConflictingMacros(package.Macros), ConflictingTemplates = _conflictingPackageData.FindConflictingTemplates(package.Templates), - ConflictingStylesheets = _conflictingPackageData.FindConflictingStylesheets(package.Stylesheets), - UnsecureFiles = FindUnsecureFiles(sourceDestination), - FilesReplaced = FindFilesToBeReplaced(sourceDestination, applicationRootFolder) + ConflictingStylesheets = _conflictingPackageData.FindConflictingStylesheets(package.Stylesheets) }; return installWarnings; } - /// - /// Returns a tuple of the zip file's unique file name and it's application relative path - /// - /// - /// - public (string packageUniqueFile, string appRelativePath)[] ExtractSourceDestinationFileInformation(IEnumerable packageFiles) - { - return packageFiles - .Select(e => - { - var fileName = PrepareAsFilePathElement(e.OriginalName); - var relativeDir = UpdatePathPlaceholders(PrepareAsFilePathElement(e.OriginalPath)); - var relativePath = Path.Combine(relativeDir, fileName); - return (e.UniqueFileName, relativePath); - }).ToArray(); - } - - private IEnumerable FindFilesToBeReplaced(IEnumerable<(string packageUniqueFile, string appRelativePath)> sourceDestination, string applicationRootFolder) - { - return sourceDestination.Where(sd => File.Exists(Path.Combine(applicationRootFolder, sd.appRelativePath))) - .Select(x => x.appRelativePath) - .ToArray(); - } - - private IEnumerable FindUnsecureFiles(IEnumerable<(string packageUniqueFile, string appRelativePath)> sourceDestinationPair) - { - return sourceDestinationPair.Where(sd => IsFileDestinationUnsecure(sd.appRelativePath)) - .Select(x => x.appRelativePath) - .ToList(); - } - - private bool IsFileDestinationUnsecure(string destination) - { - var unsecureDirNames = new[] { "bin", "app_code" }; - if (unsecureDirNames.Any(ud => destination.StartsWith(ud, StringComparison.InvariantCultureIgnoreCase))) - return true; - - string extension = Path.GetExtension(destination); - return extension != null && extension.Equals(".dll", StringComparison.InvariantCultureIgnoreCase); - } - - private static string PrepareAsFilePathElement(string pathElement) - { - return pathElement.TrimStart(new[] { '\\', '/', '~' }).Replace('/', Path.DirectorySeparatorChar); - } - - private string UpdatePathPlaceholders(string path) - { - if (path.Contains("[$")) - { - //this is experimental and undocumented... - path = path.Replace("[$UMBRACO]", _globalSettings.UmbracoPath); - path = path.Replace("[$CONFIG]", Constants.SystemDirectories.Config); - path = path.Replace("[$DATA]", Constants.SystemDirectories.Data); - } - return path; - } - } } diff --git a/src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs b/src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs index c4d36f817f..ba99fdd9a7 100644 --- a/src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs +++ b/src/Umbraco.Core/Packaging/ICreatedPackagesRepository.cs @@ -1,4 +1,4 @@ -namespace Umbraco.Cms.Core.Packaging +namespace Umbraco.Cms.Core.Packaging { /// /// Manages the storage of created package definitions diff --git a/src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs b/src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs deleted file mode 100644 index 399e79d6d3..0000000000 --- a/src/Umbraco.Core/Packaging/IInstalledPackagesRepository.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Cms.Core.Packaging -{ - /// - /// Manages the storage of installed package definitions - /// - public interface IInstalledPackagesRepository : IPackageDefinitionRepository - { - } -} diff --git a/src/Umbraco.Core/Packaging/IPackageInstallation.cs b/src/Umbraco.Core/Packaging/IPackageInstallation.cs index ca2f9a9397..8dbba39133 100644 --- a/src/Umbraco.Core/Packaging/IPackageInstallation.cs +++ b/src/Umbraco.Core/Packaging/IPackageInstallation.cs @@ -1,19 +1,11 @@ -using System.Collections.Generic; using System.IO; +using System.Xml.Linq; using Umbraco.Cms.Core.Models.Packaging; namespace Umbraco.Cms.Core.Packaging { public interface IPackageInstallation { - /// - /// This will run the uninstall sequence for this - /// - /// - /// - /// - UninstallationSummary UninstallPackage(PackageDefinition packageDefinition, int userId); - /// /// Installs a packages data and entities /// @@ -21,22 +13,18 @@ namespace Umbraco.Cms.Core.Packaging /// /// /// - InstallationSummary InstallPackageData(PackageDefinition packageDefinition, CompiledPackage compiledPackage, int userId); + // TODO: The resulting PackageDefinition is only if we wanted to persist what was saved during package data installation. + // This used to be for the installedPackages.config but we don't have that anymore and don't really want it if we can help it. + // Possibly, we could continue to persist that file so that you could uninstall package data for an installed package in the + // back office (but it won't actually uninstall the package until you do that via nuget). If we want that functionality we'll have + // to restore a bunch of deleted code. + InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId, out PackageDefinition packageDefinition); /// - /// Installs a packages files - /// - /// - /// - /// - /// - IEnumerable InstallPackageFiles(PackageDefinition packageDefinition, CompiledPackage compiledPackage, int userId); - - /// - /// Reads the package (zip) file and returns the model + /// Reads the package xml and returns the model /// /// /// - CompiledPackage ReadPackage(FileInfo packageFile); + CompiledPackage ReadPackage(XDocument packageXmlFile); } } diff --git a/src/Umbraco.Core/Packaging/InstallationSummary.cs b/src/Umbraco.Core/Packaging/InstallationSummary.cs index 8070f1dfa8..fa906ad1cc 100644 --- a/src/Umbraco.Core/Packaging/InstallationSummary.cs +++ b/src/Umbraco.Core/Packaging/InstallationSummary.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; +using System.Text; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Packaging; @@ -11,19 +12,90 @@ namespace Umbraco.Cms.Core.Packaging [DataContract(IsReference = true)] public class InstallationSummary { - public IPackageInfo MetaData { get; set; } + public InstallationSummary(string packageName) + { + PackageName = packageName; + } + + public InstallWarnings Warnings { get; set; } = new InstallWarnings(); + public IEnumerable DataTypesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable LanguagesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable DictionaryItemsInstalled { get; set; } = Enumerable.Empty(); public IEnumerable MacrosInstalled { get; set; } = Enumerable.Empty(); - public IEnumerable FilesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable TemplatesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable DocumentTypesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable MediaTypesInstalled { get; set; } = Enumerable.Empty(); public IEnumerable StylesheetsInstalled { get; set; } = Enumerable.Empty(); public IEnumerable ContentInstalled { get; set; } = Enumerable.Empty(); public IEnumerable MediaInstalled { get; set; } = Enumerable.Empty(); - + public string PackageName { get; } + + public override string ToString() + { + var sb = new StringBuilder(); + var macroConflicts = Warnings.ConflictingMacros.ToList(); + if (macroConflicts.Count > 0) + { + sb.Append("Conflicting macros found, they will be overwritten:"); + foreach(IMacro m in macroConflicts) + { + sb.Append(m.Alias); + sb.Append(','); + } + sb.AppendLine(". "); + } + var templateConflicts = Warnings.ConflictingTemplates.ToList(); + if (templateConflicts.Count > 0) + { + sb.Append("Conflicting templates found, they will be overwritten:"); + foreach (IMacro m in templateConflicts) + { + sb.Append(m.Alias); + sb.Append(','); + } + sb.AppendLine(". "); + } + var stylesheetConflicts = Warnings.ConflictingStylesheets.ToList(); + if (stylesheetConflicts.Count > 0) + { + sb.Append("Conflicting stylesheets found, they will be overwritten:"); + foreach (IMacro m in stylesheetConflicts) + { + sb.Append(m.Alias); + sb.Append(','); + } + sb.AppendLine(". "); + } + + sb.Append("Content items installed: "); + sb.Append(ContentInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Media items installed: "); + sb.Append(MediaInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Dictionary items installed: "); + sb.Append(DictionaryItemsInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Macros installed: "); + sb.Append(MacrosInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Stylesheets installed: "); + sb.Append(StylesheetsInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Templates installed: "); + sb.Append(TemplatesInstalled.Count()); + sb.AppendLine(); + sb.Append("Document types installed: "); + sb.Append(DocumentTypesInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Media types installed: "); + sb.Append(MediaTypesInstalled.Count()); + sb.AppendLine(". "); + sb.Append("Data types items installed: "); + sb.Append(DataTypesInstalled.Count()); + return sb.ToString(); + } } } diff --git a/src/Umbraco.Core/Packaging/PackageDefinition.cs b/src/Umbraco.Core/Packaging/PackageDefinition.cs index 6d8cc7b449..41f407237c 100644 --- a/src/Umbraco.Core/Packaging/PackageDefinition.cs +++ b/src/Umbraco.Core/Packaging/PackageDefinition.cs @@ -2,41 +2,15 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; -using System.Linq; using System.Runtime.Serialization; using Umbraco.Cms.Core.Models.Packaging; namespace Umbraco.Cms.Core.Packaging { + // This is the thing that goes in the createdPackages.config [DataContract(Name = "packageInstance")] - public class PackageDefinition : IPackageInfo + public class PackageDefinition { - /// - /// Converts a model to a model - /// - /// - /// - /// - /// This is used only for conversions and will not 'get' a PackageDefinition from the repository with a valid ID - /// - public static PackageDefinition FromCompiledPackage(CompiledPackage compiled) - => new PackageDefinition - { - Author = compiled.Author, - AuthorUrl = compiled.AuthorUrl, - Contributors = compiled.Contributors, - PackageView = compiled.PackageView, - IconUrl = compiled.IconUrl, - License = compiled.License, - LicenseUrl = compiled.LicenseUrl, - Name = compiled.Name, - Readme = compiled.Readme, - UmbracoVersion = compiled.UmbracoVersion, - Url = compiled.Url, - Version = compiled.Version, - Files = compiled.Files.Select(x => x.OriginalPath).ToList() - }; - [DataMember(Name = "id")] public int Id { get; set; } @@ -47,49 +21,13 @@ namespace Umbraco.Cms.Core.Packaging [Required] public string Name { get; set; } = string.Empty; - [DataMember(Name = "url")] - [Required] - [Url] - public string Url { get; set; } = string.Empty; - /// - /// The full path to the package's zip file when it was installed (or is being installed) + /// The full path to the package's xml file /// [ReadOnly(true)] [DataMember(Name = "packagePath")] public string PackagePath { get; set; } = string.Empty; - [DataMember(Name = "version")] - [Required] - public string Version { get; set; } = "1.0.0"; - - /// - /// The minimum umbraco version that this package requires - /// - [DataMember(Name = "umbracoVersion")] - public Version UmbracoVersion { get; set; } - - [DataMember(Name = "author")] - [Required] - public string Author { get; set; } = string.Empty; - - [DataMember(Name = "authorUrl")] - [Required] - [Url] - public string AuthorUrl { get; set; } = string.Empty; - - [DataMember(Name = "contributors")] - public IList Contributors { get; set; } = new List(); - - [DataMember(Name = "license")] - public string License { get; set; } = "MIT License"; - - [DataMember(Name = "licenseUrl")] - public string LicenseUrl { get; set; } = "http://opensource.org/licenses/MIT"; - - [DataMember(Name = "readme")] - public string Readme { get; set; } = string.Empty; - [DataMember(Name = "contentLoadChildNodes")] public bool ContentLoadChildNodes { get; set; } @@ -117,22 +55,9 @@ namespace Umbraco.Cms.Core.Packaging [DataMember(Name = "stylesheets")] public IList Stylesheets { get; set; } = new List(); - [DataMember(Name = "files")] - public IList Files { get; set; } = new List(); - - /// - [DataMember(Name = "packageView")] - public string PackageView { get; set; } = string.Empty; - - [DataMember(Name = "actions")] - public string Actions { get; set; } = ""; - [DataMember(Name = "dataTypes")] public IList DataTypes { get; set; } = new List(); - [DataMember(Name = "iconUrl")] - public string IconUrl { get; set; } = string.Empty; - [DataMember(Name = "mediaUdis")] public IList MediaUdis { get; set; } = Array.Empty(); diff --git a/src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs b/src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs index dc62bc84f6..69c109aee4 100644 --- a/src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs +++ b/src/Umbraco.Core/Packaging/PackageDefinitionXmlParser.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Xml.Linq; -using Microsoft.Extensions.Logging; -using Umbraco.Cms.Core.Configuration; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Packaging @@ -13,37 +12,19 @@ namespace Umbraco.Cms.Core.Packaging /// public class PackageDefinitionXmlParser { - private readonly ILogger _logger; - private readonly IUmbracoVersion _umbracoVersion; - - public PackageDefinitionXmlParser(ILogger logger, IUmbracoVersion umbracoVersion) - { - _logger = logger; - _umbracoVersion = umbracoVersion; - } - public PackageDefinition ToPackageDefinition(XElement xml) { - if (xml == null) return null; + if (xml == null) + { + return null; + } var retVal = new PackageDefinition { Id = xml.AttributeValue("id"), Name = xml.AttributeValue("name") ?? string.Empty, PackagePath = xml.AttributeValue("packagePath") ?? string.Empty, - Version = xml.AttributeValue("version") ?? string.Empty, - Url = xml.AttributeValue("url") ?? string.Empty, PackageId = xml.AttributeValue("packageGuid"), - IconUrl = xml.AttributeValue("iconUrl") ?? string.Empty, - UmbracoVersion = xml.AttributeValue("umbVersion"), - PackageView = xml.AttributeValue("view") ?? string.Empty, - License = xml.Element("license")?.Value ?? string.Empty, - LicenseUrl = xml.Element("license")?.AttributeValue("url") ?? string.Empty, - Author = xml.Element("author")?.Value ?? string.Empty, - AuthorUrl = xml.Element("author")?.AttributeValue("url") ?? string.Empty, - Contributors = xml.Element("contributors")?.Elements("contributor").Select(x => x.Value).ToList() ?? new List(), - Readme = xml.Element("readme")?.Value ?? string.Empty, - Actions = xml.Element("actions")?.ToString(SaveOptions.None) ?? "", //take the entire outer xml value ContentNodeId = xml.Element("content")?.AttributeValue("nodeId") ?? string.Empty, ContentLoadChildNodes = xml.Element("content")?.AttributeValue("loadChildNodes") ?? false, MediaUdis = xml.Element("media")?.Elements("nodeUdi").Select(x => (GuidUdi)UdiParser.Parse(x.Value)).ToList() ?? new List(), @@ -56,7 +37,6 @@ namespace Umbraco.Cms.Core.Packaging Languages = xml.Element("languages")?.Value.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(), DictionaryItems = xml.Element("dictionaryitems")?.Value.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(), DataTypes = xml.Element("datatypes")?.Value.Split(Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries).ToList() ?? new List(), - Files = xml.Element("files")?.Elements("file").Select(x => x.Value).ToList() ?? new List() }; return retVal; @@ -64,39 +44,11 @@ namespace Umbraco.Cms.Core.Packaging public XElement ToXml(PackageDefinition def) { - var actionsXml = new XElement("actions"); - try - { - actionsXml = XElement.Parse(def.Actions); - } - catch (Exception e) - { - _logger.LogWarning(e, "Could not add package actions to the package xml definition, the xml did not parse"); - } - var packageXml = new XElement("package", new XAttribute("id", def.Id), - new XAttribute("version", def.Version ?? string.Empty), - new XAttribute("url", def.Url ?? string.Empty), new XAttribute("name", def.Name ?? string.Empty), new XAttribute("packagePath", def.PackagePath ?? string.Empty), - new XAttribute("iconUrl", def.IconUrl ?? string.Empty), - new XAttribute("umbVersion", def.UmbracoVersion ?? _umbracoVersion.Version), new XAttribute("packageGuid", def.PackageId), - new XAttribute("view", def.PackageView ?? string.Empty), - - new XElement("license", - new XCData(def.License ?? string.Empty), - new XAttribute("url", def.LicenseUrl ?? string.Empty)), - - new XElement("author", - new XCData(def.Author ?? string.Empty), - new XAttribute("url", def.AuthorUrl ?? string.Empty)), - - new XElement("contributors", (def.Contributors ?? Array.Empty()).Where(x => !x.IsNullOrWhiteSpace()).Select(x => new XElement("contributor", x))), - - new XElement("readme", new XCData(def.Readme ?? string.Empty)), - actionsXml, new XElement("datatypes", string.Join(",", def.DataTypes ?? Array.Empty())), new XElement("content", @@ -108,14 +60,13 @@ namespace Umbraco.Cms.Core.Packaging new XElement("documentTypes", string.Join(",", def.DocumentTypes ?? Array.Empty())), new XElement("mediaTypes", string.Join(",", def.MediaTypes ?? Array.Empty())), new XElement("macros", string.Join(",", def.Macros ?? Array.Empty())), - new XElement("files", (def.Files ?? Array.Empty()).Where(x => !x.IsNullOrWhiteSpace()).Select(x => new XElement("file", x))), new XElement("languages", string.Join(",", def.Languages ?? Array.Empty())), new XElement("dictionaryitems", string.Join(",", def.DictionaryItems ?? Array.Empty())), new XElement( "media", - def.MediaUdis.Select(x=> (object)new XElement("nodeUdi", x)) - .Union(new []{new XAttribute("loadChildNodes", def.MediaLoadChildNodes) })) + def.MediaUdis.Select(x => (object)new XElement("nodeUdi", x)) + .Union(new[] { new XAttribute("loadChildNodes", def.MediaLoadChildNodes) })) ); return packageXml; } diff --git a/src/Umbraco.Core/Packaging/PackageExtraction.cs b/src/Umbraco.Core/Packaging/PackageExtraction.cs deleted file mode 100644 index fddf9f4d1a..0000000000 --- a/src/Umbraco.Core/Packaging/PackageExtraction.cs +++ /dev/null @@ -1,186 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; -using Umbraco.Extensions; - -namespace Umbraco.Cms.Core.Packaging -{ - public class PackageExtraction - { - public string ReadTextFileFromArchive(FileInfo packageFile, string fileToRead, out string directoryInPackage) - { - string retVal = null; - bool fileFound = false; - string foundDir = null; - - ReadZipfileEntries(packageFile, entry => - { - string fileName = Path.GetFileName(entry.Name); - - if (string.IsNullOrEmpty(fileName) == false && fileName.Equals(fileToRead, StringComparison.CurrentCultureIgnoreCase)) - { - - foundDir = entry.Name.Substring(0, entry.Name.Length - fileName.Length); - fileFound = true; - using (var entryStream = entry.Open()) - using (var reader = new StreamReader(entryStream)) - { - retVal = reader.ReadToEnd(); - return false; - } - } - return true; - }); - - if (fileFound == false) - { - directoryInPackage = null; - throw new FileNotFoundException($"Could not find file in package {packageFile}", fileToRead); - } - directoryInPackage = foundDir; - return retVal; - } - - private static void CheckPackageExists(FileInfo packageFile) - { - if (packageFile == null) throw new ArgumentNullException(nameof(packageFile)); - - if (!packageFile.Exists) - throw new ArgumentException($"Package file: {packageFile} could not be found"); - - var extension = packageFile.Extension; - - var alowedExtension = new[] { ".umb", ".zip" }; - - // Check if the file is a valid package - if (alowedExtension.All(ae => ae.InvariantEquals(extension) == false)) - { - throw new ArgumentException("Error - file isn't a package. only extensions: \"{string.Join(", ", alowedExtension)}\" is allowed"); - } - } - - public void CopyFileFromArchive(FileInfo packageFile, string fileInPackageName, string destinationfilePath) - { - CopyFilesFromArchive(packageFile, new[] {(fileInPackageName, destinationfilePath)}); - } - - public void CopyFilesFromArchive(FileInfo packageFile, IEnumerable<(string packageUniqueFile, string appAbsolutePath)> sourceDestination) - { - var d = sourceDestination.ToDictionary(k => k.packageUniqueFile.ToLower(), v => v.appAbsolutePath); - - - ReadZipfileEntries(packageFile, entry => - { - var fileName = (Path.GetFileName(entry.Name) ?? string.Empty).ToLower(); - if (fileName == string.Empty) { return true; } - - if (string.IsNullOrEmpty(fileName) == false && d.TryGetValue(fileName, out var destination)) - { - //ensure the dir exists - Directory.CreateDirectory(Path.GetDirectoryName(destination)); - - using (var streamWriter = File.Open(destination, FileMode.Create)) - using (var entryStream = entry.Open()) - { - entryStream.CopyTo(streamWriter); - } - - d.Remove(fileName); - return d.Any(); - } - return true; - }); - - if (d.Any()) - { - throw new ArgumentException(string.Format("The following source file(s): \"{0}\" could not be found in archive: \"{1}\"", string.Join("\", \"",d.Keys), packageFile)); - } - } - - public IEnumerable FindMissingFiles(FileInfo packageFile, IEnumerable expectedFiles) - { - var retVal = expectedFiles.ToList(); - - ReadZipfileEntries(packageFile, zipEntry => - { - string fileName = Path.GetFileName(zipEntry.Name); - - int index = retVal.FindIndex(f => f.Equals(fileName, StringComparison.InvariantCultureIgnoreCase)); - - if (index != -1) { retVal.RemoveAt(index); } - - return retVal.Any(); - }); - return retVal; - - } - - public IEnumerable FindDuplicateFileNames(FileInfo packageFile) - { - var dictionary = new Dictionary>(); - - - ReadZipfileEntries(packageFile, entry => - { - var fileName = (Path.GetFileName(entry.Name) ?? string.Empty).ToLower(); - - if (dictionary.TryGetValue(fileName, out var list) == false) - { - list = new List(); - dictionary.Add(fileName, list); - } - - list.Add(entry.Name); - - return true; - }); - - return dictionary.Values.Where(v => v.Count > 1).SelectMany(v => v); - } - - public IEnumerable ReadFilesFromArchive(FileInfo packageFile, IEnumerable filesToGet) - { - CheckPackageExists(packageFile); - - var files = new HashSet(filesToGet.Select(f => f.ToLowerInvariant())); - - using (var fs = packageFile.OpenRead()) - using (var zipArchive = new ZipArchive(fs)) - { - foreach (var zipEntry in zipArchive.Entries) - { - if (zipEntry.Name.IsNullOrWhiteSpace() && zipEntry.FullName.EndsWith("/")) continue; - - if (files.Contains(zipEntry.Name.ToLowerInvariant())) - { - using (var memStream = new MemoryStream()) - using (var entryStream = zipEntry.Open()) - { - entryStream.CopyTo(memStream); - memStream.Close(); - yield return memStream.ToArray(); - } - } - } - } - } - - private void ReadZipfileEntries(FileInfo packageFile, Func entryFunc, bool skipsDirectories = true) - { - CheckPackageExists(packageFile); - - using (var fs = packageFile.OpenRead()) - using (var zipArchive = new ZipArchive(fs)) - { - foreach (var zipEntry in zipArchive.Entries) - { - if (zipEntry.Name.IsNullOrWhiteSpace() && zipEntry.FullName.EndsWith("/") && skipsDirectories) - continue; - if (entryFunc(zipEntry) == false) break; - } - } - } - } -} diff --git a/src/Umbraco.Core/Packaging/PackageFileInstallation.cs b/src/Umbraco.Core/Packaging/PackageFileInstallation.cs deleted file mode 100644 index c9feccb6b5..0000000000 --- a/src/Umbraco.Core/Packaging/PackageFileInstallation.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.IO; -using Umbraco.Cms.Core.Logging; -using Umbraco.Cms.Core.Models.Packaging; -using File = System.IO.File; -using Umbraco.Extensions; - -namespace Umbraco.Cms.Core.Packaging -{ - /// - /// Installs package files - /// - public class PackageFileInstallation - { - private readonly CompiledPackageXmlParser _parser; - private readonly IIOHelper _ioHelper; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly IProfilingLogger _logger; - private readonly PackageExtraction _packageExtraction; - - public PackageFileInstallation(CompiledPackageXmlParser parser, IIOHelper ioHelper, IHostingEnvironment hostingEnvironment, IProfilingLogger logger) - { - _parser = parser; - _ioHelper = ioHelper; - _hostingEnvironment = hostingEnvironment; - _logger = logger; - _packageExtraction = new PackageExtraction(); - } - - /// - /// Returns a list of all installed file paths - /// - /// - /// - /// - /// The absolute path of where to extract the package files (normally the application root) - /// - /// - public IEnumerable InstallFiles(CompiledPackage compiledPackage, FileInfo packageFile, string targetRootFolder) - { - using (_logger.DebugDuration( - "Installing package files for package " + compiledPackage.Name, - "Package file installation complete for package " + compiledPackage.Name)) - { - var sourceAndRelativeDest = _parser.ExtractSourceDestinationFileInformation(compiledPackage.Files); - var sourceAndAbsDest = AppendRootToDestination(targetRootFolder, sourceAndRelativeDest); - - _packageExtraction.CopyFilesFromArchive(packageFile, sourceAndAbsDest); - - return sourceAndRelativeDest.Select(sd => sd.appRelativePath).ToArray(); - } - } - - public IEnumerable UninstallFiles(PackageDefinition package) - { - var removedFiles = new List(); - - foreach (var item in package.Files.ToArray()) - { - removedFiles.Add(_ioHelper.GetRelativePath(item)); - - //here we need to try to find the file in question as most packages does not support the tilde char - var file = _ioHelper.FindFile(item); - if (file != null) - { - file = file.EnsureStartsWith("/"); - var filePath = _hostingEnvironment.MapPathContentRoot(file); - - if (File.Exists(filePath)) - File.Delete(filePath); - - } - package.Files.Remove(file); - } - - return removedFiles; - } - - private static IEnumerable<(string packageUniqueFile, string appAbsolutePath)> AppendRootToDestination(string applicationRootFolder, IEnumerable<(string packageUniqueFile, string appRelativePath)> sourceDestination) - { - return - sourceDestination.Select( - sd => (sd.packageUniqueFile, Path.Combine(applicationRootFolder, sd.appRelativePath))).ToArray(); - } - } -} diff --git a/src/Umbraco.Core/Packaging/PackageInstallType.cs b/src/Umbraco.Core/Packaging/PackageInstallType.cs deleted file mode 100644 index 0c6abbc9f9..0000000000 --- a/src/Umbraco.Core/Packaging/PackageInstallType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Umbraco.Cms.Core.Packaging -{ - public enum PackageInstallType - { - AlreadyInstalled, - NewInstall, - Upgrade - } -} diff --git a/src/Umbraco.Core/Packaging/PackageMigrationPlan.cs b/src/Umbraco.Core/Packaging/PackageMigrationPlan.cs index 576fbdc343..97cdcafba6 100644 --- a/src/Umbraco.Core/Packaging/PackageMigrationPlan.cs +++ b/src/Umbraco.Core/Packaging/PackageMigrationPlan.cs @@ -1,11 +1,11 @@ using System; -using System.Collections.Generic; -using System.Text; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Migrations; +using Umbraco.Extensions; namespace Umbraco.Cms.Core.Packaging -{ +{ + /// /// Base class for package migration plans /// @@ -20,5 +20,6 @@ namespace Umbraco.Cms.Core.Packaging } protected abstract void DefinePlan(); + } } diff --git a/src/Umbraco.Core/Packaging/PackageMigrationResource.cs b/src/Umbraco.Core/Packaging/PackageMigrationResource.cs new file mode 100644 index 0000000000..82cdb31427 --- /dev/null +++ b/src/Umbraco.Core/Packaging/PackageMigrationResource.cs @@ -0,0 +1,28 @@ +using System; +using System.IO; +using System.Reflection; +using System.Xml.Linq; + +namespace Umbraco.Cms.Core.Packaging +{ + public static class PackageMigrationResource + { + public static XDocument GetEmbeddedPackageDataManifest(Type planType) + { + // lookup the embedded resource by convention + Assembly currentAssembly = planType.Assembly; + var fileName = $"{planType.Namespace}.package.xml"; + Stream stream = currentAssembly.GetManifestResourceStream(fileName); + if (stream == null) + { + throw new FileNotFoundException("Cannot find the embedded file.", fileName); + } + XDocument xml; + using (stream) + { + xml = XDocument.Load(stream); + } + return xml; + } + } +} diff --git a/src/Umbraco.Core/Packaging/PackagesRepository.cs b/src/Umbraco.Core/Packaging/PackagesRepository.cs index 904f73ab93..6fbca7f98b 100644 --- a/src/Umbraco.Core/Packaging/PackagesRepository.cs +++ b/src/Umbraco.Core/Packaging/PackagesRepository.cs @@ -1,17 +1,14 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; -using System.IO.Compression; using System.Linq; using System.Xml.Linq; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Cms.Core.Services; using Umbraco.Extensions; using File = System.IO.File; @@ -21,7 +18,7 @@ namespace Umbraco.Cms.Core.Packaging /// /// Manages the storage of installed/created package definitions /// - public class PackagesRepository : ICreatedPackagesRepository, IInstalledPackagesRepository + public class PackagesRepository : ICreatedPackagesRepository { private readonly IContentService _contentService; private readonly IContentTypeService _contentTypeService; @@ -30,15 +27,12 @@ namespace Umbraco.Cms.Core.Packaging private readonly IMacroService _macroService; private readonly ILocalizationService _languageService; private readonly IEntityXmlSerializer _serializer; - private readonly ILoggerFactory _loggerFactory; - private readonly ILogger _logger; private readonly IHostingEnvironment _hostingEnvironment; private readonly string _packageRepositoryFileName; private readonly string _mediaFolderPath; private readonly string _packagesFolderPath; private readonly string _tempFolderPath; private readonly PackageDefinitionXmlParser _parser; - private readonly IUmbracoVersion _umbracoVersion; private readonly IMediaService _mediaService; private readonly IMediaTypeService _mediaTypeService; @@ -60,18 +54,22 @@ namespace Umbraco.Cms.Core.Packaging /// /// /// - public PackagesRepository(IContentService contentService, IContentTypeService contentTypeService, - IDataTypeService dataTypeService, IFileService fileService, IMacroService macroService, + public PackagesRepository( + IContentService contentService, + IContentTypeService contentTypeService, + IDataTypeService dataTypeService, + IFileService fileService, + IMacroService macroService, ILocalizationService languageService, IHostingEnvironment hostingEnvironment, IEntityXmlSerializer serializer, - ILoggerFactory loggerFactory, - IUmbracoVersion umbracoVersion, IOptions globalSettings, IMediaService mediaService, IMediaTypeService mediaTypeService, string packageRepositoryFileName, - string tempFolderPath = null, string packagesFolderPath = null, string mediaFolderPath = null) + string tempFolderPath = null, + string packagesFolderPath = null, + string mediaFolderPath = null) { if (string.IsNullOrWhiteSpace(packageRepositoryFileName)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageRepositoryFileName)); _contentService = contentService; @@ -81,8 +79,6 @@ namespace Umbraco.Cms.Core.Packaging _macroService = macroService; _languageService = languageService; _serializer = serializer; - _loggerFactory = loggerFactory; - _logger = _loggerFactory.CreateLogger(); _hostingEnvironment = hostingEnvironment; _packageRepositoryFileName = packageRepositoryFileName; @@ -90,8 +86,7 @@ namespace Umbraco.Cms.Core.Packaging _packagesFolderPath = packagesFolderPath ?? Constants.SystemDirectories.Packages; _mediaFolderPath = mediaFolderPath ?? globalSettings.Value.UmbracoMediaPath + "/created-packages"; - _parser = new PackageDefinitionXmlParser(_loggerFactory.CreateLogger(), umbracoVersion); - _umbracoVersion = umbracoVersion; + _parser = new PackageDefinitionXmlParser(); _mediaService = mediaService; _mediaTypeService = mediaTypeService; } @@ -110,7 +105,7 @@ namespace Umbraco.Cms.Core.Packaging public PackageDefinition GetById(int id) { - var packagesXml = EnsureStorage(out _); + var packagesXml = EnsureStorage(out var packageFile); var packageXml = packagesXml?.Root?.Elements("package").FirstOrDefault(x => x.AttributeValue("id") == id); return packageXml == null ? null : _parser.ToPackageDefinition(packageXml); } @@ -176,77 +171,56 @@ namespace Umbraco.Cms.Core.Packaging //Create a folder for building this package var temporaryPath = _hostingEnvironment.MapPathContentRoot(_tempFolderPath.EnsureEndsWith('/') + Guid.NewGuid()); if (Directory.Exists(temporaryPath) == false) + { Directory.CreateDirectory(temporaryPath); + } try { //Init package file - var compiledPackageXml = CreateCompiledPackageXml(out var root, out var filesXml); + var compiledPackageXml = CreateCompiledPackageXml(out var root); //Info section - root.Add(GetPackageInfoXml(definition, _umbracoVersion)); + root.Add(GetPackageInfoXml(definition)); PackageDocumentsAndTags(definition, root); PackageDocumentTypes(definition, root); PackageMediaTypes(definition, root); PackageTemplates(definition, root); PackageStylesheets(definition, root); - PackageMacros(definition, root, filesXml, temporaryPath); + PackageMacros(definition, root); PackageDictionaryItems(definition, root); PackageLanguages(definition, root); PackageDataTypes(definition, root); PackageMedia(definition, root); - - // TODO: This needs to be split into content vs web files, for now we are going to - // assume all files are web (www) files. But this is a larger discussion/change since - // we will actually need to modify how packages and files are organized. - - //Files - foreach (var fileName in definition.Files) - AppendFileToPackage(fileName, temporaryPath, filesXml); - - //Load view on install... - if (!string.IsNullOrEmpty(definition.PackageView)) - { - var control = new XElement("view", definition.PackageView); - AppendFileToPackage(definition.PackageView, temporaryPath, filesXml); - root.Add(control); - } - - //Actions - if (string.IsNullOrEmpty(definition.Actions) == false) - { - var actionsXml = new XElement("Actions"); - try - { - //this will be formatted like a full xml block like ... and we want the child nodes - var parsed = XElement.Parse(definition.Actions); - actionsXml.Add(parsed.Elements()); - root.Add(actionsXml); - } - catch (Exception e) - { - _logger.LogWarning(e, "Could not add package actions to the package, the xml did not parse"); - } - } - var packageXmlFileName = temporaryPath + "/package.xml"; if (File.Exists(packageXmlFileName)) + { File.Delete(packageXmlFileName); + } compiledPackageXml.Save(packageXmlFileName); // check if there's a packages directory below media - if (Directory.Exists(_hostingEnvironment.MapPathWebRoot(_mediaFolderPath)) == false) - Directory.CreateDirectory(_hostingEnvironment.MapPathWebRoot(_mediaFolderPath)); + var directoryName = + _hostingEnvironment.MapPathWebRoot(Path.Combine(_mediaFolderPath, definition.Name.Replace(' ', '_'))); - var packPath = _mediaFolderPath.EnsureEndsWith('/') + (definition.Name + "_" + definition.Version).Replace(' ', '_') + ".zip"; - ZipPackage(temporaryPath, _hostingEnvironment.MapPathWebRoot(packPath)); + if (Directory.Exists(directoryName) == false) + { + Directory.CreateDirectory(directoryName); + } + + var packPath = Path.Combine(directoryName, "package.xml"); + + if (File.Exists(packPath)) + { + File.Delete(packPath); + } + File.Move(packageXmlFileName, packPath); - //we need to update the package path and save it definition.PackagePath = packPath; SavePackage(definition); @@ -308,7 +282,7 @@ namespace Umbraco.Cms.Core.Packaging root.Add(dictionaryItems); } - private void PackageMacros(PackageDefinition definition, XContainer root, XContainer filesXml, string temporaryPath) + private void PackageMacros(PackageDefinition definition, XContainer root) { var macros = new XElement("Macros"); foreach (var macroId in definition.Macros) @@ -317,10 +291,7 @@ namespace Umbraco.Cms.Core.Packaging var macroXml = GetMacroXml(outInt, out var macro); if (macroXml == null) continue; - macros.Add(macroXml); - //if the macro has a file copy it to the xml - if (!string.IsNullOrEmpty(macro.MacroSource)) - AppendFileToPackage(macro.MacroSource, temporaryPath, filesXml); + macros.Add(macroXml); } root.Add(macros); } @@ -480,76 +451,8 @@ namespace Umbraco.Cms.Core.Packaging medias.Select(x => new XElement("MediaSet", _serializer.Serialize(x, definition.MediaLoadChildNodes))))); } - + // TODO: Delete this /// - /// Zips the package. - /// - /// The path. - /// The save path. - private static void ZipPackage(string path, string savePath) - { - if (File.Exists(savePath)) - File.Delete(savePath); - ZipFile.CreateFromDirectory(path, savePath); - } - - /// - /// Appends a file to package and copies the file to the correct folder. - /// - /// The path. - /// The package directory. - /// The files xml node - /// true if it's a web file, false if it's a content file - private void AppendFileToPackage(string path, string packageDirectory, XContainer filesXml) - { - if (!path.StartsWith("~/") && !path.StartsWith("/")) - path = "~/" + path; - - var serverPath = _hostingEnvironment.MapPathContentRoot(path); - - if (File.Exists(serverPath)) - AppendFileXml(new FileInfo(serverPath), path, packageDirectory, filesXml); - else if (Directory.Exists(serverPath)) - ProcessDirectory(new DirectoryInfo(serverPath), path, packageDirectory, filesXml); - } - - //Process files in directory and add them to package - private static void ProcessDirectory(DirectoryInfo directory, string dirPath, string packageDirectory, XContainer filesXml) - { - if (directory == null) throw new ArgumentNullException(nameof(directory)); - if (string.IsNullOrWhiteSpace(packageDirectory)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageDirectory)); - if (string.IsNullOrWhiteSpace(dirPath)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(dirPath)); - if (!directory.Exists) return; - - foreach (var file in directory.GetFiles()) - AppendFileXml(new FileInfo(Path.Combine(directory.FullName, file.Name)), dirPath + "/" + file.Name, packageDirectory, filesXml); - - foreach (var dir in directory.GetDirectories()) - ProcessDirectory(dir, dirPath + "/" + dir.Name, packageDirectory, filesXml); - } - - private static void AppendFileXml(FileInfo file, string filePath, string packageDirectory, XContainer filesXml) - { - if (file == null) throw new ArgumentNullException(nameof(file)); - if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(filePath)); - if (string.IsNullOrWhiteSpace(packageDirectory)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageDirectory)); - - var orgPath = filePath.Substring(0, (filePath.LastIndexOf('/'))); - var orgName = filePath.Substring((filePath.LastIndexOf('/') + 1)); - var newFileName = orgName; - - if (File.Exists(packageDirectory.EnsureEndsWith('/') + orgName)) - newFileName = Guid.NewGuid() + "_" + newFileName; - - //Copy file to directory for zipping... - File.Copy(file.FullName, packageDirectory + "/" + newFileName, true); - - filesXml.Add(new XElement("file", - new XElement("guid", newFileName), - new XElement("orgPath", orgPath == "" ? "/" : orgPath), - new XElement("orgName", orgName))); - } - private XElement GetMacroXml(int macroId, out IMacro macro) { macro = _macroService.GetById(macroId); @@ -614,63 +517,20 @@ namespace Umbraco.Cms.Core.Packaging mediaTypes.Add(mediaType); } - private static XElement GetPackageInfoXml(PackageDefinition definition, IUmbracoVersion umbracoVersion) + private static XElement GetPackageInfoXml(PackageDefinition definition) { - var info = new XElement("info"); //Package info var package = new XElement("package"); package.Add(new XElement("name", definition.Name)); - package.Add(new XElement("version", definition.Version)); - package.Add(new XElement("iconUrl", definition.IconUrl)); - - var license = new XElement("license", definition.License); - license.Add(new XAttribute("url", definition.LicenseUrl)); - package.Add(license); - - package.Add(new XElement("url", definition.Url)); - - var requirements = new XElement("requirements"); - - requirements.Add(new XElement("major", definition.UmbracoVersion == null ? umbracoVersion.SemanticVersion.Major.ToInvariantString() : definition.UmbracoVersion.Major.ToInvariantString())); - requirements.Add(new XElement("minor", definition.UmbracoVersion == null ? umbracoVersion.SemanticVersion.Minor.ToInvariantString() : definition.UmbracoVersion.Minor.ToInvariantString())); - requirements.Add(new XElement("patch", definition.UmbracoVersion == null ? umbracoVersion.SemanticVersion.Patch.ToInvariantString() : definition.UmbracoVersion.Build.ToInvariantString())); - - if (definition.UmbracoVersion != null) - requirements.Add(new XAttribute("type", RequirementsType.Strict.ToString())); - - package.Add(requirements); info.Add(package); - - // Author - var author = new XElement("author", ""); - author.Add(new XElement("name", definition.Author)); - author.Add(new XElement("website", definition.AuthorUrl)); - info.Add(author); - - // Contributors - var contributors = new XElement("contributors", ""); - - if (definition.Contributors != null && definition.Contributors.Any()) - { - foreach (var contributor in definition.Contributors) - { - contributors.Add(new XElement("contributor", contributor)); - } - } - - info.Add(contributors); - - info.Add(new XElement("readme", new XCData(definition.Readme))); - return info; } - private static XDocument CreateCompiledPackageXml(out XElement root, out XElement files) + private static XDocument CreateCompiledPackageXml(out XElement root) { - files = new XElement("files"); - root = new XElement("umbPackage", files); + root = new XElement("umbPackage"); var compiledPackageXml = new XDocument(root); return compiledPackageXml; } diff --git a/src/Umbraco.Core/Packaging/PendingPackageMigrations.cs b/src/Umbraco.Core/Packaging/PendingPackageMigrations.cs new file mode 100644 index 0000000000..8485cc21bc --- /dev/null +++ b/src/Umbraco.Core/Packaging/PendingPackageMigrations.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.Logging; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Core.Packaging +{ + public class PendingPackageMigrations + { + private readonly ILogger _logger; + private readonly PackageMigrationPlanCollection _packageMigrationPlans; + + public PendingPackageMigrations( + ILogger logger, + PackageMigrationPlanCollection packageMigrationPlans) + { + _logger = logger; + _packageMigrationPlans = packageMigrationPlans; + + } + + /// + /// Returns what package migration names are pending + /// + /// + /// These are the key/value pairs from the keyvalue storage of migration names and their final values + /// + /// + public IReadOnlyList GetUmbracoPendingPackageMigrations(IReadOnlyDictionary keyValues) + { + var packageMigrationPlans = _packageMigrationPlans.ToList(); + + var pendingMigrations = new List(packageMigrationPlans.Count); + + foreach (PackageMigrationPlan plan in packageMigrationPlans) + { + string currentMigrationState = null; + var planKeyValueKey = Constants.Conventions.Migrations.KeyValuePrefix + plan.Name; + if (keyValues.TryGetValue(planKeyValueKey, out var value)) + { + currentMigrationState = value; + + if (!plan.FinalState.InvariantEquals(value)) + { + // Not equal so we need to run + pendingMigrations.Add(plan.Name); + } + } + else + { + // If there is nothing in the DB then we need to run + pendingMigrations.Add(plan.Name); + } + + _logger.LogDebug("Final package migration for {PackagePlan} state is {FinalMigrationState}, database contains {DatabaseState}", + plan.Name, + plan.FinalState, + currentMigrationState ?? ""); + } + + return pendingMigrations; + } + } +} diff --git a/src/Umbraco.Core/Packaging/UninstallationSummary.cs b/src/Umbraco.Core/Packaging/UninstallationSummary.cs deleted file mode 100644 index 315cf98c23..0000000000 --- a/src/Umbraco.Core/Packaging/UninstallationSummary.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.Serialization; -using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Models.Packaging; - -namespace Umbraco.Cms.Core.Packaging -{ - [Serializable] - [DataContract(IsReference = true)] - public class UninstallationSummary - { - public IPackageInfo MetaData { get; set; } - public IEnumerable DataTypesUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable LanguagesUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable DictionaryItemsUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable MacrosUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable FilesUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable TemplatesUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable DocumentTypesUninstalled { get; set; } = Enumerable.Empty(); - public IEnumerable StylesheetsUninstalled { get; set; } = Enumerable.Empty(); - - } -} diff --git a/src/Umbraco.Core/Services/IPackagingService.cs b/src/Umbraco.Core/Services/IPackagingService.cs index 96785417d8..4ab693147e 100644 --- a/src/Umbraco.Core/Services/IPackagingService.cs +++ b/src/Umbraco.Core/Services/IPackagingService.cs @@ -1,90 +1,31 @@ -using System; using System.Collections.Generic; using System.IO; -using System.Threading.Tasks; +using System.Xml.Linq; using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Cms.Core.Packaging; -using Umbraco.Cms.Core.Semver; namespace Umbraco.Cms.Core.Services { public interface IPackagingService : IService { - #region Package Installation - /// /// Returns a result from an umbraco package file (zip) /// /// /// - CompiledPackage GetCompiledPackageInfo(FileInfo packageFile); - - /// - /// Installs the package files contained in an umbraco package file (zip) - /// - /// - /// - /// - IEnumerable InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId); + CompiledPackage GetCompiledPackageInfo(XDocument packageXml); /// /// Installs the data, entities, objects contained in an umbraco package file (zip) /// - /// /// /// - InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Constants.Security.SuperUserId); + InstallationSummary InstallCompiledPackageData(FileInfo packageXmlFile, int userId = Constants.Security.SuperUserId); - /// - /// Uninstalls all versions of the package by name - /// - /// - /// - /// - UninstallationSummary UninstallPackage(string packageName, int userId = Constants.Security.SuperUserId); - - #endregion - - #region Installed Packages + InstallationSummary InstallCompiledPackageData(XDocument packageXml, int userId = Constants.Security.SuperUserId); IEnumerable GetAllInstalledPackages(); - /// - /// Returns the for the installation id - /// - /// - /// - PackageDefinition GetInstalledPackageById(int id); - - /// - /// Returns all for the package by name - /// - /// - /// - /// A list of all package definitions installed for this package (i.e. original install and any upgrades) - /// - IEnumerable GetInstalledPackageByName(string name); - - /// - /// Returns a for a given package name and version - /// - /// - /// - /// If the package is an upgrade, the original/current PackageDefinition is returned - /// - PackageInstallType GetPackageInstallType(string packageName, SemVersion packageVersion, out PackageDefinition alreadyInstalled); - void DeleteInstalledPackage(int packageId, int userId = Constants.Security.SuperUserId); - - /// - /// Persists a package definition to storage - /// - /// - bool SaveInstalledPackage(PackageDefinition definition); - - #endregion - - #region Created Packages - IEnumerable GetAllCreatedPackages(); PackageDefinition GetCreatedPackageById(int id); void DeleteCreatedPackage(int id, int userId = Constants.Security.SuperUserId); @@ -101,17 +42,5 @@ namespace Umbraco.Cms.Core.Services /// string ExportCreatedPackage(PackageDefinition definition); - #endregion - - /// - /// This will fetch an Umbraco package file from the package repository and return the file name of the downloaded package - /// - /// - /// - /// The current user id performing the operation - /// - /// The file name of the downloaded package which will exist in ~/App_Data/packages - /// - Task FetchPackageFileAsync(Guid packageId, Version umbracoVersion, int userId); } } diff --git a/src/Umbraco.Core/Services/IRuntimeState.cs b/src/Umbraco.Core/Services/IRuntimeState.cs index e36c10290e..9e494a7385 100644 --- a/src/Umbraco.Core/Services/IRuntimeState.cs +++ b/src/Umbraco.Core/Services/IRuntimeState.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Generic; using Umbraco.Cms.Core.Exceptions; using Umbraco.Cms.Core.Semver; @@ -54,8 +55,11 @@ namespace Umbraco.Cms.Core.Services /// void DetermineRuntimeLevel(); - void Configure(RuntimeLevel level, RuntimeLevelReason reason); + void Configure(RuntimeLevel level, RuntimeLevelReason reason, Exception bootFailedException = null); - void DoUnattendedInstall(); + /// + /// Returns any state data that was collected during startup + /// + IReadOnlyDictionary StartupState { get; } } } diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs index 8e230c4963..f2cd5cfad7 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs @@ -16,6 +16,7 @@ using Umbraco.Cms.Core.Manifest; using Umbraco.Cms.Core.Media; using Umbraco.Cms.Core.Migrations; using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.PropertyEditors.ValueConverters; @@ -37,6 +38,7 @@ using Umbraco.Cms.Infrastructure.Media; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Install; using Umbraco.Cms.Infrastructure.Migrations.PostMigrations; +using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Infrastructure.Persistence; using Umbraco.Cms.Infrastructure.Runtime; using Umbraco.Cms.Infrastructure.Search; @@ -61,6 +63,9 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddUnique(factory => factory.GetRequiredService().SqlContext); builder.Services.AddUnique(); builder.Services.AddUnique(); + builder.Services.AddUnique(); + builder.AddNotificationAsyncHandler(); + builder.AddNotificationAsyncHandler(); // composers builder diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs index dda80967b1..2218f14df3 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Installer.cs @@ -24,10 +24,6 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddScoped(); builder.Services.AddScoped(); - // TODO: Add these back once we have a compatible Starter kit - // composition.Services.AddScoped(); - // composition.Services.AddScoped(); - // composition.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddTransient(); diff --git a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs index 68d74fefeb..134ffc070c 100644 --- a/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs +++ b/src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs @@ -14,6 +14,7 @@ using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.Implement; +using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Extensions; namespace Umbraco.Cms.Infrastructure.DependencyInjection @@ -70,9 +71,7 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddUnique(factory => CreatePackageRepository(factory, "createdPackages.config")); - builder.Services.AddUnique(factory => CreatePackageRepository(factory, "installedPackages.config")); builder.Services.AddUnique(); - builder.Services.AddUnique(); builder.Services.AddUnique(); return builder; @@ -91,8 +90,6 @@ namespace Umbraco.Cms.Infrastructure.DependencyInjection factory.GetRequiredService(), factory.GetRequiredService(), factory.GetRequiredService(), - factory.GetRequiredService(), - factory.GetRequiredService(), factory.GetRequiredService>(), factory.GetRequiredService(), factory.GetRequiredService(), diff --git a/src/Umbraco.Infrastructure/Install/InstallHelper.cs b/src/Umbraco.Infrastructure/Install/InstallHelper.cs index 7206bdfffa..2b9c71f28d 100644 --- a/src/Umbraco.Infrastructure/Install/InstallHelper.cs +++ b/src/Umbraco.Infrastructure/Install/InstallHelper.cs @@ -136,32 +136,5 @@ namespace Umbraco.Cms.Infrastructure.Install return _databaseBuilder.IsUmbracoInstalled() == false; } } - - public IEnumerable GetStarterKits() - { - if (_httpClient == null) - _httpClient = new HttpClient(); - - var packages = new List(); - try - { - var requestUri = $"https://our.umbraco.com/webapi/StarterKit/Get/?umbracoVersion={_umbracoVersion.Version}"; - - using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri)) - { - var response = _httpClient.SendAsync(request).Result; - - - var json = response.Content.ReadAsStringAsync().Result; - packages = _jsonSerializer.Deserialize>(json).ToList(); - } - } - catch (AggregateException ex) - { - _logger.LogError(ex, "Could not download list of available starter kits"); - } - - return packages; - } } } diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs deleted file mode 100644 index 7f3885e4e2..0000000000 --- a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Umbraco.Cms.Core.Configuration; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.Install.Models; -using Umbraco.Cms.Core.Packaging; -using Umbraco.Cms.Core.Security; -using Umbraco.Cms.Core.Services; - -namespace Umbraco.Cms.Infrastructure.Install.InstallSteps -{ - [InstallSetupStep(InstallationType.NewInstall, - "StarterKitDownload", "starterKit", 30, "Adding a simple website to Umbraco, will make it easier for you to get started", - PerformsAppRestart = true)] - internal class StarterKitDownloadStep : InstallSetupStep - { - private readonly InstallHelper _installHelper; - private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor; - private readonly IUmbracoVersion _umbracoVersion; - private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; - private readonly IContentService _contentService; - private readonly IPackagingService _packageService; - - public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IBackOfficeSecurityAccessor backofficeSecurityAccessor, IUmbracoVersion umbracoVersion, IUmbracoApplicationLifetime umbracoApplicationLifetime) - { - _installHelper = installHelper; - _backofficeSecurityAccessor = backofficeSecurityAccessor; - _umbracoVersion = umbracoVersion; - _umbracoApplicationLifetime = umbracoApplicationLifetime; - _contentService = contentService; - _packageService = packageService; - } - - //private const string RepoGuid = "65194810-1f85-11dd-bd0b-0800200c9a66"; - - public override async Task ExecuteAsync(Guid? starterKitId) - { - //if there is no value assigned then use the default starter kit - if (starterKitId.HasValue == false) - { - var starterKits = _installHelper.GetStarterKits().FirstOrDefault(); - if (starterKits != null) - starterKitId = starterKits.Id; - else - return null; - } - else if (starterKitId.Value == Guid.Empty) - { - //if the startkit id is an empty GUID then it means the user has decided not to install one - // so we'll just exit - return null; - } - - var (packageFile, packageId) = await DownloadPackageFilesAsync(starterKitId.Value); - - _umbracoApplicationLifetime.Restart(); - - return new InstallSetupResult(new Dictionary - { - {"packageId", packageId}, - {"packageFile", packageFile} - }); - } - - private async Task<(string packageFile, int packageId)> DownloadPackageFilesAsync(Guid kitGuid) - { - //Go get the package file from the package repo - var packageFile = await _packageService.FetchPackageFileAsync(kitGuid, _umbracoVersion.Version, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - if (packageFile == null) throw new InvalidOperationException("Could not fetch package file " + kitGuid); - - //add an entry to the installedPackages.config - var compiledPackage = _packageService.GetCompiledPackageInfo(packageFile); - var packageDefinition = PackageDefinition.FromCompiledPackage(compiledPackage); - packageDefinition.PackagePath = packageFile.FullName; - - _packageService.SaveInstalledPackage(packageDefinition); - - _packageService.InstallCompiledPackageFiles(packageDefinition, packageFile, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(-1)); - - return (compiledPackage.PackageFile.Name, packageDefinition.Id); - } - - /// - /// Don't show the view if there's already packages installed - /// - public override string View => _packageService.GetAllInstalledPackages().Any() ? string.Empty : base.View; - - public override bool RequiresExecution(Guid? model) - { - //Don't execute if it's an empty GUID - meaning the user has chosen not to install one - if (model.HasValue && model.Value == Guid.Empty) - { - return false; - } - - //Don't continue if there's already packages installed - if (_packageService.GetAllInstalledPackages().Any()) - return false; - - if (_contentService.GetRootContent().Any()) - return false; - - return true; - } - } -} diff --git a/src/Umbraco.Infrastructure/Install/UnattendedInstaller.cs b/src/Umbraco.Infrastructure/Install/UnattendedInstaller.cs new file mode 100644 index 0000000000..babf882e1b --- /dev/null +++ b/src/Umbraco.Infrastructure/Install/UnattendedInstaller.cs @@ -0,0 +1,134 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Exceptions; +using Umbraco.Cms.Core.Notifications; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations.Install; +using Umbraco.Cms.Infrastructure.Persistence; + +namespace Umbraco.Cms.Infrastructure.Install +{ + public class UnattendedInstaller : INotificationAsyncHandler + { + private readonly IOptions _unattendedSettings; + + private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; + private readonly IEventAggregator _eventAggregator; + private readonly IUmbracoDatabaseFactory _databaseFactory; + private readonly IOptions _globalSettings; + private readonly ILogger _logger; + private readonly IRuntimeState _runtimeState; + + public UnattendedInstaller( + DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory, + IEventAggregator eventAggregator, + IOptions unattendedSettings, + IUmbracoDatabaseFactory databaseFactory, + IOptions globalSettings, + ILogger logger, + IRuntimeState runtimeState) + { + _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory ?? throw new ArgumentNullException(nameof(databaseSchemaCreatorFactory)); + _eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator)); + _unattendedSettings = unattendedSettings; + _databaseFactory = databaseFactory; + _globalSettings = globalSettings; + _logger = logger; + _runtimeState = runtimeState; + } + + public Task HandleAsync(RuntimeUnattendedInstallNotification notification, CancellationToken cancellationToken) + { + // unattended install is not enabled + if (_unattendedSettings.Value.InstallUnattended == false) + { + return Task.CompletedTask; + } + + // no connection string set + if (_databaseFactory.Configured == false) + { + return Task.CompletedTask; + } + + var tries = _globalSettings.Value.InstallMissingDatabase ? 2 : 5; + + bool connect; + try + { + for (var i = 0; ;) + { + connect = _databaseFactory.CanConnect; + if (connect || ++i == tries) + { + break; + } + + _logger.LogDebug("Could not immediately connect to database, trying again."); + Thread.Sleep(1000); + } + } + catch (Exception ex) + { + _logger.LogInformation(ex, "Error during unattended install."); + + var innerException = new UnattendedInstallException("Unattended installation failed.", ex); + _runtimeState.Configure(Core.RuntimeLevel.BootFailed, Core.RuntimeLevelReason.BootFailedOnException, innerException); + return Task.CompletedTask; + } + + // could not connect to the database + if (connect == false) + { + return Task.CompletedTask; + } + + IUmbracoDatabase database = null; + try + { + using (database = _databaseFactory.CreateDatabase()) + { + var hasUmbracoTables = database.IsUmbracoInstalled(); + + // database has umbraco tables, assume Umbraco is already installed + if (hasUmbracoTables) + { + return Task.CompletedTask; + } + + // all conditions fulfilled, do the install + _logger.LogInformation("Starting unattended install."); + + database.BeginTransaction(); + DatabaseSchemaCreator creator = _databaseSchemaCreatorFactory.Create(database); + creator.InitializeDatabaseSchema(); + database.CompleteTransaction(); + _logger.LogInformation("Unattended install completed."); + + // Emit an event with EventAggregator that unattended install completed + // Then this event can be listened for and create an unattended user + _eventAggregator.Publish(new UnattendedInstallNotification()); + } + } + catch (Exception ex) + { + _logger.LogInformation(ex, "Error during unattended install."); + database?.AbortTransaction(); + + var innerException = new UnattendedInstallException( + "The database configuration failed." + + "\n Please check log file for additional information (can be found in '/Umbraco/Data/Logs/')", + ex); + + _runtimeState.Configure(Core.RuntimeLevel.BootFailed, Core.RuntimeLevelReason.BootFailedOnException, innerException); + } + + return Task.CompletedTask; + } + } +} diff --git a/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs b/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs new file mode 100644 index 0000000000..eeae566cc9 --- /dev/null +++ b/src/Umbraco.Infrastructure/Install/UnattendedUpgrader.cs @@ -0,0 +1,157 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Umbraco.Cms.Core.Configuration; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Exceptions; +using Umbraco.Cms.Core.Logging; +using Umbraco.Cms.Core.Notifications; +using Umbraco.Cms.Core.Packaging; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations.Install; +using Umbraco.Cms.Infrastructure.Migrations.Upgrade; +using Umbraco.Cms.Infrastructure.Runtime; +using Umbraco.Extensions; +using Umbraco.Cms.Core.Migrations; +using Umbraco.Cms.Core.Scoping; +using Umbraco.Cms.Core; + +namespace Umbraco.Cms.Infrastructure.Install +{ + public class UnattendedUpgrader : INotificationAsyncHandler + { + private readonly IProfilingLogger _profilingLogger; + private readonly IUmbracoVersion _umbracoVersion; + private readonly DatabaseBuilder _databaseBuilder; + private readonly IRuntimeState _runtimeState; + private readonly PackageMigrationPlanCollection _packageMigrationPlans; + private readonly IMigrationPlanExecutor _migrationPlanExecutor; + private readonly IScopeProvider _scopeProvider; + private readonly IKeyValueService _keyValueService; + + public UnattendedUpgrader( + IProfilingLogger profilingLogger, + IUmbracoVersion umbracoVersion, + DatabaseBuilder databaseBuilder, + IRuntimeState runtimeState, + PackageMigrationPlanCollection packageMigrationPlans, + IMigrationPlanExecutor migrationPlanExecutor, + IScopeProvider scopeProvider, + IKeyValueService keyValueService) + { + _profilingLogger = profilingLogger ?? throw new ArgumentNullException(nameof(profilingLogger)); + _umbracoVersion = umbracoVersion ?? throw new ArgumentNullException(nameof(umbracoVersion)); + _databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder)); + _runtimeState = runtimeState ?? throw new ArgumentNullException(nameof(runtimeState)); + _packageMigrationPlans = packageMigrationPlans; + _migrationPlanExecutor = migrationPlanExecutor; + _scopeProvider = scopeProvider; + _keyValueService = keyValueService; + } + + public Task HandleAsync(RuntimeUnattendedUpgradeNotification notification, CancellationToken cancellationToken) + { + if (_runtimeState.RunUnattendedBootLogic()) + { + // TODO: Here is also where we would run package migrations! + + switch (_runtimeState.Reason) + { + case RuntimeLevelReason.UpgradeMigrations: + { + var plan = new UmbracoPlan(_umbracoVersion); + using (_profilingLogger.TraceDuration( + "Starting unattended upgrade.", + "Unattended upgrade completed.")) + { + DatabaseBuilder.Result result = _databaseBuilder.UpgradeSchemaAndData(plan); + if (result.Success == false) + { + var innerException = new UnattendedInstallException("An error occurred while running the unattended upgrade.\n" + result.Message); + _runtimeState.Configure(Core.RuntimeLevel.BootFailed, Core.RuntimeLevelReason.BootFailedOnException, innerException); + return Task.CompletedTask; + } + + notification.UnattendedUpgradeResult = RuntimeUnattendedUpgradeNotification.UpgradeResult.CoreUpgradeComplete; + } + } + break; + case RuntimeLevelReason.UpgradePackageMigrations: + { + if (!_runtimeState.StartupState.TryGetValue(RuntimeState.PendingPacakgeMigrationsStateKey, out var pm) + || pm is not IReadOnlyList pendingMigrations) + { + throw new InvalidOperationException($"The required key {RuntimeState.PendingPacakgeMigrationsStateKey} does not exist in startup state"); + } + + if (pendingMigrations.Count == 0) + { + throw new InvalidOperationException("No pending migrations found but the runtime level reason is " + Core.RuntimeLevelReason.UpgradePackageMigrations); + } + + var exceptions = new List(); + var packageMigrationsPlans = _packageMigrationPlans.ToDictionary(x => x.Name); + + foreach (var migrationName in pendingMigrations) + { + if (!packageMigrationsPlans.TryGetValue(migrationName, out PackageMigrationPlan plan)) + { + throw new InvalidOperationException("Cannot find package migration plan " + migrationName); + } + + using (_profilingLogger.TraceDuration( + "Starting unattended package migration for " + migrationName, + "Unattended upgrade completed for " + migrationName)) + { + var upgrader = new Upgrader(plan); + + try + { + upgrader.Execute(_migrationPlanExecutor, _scopeProvider, _keyValueService); + } + catch (Exception ex) + { + exceptions.Add(new UnattendedInstallException("Unattended package migration failed for " + migrationName, ex)); + } + } + } + + if (exceptions.Count > 0) + { + notification.UnattendedUpgradeResult = RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors; + SetRuntimeErrors(exceptions); + } + else + { + notification.UnattendedUpgradeResult = RuntimeUnattendedUpgradeNotification.UpgradeResult.PackageMigrationComplete; + } + } + break; + default: + throw new InvalidOperationException("Invalid reason " + _runtimeState.Reason); + } + } + return Task.CompletedTask; + } + + private void SetRuntimeErrors(List exception) + { + Exception innerException; + if (exception.Count == 1) + { + innerException = exception[0]; + } + else + { + innerException = new AggregateException(exception); + } + + _runtimeState.Configure( + RuntimeLevel.BootFailed, + RuntimeLevelReason.BootFailedOnException, + innerException); + } + } +} diff --git a/src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs b/src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs index 016184d4cf..80603db07b 100644 --- a/src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs +++ b/src/Umbraco.Infrastructure/Migrations/IMigrationContext.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Migrations; using Umbraco.Cms.Infrastructure.Persistence; @@ -9,6 +9,11 @@ namespace Umbraco.Cms.Infrastructure.Migrations /// public interface IMigrationContext { + /// + /// Gets the current migration plan + /// + MigrationPlan Plan { get; } + /// /// Gets the logger. /// diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationBase.cs index 56f195cd9f..f3e22c8b45 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationBase.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationBase.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Cms.Core.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Expressions.Alter; @@ -80,7 +80,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations // ensures we are not already building, // ie we did not forget to .Do() an expression - private T BeginBuild(T builder) + private protected T BeginBuild(T builder) { if (Context.BuildingExpression) throw new IncompleteMigrationExpressionException("Cannot create a new expression: the previous expression has not run."); diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationContext.cs b/src/Umbraco.Infrastructure/Migrations/MigrationContext.cs index 01e270dc79..ca3b2313d6 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationContext.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Migrations; @@ -11,18 +11,24 @@ namespace Umbraco.Cms.Infrastructure.Migrations /// internal class MigrationContext : IMigrationContext { + private readonly List _postMigrations = new List(); + /// /// Initializes a new instance of the class. /// - public MigrationContext(IUmbracoDatabase database, ILogger logger) + public MigrationContext(MigrationPlan plan, IUmbracoDatabase database, ILogger logger) { + Plan = plan; Database = database ?? throw new ArgumentNullException(nameof(database)); Logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _postMigrations.AddRange(plan.PostMigrationTypes); } /// public ILogger Logger { get; } + public MigrationPlan Plan { get; } + /// public IUmbracoDatabase Database { get; } @@ -36,14 +42,14 @@ namespace Umbraco.Cms.Infrastructure.Migrations public bool BuildingExpression { get; set; } // this is only internally exposed - public List PostMigrations { get; } = new List(); + public IReadOnlyList PostMigrations => _postMigrations; /// public void AddPostMigration() where TMigration : IMigration { // just adding - will be de-duplicated when executing - PostMigrations.Add(typeof(TMigration)); + _postMigrations.Add(typeof(TMigration)); } } } diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs index 5e710eaad5..cb9fab0160 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs @@ -40,7 +40,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations return ToString(); } - public void Execute() + public virtual void Execute() { if (_executed) throw new InvalidOperationException("This expression has already been executed."); diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs index 8c372ebe72..e0c0ba51fd 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs @@ -51,8 +51,7 @@ namespace Umbraco.Cms.Infrastructure.Migrations using (IScope scope = _scopeProvider.CreateScope(autoComplete: true)) { - var context = new MigrationContext(scope.Database, _loggerFactory.CreateLogger()); - context.PostMigrations.AddRange(plan.PostMigrationTypes); + var context = new MigrationContext(plan, scope.Database, _loggerFactory.CreateLogger()); while (transition != null) { diff --git a/src/Umbraco.Infrastructure/Packaging/AutomaticPackageMigrationPlan.cs b/src/Umbraco.Infrastructure/Packaging/AutomaticPackageMigrationPlan.cs new file mode 100644 index 0000000000..7bfd678333 --- /dev/null +++ b/src/Umbraco.Infrastructure/Packaging/AutomaticPackageMigrationPlan.cs @@ -0,0 +1,62 @@ +using System; +using System.Xml.Linq; +using Umbraco.Cms.Core.Packaging; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations; +using Umbraco.Extensions; + +namespace Umbraco.Cms.Infrastructure.Packaging +{ + /// + /// Used to automatically indicate that a package has an embedded package data manifest that needs to be installed + /// + public abstract class AutomaticPackageMigrationPlan : PackageMigrationPlan + { + private XDocument _xdoc; + + protected AutomaticPackageMigrationPlan(string name) + : base(name) + { + } + + protected sealed override void DefinePlan() + { + // calculate the final state based on the hash value of the embedded resource + var finalId = PackageDataManifest.ToString(SaveOptions.DisableFormatting).ToGuid(); + To(finalId); + } + + /// + /// Get the extracted package data xml manifest + /// + private XDocument PackageDataManifest + { + get + { + if (_xdoc != null) + { + return _xdoc; + } + + Type planType = GetType(); + _xdoc = PackageMigrationResource.GetEmbeddedPackageDataManifest(planType); + return _xdoc; + } + } + + private class MigrateToPackageData : PackageMigrationBase + { + public MigrateToPackageData(IPackagingService packagingService, IMigrationContext context) + : base(packagingService, context) + { + } + + public override void Migrate() + { + var plan = (AutomaticPackageMigrationPlan)Context.Plan; + XDocument xml = plan.PackageDataManifest; + ImportPackage.FromXmlDataManifest(xml).Do(); + } + } + } +} diff --git a/src/Umbraco.Infrastructure/Packaging/IImportPackageBuilder.cs b/src/Umbraco.Infrastructure/Packaging/IImportPackageBuilder.cs new file mode 100644 index 0000000000..994ac643c6 --- /dev/null +++ b/src/Umbraco.Infrastructure/Packaging/IImportPackageBuilder.cs @@ -0,0 +1,17 @@ +using System; +using System.Xml.Linq; +using Umbraco.Cms.Infrastructure.Migrations.Expressions; +using Umbraco.Cms.Infrastructure.Migrations.Expressions.Common; + +namespace Umbraco.Cms.Infrastructure.Packaging +{ + public interface IImportPackageBuilder : IFluentBuilder + { + IExecutableBuilder FromEmbeddedResource() + where TPackageMigration : PackageMigrationBase; + + IExecutableBuilder FromEmbeddedResource(Type packageMigrationType); + + IExecutableBuilder FromXmlDataManifest(XDocument packageDataManifest); + } +} diff --git a/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilder.cs b/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilder.cs new file mode 100644 index 0000000000..09c4ec74a5 --- /dev/null +++ b/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilder.cs @@ -0,0 +1,38 @@ +using System; +using System.Xml.Linq; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations; +using Umbraco.Cms.Infrastructure.Migrations.Expressions; +using Umbraco.Cms.Infrastructure.Migrations.Expressions.Common; + +namespace Umbraco.Cms.Infrastructure.Packaging +{ + internal class ImportPackageBuilder : ExpressionBuilderBase, IImportPackageBuilder, IExecutableBuilder + { + public ImportPackageBuilder(IPackagingService packagingService, IMigrationContext context) + : base(new ImportPackageBuilderExpression(packagingService, context)) + { + } + + public void Do() => Expression.Execute(); + + public IExecutableBuilder FromEmbeddedResource() + where TPackageMigration : PackageMigrationBase + { + Expression.EmbeddedResourceMigrationType = typeof(TPackageMigration); + return this; + } + + public IExecutableBuilder FromEmbeddedResource(Type packageMigrationType) + { + Expression.EmbeddedResourceMigrationType = packageMigrationType; + return this; + } + + public IExecutableBuilder FromXmlDataManifest(XDocument packageDataManifest) + { + Expression.PackageDataManifest = packageDataManifest; + return this; + } + } +} diff --git a/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilderExpression.cs b/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilderExpression.cs new file mode 100644 index 0000000000..441109f2ca --- /dev/null +++ b/src/Umbraco.Infrastructure/Packaging/ImportPackageBuilderExpression.cs @@ -0,0 +1,56 @@ +using System; +using System.Xml.Linq; +using Microsoft.Extensions.Logging; +using Umbraco.Cms.Core.Packaging; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations; + +namespace Umbraco.Cms.Infrastructure.Packaging +{ + internal class ImportPackageBuilderExpression : MigrationExpressionBase + { + private readonly IPackagingService _packagingService; + private bool _executed; + + public ImportPackageBuilderExpression(IPackagingService packagingService, IMigrationContext context) : base(context) + => _packagingService = packagingService; + + /// + /// The type of the migration which dictates the namespace of the embedded resource + /// + public Type EmbeddedResourceMigrationType { get; set; } + + public XDocument PackageDataManifest { get; set; } + + public override void Execute() + { + if (_executed) + { + throw new InvalidOperationException("This expression has already been executed."); + } + + _executed = true; + Context.BuildingExpression = false; + + if (EmbeddedResourceMigrationType == null && PackageDataManifest == null) + { + throw new InvalidOperationException($"Nothing to execute, neither {nameof(EmbeddedResourceMigrationType)} or {nameof(PackageDataManifest)} has been set."); + } + + XDocument xml; + if (EmbeddedResourceMigrationType != null) + { + // get the embedded resource + xml = PackageMigrationResource.GetEmbeddedPackageDataManifest(EmbeddedResourceMigrationType); + } + else + { + xml = PackageDataManifest; + } + + InstallationSummary installationSummary = _packagingService.InstallCompiledPackageData(xml); + + Logger.LogInformation($"Package migration executed. Summary: {installationSummary}"); + } + } +} diff --git a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs index b912fd9120..6b13358fe9 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -7,12 +7,14 @@ using System.Xml.Linq; using System.Xml.XPath; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Collections; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Models.Packaging; +using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; @@ -20,7 +22,7 @@ using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; using Umbraco.Extensions; -namespace Umbraco.Cms.Core.Packaging +namespace Umbraco.Cms.Infrastructure.Packaging { public class PackageDataInstallation { @@ -79,134 +81,13 @@ namespace Umbraco.Cms.Core.Packaging #region Install/Uninstall - public UninstallationSummary UninstallPackageData(PackageDefinition package, int userId) - { - if (package == null) throw new ArgumentNullException(nameof(package)); - - var removedTemplates = new List(); - var removedMacros = new List(); - var removedContentTypes = new List(); - var removedDictionaryItems = new List(); - var removedDataTypes = new List(); - var removedLanguages = new List(); - - using (var scope = _scopeProvider.CreateScope()) - { - //Uninstall templates - foreach (var item in package.Templates.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var found = _fileService.GetTemplate(nId); - if (found != null) - { - removedTemplates.Add(found); - _fileService.DeleteTemplate(found.Alias, userId); - } - package.Templates.Remove(nId.ToString()); - } - - //Uninstall macros - foreach (var item in package.Macros.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var macro = _macroService.GetById(nId); - if (macro != null) - { - removedMacros.Add(macro); - _macroService.Delete(macro, userId); - } - package.Macros.Remove(nId.ToString()); - } - - //Remove Document Types - var contentTypes = new List(); - var contentTypeService = _contentTypeService; - foreach (var item in package.DocumentTypes.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var contentType = contentTypeService.Get(nId); - if (contentType == null) continue; - contentTypes.Add(contentType); - package.DocumentTypes.Remove(nId.ToString(CultureInfo.InvariantCulture)); - } - - //Order the DocumentTypes before removing them - if (contentTypes.Any()) - { - // TODO: I don't think this ordering is necessary - var orderedTypes = (from contentType in contentTypes - orderby contentType.ParentId descending, contentType.Id descending - select contentType).ToList(); - removedContentTypes.AddRange(orderedTypes); - contentTypeService.Delete(orderedTypes, userId); - } - - //Remove Dictionary items - foreach (var item in package.DictionaryItems.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var di = _localizationService.GetDictionaryItemById(nId); - if (di != null) - { - removedDictionaryItems.Add(di); - _localizationService.Delete(di, userId); - } - package.DictionaryItems.Remove(nId.ToString()); - } - - //Remove Data types - foreach (var item in package.DataTypes.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var dtd = _dataTypeService.GetDataType(nId); - if (dtd != null) - { - removedDataTypes.Add(dtd); - _dataTypeService.Delete(dtd, userId); - } - package.DataTypes.Remove(nId.ToString()); - } - - //Remove Langs - foreach (var item in package.Languages.ToArray()) - { - if (int.TryParse(item, out var nId) == false) continue; - var lang = _localizationService.GetLanguageById(nId); - if (lang != null) - { - removedLanguages.Add(lang); - _localizationService.Delete(lang, userId); - } - package.Languages.Remove(nId.ToString()); - } - - scope.Complete(); - } - - // create a summary of what was actually removed, for PackagingService.UninstalledPackage - var summary = new UninstallationSummary - { - MetaData = package, - TemplatesUninstalled = removedTemplates, - MacrosUninstalled = removedMacros, - DocumentTypesUninstalled = removedContentTypes, - DictionaryItemsUninstalled = removedDictionaryItems, - DataTypesUninstalled = removedDataTypes, - LanguagesUninstalled = removedLanguages, - - }; - - return summary; - - - } - public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId) { using (var scope = _scopeProvider.CreateScope()) { - var installationSummary = new InstallationSummary + var installationSummary = new InstallationSummary(compiledPackage.Name) { + Warnings = compiledPackage.Warnings, DataTypesInstalled = ImportDataTypes(compiledPackage.DataTypes.ToList(), userId), LanguagesInstalled = ImportLanguages(compiledPackage.Languages, userId), DictionaryItemsInstalled = ImportDictionaryItems(compiledPackage.DictionaryItems, userId), @@ -254,10 +135,10 @@ namespace Umbraco.Cms.Core.Packaging int userId, IContentTypeBaseService typeService, IContentServiceBase service) - where T: class, IContentBase - where S: IContentTypeComposition + where T : class, IContentBase + where S : IContentTypeComposition { - return docs.SelectMany(x => ImportContentBase( + return docs.SelectMany(x => ImportContentBase( x.XmlData.Elements().Where(doc => (string)doc.Attribute("isDoc") == string.Empty), -1, importedDocumentTypes, @@ -281,8 +162,8 @@ namespace Umbraco.Cms.Core.Packaging int userId, IContentTypeBaseService typeService, IContentServiceBase service) - where T: class, IContentBase - where S: IContentTypeComposition + where T : class, IContentBase + where S : IContentTypeComposition { var contents = ParseContentBaseRootXml(roots, parentId, importedDocumentTypes, typeService, service).ToList(); @@ -314,8 +195,8 @@ namespace Umbraco.Cms.Core.Packaging IDictionary importedContentTypes, IContentTypeBaseService typeService, IContentServiceBase service) - where T: class, IContentBase - where S: IContentTypeComposition + where T : class, IContentBase + where S : IContentTypeComposition { var contents = new List(); foreach (var root in roots) @@ -328,8 +209,9 @@ namespace Umbraco.Cms.Core.Packaging importedContentTypes.Add(contentTypeAlias, contentType); } - var content = CreateContentFromXml(root, importedContentTypes[contentTypeAlias], default(T), parentId, service); - if (content == null) continue; + var content = CreateContentFromXml(root, importedContentTypes[contentTypeAlias], default, parentId, service); + if (content == null) + continue; contents.Add(content); @@ -338,7 +220,7 @@ namespace Umbraco.Cms.Core.Packaging if (children.Count > 0) { - contents.AddRange(CreateContentFromXml(children, content, importedContentTypes, typeService, service).WhereNotNull()); + contents.AddRange(CreateContentFromXml(children, content, importedContentTypes, typeService, service).WhereNotNull()); } } return contents; @@ -350,8 +232,8 @@ namespace Umbraco.Cms.Core.Packaging IDictionary importedContentTypes, IContentTypeBaseService typeService, IContentServiceBase service) - where T: class, IContentBase - where S: IContentTypeComposition + where T : class, IContentBase + where S : IContentTypeComposition { var list = new List(); foreach (var child in children) @@ -375,7 +257,7 @@ namespace Umbraco.Cms.Core.Packaging select grand).ToList(); if (grandChildren.Any()) - list.AddRange(CreateContentFromXml(grandChildren, content,importedContentTypes, typeService, service)); + list.AddRange(CreateContentFromXml(grandChildren, content, importedContentTypes, typeService, service)); } return list; @@ -387,8 +269,8 @@ namespace Umbraco.Cms.Core.Packaging T parent, int parentId, IContentServiceBase service) - where T: class, IContentBase - where S: IContentTypeComposition + where T : class, IContentBase + where S : IContentTypeComposition { var key = Guid.Empty; if (element.Attribute("key") != null && Guid.TryParse(element.Attribute("key").Value, out key)) @@ -509,11 +391,11 @@ namespace Umbraco.Cms.Core.Packaging case IMediaType m: if (parent is null) { - return new Models.Media(name, parentId, m) { Key = key, Level = level, SortOrder = sortOrder, } as T; + return new Core.Models.Media(name, parentId, m) { Key = key, Level = level, SortOrder = sortOrder, } as T; } else { - return new Models.Media(name, (IMedia)parent, m) { Key = key, Level = level, SortOrder = sortOrder, } as T; + return new Core.Models.Media(name, (IMedia)parent, m) { Key = key, Level = level, SortOrder = sortOrder, } as T; } default: @@ -538,7 +420,7 @@ namespace Umbraco.Cms.Core.Packaging /// An enumerable list of generated ContentTypes public IReadOnlyList ImportDocumentTypes(IEnumerable docTypeElements, int userId) { - return ImportDocumentTypes(docTypeElements.ToList(), true, userId, _contentTypeService); + return ImportDocumentTypes(docTypeElements.ToList(), true, userId, _contentTypeService); } /// @@ -549,7 +431,7 @@ namespace Umbraco.Cms.Core.Packaging /// Optional id of the User performing the operation. Default is zero (admin). /// An enumerable list of generated ContentTypes public IReadOnlyList ImportDocumentTypes(IReadOnlyCollection unsortedDocumentTypes, bool importStructure, int userId, IContentTypeBaseService service) - where T: class, IContentTypeComposition + where T : class, IContentTypeComposition { var importedContentTypes = new Dictionary(); @@ -636,7 +518,8 @@ namespace Umbraco.Cms.Core.Packaging var alias = documentType.Element("Info").Element("Alias").Value; var structureElement = documentType.Element("Structure"); //Ensure that we only update ContentTypes which has actual structure-elements - if (structureElement == null || structureElement.Elements().Any() == false) continue; + if (structureElement == null || structureElement.Elements().Any() == false) + continue; var updated = UpdateContentTypesStructure(importedContentTypes[alias], structureElement, importedContentTypes, service); updatedContentTypes.Add(updated); @@ -748,7 +631,7 @@ namespace Umbraco.Cms.Core.Packaging } else { - return new ContentType(_shortStringHelper, (IContentType) parent, alias) as T; + return new ContentType(_shortStringHelper, (IContentType)parent, alias) as T; } } @@ -852,7 +735,8 @@ namespace Umbraco.Cms.Core.Packaging var template = _fileService.GetTemplate(alias.ToSafeAlias(_shortStringHelper)); if (template != null) { - if (allowedTemplates.Any(x => x.Id == template.Id)) continue; + if (allowedTemplates.Any(x => x.Id == template.Id)) + continue; allowedTemplates.Add(template); } else @@ -879,7 +763,7 @@ namespace Umbraco.Cms.Core.Packaging } private void UpdateContentTypesTabs(T contentType, XElement tabElement) - where T: IContentTypeComposition + where T : IContentTypeComposition { if (tabElement == null) return; @@ -906,7 +790,7 @@ namespace Umbraco.Cms.Core.Packaging } private void UpdateContentTypesProperties(T contentType, XElement genericPropertiesElement) - where T: IContentTypeComposition + where T : IContentTypeComposition { var properties = genericPropertiesElement.Elements("GenericProperty"); foreach (var property in properties) @@ -951,9 +835,10 @@ namespace Umbraco.Cms.Core.Packaging property.Element("Name").Value, dataTypeDefinitionId, property.Element("Type").Value.Trim()); //convert to a label! - dataTypeDefinition = _dataTypeService.GetByEditorAlias(Cms.Core.Constants.PropertyEditors.Aliases.Label).FirstOrDefault(); + dataTypeDefinition = _dataTypeService.GetByEditorAlias(Constants.PropertyEditors.Aliases.Label).FirstOrDefault(); //if for some odd reason this isn't there then ignore - if (dataTypeDefinition == null) continue; + if (dataTypeDefinition == null) + continue; } var sortOrder = 0; @@ -999,7 +884,7 @@ namespace Umbraco.Cms.Core.Packaging } private T UpdateContentTypesStructure(T contentType, XElement structureElement, IReadOnlyDictionary importedContentTypes, IContentTypeBaseService service) - where T: IContentTypeComposition + where T : IContentTypeComposition { var allowedChildren = contentType.AllowedContentTypes.ToList(); int sortOrder = allowedChildren.Any() ? allowedChildren.Last().SortOrder : 0; @@ -1016,7 +901,8 @@ namespace Umbraco.Cms.Core.Packaging continue; } - if (allowedChildren.Any(x => x.Id.IsValueCreated && x.Id.Value == allowedChild.Id)) continue; + if (allowedChildren.Any(x => x.Id.IsValueCreated && x.Id.Value == allowedChild.Id)) + continue; allowedChildren.Add(new ContentTypeSort(new Lazy(() => allowedChild.Id), sortOrder, allowedChild.Alias)); sortOrder++; @@ -1032,7 +918,7 @@ namespace Umbraco.Cms.Core.Packaging /// /// private S FindContentTypeByAlias(string contentTypeAlias, IContentTypeBaseService typeService) - where S: IContentTypeComposition + where S : IContentTypeComposition { var contentType = typeService.Get(contentTypeAlias); @@ -1238,7 +1124,7 @@ namespace Umbraco.Cms.Core.Packaging private static bool DictionaryValueIsNew(IEnumerable translations, XElement valueElement) { return translations.All(t => - String.Compare(t.Language.IsoCode, valueElement.Attribute("LanguageCultureAlias").Value, + string.Compare(t.Language.IsoCode, valueElement.Attribute("LanguageCultureAlias").Value, StringComparison.InvariantCultureIgnoreCase) != 0 ); } @@ -1271,7 +1157,8 @@ namespace Umbraco.Cms.Core.Packaging { var isoCode = languageElement.AttributeValue("CultureAlias"); var existingLanguage = _localizationService.GetLanguageByIsoCode(isoCode); - if (existingLanguage != null) continue; + if (existingLanguage != null) + continue; var langauge = new Language(_globalSettings, isoCode) { CultureName = languageElement.AttributeValue("FriendlyName") @@ -1366,7 +1253,8 @@ namespace Umbraco.Cms.Core.Packaging sortOrder = int.Parse(sortOrderAttribute.Value); } - if (macro.Properties.Values.Any(x => string.Equals(x.Alias, propertyAlias, StringComparison.OrdinalIgnoreCase))) continue; + if (macro.Properties.Values.Any(x => string.Equals(x.Alias, propertyAlias, StringComparison.OrdinalIgnoreCase))) + continue; macro.Properties.Add(new MacroProperty(propertyAlias, propertyName, sortOrder, editorAlias)); sortOrder++; } @@ -1374,10 +1262,6 @@ namespace Umbraco.Cms.Core.Packaging return macro; } - - - - #endregion #region Stylesheets @@ -1389,15 +1273,18 @@ namespace Umbraco.Cms.Core.Packaging foreach (var n in stylesheetElements) { var stylesheetName = n.Element("Name")?.Value; - if (stylesheetName.IsNullOrWhiteSpace()) continue; + if (stylesheetName.IsNullOrWhiteSpace()) + continue; var s = _fileService.GetStylesheetByName(stylesheetName); if (s == null) { var fileName = n.Element("FileName")?.Value; - if (fileName == null) continue; + if (fileName == null) + continue; var content = n.Element("Content")?.Value; - if (content == null) continue; + if (content == null) + continue; s = new Stylesheet(fileName) { Content = content }; _fileService.SaveStylesheet(s); @@ -1508,11 +1395,6 @@ namespace Umbraco.Cms.Core.Packaging return templates; } - private string ViewPath(string alias) - { - return Cms.Core.Constants.SystemDirectories.MvcViews + "/" + alias.Replace(" ", "") + ".cshtml"; - } - #endregion } } diff --git a/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs index 119ee734e9..5138a4c630 100644 --- a/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs +++ b/src/Umbraco.Infrastructure/Packaging/PackageInstallation.cs @@ -1,140 +1,66 @@ using System; -using System.Collections.Generic; -using System.IO; using System.Linq; using System.Xml.Linq; -using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models.Packaging; +using Umbraco.Cms.Core.Packaging; using Umbraco.Extensions; -namespace Umbraco.Cms.Core.Packaging +namespace Umbraco.Cms.Infrastructure.Packaging { + public class PackageInstallation : IPackageInstallation { - private readonly PackageExtraction _packageExtraction; private readonly PackageDataInstallation _packageDataInstallation; - private readonly PackageFileInstallation _packageFileInstallation; private readonly CompiledPackageXmlParser _parser; - private readonly DirectoryInfo _applicationRootFolder; /// /// Initializes a new instance of the class. /// - public PackageInstallation(PackageDataInstallation packageDataInstallation, PackageFileInstallation packageFileInstallation, CompiledPackageXmlParser parser, IHostingEnvironment hostingEnvironment) + public PackageInstallation(PackageDataInstallation packageDataInstallation, CompiledPackageXmlParser parser) { - _packageExtraction = new PackageExtraction(); - _packageFileInstallation = packageFileInstallation ?? throw new ArgumentNullException(nameof(packageFileInstallation)); _packageDataInstallation = packageDataInstallation ?? throw new ArgumentNullException(nameof(packageDataInstallation)); _parser = parser ?? throw new ArgumentNullException(nameof(parser)); - _applicationRootFolder = new DirectoryInfo(hostingEnvironment.ApplicationPhysicalPath); } - public CompiledPackage ReadPackage(FileInfo packageFile) + public CompiledPackage ReadPackage(XDocument packageXmlFile) { - if (packageFile == null) throw new ArgumentNullException(nameof(packageFile)); - var doc = GetConfigXmlDoc(packageFile); - - var compiledPackage = _parser.ToCompiledPackage(doc, packageFile, _applicationRootFolder.FullName); - - ValidatePackageFile(packageFile, compiledPackage); + if (packageXmlFile == null) + throw new ArgumentNullException(nameof(packageXmlFile)); + var compiledPackage = _parser.ToCompiledPackage(packageXmlFile); return compiledPackage; } - public IEnumerable InstallPackageFiles(PackageDefinition packageDefinition, CompiledPackage compiledPackage, int userId) + public InstallationSummary InstallPackageData(CompiledPackage compiledPackage, int userId, out PackageDefinition packageDefinition) { - if (packageDefinition == null) throw new ArgumentNullException(nameof(packageDefinition)); - if (compiledPackage == null) throw new ArgumentNullException(nameof(compiledPackage)); + packageDefinition = new PackageDefinition + { + Name = compiledPackage.Name + }; - //these should be the same, TODO: we should have a better validator for this - if (packageDefinition.Name != compiledPackage.Name) - throw new InvalidOperationException("The package definition does not match the compiled package manifest"); - - var packageZipFile = compiledPackage.PackageFile; - - var files = _packageFileInstallation.InstallFiles(compiledPackage, packageZipFile, _applicationRootFolder.FullName).ToList(); - - packageDefinition.Files = files; - - return files; - } - - /// - public UninstallationSummary UninstallPackage(PackageDefinition package, int userId) - { - //running this will update the PackageDefinition with the items being removed - var summary = _packageDataInstallation.UninstallPackageData(package, userId); - - var filesRemoved = _packageFileInstallation.UninstallFiles(package); - summary.FilesUninstalled = filesRemoved; - - return summary; - } - - public InstallationSummary InstallPackageData(PackageDefinition packageDefinition, CompiledPackage compiledPackage, int userId) - { - var installationSummary = _packageDataInstallation.InstallPackageData(compiledPackage, userId); - - installationSummary.MetaData = compiledPackage; - installationSummary.FilesInstalled = packageDefinition.Files; + InstallationSummary installationSummary = _packageDataInstallation.InstallPackageData(compiledPackage, userId); //make sure the definition is up to date with everything - foreach (var x in installationSummary.DataTypesInstalled) packageDefinition.DataTypes.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.LanguagesInstalled) packageDefinition.Languages.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.DictionaryItemsInstalled) packageDefinition.DictionaryItems.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.MacrosInstalled) packageDefinition.Macros.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.TemplatesInstalled) packageDefinition.Templates.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.DocumentTypesInstalled) packageDefinition.DocumentTypes.Add(x.Id.ToInvariantString()); - foreach (var x in installationSummary.StylesheetsInstalled) packageDefinition.Stylesheets.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.DataTypesInstalled) + packageDefinition.DataTypes.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.LanguagesInstalled) + packageDefinition.Languages.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.DictionaryItemsInstalled) + packageDefinition.DictionaryItems.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.MacrosInstalled) + packageDefinition.Macros.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.TemplatesInstalled) + packageDefinition.Templates.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.DocumentTypesInstalled) + packageDefinition.DocumentTypes.Add(x.Id.ToInvariantString()); + foreach (var x in installationSummary.StylesheetsInstalled) + packageDefinition.Stylesheets.Add(x.Id.ToInvariantString()); var contentInstalled = installationSummary.ContentInstalled.ToList(); packageDefinition.ContentNodeId = contentInstalled.Count > 0 ? contentInstalled[0].Id.ToInvariantString() : null; return installationSummary; } - private XDocument GetConfigXmlDoc(FileInfo packageFile) - { - var configXmlContent = _packageExtraction.ReadTextFileFromArchive(packageFile, "package.xml", out _); - - var document = XDocument.Parse(configXmlContent); - - if (document.Root == null || - document.Root.Name.LocalName.Equals("umbPackage") == false) - throw new FormatException("xml does not have a root node called \"umbPackage\""); - - return document; - } - - private void ValidatePackageFile(FileInfo packageFile, CompiledPackage package) - { - if (!(package.Files?.Count > 0)) return; - - var sourceDestination = _parser.ExtractSourceDestinationFileInformation(package.Files).ToArray(); - - var missingFiles = _packageExtraction.FindMissingFiles(packageFile, sourceDestination.Select(i => i.packageUniqueFile)).ToArray(); - - if (missingFiles.Any()) - { - throw new Exception("The following file(s) are missing in the package: " + - string.Join(", ", missingFiles.Select( - mf => - { - var (packageUniqueFile, appRelativePath) = sourceDestination.Single(fi => fi.packageUniqueFile == mf); - return $"source: \"{packageUniqueFile}\" destination: \"{appRelativePath}\""; - }))); - } - - IEnumerable duplicates = _packageExtraction.FindDuplicateFileNames(packageFile).ToArray(); - - if (duplicates.Any()) - { - throw new Exception("The following filename(s) are found more than one time in the package, since the filename is used ad primary key, this is not allowed: " + - string.Join(", ", duplicates)); - } - } - - - } } diff --git a/src/Umbraco.Infrastructure/Packaging/PackageMigrationBase.cs b/src/Umbraco.Infrastructure/Packaging/PackageMigrationBase.cs new file mode 100644 index 0000000000..ebe6f82a8f --- /dev/null +++ b/src/Umbraco.Infrastructure/Packaging/PackageMigrationBase.cs @@ -0,0 +1,19 @@ +using Umbraco.Cms.Core.Packaging; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Infrastructure.Migrations; +using Umbraco.Cms.Infrastructure.Migrations.Expressions.Execute; + +namespace Umbraco.Cms.Infrastructure.Packaging +{ + + public abstract class PackageMigrationBase : MigrationBase + { + private readonly IPackagingService _packagingService; + + public PackageMigrationBase(IPackagingService packagingService, IMigrationContext context) : base(context) + => _packagingService = packagingService; + + public IImportPackageBuilder ImportPackage => BeginBuild(new ImportPackageBuilder(_packagingService, Context)); + + } +} diff --git a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index 715b569b96..ecdc17f97d 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -30,7 +30,6 @@ namespace Umbraco.Cms.Infrastructure.Runtime private readonly IUmbracoDatabaseFactory _databaseFactory; private readonly IEventAggregator _eventAggregator; private readonly IHostingEnvironment _hostingEnvironment; - private readonly DatabaseBuilder _databaseBuilder; private readonly IUmbracoVersion _umbracoVersion; private CancellationToken _cancellationToken; @@ -47,7 +46,6 @@ namespace Umbraco.Cms.Infrastructure.Runtime IUmbracoDatabaseFactory databaseFactory, IEventAggregator eventAggregator, IHostingEnvironment hostingEnvironment, - DatabaseBuilder databaseBuilder, IUmbracoVersion umbracoVersion) { State = state; @@ -59,7 +57,6 @@ namespace Umbraco.Cms.Infrastructure.Runtime _databaseFactory = databaseFactory; _eventAggregator = eventAggregator; _hostingEnvironment = hostingEnvironment; - _databaseBuilder = databaseBuilder; _umbracoVersion = umbracoVersion; _logger = _loggerFactory.CreateLogger(); } @@ -104,7 +101,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime // acquire the main domain - if this fails then anything that should be registered with MainDom will not operate AcquireMainDom(); - DoUnattendedInstall(); + // notify for unattended install + await _eventAggregator.PublishAsync(new RuntimeUnattendedInstallNotification()); DetermineRuntimeLevel(); if (!State.UmbracoCanBoot()) @@ -119,13 +117,24 @@ namespace Umbraco.Cms.Infrastructure.Runtime } // if level is Run and reason is UpgradeMigrations, that means we need to perform an unattended upgrade - if (State.RunUnattendedBootLogic()) + var unattendedUpgradeNotification = new RuntimeUnattendedUpgradeNotification(); + await _eventAggregator.PublishAsync(unattendedUpgradeNotification); + switch (unattendedUpgradeNotification.UnattendedUpgradeResult) { - // do the upgrade - DoUnattendedUpgrade(); - - // upgrade is done, set reason to Run - DetermineRuntimeLevel(); + case RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors: + if (State.BootFailedException == null) + { + throw new InvalidOperationException($"Unattended upgrade result was {RuntimeUnattendedUpgradeNotification.UpgradeResult.HasErrors} but no {nameof(BootFailedException)} was registered"); + } + // we cannot continue here, the exception will be rethrown by BootFailedMiddelware + return; + case RuntimeUnattendedUpgradeNotification.UpgradeResult.CoreUpgradeComplete: + case RuntimeUnattendedUpgradeNotification.UpgradeResult.PackageMigrationComplete: + // upgrade is done, set reason to Run + DetermineRuntimeLevel(); + break; + case RuntimeUnattendedUpgradeNotification.UpgradeResult.NotRequired: + break; } // create & initialize the components @@ -134,23 +143,6 @@ namespace Umbraco.Cms.Infrastructure.Runtime await _eventAggregator.PublishAsync(new UmbracoApplicationStartingNotification(State.Level), cancellationToken); } - private void DoUnattendedUpgrade() - { - var plan = new UmbracoPlan(_umbracoVersion); - using (_profilingLogger.TraceDuration("Starting unattended upgrade.", "Unattended upgrade completed.")) - { - var result = _databaseBuilder.UpgradeSchemaAndData(plan); - if (result.Success == false) - throw new UnattendedInstallException("An error occurred while running the unattended upgrade.\n" + result.Message); - } - - } - - private void DoUnattendedInstall() - { - State.DoUnattendedInstall(); - } - public async Task StopAsync(CancellationToken cancellationToken) { _components.Terminate(); @@ -176,6 +168,12 @@ namespace Umbraco.Cms.Infrastructure.Runtime private void DetermineRuntimeLevel() { + if (State.BootFailedException != null) + { + // there's already been an exception so cannot boot and no need to check + return; + } + using DisposableTimer timer = _profilingLogger.DebugDuration("Determining runtime level.", "Determined."); try diff --git a/src/Umbraco.Infrastructure/RuntimeState.cs b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs similarity index 67% rename from src/Umbraco.Infrastructure/RuntimeState.cs rename to src/Umbraco.Infrastructure/Runtime/RuntimeState.cs index 52313ed8a4..add276760f 100644 --- a/src/Umbraco.Infrastructure/RuntimeState.cs +++ b/src/Umbraco.Infrastructure/Runtime/RuntimeState.cs @@ -4,33 +4,32 @@ using System.Linq; using System.Threading; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Umbraco.Cms.Core; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; -using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Exceptions; -using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.Semver; using Umbraco.Cms.Core.Services; -using Umbraco.Cms.Infrastructure.Migrations.Install; using Umbraco.Cms.Infrastructure.Migrations.Upgrade; using Umbraco.Cms.Infrastructure.Persistence; -namespace Umbraco.Cms.Core +namespace Umbraco.Cms.Infrastructure.Runtime { + /// /// Represents the state of the Umbraco runtime. /// public class RuntimeState : IRuntimeState { + internal const string PendingPacakgeMigrationsStateKey = "PendingPackageMigrations"; private readonly IOptions _globalSettings; private readonly IOptions _unattendedSettings; private readonly IUmbracoVersion _umbracoVersion; private readonly IUmbracoDatabaseFactory _databaseFactory; private readonly ILogger _logger; - private readonly DatabaseSchemaCreatorFactory _databaseSchemaCreatorFactory; - private readonly IEventAggregator _eventAggregator; - private readonly PackageMigrationPlanCollection _packageMigrationPlans; + private readonly PendingPackageMigrations _packageMigrationState; + private readonly Dictionary _startupState = new Dictionary(); /// /// The initial @@ -51,18 +50,14 @@ namespace Umbraco.Cms.Core IUmbracoVersion umbracoVersion, IUmbracoDatabaseFactory databaseFactory, ILogger logger, - DatabaseSchemaCreatorFactory databaseSchemaCreatorFactory, - IEventAggregator eventAggregator, - PackageMigrationPlanCollection packageMigrationPlans) + PendingPackageMigrations packageMigrationState) { _globalSettings = globalSettings; _unattendedSettings = unattendedSettings; _umbracoVersion = umbracoVersion; _databaseFactory = databaseFactory; _logger = logger; - _databaseSchemaCreatorFactory = databaseSchemaCreatorFactory; - _eventAggregator = eventAggregator; - _packageMigrationPlans = packageMigrationPlans; + _packageMigrationState = packageMigrationState; } @@ -90,6 +85,9 @@ namespace Umbraco.Cms.Core /// public BootFailedException BootFailedException { get; internal set; } + /// + public IReadOnlyDictionary StartupState => _startupState; + /// public void DetermineRuntimeLevel() { @@ -203,11 +201,11 @@ namespace Umbraco.Cms.Core return UmbracoDatabaseState.NeedsUpgrade; } - - // TODO: Can we save the result of this since we'll need to re-use it? - IReadOnlyList packagesRequiringMigration = DoesUmbracoRequirePackageMigrations(keyValues); + IReadOnlyList packagesRequiringMigration = _packageMigrationState.GetUmbracoPendingPackageMigrations(keyValues); if (packagesRequiringMigration.Count > 0) { + _startupState[PendingPacakgeMigrationsStateKey] = packagesRequiringMigration; + return UmbracoDatabaseState.NeedsPackageMigration; } } @@ -226,83 +224,14 @@ namespace Umbraco.Cms.Core } } - public void Configure(RuntimeLevel level, RuntimeLevelReason reason) + public void Configure(RuntimeLevel level, RuntimeLevelReason reason, Exception bootFailedException = null) { Level = level; Reason = reason; - } - public void DoUnattendedInstall() - { - // unattended install is not enabled - if (_unattendedSettings.Value.InstallUnattended == false) + if (bootFailedException != null) { - return; - } - - // no connection string set - if (_databaseFactory.Configured == false) - { - return; - } - - var tries = _globalSettings.Value.InstallMissingDatabase ? 2 : 5; - - bool connect; - for (var i = 0; ;) - { - connect = _databaseFactory.CanConnect; - if (connect || ++i == tries) - { - break; - } - - _logger.LogDebug("Could not immediately connect to database, trying again."); - Thread.Sleep(1000); - } - - // could not connect to the database - if (connect == false) - { - return; - } - - using (var database = _databaseFactory.CreateDatabase()) - { - var hasUmbracoTables = database.IsUmbracoInstalled(); - - // database has umbraco tables, assume Umbraco is already installed - if (hasUmbracoTables) - return; - - // all conditions fulfilled, do the install - _logger.LogInformation("Starting unattended install."); - - try - { - database.BeginTransaction(); - var creator = _databaseSchemaCreatorFactory.Create(database); - creator.InitializeDatabaseSchema(); - database.CompleteTransaction(); - _logger.LogInformation("Unattended install completed."); - - // Emit an event with EventAggregator that unattended install completed - // Then this event can be listened for and create an unattended user - _eventAggregator.Publish(new UnattendedInstallNotification()); - - } - catch (Exception ex) - { - _logger.LogInformation(ex, "Error during unattended install."); - database.AbortTransaction(); - - var innerException = new UnattendedInstallException( - "The database configuration failed with the following message: " + ex.Message - + "\n Please check log file for additional information (can be found in '/App_Data/Logs/')"); - BootFailedException = new BootFailedException(innerException.Message, innerException); - - throw BootFailedException; - } + BootFailedException = new BootFailedException(bootFailedException.Message, bootFailedException); } } @@ -321,41 +250,6 @@ namespace Umbraco.Cms.Core return CurrentMigrationState != FinalMigrationState; } - private IReadOnlyList DoesUmbracoRequirePackageMigrations(IReadOnlyDictionary keyValues) - { - var packageMigrationPlans = _packageMigrationPlans.ToList(); - - var result = new List(packageMigrationPlans.Count); - - foreach(PackageMigrationPlan plan in packageMigrationPlans) - { - string currentMigrationState = null; - var planKeyValueKey = Constants.Conventions.Migrations.KeyValuePrefix + plan.Name; - if (keyValues.TryGetValue(planKeyValueKey, out var value)) - { - currentMigrationState = value; - - if (plan.FinalState != value) - { - // Not equal so we need to run - result.Add(plan.Name); - } - } - else - { - // If there is nothing in the DB then we need to run - result.Add(plan.Name); - } - - _logger.LogDebug("Final package migration for {PackagePlan} state is {FinalMigrationState}, database contains {DatabaseState}", - plan.Name, - plan.FinalState, - currentMigrationState ?? ""); - } - - return result; - } - private bool TryDbConnect(IUmbracoDatabaseFactory databaseFactory) { // anything other than install wants a database - see if we can connect diff --git a/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs b/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs index 8a10bc4f4c..93028af308 100644 --- a/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs +++ b/src/Umbraco.Infrastructure/Services/Implement/PackagingService.cs @@ -2,16 +2,12 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; +using System.Xml.Linq; using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Packaging; using Umbraco.Cms.Core.Notifications; using Umbraco.Cms.Core.Packaging; -using Umbraco.Cms.Core.Semver; -using Umbraco.Extensions; namespace Umbraco.Cms.Core.Services.Implement { @@ -22,162 +18,60 @@ namespace Umbraco.Cms.Core.Services.Implement public class PackagingService : IPackagingService { private readonly IPackageInstallation _packageInstallation; - private readonly IHostingEnvironment _hostingEnvironment; private readonly IEventAggregator _eventAggregator; private readonly IAuditService _auditService; private readonly ICreatedPackagesRepository _createdPackages; - private readonly IInstalledPackagesRepository _installedPackages; - private static HttpClient _httpClient; public PackagingService( IAuditService auditService, ICreatedPackagesRepository createdPackages, - IInstalledPackagesRepository installedPackages, IPackageInstallation packageInstallation, - IHostingEnvironment hostingEnvironment, IEventAggregator eventAggregator) { _auditService = auditService; _createdPackages = createdPackages; - _installedPackages = installedPackages; _packageInstallation = packageInstallation; - _hostingEnvironment = hostingEnvironment; _eventAggregator = eventAggregator; } - #region Package Files - - /// - public async Task FetchPackageFileAsync(Guid packageId, Version umbracoVersion, int userId) - { - //includeHidden = true because we don't care if it's hidden we want to get the file regardless - var url = $"{Cms.Core.Constants.PackageRepository.RestApiBaseUrl}/{packageId}?version={umbracoVersion.ToString(3)}&includeHidden=true&asFile=true"; - byte[] bytes; - try - { - if (_httpClient == null) - { - _httpClient = new HttpClient(); - } - bytes = await _httpClient.GetByteArrayAsync(url); - } - catch (HttpRequestException ex) - { - throw new HttpRequestException("An error occurring downloading the package from " + url, ex); - } - - //successful - if (bytes.Length > 0) - { - var packagePath = _hostingEnvironment.MapPathContentRoot(Cms.Core.Constants.SystemDirectories.Packages); - - // Check for package directory - if (Directory.Exists(packagePath) == false) - Directory.CreateDirectory(packagePath); - - var packageFilePath = Path.Combine(packagePath, packageId + ".umb"); - - using (var fs1 = new FileStream(packageFilePath, FileMode.Create)) - { - fs1.Write(bytes, 0, bytes.Length); - return new FileInfo(packageFilePath); - } - } - - _auditService.Add(AuditType.PackagerInstall, userId, -1, "Package", $"Package {packageId} fetched from {Cms.Core.Constants.PackageRepository.DefaultRepositoryId}"); - return null; - } - - #endregion - #region Installation - public CompiledPackage GetCompiledPackageInfo(FileInfo packageFile) => _packageInstallation.ReadPackage(packageFile); + public CompiledPackage GetCompiledPackageInfo(XDocument xml) => _packageInstallation.ReadPackage(xml); - public IEnumerable InstallCompiledPackageFiles(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Cms.Core.Constants.Security.SuperUserId) + public InstallationSummary InstallCompiledPackageData(XDocument packageXml, int userId = Constants.Security.SuperUserId) { - if (packageDefinition == null) throw new ArgumentNullException(nameof(packageDefinition)); - if (packageDefinition.Id == default) throw new ArgumentException("The package definition has not been persisted"); - if (packageDefinition.Name == default) throw new ArgumentException("The package definition has incomplete information"); + CompiledPackage compiledPackage = GetCompiledPackageInfo(packageXml); - var compiledPackage = GetCompiledPackageInfo(packageFile); - if (compiledPackage == null) throw new InvalidOperationException("Could not read the package file " + packageFile); - - var files = _packageInstallation.InstallPackageFiles(packageDefinition, compiledPackage, userId).ToList(); - - SaveInstalledPackage(packageDefinition); - - _auditService.Add(AuditType.PackagerInstall, userId, -1, "Package", $"Package files installed for package '{compiledPackage.Name}'."); - - return files; - } - - public InstallationSummary InstallCompiledPackageData(PackageDefinition packageDefinition, FileInfo packageFile, int userId = Cms.Core.Constants.Security.SuperUserId) - { - if (packageDefinition == null) throw new ArgumentNullException(nameof(packageDefinition)); - if (packageDefinition.Id == default) throw new ArgumentException("The package definition has not been persisted"); - if (packageDefinition.Name == default) throw new ArgumentException("The package definition has incomplete information"); - - var compiledPackage = GetCompiledPackageInfo(packageFile); - if (compiledPackage == null) throw new InvalidOperationException("Could not read the package file " + packageFile); - - // Trigger the Importing Package Notification and stop execution if event/user is cancelling it - var importingPackageNotification = new ImportingPackageNotification(packageFile.Name, compiledPackage); - if (_eventAggregator.PublishCancelable(importingPackageNotification)) + if (compiledPackage == null) { - return new InstallationSummary { MetaData = compiledPackage }; + throw new InvalidOperationException("Could not read the package file " + packageXml); } - var summary = _packageInstallation.InstallPackageData(packageDefinition, compiledPackage, userId); + // Trigger the Importing Package Notification and stop execution if event/user is cancelling it + var importingPackageNotification = new ImportingPackageNotification(compiledPackage.Name); + if (_eventAggregator.PublishCancelable(importingPackageNotification)) + { + return new InstallationSummary(compiledPackage.Name); + } - SaveInstalledPackage(packageDefinition); + var summary = _packageInstallation.InstallPackageData(compiledPackage, userId, out _); _auditService.Add(AuditType.PackagerInstall, userId, -1, "Package", $"Package data installed for package '{compiledPackage.Name}'."); // trigger the ImportedPackage event - _eventAggregator.Publish(new ImportedPackageNotification(summary, compiledPackage).WithStateFrom(importingPackageNotification)); + _eventAggregator.Publish(new ImportedPackageNotification(summary).WithStateFrom(importingPackageNotification)); return summary; } - public UninstallationSummary UninstallPackage(string packageName, int userId = Cms.Core.Constants.Security.SuperUserId) + public InstallationSummary InstallCompiledPackageData(FileInfo packageXmlFile, int userId = Constants.Security.SuperUserId) { - //this is ordered by descending version - var allPackageVersions = GetInstalledPackageByName(packageName)?.ToList(); - if (allPackageVersions == null || allPackageVersions.Count == 0) - throw new InvalidOperationException("No installed package found by name " + packageName); - - var summary = new UninstallationSummary + XDocument xml; + using (StreamReader streamReader = System.IO.File.OpenText(packageXmlFile.FullName)) { - MetaData = allPackageVersions[0] - }; - - var allSummaries = new List(); - - foreach (var packageVersion in allPackageVersions) - { - var versionUninstallSummary = _packageInstallation.UninstallPackage(packageVersion, userId); - - allSummaries.Add(versionUninstallSummary); - - //merge the summary - summary.DataTypesUninstalled = summary.DataTypesUninstalled.Concat(versionUninstallSummary.DataTypesUninstalled).Distinct().ToList(); - summary.DictionaryItemsUninstalled = summary.DictionaryItemsUninstalled.Concat(versionUninstallSummary.DictionaryItemsUninstalled).Distinct().ToList(); - summary.DocumentTypesUninstalled = summary.DocumentTypesUninstalled.Concat(versionUninstallSummary.DocumentTypesUninstalled).Distinct().ToList(); - summary.FilesUninstalled = summary.FilesUninstalled.Concat(versionUninstallSummary.FilesUninstalled).Distinct().ToList(); - summary.LanguagesUninstalled = summary.LanguagesUninstalled.Concat(versionUninstallSummary.LanguagesUninstalled).Distinct().ToList(); - summary.MacrosUninstalled = summary.MacrosUninstalled.Concat(versionUninstallSummary.MacrosUninstalled).Distinct().ToList(); - summary.StylesheetsUninstalled = summary.StylesheetsUninstalled.Concat(versionUninstallSummary.StylesheetsUninstalled).Distinct().ToList(); - summary.TemplatesUninstalled = summary.TemplatesUninstalled.Concat(versionUninstallSummary.TemplatesUninstalled).Distinct().ToList(); - - SaveInstalledPackage(packageVersion); - DeleteInstalledPackage(packageVersion.Id, userId); + xml = XDocument.Load(streamReader); } - - // trigger the UninstalledPackage event - _eventAggregator.Publish(new UninstallPackageNotification(allSummaries)); - - return summary; + return InstallCompiledPackageData(xml, userId); } #endregion @@ -202,46 +96,9 @@ namespace Umbraco.Cms.Core.Services.Implement public string ExportCreatedPackage(PackageDefinition definition) => _createdPackages.ExportPackage(definition); - public IEnumerable GetAllInstalledPackages() => _installedPackages.GetAll(); - - public PackageDefinition GetInstalledPackageById(int id) => _installedPackages.GetById(id); - - public IEnumerable GetInstalledPackageByName(string name) - { - var found = _installedPackages.GetAll().Where(x => x.Name.InvariantEquals(name)).OrderByDescending(x => SemVersion.Parse(x.Version)); - return found; - } - - public PackageInstallType GetPackageInstallType(string packageName, SemVersion packageVersion, out PackageDefinition alreadyInstalled) - { - if (packageName == null) throw new ArgumentNullException(nameof(packageName)); - if (packageVersion == null) throw new ArgumentNullException(nameof(packageVersion)); - - //get the latest version installed - alreadyInstalled = GetInstalledPackageByName(packageName)?.OrderByDescending(x => SemVersion.Parse(x.Version)).FirstOrDefault(); - if (alreadyInstalled == null) return PackageInstallType.NewInstall; - - if (!SemVersion.TryParse(alreadyInstalled.Version, out var installedVersion)) - throw new InvalidOperationException("Could not parse the currently installed package version " + alreadyInstalled.Version); - - //compare versions - if (installedVersion >= packageVersion) return PackageInstallType.AlreadyInstalled; - - //it's an upgrade - return PackageInstallType.Upgrade; - } - - public bool SaveInstalledPackage(PackageDefinition definition) => _installedPackages.SavePackage(definition); - - public void DeleteInstalledPackage(int packageId, int userId = Cms.Core.Constants.Security.SuperUserId) - { - var package = GetInstalledPackageById(packageId); - if (package == null) return; - - _auditService.Add(AuditType.PackagerUninstall, userId, -1, "Package", $"Installed package '{package.Name}' deleted. Package id: {package.Id}"); - _installedPackages.Delete(packageId); - } - + // TODO: Implement + public IEnumerable GetAllInstalledPackages() => Enumerable.Empty(); + #endregion } } diff --git a/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.package.xml b/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.package.xml new file mode 100644 index 0000000000..25cc51dd69 --- /dev/null +++ b/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.package.xml @@ -0,0 +1,17 @@ + + + + + Document Type Picker + + + + + + + + + + + + diff --git a/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.umb b/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.umb deleted file mode 100644 index 18449bd3735870c98e711525a7ea9883941e321f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6147 zcma)=RZJWVl!bAp6qn)@DHL~ich`a9GDv|U9o*dqXP~$j8>HwIcc+6CcZxg3_Ww7V z%_f^o_TGmt_vYr@m-BSARFP4L5D*YB5dOwu%SOrHjmG{vav>nF{0m`zTP^`UD|RbO zJ{xvEJ{}u(VJ6 z>RqIdc64-an*}K5AZ-UAemx4uIqk2~WIP~j*f$8$!If+UInR2e$q(g!=FuH-F4L-4 z9dYM91Y;{#CsPV><>WPb+O>B}bWg&$d6f8SWagJ$DRHjNnOwXeRSe4r{pSursKP2+ z5*!Csj==m?xdmqNt(gZb?I}|u@T-17dXyRCfw)Zm+V*Ay#4LOW7g^5bn$2t^_RxbI zb~nFqnEJIPe82VAW1vgLGN5?NciA2C@u8*RO#64`l1El`KGb^eq{hBl4d;)_RN9|h z;2vSvnrG6N7_BRX3JZ;r19(S{2)`5E;kr~#Mr_~Kl~nJtaO8z|tn0FriIPLEk-0X6 zvkrodN)M#{Ib62%^qF1q_<~==kbKIOK6YgSp`>(Lk|N2qo8u_hSPg*eGz2WtsELJg z&i!U|fb7dz**KzB*2#Yx-xvl~W{KI5olssKlTbSoK4HwQbkz%LRT0Zs&^mDvdZM^f zaJ6-Hs!Z$PJ3v>ei2UT60fWv}du)Y_hI){-2L5Ct%oxT=k6UZvoJj>&I^!)jbKH&Z zn`AY%?Dat5!Xs-{1DBUi;|eN+y0ooBU9<+W zXtE^aR5vrFAIN4;N9Ijz8F;tVH*fW17b6FKG25!*j&7OkS`7Kf{_6PgnqvHT(@?hk zLv`$3uPtrWhuOD|xBV3K-Z=x^L*J84#xI&3h8UoEF81qz>!y#mJLY5D1@>wIkH3r( zKD4hMlFtyiV)%T#VfSo7!H3Sox<$um(_bE!wiwmw%hWWmIl0OA#aZY==|=ILqn824 zdZOgHV!5W3XWn)GHS;s9Br+0=)89}`$X;b0zt|G{kaO!YVoO;^U|9U?4*?C z!%|*r>zZj^}+;2PT53CIGVe$h&mj**Cis2A- z`8%{XPB83WbizI%%r;n-d1*hl?rK}yc6^H~msEv1`WhYfE;4vHO~yK60KQbPy+H~& z`rp(kJ4~kAZ*nz~nKy2r#MMU^21S{qW`tix;>?ZXUT`dLZ6bRY-q$g#o^Br|Ldz)_ zDg*O{d2CY7!@cjB=Op+FYx~N>fq<(Ap`nroe+W26+&nUTGK}0iDtO^=(%MYj)iRO# z?oT?0ZWTHZ_P``(^9-`JtTQyLdIA#NI|)c0!3Dc?);nWKZ{Cszq-_5F9y*io>5Hs_ zAnWq_~2s-hqXHNdHM>xV6h`*qRK!=$MrB=hXz+vHdBI$$LU=ggLL z^jO=a$aVtKjpt#M5lUhlQ9Qx@QXkS}vB$}6U~xu4-=rlJC}joEaE7=&(6 z-FR1gL)Z7leecjH^`_wsAd@Ib5u$uuuP82a*C4daRl_d$88oY z?qOz0+t3y^;Qp(6uXXmoj0;jop*I%skt<_q-YP(blUACHztsDilz|0Jd@ULU$sc+RLK@h*@r?;B}v z5IR{Rml=D#;)V+nRmdHtzuv~~FmDRVv)(rn+fk1Yzhcp14yw3Di#tW^85Hq1ZQVh1EGVb^Pax`C0-tS*wo!YH)*C?b4l>Vd)h$bQvM zNSz2P#E`kRXV;MRxn)F7ARMWiXcSQ(iu@Eq6X`bGc#i~zADH>Am4e1_OzOkKBI!m< z5joA{8()ep_|OZrSOWD$LqRZUQF*|}qFR(&V0a?+IQvVvdeiP8IhwTVglv`-h2`=uZ zwI0SrzXM<)cRy#(T3;a9U#glApBlWuG3yBb(Dk~5p$5_3H;wnI@2XOw=YrfS{!*7u z!a)pbk#MBP%1@F8K3KPxe-~fzp(YrDTIB`9&np ztMlJ}{Q*|$yDUgbRY&CGkDxUh_5?3`NWEGwS7;n+Y6(spup!c*h{@AP*SUfef@0ej zlCCAABKL2mkX~}vCOp`U((16TP~2 zxKU*Dd2$2VNmPQMwt~1_3Aj|k8m7@uWe7mq1%nXTy!oGrE^CkEty^Pbnro5D>Aspl ziUt=k7gWZqNu}1Qa&_*oo?Z2$e^eRLTjSg3$omYe6;Z8!i9pU+Of8oM{Iqvl_}wkRr_ix0&v0i6~@8!2pJC z0?yO1Lt}PzprseZS^620EvXAmX#;6|$gCV5aw66pHHh;7pohN53HJUgym11h0jGT- znJ#Tb$S;1B9Xh0Q7{kcJ_icsw*?<*Go{dAqDRdLD{m}#B1gZm$H28~O^a20@7UFd; z^36^G%h6?Y1+qrj_`+%8r5B+Oov?kBJsBZ})OR8HZny>6jN6V{zL7h7RpcaO z5gO`zz>0is7z+KjO(6iDFK#}CfU5I7l!)6=*Ub>G`aIq+tQvmPydGtaCD@oHL7j90pUrRf%j^&T{Jpd~)}G*FsWLG6xG|$2-QLDh zs_|#`jtveNrTh3?w*S(#Uy?=#qbF-XKV_X`86NIM@j3^XQuIuxS==-_^47lWv$vJq zAS-P47_7Qm>CT+iJm*k8G{$l8J-3y)##sctTD3kLG_*=!qr&g1_QQB(#59Eb%crLV zyB0Zy2en_nt@k~(T!~f6Jdu38;wfg|vSD{Jz{iU_vPH+URQobavCM`S`ojBP9;v#WL= z>Z>yLbwtLvJL$L%%hHAtZ)_WxxdjDH?IaWh#|7-DgT4f|^*0Mk?5N0h@9(^Ql#GIQ zIPZo_?1=li8lhhfl>D5VUi_o>5u6|BkcdlML!dv$Kug0CZ>N#VXU~Vj14NKiemoKL z8^EUPT9E^p7+)OUXJn4d@ETz@+s$N&yHVJsIlvm?kZ-d?&o2WH?C?`O%u(#MA9=o$ zFRG_EyMLUP8e&~#83rVlo?X{NHswSt)xi)PQDuT0WK_FkPNI*INOd%XY!yZvU(ZCP zliy@uGXh7|XauM@$j8aYgvj>o&U@JHj=HIZDP;bHTs~l z#J%r#h;A3H8V{i4hs=?{$rrsAJ!&sZf`nK1fw!_E1@2Ahg8SUhmgqI(azDLQ4M@iN zC^^OE24Bns*a5 zYX13M#}>VKWJ{)NbfNLRWwol7POHxS-zz(`+@#DH?~BEaN{`5>vKM7uzs4yEHtZ6? z%b<$VnhJ`OpC?)Tqq&=9t&ST?%NVFxmMrV7#gut+RWr>z947bo(U#Wsuepn;P z2CFR7mLNf@aY{4MQuz%Ey_;>92&Gazd0)1pkuV>KwP$FYH0)fzzAyzRb18KS!#fP| zDm)@sn%t?!zS76PA{H;7zsbm`LvQ< zujr5-h3qLt)ms{ZJ(|eq>yHUna6T$~q`<+!`i{I(0_}hdrjfw{)sLA>FU8Y#MTJzp z*e50C?c_m#FH~OBZ=h(72(>P=r?NoiPd(G^7sqAn!C@OdA#19pGdl0kztLc)mT@T{ z7Be~GoNdd0Ql|LXVMXGm$s{cIE-K^)y>^vSo|GH9rXpxxY-9~l>K#GNBhG=cQF4E7 zPQ)#W|4u#$G>eS?!x}d`c5DPSs!rJR`EPK;qm=L;;3B%{6}`SczsYyVAJc^r&E~K3qG|;RjqSU&+G3p*#4?VcqDZL6ezyGN!?Y&PAwMCGXttI%{xhL8yTaq?Eq< z!Dq0=I+ttmY;wh-`*-ieub$qXlxxTIW~q$@is3z}pp}|?M^7ZTK{O0Ozv+k!XItJ+ ztD2PAu@d&U|2j?_Wf89v($Jg`iub|tXMYh$t*YDIY6l0NCw1QrW4HSAJsemBZ5|$j zc=CN$8#*Yuse0CY|4tT1nYIGD4da+(W(J81-!t|qml8NsXvJnZY`DH*u52LwX6eOO zS=lmpgRjK@9j`nq4@p?zC}%LCs(}HYF7g11dgq<8GP&Ae+?Lx6RC8wWoWnR|#or^n z#*ni+O-L?dB$%ySp}o{={FHmXPRfKTAdMzNu`Kd!M#z({447Y!hR=?#UPT;3TsRPy zp4Ci{VaAufHd_@(ddu4eCH3r1WMq6r})JmSFPFdJrM`@a{?6axWC`G}A^DqGoIlg>9x%ssmFHAc zA;yh4FL&ObY{WN%1-N@ZkQEL$$G;3WwzQ5C?2izkG6-CG9J)TO|IP@-u!NrV(IF!O z^B$y&*w-qd>0l#76lq7<_+~i>wK9}j-kQ0>a__4_Y*flT4t|0TMxo|Gdl@&YMrW|_ zyf>Rk#+sy%!PnQtW14igo!1F%z6^)&_4m-!DYYxrb*s~~n$M{#zt~jJ>Kv8V(9+i4 z*g{(07N zU#$Pmp^gUD6>_j~06U-(Tzh@KF1lDf`}$<|G`?Nw)~I&+x44+O+%wT@SuA!g(T~rN zmHKA#w_@Giy|&*|g5qw%ZWaBZm22Khof#gU!Ab#UAiM>3)4w63*ZCrZ{O}|}InXr) zDEm-=^Z;@c|HA%q!+sU`IP!MD@9;zfov$>&X%zS7{fYQ{R}k>5k%iHQbAPk6 zv>`9*-r5WeOnzihj!z!MY(Xwx=F_No(zlR6)h*&N*Y?j*K;h+iW6?!6m(t{sdS4>4 zTY#&rxiRB(jqCp|IZW2TpJOt1#LY=mIgpIsnu_FWt6e;Mw;{xXkgAk8nI`qZsD(Bv zyvkm`XZB0;m2<6&qi_R=jZU%pn;+RV=FBo@`K9B9KhnO?%gL_4Nh)<;z>P1{#oja~ zP5Tq~;tO(M&{(VFdC$4z)(}~%)j} zHaDuLH34?Tfy}eJl|Mlb3)|1$JHVBocd@TYa85+6|IRZ*9m?fCGU0)xkq{6-Cf*ZaN#F@~PP8t@EI#8X^FN|lf;z-*2tigPkH zbrg##Zrs60*X2O={)MXU%7Jr7nG#W4#aq<9*%R6EOj#p%)rC#(AeEk5y&=)qjcZUYRKJY3dvzFX0C%hZGvfmP~T#f zQE#0|`ZS;WNqe8?#T>YB${6@t4y*v{!=MN#$xTUjBy>z@K=aez!CKP*$1RsptqQGc zk|dGUV%496zS~E$+R}9%)*?sIBLm?z(d9%m`4Vn|Q4@2fa3w3t2p9ictT=2AdNUk? zLMN+KIpxkKthpLGVjEiap8)2v_dljd3GU)?Wp^bc@nX?%6L_7;3XYi#EDg^QzNTP` zBCVgG%9kK`2UACUoY-(lhqhT1bsm4*L4MLduukZszN-JxqW4DwVYV}pKLAJ%KHlO7 zpyewOysjBD1=o3I%T2PT-pko?rE%RcxC@rsV8_gkw$Oz4V4M&15?no@=0_tjhZ+fC z8$IL`v60`W-u5o)k=v(nZlh|cA|eqX{NLI6KX&^c_5V%M|5cUzFV+9;;P?NfNc#_` z|9SmC{EUV0?-Bt45rGV0H$DE%j^h-f<+aM~_CI_MRr*hAsiLC&dxP{(H~m8q(toG_ E0K6^9ApigX diff --git a/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.zip b/src/Umbraco.Tests.Integration/TestData/Packages/Document_Type_Picker_1.1.zip deleted file mode 100644 index 18449bd3735870c98e711525a7ea9883941e321f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6147 zcma)=RZJWVl!bAp6qn)@DHL~ich`a9GDv|U9o*dqXP~$j8>HwIcc+6CcZxg3_Ww7V z%_f^o_TGmt_vYr@m-BSARFP4L5D*YB5dOwu%SOrHjmG{vav>nF{0m`zTP^`UD|RbO zJ{xvEJ{}u(VJ6 z>RqIdc64-an*}K5AZ-UAemx4uIqk2~WIP~j*f$8$!If+UInR2e$q(g!=FuH-F4L-4 z9dYM91Y;{#CsPV><>WPb+O>B}bWg&$d6f8SWagJ$DRHjNnOwXeRSe4r{pSursKP2+ z5*!Csj==m?xdmqNt(gZb?I}|u@T-17dXyRCfw)Zm+V*Ay#4LOW7g^5bn$2t^_RxbI zb~nFqnEJIPe82VAW1vgLGN5?NciA2C@u8*RO#64`l1El`KGb^eq{hBl4d;)_RN9|h z;2vSvnrG6N7_BRX3JZ;r19(S{2)`5E;kr~#Mr_~Kl~nJtaO8z|tn0FriIPLEk-0X6 zvkrodN)M#{Ib62%^qF1q_<~==kbKIOK6YgSp`>(Lk|N2qo8u_hSPg*eGz2WtsELJg z&i!U|fb7dz**KzB*2#Yx-xvl~W{KI5olssKlTbSoK4HwQbkz%LRT0Zs&^mDvdZM^f zaJ6-Hs!Z$PJ3v>ei2UT60fWv}du)Y_hI){-2L5Ct%oxT=k6UZvoJj>&I^!)jbKH&Z zn`AY%?Dat5!Xs-{1DBUi;|eN+y0ooBU9<+W zXtE^aR5vrFAIN4;N9Ijz8F;tVH*fW17b6FKG25!*j&7OkS`7Kf{_6PgnqvHT(@?hk zLv`$3uPtrWhuOD|xBV3K-Z=x^L*J84#xI&3h8UoEF81qz>!y#mJLY5D1@>wIkH3r( zKD4hMlFtyiV)%T#VfSo7!H3Sox<$um(_bE!wiwmw%hWWmIl0OA#aZY==|=ILqn824 zdZOgHV!5W3XWn)GHS;s9Br+0=)89}`$X;b0zt|G{kaO!YVoO;^U|9U?4*?C z!%|*r>zZj^}+;2PT53CIGVe$h&mj**Cis2A- z`8%{XPB83WbizI%%r;n-d1*hl?rK}yc6^H~msEv1`WhYfE;4vHO~yK60KQbPy+H~& z`rp(kJ4~kAZ*nz~nKy2r#MMU^21S{qW`tix;>?ZXUT`dLZ6bRY-q$g#o^Br|Ldz)_ zDg*O{d2CY7!@cjB=Op+FYx~N>fq<(Ap`nroe+W26+&nUTGK}0iDtO^=(%MYj)iRO# z?oT?0ZWTHZ_P``(^9-`JtTQyLdIA#NI|)c0!3Dc?);nWKZ{Cszq-_5F9y*io>5Hs_ zAnWq_~2s-hqXHNdHM>xV6h`*qRK!=$MrB=hXz+vHdBI$$LU=ggLL z^jO=a$aVtKjpt#M5lUhlQ9Qx@QXkS}vB$}6U~xu4-=rlJC}joEaE7=&(6 z-FR1gL)Z7leecjH^`_wsAd@Ib5u$uuuP82a*C4daRl_d$88oY z?qOz0+t3y^;Qp(6uXXmoj0;jop*I%skt<_q-YP(blUACHztsDilz|0Jd@ULU$sc+RLK@h*@r?;B}v z5IR{Rml=D#;)V+nRmdHtzuv~~FmDRVv)(rn+fk1Yzhcp14yw3Di#tW^85Hq1ZQVh1EGVb^Pax`C0-tS*wo!YH)*C?b4l>Vd)h$bQvM zNSz2P#E`kRXV;MRxn)F7ARMWiXcSQ(iu@Eq6X`bGc#i~zADH>Am4e1_OzOkKBI!m< z5joA{8()ep_|OZrSOWD$LqRZUQF*|}qFR(&V0a?+IQvVvdeiP8IhwTVglv`-h2`=uZ zwI0SrzXM<)cRy#(T3;a9U#glApBlWuG3yBb(Dk~5p$5_3H;wnI@2XOw=YrfS{!*7u z!a)pbk#MBP%1@F8K3KPxe-~fzp(YrDTIB`9&np ztMlJ}{Q*|$yDUgbRY&CGkDxUh_5?3`NWEGwS7;n+Y6(spup!c*h{@AP*SUfef@0ej zlCCAABKL2mkX~}vCOp`U((16TP~2 zxKU*Dd2$2VNmPQMwt~1_3Aj|k8m7@uWe7mq1%nXTy!oGrE^CkEty^Pbnro5D>Aspl ziUt=k7gWZqNu}1Qa&_*oo?Z2$e^eRLTjSg3$omYe6;Z8!i9pU+Of8oM{Iqvl_}wkRr_ix0&v0i6~@8!2pJC z0?yO1Lt}PzprseZS^620EvXAmX#;6|$gCV5aw66pHHh;7pohN53HJUgym11h0jGT- znJ#Tb$S;1B9Xh0Q7{kcJ_icsw*?<*Go{dAqDRdLD{m}#B1gZm$H28~O^a20@7UFd; z^36^G%h6?Y1+qrj_`+%8r5B+Oov?kBJsBZ})OR8HZny>6jN6V{zL7h7RpcaO z5gO`zz>0is7z+KjO(6iDFK#}CfU5I7l!)6=*Ub>G`aIq+tQvmPydGtaCD@oHL7j90pUrRf%j^&T{Jpd~)}G*FsWLG6xG|$2-QLDh zs_|#`jtveNrTh3?w*S(#Uy?=#qbF-XKV_X`86NIM@j3^XQuIuxS==-_^47lWv$vJq zAS-P47_7Qm>CT+iJm*k8G{$l8J-3y)##sctTD3kLG_*=!qr&g1_QQB(#59Eb%crLV zyB0Zy2en_nt@k~(T!~f6Jdu38;wfg|vSD{Jz{iU_vPH+URQobavCM`S`ojBP9;v#WL= z>Z>yLbwtLvJL$L%%hHAtZ)_WxxdjDH?IaWh#|7-DgT4f|^*0Mk?5N0h@9(^Ql#GIQ zIPZo_?1=li8lhhfl>D5VUi_o>5u6|BkcdlML!dv$Kug0CZ>N#VXU~Vj14NKiemoKL z8^EUPT9E^p7+)OUXJn4d@ETz@+s$N&yHVJsIlvm?kZ-d?&o2WH?C?`O%u(#MA9=o$ zFRG_EyMLUP8e&~#83rVlo?X{NHswSt)xi)PQDuT0WK_FkPNI*INOd%XY!yZvU(ZCP zliy@uGXh7|XauM@$j8aYgvj>o&U@JHj=HIZDP;bHTs~l z#J%r#h;A3H8V{i4hs=?{$rrsAJ!&sZf`nK1fw!_E1@2Ahg8SUhmgqI(azDLQ4M@iN zC^^OE24Bns*a5 zYX13M#}>VKWJ{)NbfNLRWwol7POHxS-zz(`+@#DH?~BEaN{`5>vKM7uzs4yEHtZ6? z%b<$VnhJ`OpC?)Tqq&=9t&ST?%NVFxmMrV7#gut+RWr>z947bo(U#Wsuepn;P z2CFR7mLNf@aY{4MQuz%Ey_;>92&Gazd0)1pkuV>KwP$FYH0)fzzAyzRb18KS!#fP| zDm)@sn%t?!zS76PA{H;7zsbm`LvQ< zujr5-h3qLt)ms{ZJ(|eq>yHUna6T$~q`<+!`i{I(0_}hdrjfw{)sLA>FU8Y#MTJzp z*e50C?c_m#FH~OBZ=h(72(>P=r?NoiPd(G^7sqAn!C@OdA#19pGdl0kztLc)mT@T{ z7Be~GoNdd0Ql|LXVMXGm$s{cIE-K^)y>^vSo|GH9rXpxxY-9~l>K#GNBhG=cQF4E7 zPQ)#W|4u#$G>eS?!x}d`c5DPSs!rJR`EPK;qm=L;;3B%{6}`SczsYyVAJc^r&E~K3qG|;RjqSU&+G3p*#4?VcqDZL6ezyGN!?Y&PAwMCGXttI%{xhL8yTaq?Eq< z!Dq0=I+ttmY;wh-`*-ieub$qXlxxTIW~q$@is3z}pp}|?M^7ZTK{O0Ozv+k!XItJ+ ztD2PAu@d&U|2j?_Wf89v($Jg`iub|tXMYh$t*YDIY6l0NCw1QrW4HSAJsemBZ5|$j zc=CN$8#*Yuse0CY|4tT1nYIGD4da+(W(J81-!t|qml8NsXvJnZY`DH*u52LwX6eOO zS=lmpgRjK@9j`nq4@p?zC}%LCs(}HYF7g11dgq<8GP&Ae+?Lx6RC8wWoWnR|#or^n z#*ni+O-L?dB$%ySp}o{={FHmXPRfKTAdMzNu`Kd!M#z({447Y!hR=?#UPT;3TsRPy zp4Ci{VaAufHd_@(ddu4eCH3r1WMq6r})JmSFPFdJrM`@a{?6axWC`G}A^DqGoIlg>9x%ssmFHAc zA;yh4FL&ObY{WN%1-N@ZkQEL$$G;3WwzQ5C?2izkG6-CG9J)TO|IP@-u!NrV(IF!O z^B$y&*w-qd>0l#76lq7<_+~i>wK9}j-kQ0>a__4_Y*flT4t|0TMxo|Gdl@&YMrW|_ zyf>Rk#+sy%!PnQtW14igo!1F%z6^)&_4m-!DYYxrb*s~~n$M{#zt~jJ>Kv8V(9+i4 z*g{(07N zU#$Pmp^gUD6>_j~06U-(Tzh@KF1lDf`}$<|G`?Nw)~I&+x44+O+%wT@SuA!g(T~rN zmHKA#w_@Giy|&*|g5qw%ZWaBZm22Khof#gU!Ab#UAiM>3)4w63*ZCrZ{O}|}InXr) zDEm-=^Z;@c|HA%q!+sU`IP!MD@9;zfov$>&X%zS7{fYQ{R}k>5k%iHQbAPk6 zv>`9*-r5WeOnzihj!z!MY(Xwx=F_No(zlR6)h*&N*Y?j*K;h+iW6?!6m(t{sdS4>4 zTY#&rxiRB(jqCp|IZW2TpJOt1#LY=mIgpIsnu_FWt6e;Mw;{xXkgAk8nI`qZsD(Bv zyvkm`XZB0;m2<6&qi_R=jZU%pn;+RV=FBo@`K9B9KhnO?%gL_4Nh)<;z>P1{#oja~ zP5Tq~;tO(M&{(VFdC$4z)(}~%)j} zHaDuLH34?Tfy}eJl|Mlb3)|1$JHVBocd@TYa85+6|IRZ*9m?fCGU0)xkq{6-Cf*ZaN#F@~PP8t@EI#8X^FN|lf;z-*2tigPkH zbrg##Zrs60*X2O={)MXU%7Jr7nG#W4#aq<9*%R6EOj#p%)rC#(AeEk5y&=)qjcZUYRKJY3dvzFX0C%hZGvfmP~T#f zQE#0|`ZS;WNqe8?#T>YB${6@t4y*v{!=MN#$xTUjBy>z@K=aez!CKP*$1RsptqQGc zk|dGUV%496zS~E$+R}9%)*?sIBLm?z(d9%m`4Vn|Q4@2fa3w3t2p9ictT=2AdNUk? zLMN+KIpxkKthpLGVjEiap8)2v_dljd3GU)?Wp^bc@nX?%6L_7;3XYi#EDg^QzNTP` zBCVgG%9kK`2UACUoY-(lhqhT1bsm4*L4MLduukZszN-JxqW4DwVYV}pKLAJ%KHlO7 zpyewOysjBD1=o3I%T2PT-pko?rE%RcxC@rsV8_gkw$Oz4V4M&15?no@=0_tjhZ+fC z8$IL`v60`W-u5o)k=v(nZlh|cA|eqX{NLI6KX&^c_5V%M|5cUzFV+9;;P?NfNc#_` z|9SmC{EUV0?-Bt45rGV0H$DE%j^h-f<+aM~_CI_MRr*hAsiLC&dxP{(H~m8q(toG_ E0K6^9ApigX diff --git a/src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.package.xml b/src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.package.xml new file mode 100644 index 0000000000..e652c33702 --- /dev/null +++ b/src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.package.xml @@ -0,0 +1,90 @@ + + + + + Hello + + + + + + <![CDATA[Moose]]> + + + <![CDATA[Rover]]> + + + + + + + + + Simple Page + mySimplePage + icon-umb-content color-deep-orange + folder.png + + True + False + + + + + SimplePage + + + mySimplePage + + + + Title + title + Umbraco.TextBox + 0cc0eba1-9960-42c9-bf9b-60e150b429ae + Content + 0 + False + + + + Dogs + doggies + Umbraco.DropDown.Flexible + 1b145e83-80fd-428b-a859-40f177ff1c1c + Content + 1 + False + + + + + 2017 + Content + 0 + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.zip b/src/Umbraco.Tests.Integration/TestData/Packages/Hello_1.0.0.zip deleted file mode 100644 index c95cb282d14065396851362194fd37007cb632fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1529 zcmVeh01E&B0B~VrYhh<)E_iKh%~wlv z+cpqBH#7MUEDt@I;=|N46cg8)q?)l(kENssPYxgnN@yrT0YTfEOnzAp{Ym``U63FN z=#iw8OAofN59}_!UF?GY{PlP6@@bnH5118%=2O${Ii`X0m?k7&PtB62*2sJrK7SUJ z+vpa>AJG~EWf(z9GF%vTO^`gL)e6=-MXO@uXp6(&aF)@)uGXzYx(&f=&k5{?Y~>`T z`8$?{f!(ZHQAT2%7uYCSHZ?b#?`A^bCLYEICII&)wq zlvXw((q2rrfnBN|8U9ofhPOE9g~9hbJT;e`k(isU4rp!BpOl58z^)gngyg`0W7Z2r zvO_%H2uZzYJ=&_v23}joH$WxdDCTOkQIVvFU_auhARM1KW+Q1lXeQy@C;>ac&-d4} ztJT%Lu>IjfD59$bRRP#-1q3r1ms-RPV~M#zwmZuBf+m0-qg25z*zT7g&G0Q8&L9cY zqT>yH)A)$@Q!_#s`QtvahJNf={%GJ>k)L9#?Tqzq16hPKamlH#I%S9a*ktxuccmOqfY~kVhf~U@|r9ovW&p2A(tS=&OvN0=6rVw5O;oFE=R9X>J;i z3{rQR*_@YSFj9pNUPi+GZ5d^x*kC}Jvl43+%n8qwbXP~J@?8rQ&4jMk1Q(s|5|ssn zT4^^z^#+{Ea9?J)kE4Ek>3G&)FdmBxCl*RBJ!?2{5D)S0+_HOY4r8kLe{R?~WtFXY+&PpM8(R%p3C&USUSli5C%?>96{ zaBkdT&M;{7dmn5;0U?acns6g_u{b?rQ^sNIN0qwk?)OB4QaDMcZj0! zx-Mk!1B51BHqBJLQaVD@S)e=-O>5s&TgTA!-lL2FUqlet3ZWLvd1Su>^ch_j=P{S< z>D#E!z{89_=DpV$ej<@b)K~F$BiHZa(WNzV(gg4yMHU+MVU#(kI~=B|8@ut3D8P9V!qgnX#Y}X;HL6-zceaM{-|9=pq@ubP@zHhGS#oR~cAwz5 zt$brV$O<|?8bs43>%1F~uSmWDOyPr}sj5G4)LT5nJxPmRTv?L%h?j9z^t7?~sx07R z%+NH9sb;Yq^0o8@Z2J8C*-tlUPfHHEd6{Lv{89~Q8DxW=217?m)Rue?-+3F1dHb=q zKry2&HG?l8$R}d^IXpgE_6-cc65{Xl5J&pNmJFkQ(1=@W8gqE2oV|di(cK<+0Di}P zgB{={LWO*Ky?sC|-XM6b0h%dUmkia$KL7Hmr2NGKrVRn)Yic6i#uxRvI-F$ROKp-! zhAWjGP*yg3>mT_du8A)fhZ`@?ZajQiowMMbwQz$Xx#`0fv&n+3ry;nCyRi@7yWKbb zzfem70u%rg000080Jn)RPO_5QS%C!r02>eh01E&B0000000000000000001RVPk7y fXJsyUZER3W1qJ{B000310RTAw0062500000ehA61 diff --git a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/CreatedPackagesRepositoryTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/CreatedPackagesRepositoryTests.cs index e2fb873611..746bd271c5 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/CreatedPackagesRepositoryTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/CreatedPackagesRepositoryTests.cs @@ -11,11 +11,15 @@ using NUnit.Framework; using Umbraco.Cms.Core.Configuration; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Tests.Common.Builders; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; using Umbraco.Extensions; +using File = System.IO.File; namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging { @@ -32,6 +36,7 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging public void DeleteTestFolder() => Directory.Delete(HostingEnvironment.MapPathContentRoot("~/" + _testBaseFolder), true); + private IShortStringHelper ShortStringHelper => GetRequiredService(); private IContentService ContentService => GetRequiredService(); private IContentTypeService ContentTypeService => GetRequiredService(); @@ -63,8 +68,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging LocalizationService, HostingEnvironment, EntityXmlSerializer, - LoggerFactory, - UmbracoVersion, Microsoft.Extensions.Options.Options.Create(new GlobalSettings()), MediaService, MediaTypeService, @@ -81,9 +84,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging var def1 = new PackageDefinition { Name = "test", - Url = "http://test.com", - Author = "Someone", - AuthorUrl = "http://test.com" }; bool result = PackageBuilder.SavePackage(def1); @@ -101,9 +101,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging var def1 = new PackageDefinition { Name = "test", - Url = "http://test.com", - Author = "Someone", - AuthorUrl = "http://test.com" }; bool result = PackageBuilder.SavePackage(def1); @@ -115,9 +112,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging var def2 = new PackageDefinition { Name = "test2", - Url = "http://test2.com", - Author = "Someone2", - AuthorUrl = "http://test2.com" }; result = PackageBuilder.SavePackage(def2); @@ -134,9 +128,6 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging { Id = 3, // doesn't exist Name = "test", - Url = "http://test.com", - Author = "Someone", - AuthorUrl = "http://test.com" }; bool result = PackageBuilder.SavePackage(def); @@ -150,21 +141,16 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging var def = new PackageDefinition { Name = "test", - Url = "http://test.com", - Author = "Someone", - AuthorUrl = "http://test.com" }; bool result = PackageBuilder.SavePackage(def); def.Name = "updated"; - def.Files = new List { "hello.txt", "world.png" }; result = PackageBuilder.SavePackage(def); Assert.IsTrue(result); // re-get def = PackageBuilder.GetById(def.Id); Assert.AreEqual("updated", def.Name); - Assert.AreEqual(2, def.Files.Count); // TODO: There's a whole lot more assertions to be done } @@ -172,55 +158,34 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging [Test] public void Export() { - string file1 = $"~/{_testBaseFolder}/App_Plugins/MyPlugin/package.manifest"; - string file2 = $"~/{_testBaseFolder}/App_Plugins/MyPlugin/styles.css"; - string mappedFile1 = HostingEnvironment.MapPathContentRoot(file1); - string mappedFile2 = HostingEnvironment.MapPathContentRoot(file2); - Directory.CreateDirectory(Path.GetDirectoryName(mappedFile1)); - Directory.CreateDirectory(Path.GetDirectoryName(mappedFile2)); - File.WriteAllText(mappedFile1, "hello world"); - File.WriteAllText(mappedFile2, "hello world"); + + var template = TemplateBuilder.CreateTextPageTemplate(); + + FileService.SaveTemplate(template); var def = new PackageDefinition { Name = "test", - Url = "http://test.com", - Author = "Someone", - AuthorUrl = "http://test.com", - Files = new List { file1, file2 }, - Actions = "" + Templates = new []{template.Id.ToString()} }; bool result = PackageBuilder.SavePackage(def); Assert.IsTrue(result); Assert.IsTrue(def.PackagePath.IsNullOrWhiteSpace()); - string zip = PackageBuilder.ExportPackage(def); + string packageXmlPath = PackageBuilder.ExportPackage(def); def = PackageBuilder.GetById(def.Id); // re-get Assert.IsNotNull(def.PackagePath); - using (ZipArchive archive = ZipFile.OpenRead(HostingEnvironment.MapPathWebRoot(zip))) + using (var packageXmlStream = File.OpenRead(packageXmlPath)) { - Assert.AreEqual(3, archive.Entries.Count); + var xml = XDocument.Load(packageXmlStream); + Assert.AreEqual("umbPackage", xml.Root.Name.ToString()); - // the 2 files we manually added - Assert.IsNotNull(archive.Entries.Where(x => x.Name == "package.manifest")); - Assert.IsNotNull(archive.Entries.Where(x => x.Name == "styles.css")); + Assert.AreEqual($"", xml.Element("umbPackage").Element("Templates").ToString(SaveOptions.DisableFormatting)); - // this is the actual package definition/manifest (not the developer manifest!) - ZipArchiveEntry packageXml = archive.Entries.FirstOrDefault(x => x.Name == "package.xml"); - Assert.IsNotNull(packageXml); + // TODO: There's a whole lot more assertions to be done - using (Stream stream = packageXml.Open()) - { - var xml = XDocument.Load(stream); - Assert.AreEqual("umbPackage", xml.Root.Name.ToString()); - Assert.AreEqual(2, xml.Root.Element("files").Elements("file").Count()); - - Assert.AreEqual("", xml.Element("umbPackage").Element("Actions").ToString(SaveOptions.DisableFormatting)); - - // TODO: There's a whole lot more assertions to be done - } } } } diff --git a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageDataInstallationTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageDataInstallationTests.cs index 405f2fd838..f75c359498 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageDataInstallationTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageDataInstallationTests.cs @@ -5,20 +5,16 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Xml.Linq; -using Microsoft.Extensions.Logging; -using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Packaging; -using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Services; -using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Infrastructure.Persistence.Dtos; -using Umbraco.Cms.Infrastructure.Serialization; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; using Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services.Importing; diff --git a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageInstallationTest.cs b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageInstallationTest.cs index 2665cde3d7..bffd4006a3 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageInstallationTest.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Core/Packaging/PackageInstallationTest.cs @@ -2,9 +2,9 @@ // See LICENSE for more details. using System; -using System.Collections.Generic; using System.IO; using System.Linq; +using System.Xml.Linq; using NUnit.Framework; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Models.Packaging; @@ -22,28 +22,17 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging private IPackageInstallation PackageInstallation => GetRequiredService(); - private const string DocumentTypePickerPackage = "Document_Type_Picker_1.1.umb"; - private const string HelloPackage = "Hello_1.0.0.zip"; + private const string DocumentTypePickerPackage = "Document_Type_Picker_1.1.package.xml"; + private const string HelloPackage = "Hello_1.0.0.package.xml"; [Test] public void Can_Read_Compiled_Package_1() { var testPackageFile = new FileInfo(Path.Combine(HostingEnvironment.MapPathContentRoot("~/TestData/Packages"), DocumentTypePickerPackage)); - CompiledPackage package = PackageInstallation.ReadPackage(testPackageFile); + using var fileStream = testPackageFile.OpenRead(); + CompiledPackage package = PackageInstallation.ReadPackage(XDocument.Load(fileStream)); Assert.IsNotNull(package); - Assert.AreEqual(1, package.Files.Count); - Assert.AreEqual("095e064b-ba4d-442d-9006-3050983c13d8.dll", package.Files[0].UniqueFileName); - Assert.AreEqual("/bin", package.Files[0].OriginalPath); - Assert.AreEqual("Auros.DocumentTypePicker.dll", package.Files[0].OriginalName); Assert.AreEqual("Document Type Picker", package.Name); - Assert.AreEqual("1.1", package.Version); - Assert.AreEqual("http://www.opensource.org/licenses/mit-license.php", package.LicenseUrl); - Assert.AreEqual("MIT", package.License); - Assert.AreEqual(3, package.UmbracoVersion.Major); - Assert.AreEqual(RequirementsType.Legacy, package.UmbracoVersionRequirementsType); - Assert.AreEqual("@tentonipete", package.Author); - Assert.AreEqual("auros.co.uk", package.AuthorUrl); - Assert.AreEqual("Document Type Picker datatype that enables back office user to select one or many document types.", package.Readme); Assert.AreEqual(1, package.DataTypes.Count()); } @@ -51,22 +40,11 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging public void Can_Read_Compiled_Package_2() { var testPackageFile = new FileInfo(Path.Combine(HostingEnvironment.MapPathContentRoot("~/TestData/Packages"), HelloPackage)); - CompiledPackage package = PackageInstallation.ReadPackage(testPackageFile); + using var fileStream = testPackageFile.OpenRead(); + CompiledPackage package = PackageInstallation.ReadPackage(XDocument.Load(fileStream)); Assert.IsNotNull(package); - Assert.AreEqual(0, package.Files.Count); Assert.AreEqual("Hello", package.Name); - Assert.AreEqual("1.0.0", package.Version); - Assert.AreEqual("http://opensource.org/licenses/MIT", package.LicenseUrl); - Assert.AreEqual("MIT License", package.License); - Assert.AreEqual(8, package.UmbracoVersion.Major); - Assert.AreEqual(0, package.UmbracoVersion.Minor); - Assert.AreEqual(0, package.UmbracoVersion.Build); - Assert.AreEqual(RequirementsType.Strict, package.UmbracoVersionRequirementsType); - Assert.AreEqual("asdf", package.Author); - Assert.AreEqual("http://hello.com", package.AuthorUrl); - Assert.AreEqual("asdf", package.Readme); Assert.AreEqual(1, package.Documents.Count()); - Assert.AreEqual("root", package.Documents.First().ImportMode); Assert.AreEqual(1, package.DocumentTypes.Count()); Assert.AreEqual(1, package.Templates.Count()); Assert.AreEqual(1, package.DataTypes.Count()); @@ -84,47 +62,22 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Packaging string packageFile = Path.Combine(HostingEnvironment.MapPathContentRoot("~/TestData/Packages"), DocumentTypePickerPackage); Console.WriteLine(packageFile); - CompiledPackage package = PackageInstallation.ReadPackage(new FileInfo(packageFile)); - PreInstallWarnings preInstallWarnings = package.Warnings; + using var fileStream = File.OpenRead(packageFile); + CompiledPackage package = PackageInstallation.ReadPackage(XDocument.Load(fileStream)); + InstallWarnings preInstallWarnings = package.Warnings; Assert.IsNotNull(preInstallWarnings); - Assert.AreEqual(1, preInstallWarnings.FilesReplaced.Count()); - Assert.AreEqual(Path.Combine("bin", "Auros.DocumentTypePicker.dll"), preInstallWarnings.FilesReplaced.First()); - // TODO: More Asserts } - [Test] - public void Install_Files() - { - var testPackageFile = new FileInfo(Path.Combine(HostingEnvironment.MapPathContentRoot("~/TestData/Packages"), DocumentTypePickerPackage)); - CompiledPackage package = PackageInstallation.ReadPackage(testPackageFile); - - var def = PackageDefinition.FromCompiledPackage(package); - def.Id = 1; - def.PackageId = Guid.NewGuid(); - def.Files = new List(); // clear out the files of the def for testing, this should be populated by the install - - var result = PackageInstallation.InstallPackageFiles(def, package, -1).ToList(); - - Assert.AreEqual(1, result.Count); - Assert.AreEqual(Path.Combine("bin", "Auros.DocumentTypePicker.dll"), result[0]); - Assert.IsTrue(File.Exists(Path.Combine(HostingEnvironment.MapPathContentRoot("~/"), result[0]))); - - // make sure the def is updated too - Assert.AreEqual(result.Count, def.Files.Count); - } - [Test] public void Install_Data() { var testPackageFile = new FileInfo(Path.Combine(HostingEnvironment.MapPathContentRoot("~/TestData/Packages"), DocumentTypePickerPackage)); - CompiledPackage package = PackageInstallation.ReadPackage(testPackageFile); - var def = PackageDefinition.FromCompiledPackage(package); - def.Id = 1; - def.PackageId = Guid.NewGuid(); - - InstallationSummary summary = PackageInstallation.InstallPackageData(def, package, -1); + using var fileStream = testPackageFile.OpenRead(); + CompiledPackage package = PackageInstallation.ReadPackage(XDocument.Load(fileStream)); + + InstallationSummary summary = PackageInstallation.InstallPackageData(package, -1, out PackageDefinition def); Assert.AreEqual(1, summary.DataTypesInstalled.Count()); diff --git a/src/Umbraco.Tests.Integration/Umbraco.Core/RuntimeStateTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Core/RuntimeStateTests.cs index e8031d25b1..c9838361c6 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Core/RuntimeStateTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Core/RuntimeStateTests.cs @@ -9,6 +9,7 @@ using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Infrastructure.Migrations; +using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; @@ -85,15 +86,16 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Core } } - private class TestMigration : MigrationBase + private class TestMigration : PackageMigrationBase { - public TestMigration(IMigrationContext context) : base(context) + public TestMigration(IPackagingService packagingService, IMigrationContext context) + : base(packagingService, context) { } public override void Migrate() { - + ImportPackage.FromEmbeddedResource().Do(); } } } diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs index 800b702888..a90d357b0e 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -6,6 +6,7 @@ using Moq; using NPoco; using NUnit.Framework; using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Migrations; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Infrastructure.Migrations.Expressions.Common.Expressions; using Umbraco.Cms.Infrastructure.Migrations.Expressions.Create.Index; @@ -26,6 +27,20 @@ namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.Synta public class SqlServerSyntaxProviderTests : UmbracoIntegrationTest { private ISqlContext SqlContext => GetRequiredService().SqlContext; + private SqlServerSyntaxProvider GetSqlSyntax() => new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); + private class TestPlan : MigrationPlan + { + public TestPlan() : base("Test") + { + } + } + private MigrationContext GetMigrationContext(out TestDatabase db) + { + ILogger logger = Mock.Of>(); + SqlServerSyntaxProvider sqlSyntax = GetSqlSyntax(); + db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); + return new MigrationContext(new TestPlan(), db, logger); + } [UmbracoTest(Database = UmbracoTestOptions.Database.NewEmptyPerTest)] [Test] @@ -80,19 +95,19 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void Format_SqlServer_NonClusteredIndexDefinition_AddsNonClusteredDirective() { - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); + SqlServerSyntaxProvider sqlSyntax = GetSqlSyntax(); var indexDefinition = CreateIndexDefinition(); indexDefinition.IndexType = IndexTypes.NonClustered; var actual = sqlSyntax.Format(indexDefinition); - Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", actual); + Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", actual); } [Test] public void Format_SqlServer_NonClusteredIndexDefinition_UsingIsClusteredFalse_AddsClusteredDirective() { - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); + SqlServerSyntaxProvider sqlSyntax = GetSqlSyntax(); var indexDefinition = CreateIndexDefinition(); indexDefinition.IndexType = IndexTypes.Clustered; @@ -104,10 +119,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_NonClustered_CreatesNonClusteredIndex() { - var logger = Mock.Of>(); - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); - var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); - var context = new MigrationContext(db, logger); + var context = GetMigrationContext(out var db); var createExpression = new CreateIndexExpression(context) { @@ -125,10 +137,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex() { - var logger = Mock.Of>(); - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); - var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); - var context = new MigrationContext(db, logger); + var context = GetMigrationContext(out var db); var createExpression = new CreateIndexExpression(context) { @@ -146,10 +155,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex_Multi_Columnn() { - var logger = Mock.Of>(); - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); - var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); - var context = new MigrationContext(db, logger); + var context = GetMigrationContext(out var db); var createExpression = new CreateIndexExpression(context) { @@ -167,10 +173,7 @@ WHERE (([umbracoNode].[nodeObjectType] = @0))) x)".Replace(Environment.NewLine, [Test] public void CreateIndexBuilder_SqlServer_Clustered_CreatesClusteredIndex() { - var logger = Mock.Of>(); - var sqlSyntax = new SqlServerSyntaxProvider(Options.Create(new GlobalSettings())); - var db = new TestDatabase(DatabaseType.SqlServer2005, sqlSyntax); - var context = new MigrationContext(db, logger); + var context = GetMigrationContext(out var db); var createExpression = new CreateIndexExpression(context) { diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CheckboxList-Content-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CheckboxList-Content-Package.xml index 2c1c7a8825..6f2ae0812c 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CheckboxList-Content-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CheckboxList-Content-Package.xml @@ -1,23 +1,10 @@ - + - CheckboxListTest - 1 - MIT license - 1 - - 3 - 0 - 0 - - - - 1 - 1 - - + CheckboxListTest + @@ -74,4 +61,4 @@ --> - \ No newline at end of file + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage-Random.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage-Random.xml index 2ec534334f..aa61633218 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage-Random.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage-Random.xml @@ -1,23 +1,10 @@ - + - Composite Test - dfsfd - MIT License - ddsff - - 3 - 0 - 0 - + Composite Test - - fsdfds - sfdf - - diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage.xml index 39a7f102a5..89c940f7d1 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/CompositionsTestPackage.xml @@ -1,23 +1,10 @@ - + - Compositions Packaged - 1.0 - MIT License - http://blog.sitereactor.dk - - 3 - 0 - 0 - - - - Morten Christensen - http://blog.sitereactor.dk - - + Compositions Packaged + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml index 8324ea4ef4..915492dea8 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Dictionary-Package.xml @@ -1,23 +1,10 @@ - + - Dictionary-Package - 1.0 - MIT license - http://not.available - - 3 - 0 - 0 - + Dictionary-Package - - Test - http://not.available - - diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Fanoe-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Fanoe-Package.xml index 8c353551dd..6b96eed2ed 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Fanoe-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/Fanoe-Package.xml @@ -1,1059 +1,9 @@ - + - - - bootstrap.min.js - /js - bootstrap.min.js - - - jquery.min.js - /js - jquery.min.js - - - top-image.jpg - /Media/1001 - top-image.jpg - - - top-image_big-thumb.jpg - /Media/1001 - top-image_big-thumb.jpg - - - top-image_thumb.jpg - /Media/1001 - top-image_thumb.jpg - - - 128.jpg - /Media/1002 - 128.jpg - - - 128_thumb.jpg - /Media/1002 - 128_thumb.jpg - - - mid-image.jpg - /Media/1003 - mid-image.jpg - - - mid-image_thumb.jpg - /Media/1003 - mid-image_thumb.jpg - - - milkbath.jpg - /Media/1004 - milkbath.jpg - - - milkbath_thumb.jpg - /Media/1004 - milkbath_thumb.jpg - - - 54619133.jpg - /Media/1005 - 54619133.jpg - - - 54619133_thumb.jpg - /Media/1005 - 54619133_thumb.jpg - - - girls-1000.png - /Media/1006 - girls-1000.png - - - girls-1000_big-thumb.jpg - /Media/1006 - girls-1000_big-thumb.jpg - - - girls-1000_thumb.jpg - /Media/1006 - girls-1000_thumb.jpg - - - boat.jpg - /Media/1007 - boat.jpg - - - boat_big-thumb.jpg - /Media/1007 - boat_big-thumb.jpg - - - boat_thumb.jpg - /Media/1007 - boat_thumb.jpg - - - boat_2.jpg - /Media/1008 - boat_2.jpg - - - boat_2_big-thumb.jpg - /Media/1008 - boat_2_big-thumb.jpg - - - boat_2_thumb.jpg - /Media/1008 - boat_2_thumb.jpg - - - logo.svg - /Media/1009 - logo.svg - - - 591407c7-165f-462c-9546-4b55621da7ce_128.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - 128.jpg - - - b9d7afcb-d025-43fc-88cb-6922d3e7a788_128_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - 128_thumb.jpg - - - 70ec1293-6e21-4a71-bef1-38a0005788ef_54619133.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - 54619133.jpg - - - def11b2b-48ec-4c8e-bca6-6b07117d28b7_54619133_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - 54619133_thumb.jpg - - - 2710e8d0-fc69-4fc2-a5d7-4e78353f6124_boat.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat.jpg - - - 61d37ca2-433f-4f0f-ab04-3f297def9e1d_boat_2.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat_2.jpg - - - a07ee698-17ff-4daf-9583-80e02ba9bbfe_boat_2_big-thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat_2_big-thumb.jpg - - - c17da1af-ae34-42ea-8aaa-ebebcc616607_boat_2_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat_2_thumb.jpg - - - 15ec6ab7-ee74-401a-89ae-33ef21428f6b_boat_big-thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat_big-thumb.jpg - - - af7ef385-f973-4883-8fcd-6125a2b652fd_boat_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - boat_thumb.jpg - - - ed078f42-d7fd-4c4c-a6b1-c1fff3497403_bootstrap.min.js - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - bootstrap.min.js - - - d16e43db-1b49-4fd6-8e38-072ae77e4ca1_girls-1000.png - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - girls-1000.png - - - 6442ec82-0055-4741-82a1-2c1b4a29ca5f_girls-1000_big-thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - girls-1000_big-thumb.jpg - - - a1641fdd-1aac-4516-bab0-8541e823023e_girls-1000_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - girls-1000_thumb.jpg - - - f3423fde-9765-4b42-8059-34458e2f21cf_jquery.min.js - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - jquery.min.js - - - 9557317e-2194-4b2f-a4a9-4345bea5fa40_logo.svg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - logo.svg - - - a8457e59-4f99-43e8-bac1-12e9ff18696e_mid-image.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - mid-image.jpg - - - 73225caf-fe9c-494e-a8df-14604922eae1_mid-image_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - mid-image_thumb.jpg - - - 2cf84124-8540-4dfd-947e-ef20401638fc_milkbath.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - milkbath.jpg - - - 24ce629e-0748-4524-8d08-077940270f93_milkbath_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - milkbath_thumb.jpg - - - 15554ca1-3cbc-47b5-a40f-29712ce4d4ec_top-image.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - top-image.jpg - - - 7de54e8a-d0eb-4439-a445-0b5067c660e2_top-image_big-thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - top-image_big-thumb.jpg - - - 778cecbc-63a9-4b2f-b443-677fba525a03_top-image_thumb.jpg - /Media/1d1fa309-e97e-4243-b58a-6f9ced1ccb0f - top-image_thumb.jpg - - - Blogpost.cshtml - /Views - Blogpost.cshtml - - - Home.cshtml - /Views - Home.cshtml - - - Master.cshtml - /Views - Master.cshtml - - - TextPage.cshtml - /Views - TextPage.cshtml - - - Web.config - /Views - Web.config - - - InsertUmbracoForm.cshtml - /Views/MacroPartials - InsertUmbracoForm.cshtml - - - RenderUmbracoFormScripts.cshtml - /Views/MacroPartials - RenderUmbracoFormScripts.cshtml - - - mainNavPartial.cshtml - /Views/Partials - mainNavPartial.cshtml - - - yada.cshtml - /Views/Partials - yada.cshtml - - - Form.cshtml - /Views/Partials/Forms - Form.cshtml - - - Script.cshtml - /Views/Partials/Forms - Script.cshtml - - - csv.cshtml - /Views/Partials/Forms/Export - csv.cshtml - - - html.cshtml - /Views/Partials/Forms/Export - html.cshtml - - - FieldType.CheckBox.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.CheckBox.cshtml - - - FieldType.CheckBoxList.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.CheckBoxList.cshtml - - - FieldType.DatePicker.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.DatePicker.cshtml - - - FieldType.DropDownList.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.DropDownList.cshtml - - - FieldType.FileUpload.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.FileUpload.cshtml - - - FieldType.HiddenField.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.HiddenField.cshtml - - - FieldType.PasswordField.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.PasswordField.cshtml - - - FieldType.RadioButtonList.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.RadioButtonList.cshtml - - - Fieldtype.Recaptcha.cshtml - /Views/Partials/Forms/Fieldtypes - Fieldtype.Recaptcha.cshtml - - - FieldType.Text.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.Text.cshtml - - - FieldType.Textarea.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.Textarea.cshtml - - - FieldType.Textfield.cshtml - /Views/Partials/Forms/Fieldtypes - FieldType.Textfield.cshtml - - - d0c3e59e-702b-45f2-a111-b6a24dab4563_blogpost.cshtml - /Views/Partials/Grid - blogpost.cshtml - - - Bootstrap3.cshtml - /Views/Partials/Grid - Bootstrap3.cshtml - - - Base.cshtml - /Views/Partials/Grid/Editors - Base.cshtml - - - Embed.cshtml - /Views/Partials/Grid/Editors - Embed.cshtml - - - Macro.cshtml - /Views/Partials/Grid/Editors - Macro.cshtml - - - Media.cshtml - /Views/Partials/Grid/Editors - Media.cshtml - - - Rte.cshtml - /Views/Partials/Grid/Editors - Rte.cshtml - - - Textstring.cshtml - /Views/Partials/Grid/Editors - Textstring.cshtml - - - ._embed_videowrapper.cshtml - /App_Plugins/Grid/Editors/Render - ._embed_videowrapper.cshtml - - - embed_videowrapper.cshtml - /App_Plugins/Grid/Editors/Render - embed_videowrapper.cshtml - - - media_round.cshtml - /App_Plugins/Grid/Editors/Render - media_round.cshtml - - - media_text_right.cshtml - /App_Plugins/Grid/Editors/Render - media_text_right.cshtml - - - media_wide.cshtml - /App_Plugins/Grid/Editors/Render - media_wide.cshtml - - - quote_with_description.cshtml - /App_Plugins/Grid/Editors/Render - quote_with_description.cshtml - - - media_with_description.html - /App_Plugins/Grid/Editors/View - media_with_description.html - - - quote_with_description.html - /App_Plugins/Grid/Editors/View - quote_with_description.html - - - installed - /App_Plugins/UmbracoForms - installed - - - package.manifest - /App_Plugins/UmbracoForms - package.manifest - - - UmbracoForms.config - /App_Plugins/UmbracoForms - UmbracoForms.config - - - version - /App_Plugins/UmbracoForms - version - - - defaultform.css - /App_Plugins/UmbracoForms/Assets - defaultform.css - - - jquery-ui-1.8.18.custom.css - /App_Plugins/UmbracoForms/Assets - jquery-ui-1.8.18.custom.css - - - umbracoforms.js - /App_Plugins/UmbracoForms/Assets - umbracoforms.js - - - daterangepicker.css - /App_Plugins/UmbracoForms/Assets/daterangepicker - daterangepicker.css - - - daterangepicker.js - /App_Plugins/UmbracoForms/Assets/daterangepicker - daterangepicker.js - - - moment.min.js - /App_Plugins/UmbracoForms/Assets/moment - moment.min.js - - - pikaday.css - /App_Plugins/UmbracoForms/Assets/pikaday - pikaday.css - - - pikaday.js - /App_Plugins/UmbracoForms/Assets/pikaday - pikaday.js - - - checkbox.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - checkbox.html - - - checkboxlist.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - checkboxlist.html - - - datepicker.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - datepicker.html - - - dropdownlist.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - dropdownlist.html - - - fileupload.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - fileupload.html - - - hiddenfield.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - hiddenfield.html - - - password.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - password.html - - - radiobuttonlist.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - radiobuttonlist.html - - - recaptcha.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - recaptcha.html - - - text.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - text.html - - - textarea.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - textarea.html - - - textfield.html - /App_Plugins/UmbracoForms/Backoffice/Common/FieldTypes - textfield.html - - - date.html - /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes - date.html - - - file.html - /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes - file.html - - - file.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/RenderTypes/Controllers - file.controller.js - - - 592e910e-fd49-4237-b466-6f4eaabaf0a3_checkbox.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - checkbox.html - - - documentmapper.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - documentmapper.controller.js - - - documentmapper.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - documentmapper.html - - - b3661117-72d3-4d8a-9faa-10833b1641c2_dropdownlist.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - dropdownlist.html - - - fieldmapper.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - fieldmapper.controller.js - - - fieldmapper.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - fieldmapper.html - - - 5222ea6b-3c45-4c6a-a349-2d3998958e53_file.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - file.controller.js - - - 43f7e18f-2c10-4281-a217-418bd085730b_file.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - file.html - - - 43285028-e2d1-4b2b-b609-b317ad28b26a_password.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - password.html - - - pickers.connectionstring.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.connectionstring.controller.js - - - pickers.connectionstring.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.connectionstring.html - - - pickers.contentwithxpath.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.contentwithxpath.controller.js - - - pickers.contentwithxpath.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.contentwithxpath.html - - - pickers.datatype.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.datatype.controller.js - - - pickers.datatype.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.datatype.html - - - pickers.documenttype.controller.js - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.documenttype.controller.js - - - pickers.documenttype.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - pickers.documenttype.html - - - 9914ab3f-255e-44e8-9d52-e60e22d1db6d_textarea.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - textarea.html - - - 56b20f99-e751-4d40-bade-1edf7ff5f983_textfield.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - textfield.html - - - textstring.html - /App_Plugins/UmbracoForms/Backoffice/Common/SettingTypes - textstring.html - - - Activity.html - /App_Plugins/UmbracoForms/Backoffice/Dashboards - Activity.html - - - Licensing.html - /App_Plugins/UmbracoForms/Backoffice/Dashboards - Licensing.html - - - YourForms.html - /App_Plugins/UmbracoForms/Backoffice/Dashboards - YourForms.html - - - activity.controller.js - /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers - activity.controller.js - - - licensing.controller.js - /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers - licensing.controller.js - - - yourforms.controller.js - /App_Plugins/UmbracoForms/Backoffice/Dashboards/Controllers - yourforms.controller.js - - - delete.html - /App_Plugins/UmbracoForms/Backoffice/DataSource - delete.html - - - edit.html - /App_Plugins/UmbracoForms/Backoffice/DataSource - edit.html - - - delete.controller.js - /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers - delete.controller.js - - - edit.controller.js - /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers - edit.controller.js - - - wizard.controller.js - /App_Plugins/UmbracoForms/Backoffice/DataSource/controllers - wizard.controller.js - - - wizard.html - /App_Plugins/UmbracoForms/Backoffice/DataSource/dialogs - wizard.html - - - create.html - /App_Plugins/UmbracoForms/Backoffice/Form - create.html - - - c0d2f039-3acb-47fb-9068-8d2050098db0_delete.html - /App_Plugins/UmbracoForms/Backoffice/Form - delete.html - - - a4fd64d8-aa3a-4753-b9a7-90378fa6b3df_edit.html - /App_Plugins/UmbracoForms/Backoffice/Form - edit.html - - - entries.html - /App_Plugins/UmbracoForms/Backoffice/Form - entries.html - - - workflows.html - /App_Plugins/UmbracoForms/Backoffice/Form - workflows.html - - - create.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - create.controller.js - - - b838c1b8-ef83-435f-9d91-09240d8f70a7_delete.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - delete.controller.js - - - 777a833e-1023-4dfe-9c6a-e8c372ea38a4_edit.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - edit.controller.js - - - entries.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - entries.controller.js - - - entriessettings.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - entriessettings.controller.js - - - fieldsettings.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - fieldsettings.controller.js - - - workflows.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - workflows.controller.js - - - workflows.dialog.controller.js - /App_Plugins/UmbracoForms/Backoffice/Form/controllers - workflows.dialog.controller.js - - - additem.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - additem.html - - - entriesdetail.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - entriesdetail.html - - - entriessettings.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - entriessettings.html - - - fieldsettings.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - fieldsettings.html - - - formsettings.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - formsettings.html - - - workflow.html - /App_Plugins/UmbracoForms/Backoffice/Form/dialogs - workflow.html - - - 753759e0-8867-4d52-a58d-1bac828d76c5_delete.html - /App_Plugins/UmbracoForms/Backoffice/PreValueSource - delete.html - - - a69b3d96-ed63-4bf3-b94e-0e74f351abe0_edit.html - /App_Plugins/UmbracoForms/Backoffice/PreValueSource - edit.html - - - 677731bc-3ecc-43d9-b949-dbb1eedf56d7_delete.controller.js - /App_Plugins/UmbracoForms/Backoffice/PreValueSource/controllers - delete.controller.js - - - 70d127e8-f15b-4afd-935d-a55754d22424_edit.controller.js - /App_Plugins/UmbracoForms/Backoffice/PreValueSource/controllers - edit.controller.js - - - formpicker.controller.js - /App_Plugins/UmbracoForms/Backoffice/PropertyEditors - formpicker.controller.js - - - formpicker.html - /App_Plugins/UmbracoForms/Backoffice/PropertyEditors - formpicker.html - - - umbraco.forms.css - /App_Plugins/UmbracoForms/css - umbraco.forms.css - - - 385baff5-cb75-441a-86e5-5121168a4fac.json - /App_Plugins/UmbracoForms/Data/forms - 385baff5-cb75-441a-86e5-5121168a4fac.json - - - commentform.json - /App_Plugins/UmbracoForms/Data/Templates - commentform.json - - - contactform.json - /App_Plugins/UmbracoForms/Data/Templates - contactform.json - - - 065b5cad-b43d-4390-aecb-166bdc677139.json - /App_Plugins/UmbracoForms/Data/Workflows - 065b5cad-b43d-4390-aecb-166bdc677139.json - - - 706acfaf-6f15-4a20-af43-f7eeb1f2761d.json - /App_Plugins/UmbracoForms/Data/Workflows - 706acfaf-6f15-4a20-af43-f7eeb1f2761d.json - - - 87895f0c-656a-4232-b41e-00fddb4840a0.json - /App_Plugins/UmbracoForms/Data/Workflows - 87895f0c-656a-4232-b41e-00fddb4840a0.json - - - umb-forms-content-picker.html - /App_Plugins/UmbracoForms/Directives - umb-forms-content-picker.html - - - umb-forms-designer.html - /App_Plugins/UmbracoForms/Directives - umb-forms-designer.html - - - umb-forms-prevalue-editor.html - /App_Plugins/UmbracoForms/Directives - umb-forms-prevalue-editor.html - - - umb-forms-regexpicker.html - /App_Plugins/UmbracoForms/Directives - umb-forms-regexpicker.html - - - icomoon.eot - /App_Plugins/UmbracoForms/Fonts - icomoon.eot - - - icomoon.svg - /App_Plugins/UmbracoForms/Fonts - icomoon.svg - - - icomoon.ttf - /App_Plugins/UmbracoForms/Fonts - icomoon.ttf - - - icomoon.woff - /App_Plugins/UmbracoForms/Fonts - icomoon.woff - - - close.png - /App_Plugins/UmbracoForms/Images - close.png - - - recaptcha.png - /App_Plugins/UmbracoForms/Images - recaptcha.png - - - succes-green.png - /App_Plugins/UmbracoForms/Images - succes-green.png - - - umbraco.forms.js - /App_Plugins/UmbracoForms/js - umbraco.forms.js - - - HtmlTable.cshtml - /App_Plugins/UmbracoForms/RazorTemplates - HtmlTable.cshtml - - - umbraco.forms.dashboards.less - /App_Plugins/UmbracoForms/Styles - umbraco.forms.dashboards.less - - - umbraco.forms.entries.less - /App_Plugins/UmbracoForms/Styles - umbraco.forms.entries.less - - - umbraco.forms.fonts.less - /App_Plugins/UmbracoForms/Styles - umbraco.forms.fonts.less - - - umbraco.forms.less - /App_Plugins/UmbracoForms/Styles - umbraco.forms.less - - - umbraco.forms.workflows.less - /App_Plugins/UmbracoForms/Styles - umbraco.forms.workflows.less - - - umbraco.gridview.less - /App_Plugins/UmbracoForms/Styles - umbraco.gridview.less - - - DataTables_json.xslt - /App_Plugins/UmbracoForms/Xslt - DataTables_json.xslt - - - DataTables_json_medtrust.xslt - /App_Plugins/UmbracoForms/Xslt - DataTables_json_medtrust.xslt - - - excel.xslt - /App_Plugins/UmbracoForms/Xslt - excel.xslt - - - Html.xslt - /App_Plugins/UmbracoForms/Xslt - Html.xslt - - - postAsXmlSample.xslt - /App_Plugins/UmbracoForms/Xslt - postAsXmlSample.xslt - - - sendXsltEmailSample.xslt - /App_Plugins/UmbracoForms/Xslt - sendXsltEmailSample.xslt - - - xml.xslt - /App_Plugins/UmbracoForms/Xslt - xml.xslt - - - UmbracoContourListComments.xslt - /App_Plugins/UmbracoForms/Xslt/Templates - UmbracoContourListComments.xslt - - - d337dddb-dd69-4fc1-a10d-7062a562596e_UmbracoContourListComments.xslt - /App_Plugins/UmbracoForms/Xslt/Templates/Schema2 - UmbracoContourListComments.xslt - - - grid.editors.config.js - /Config - grid.editors.config.js - - - Fanoe - 1.0.0 - MIT License - http://umbraco.com - - 3 - 0 - 0 - + Fanoe - - Umbraco HQ - http://umbraco.com - - diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/InheritedDocTypes-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/InheritedDocTypes-Package.xml index 6156b4281b..7e30bb8525 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/InheritedDocTypes-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/InheritedDocTypes-Package.xml @@ -1,23 +1,10 @@ - + - DocTypeError - 1 - Personal license - http://www.iseli-webconsulting.de - - 3 - 0 - 0 - + DocTypeError - - Iseli Webconsulting - http://www.iseli-webconsulting.de - - @@ -442,4 +429,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/MediaTypesAndMedia-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/MediaTypesAndMedia-Package.xml index e51fee48f8..ae37d5a337 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/MediaTypesAndMedia-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/MediaTypesAndMedia-Package.xml @@ -1,25 +1,10 @@ - + - Package With MediaTypes And Media + Folder - 1.0.0 - - MIT License - http://www.umbraco.com - - 0 - 5 - 0 - + Package With MediaTypes And Media + Folder - - dteam - http://www.umbraco.com - - - @@ -155,4 +140,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml index f0013771c3..347bfe060b 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/StandardMvc-Package.xml @@ -1,207 +1,9 @@ - + - - - Map.cshtml - /macroScripts - Map.cshtml - - - AccountController.cs - /App_Code - AccountController.cs - - - ContactController.cs - /App_Code - ContactController.cs - - - LuceneHighlightHelper.cs - /App_Code - LuceneHighlightHelper.cs - - - default.js - /scripts - default.js - - - jquery.timers.js - /scripts - jquery.timers.js - - - Creative_Founds_Square.jpg - /images - Creative_Founds_Square.jpg - - - header_bg.png - /images - header_bg.png - - - li_bg.gif - /images - li_bg.gif - - - li_white_bg.gif - /images - li_white_bg.gif - - - logo.png - /images - logo.png - - - nav_li_bg.png - /images - nav_li_bg.png - - - search_bg.png - /images - search_bg.png - - - search_btn_bg.png - /images - search_btn_bg.png - - - slider_bg.png - /images - slider_bg.png - - - twitter_square.png - /images - twitter_square.png - - - umbraco_Square.jpg - /images - umbraco_Square.jpg - - - web_applications.jpg - /images - web_applications.jpg - - - Lucene.Net.Contrib.Highlighter.dll - /bin - Lucene.Net.Contrib.Highlighter.dll - - - StandardWebsiteInstall.ascx.cs - /usercontrols - StandardWebsiteInstall.ascx.cs - - - Affiliations.cshtml - /Views/Partials - Affiliations.cshtml - - - ContactForm.cshtml - /Views/Partials - ContactForm.cshtml - - - ContentPanels.cshtml - /Views/Partials - ContentPanels.cshtml - - - LeftNavigation.cshtml - /Views/Partials - LeftNavigation.cshtml - - - LoginForm.cshtml - /Views/Partials - LoginForm.cshtml - - - dice.png - /media/1824 - dice.png - - - dice_thumb.jpg - /media/1824 - dice_thumb.jpg - - - cap.png - /media/1813 - cap.png - - - cap_thumb.jpg - /media/1813 - cap_thumb.jpg - - - chat.jpg - /media/2075 - chat.jpg - - - chat_thumb.jpg - /media/2075 - chat_thumb.jpg - - - umbraco_logo.png - /media/1477 - umbraco_logo.png - - - umbraco_logo_thumb.jpg - /media/1477 - umbraco_logo_thumb.jpg - - - StandardWebsiteInstall.ascx - /usercontrols - StandardWebsiteInstall.ascx - - StandardWebsiteMVC - 2.0 - MIT license - https://our.umbraco.com/projects/starter-kits/standard-website-mvc - - 3 - 0 - 0 - - - - Chris Koiak - http://www.creativefounds.co.uk - - - - + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Package.xml index 7900564a11..51033b93c3 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Package.xml @@ -1,23 +1,10 @@ - + Template-Update - 0.1 - MIT license - https://our.umbraco.com/projects - - 3 - 0 - 0 - - - Morten Christensen - http://blog.sitereactor.dk - - @@ -87,4 +74,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Updated-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Updated-Package.xml index d130d9fa76..d2facd8fc1 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Updated-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/TemplateOnly-Updated-Package.xml @@ -1,23 +1,10 @@ - + Template-Update - 0.1 - MIT license - https://our.umbraco.com/projects - - 3 - 0 - 0 - - - Morten Christensen - http://blog.sitereactor.dk - - @@ -84,4 +71,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/XsltSearch-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/XsltSearch-Package.xml index fdcbfba25e..b97c62825c 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/XsltSearch-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/XsltSearch-Package.xml @@ -1,62 +1,9 @@ - + - - - XSLTsearch.xslt - /xslt - XSLTsearch.xslt - - - XSLTsearch.cs - /App_Code - XSLTsearch.cs - - - XSLTsearch - 3.0.4 - MIT license - http://www.percipientstudios.com - - 3 - 0 - 0 - + XSLTsearch - - Percipient Studios - http://www.percipientstudios.com - - - - diff --git a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/uBlogsy-Package.xml b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/uBlogsy-Package.xml index 888d854693..175d5a5927 100644 --- a/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/uBlogsy-Package.xml +++ b/src/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/Importing/uBlogsy-Package.xml @@ -1,358 +1,9 @@ - - - - - uBlogsy.BusinessLogic.dll - /bin - uBlogsy.BusinessLogic.dll - - - uBlogsy.BusinessLogic.pdb - /bin - uBlogsy.BusinessLogic.pdb - - - uBlogsy.Common.dll - /bin - uBlogsy.Common.dll - - - uBlogsy.Common.pdb - /bin - uBlogsy.Common.pdb - - - uBlogsy.Mvc.Parts.dll - /bin - uBlogsy.Mvc.Parts.dll - - - uBlogsy.Mvc.Parts.pdb - /bin - uBlogsy.Mvc.Parts.pdb - - - uBlogsy.Web.dll - /bin - uBlogsy.Web.dll - - - uBlogsy.Web.pdb - /bin - uBlogsy.Web.pdb - - - uDateFoldersy.dll - /bin - uDateFoldersy.dll - - - uDateFoldersy.pdb - /bin - uDateFoldersy.pdb - - - uLoremsy.dll - /bin - uLoremsy.dll - - - uLoremsy.pdb - /bin - uLoremsy.pdb - - - uHelpsy.dll - /bin - uHelpsy.dll - - - uHelpsy.pdb - /bin - uHelpsy.pdb - - - uTagsy.Web.dll - /bin - uTagsy.Web.dll - - - uTagsy.Web.pdb - /bin - uTagsy.Web.pdb - - - CreatePost.ascx - /usercontrols/uBlogsy/dashboard - CreatePost.ascx - - - RSSImport.ascx - /usercontrols/uBlogsy/dashboard - RSSImport.ascx - - - uTagsy.ascx - /usercontrols/uTagsy - uTagsy.ascx - - - uDateFoldersy.config - /config - uDateFoldersy.config - - - uTagsy.config - /config - uTagsy.config - - - uLoremsy.config - /config - uLoremsy.config - - - uBlogsy.css - /css - uBlogsy.css - - - uBlogsy_feed-icon-14x14.png - /Images - uBlogsy_feed-icon-14x14.png - - - calendar_view_day.png - /umbraco/images/umbraco - calendar_view_day.png - - - date.png - /umbraco/images/umbraco - date.png - - - feed.png - /umbraco/images/umbraco - feed.png - - - folder_table.png - /umbraco/images/umbraco - folder_table.png - - - folder_user.png - /umbraco/images/umbraco - folder_user.png - - - house.png - /umbraco/images/umbraco - house.png - - - page_green.png - /umbraco/images/umbraco - page_green.png - - - page_white_cup.png - /umbraco/images/umbraco - page_white_cup.png - - - rss.png - /umbraco/images/umbraco - rss.png - - - tag.png - /umbraco/images/umbraco - tag.png - - - tag_blue.png - /Umbraco/Images/Umbraco - tag_blue.png - - - tag_blue_add.png - /Umbraco/Images/Umbraco - tag_blue_add.png - - - user.png - /umbraco/images/umbraco - user.png - - - _uBlogsyBase.cshtml - /Views - _uBlogsyBase.cshtml - - - _uBlogsyBaseSite.cshtml - /Views - _uBlogsyBaseSite.cshtml - - - _uBlogsyBaseBlog.cshtml - /Views - _uBlogsyBaseBlog.cshtml - - - uBlogsyMacroShowSomeLove.cshtml - /Views/MacroPartials/uBlogsy - uBlogsyMacroShowSomeLove.cshtml - - - uBlogsyGlobalBrowserTitle.cshtml - /Views/Partials/uBlogsy/Global - uBlogsyGlobalBrowserTitle.cshtml - - - uBlogsyGlobalFooter.cshtml - /Views/Partials/uBlogsy/Global - uBlogsyGlobalFooter.cshtml - - - uBlogsyGlobalHeader.cshtml - /Views/Partials/uBlogsy/Global - uBlogsyGlobalHeader.cshtml - - - uBlogsyGlobalNavigation.cshtml - /Views/Partials/uBlogsy/Global - uBlogsyGlobalNavigation.cshtml - - - uBlogsyGlobalSeoMeta.cshtml - /Views/Partials/uBlogsy/Global - uBlogsyGlobalSeoMeta.cshtml - - - uBlogsyLandingListPosts.cshtml - /Views/Partials/uBlogsy/Landing - uBlogsyLandingListPosts.cshtml - - - uBlogsyLandingShowPost.cshtml - /Views/Partials/uBlogsy/Landing - uBlogsyLandingShowPost.cshtml - - - uBlogsyPostListAuthors.cshtml - /Views/Partials/uBlogsy/Post - uBlogsyPostListAuthors.cshtml - - - uBlogsyPostListLabels.cshtml - /Views/Partials/uBlogsy/Post - uBlogsyPostListLabels.cshtml - - - uBlogsyPostListRelatedPosts.cshtml - /Views/Partials/uBlogsy/Post - uBlogsyPostListRelatedPosts.cshtml - - - uBlogsyPostListTags.cshtml - /Views/Partials/uBlogsy/Post - uBlogsyPostListTags.cshtml - - - uBlogsyPostShowPost.cshtml - /Views/Partials/uBlogsy/Post - uBlogsyPostShowPost.cshtml - - - uBlogsyShowImage.cshtml - /Views/Partials/uBlogsy/Shared - uBlogsyShowImage.cshtml - - - uBlogsyWidgetListAuthors.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListAuthors.cshtml - - - uBlogsyWidgetListBlogRoll.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListBlogRoll.cshtml - - - uBlogsyWidgetListLabels.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListLabels.cshtml - - - uBlogsyWidgetListPostArchive.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListPostArchive.cshtml - - - uBlogsyWidgetListPosts.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListPosts.cshtml - - - uBlogsyWidgetListPostsForHome.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListPostsForHome.cshtml - - - uBlogsyWidgetListTags.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetListTags.cshtml - - - uBlogsyWidgetSearch.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetSearch.cshtml - - - uBlogsyWidgetShowRSSLink.cshtml - /Views/Partials/uBlogsy/Widgets - uBlogsyWidgetShowRSSLink.cshtml - - - uDateFoldersyFolderRedirect.cshtml - /Views/Partials/uDateFoldersy - uDateFoldersyFolderRedirect.cshtml - - - Installer.ascx - /usercontrols/uBlogsy/dashboard - Installer.ascx - - + + - uBlogsy - 3.0 - MIT license - https://our.umbraco.com/projects/starter-kits/ublogsy - - 3 - 0 - 0 - + uBlogsy - - Anthony Dang - http://anthonydotnet.blogspot.com - - - - diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PackageExtractionTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PackageExtractionTests.cs deleted file mode 100644 index 435c2f14dc..0000000000 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PackageExtractionTests.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using System.Collections.Generic; -using System.IO; -using System.Linq; -using NUnit.Framework; -using Umbraco.Cms.Core.Packaging; - -namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Packaging -{ - [TestFixture] - public class PackageExtractionTests - { - private const string PackageFileName = "Document_Type_Picker_1.1.umb"; - - private static FileInfo GetTestPackagePath(string packageName) - { - var testPackagesDirName = Path.Combine("Umbraco.Core", "Packaging", "Packages"); - var testDir = TestContext.CurrentContext.TestDirectory.Split("bin")[0]; - var path = Path.Combine(testDir, testPackagesDirName, packageName); - return new FileInfo(path); - } - - [Test] - public void ReadFilesFromArchive_NumberOfFilesIs1_SearchingForPackageXmlFile() - { - // Arrange - var sut = new PackageExtraction(); - - // Act - IEnumerable result = sut.ReadFilesFromArchive(GetTestPackagePath(PackageFileName), new[] { "Package.xml" }); - - // Assert - Assert.AreEqual(1, result.Count()); - } - - [Test] - public void FindMissingFiles_1_UnknownFile() - { - // Arrange - var sut = new PackageExtraction(); - - // Act - IEnumerable result = sut.FindMissingFiles(GetTestPackagePath(PackageFileName), new[] { "DoesNotExists.XYZ" }); - - // Assert - Assert.AreEqual(1, result.Count()); - } - } -} diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/Packages/Document_Type_Picker_1.1.umb b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/Packages/Document_Type_Picker_1.1.umb deleted file mode 100644 index 18449bd3735870c98e711525a7ea9883941e321f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6147 zcma)=RZJWVl!bAp6qn)@DHL~ich`a9GDv|U9o*dqXP~$j8>HwIcc+6CcZxg3_Ww7V z%_f^o_TGmt_vYr@m-BSARFP4L5D*YB5dOwu%SOrHjmG{vav>nF{0m`zTP^`UD|RbO zJ{xvEJ{}u(VJ6 z>RqIdc64-an*}K5AZ-UAemx4uIqk2~WIP~j*f$8$!If+UInR2e$q(g!=FuH-F4L-4 z9dYM91Y;{#CsPV><>WPb+O>B}bWg&$d6f8SWagJ$DRHjNnOwXeRSe4r{pSursKP2+ z5*!Csj==m?xdmqNt(gZb?I}|u@T-17dXyRCfw)Zm+V*Ay#4LOW7g^5bn$2t^_RxbI zb~nFqnEJIPe82VAW1vgLGN5?NciA2C@u8*RO#64`l1El`KGb^eq{hBl4d;)_RN9|h z;2vSvnrG6N7_BRX3JZ;r19(S{2)`5E;kr~#Mr_~Kl~nJtaO8z|tn0FriIPLEk-0X6 zvkrodN)M#{Ib62%^qF1q_<~==kbKIOK6YgSp`>(Lk|N2qo8u_hSPg*eGz2WtsELJg z&i!U|fb7dz**KzB*2#Yx-xvl~W{KI5olssKlTbSoK4HwQbkz%LRT0Zs&^mDvdZM^f zaJ6-Hs!Z$PJ3v>ei2UT60fWv}du)Y_hI){-2L5Ct%oxT=k6UZvoJj>&I^!)jbKH&Z zn`AY%?Dat5!Xs-{1DBUi;|eN+y0ooBU9<+W zXtE^aR5vrFAIN4;N9Ijz8F;tVH*fW17b6FKG25!*j&7OkS`7Kf{_6PgnqvHT(@?hk zLv`$3uPtrWhuOD|xBV3K-Z=x^L*J84#xI&3h8UoEF81qz>!y#mJLY5D1@>wIkH3r( zKD4hMlFtyiV)%T#VfSo7!H3Sox<$um(_bE!wiwmw%hWWmIl0OA#aZY==|=ILqn824 zdZOgHV!5W3XWn)GHS;s9Br+0=)89}`$X;b0zt|G{kaO!YVoO;^U|9U?4*?C z!%|*r>zZj^}+;2PT53CIGVe$h&mj**Cis2A- z`8%{XPB83WbizI%%r;n-d1*hl?rK}yc6^H~msEv1`WhYfE;4vHO~yK60KQbPy+H~& z`rp(kJ4~kAZ*nz~nKy2r#MMU^21S{qW`tix;>?ZXUT`dLZ6bRY-q$g#o^Br|Ldz)_ zDg*O{d2CY7!@cjB=Op+FYx~N>fq<(Ap`nroe+W26+&nUTGK}0iDtO^=(%MYj)iRO# z?oT?0ZWTHZ_P``(^9-`JtTQyLdIA#NI|)c0!3Dc?);nWKZ{Cszq-_5F9y*io>5Hs_ zAnWq_~2s-hqXHNdHM>xV6h`*qRK!=$MrB=hXz+vHdBI$$LU=ggLL z^jO=a$aVtKjpt#M5lUhlQ9Qx@QXkS}vB$}6U~xu4-=rlJC}joEaE7=&(6 z-FR1gL)Z7leecjH^`_wsAd@Ib5u$uuuP82a*C4daRl_d$88oY z?qOz0+t3y^;Qp(6uXXmoj0;jop*I%skt<_q-YP(blUACHztsDilz|0Jd@ULU$sc+RLK@h*@r?;B}v z5IR{Rml=D#;)V+nRmdHtzuv~~FmDRVv)(rn+fk1Yzhcp14yw3Di#tW^85Hq1ZQVh1EGVb^Pax`C0-tS*wo!YH)*C?b4l>Vd)h$bQvM zNSz2P#E`kRXV;MRxn)F7ARMWiXcSQ(iu@Eq6X`bGc#i~zADH>Am4e1_OzOkKBI!m< z5joA{8()ep_|OZrSOWD$LqRZUQF*|}qFR(&V0a?+IQvVvdeiP8IhwTVglv`-h2`=uZ zwI0SrzXM<)cRy#(T3;a9U#glApBlWuG3yBb(Dk~5p$5_3H;wnI@2XOw=YrfS{!*7u z!a)pbk#MBP%1@F8K3KPxe-~fzp(YrDTIB`9&np ztMlJ}{Q*|$yDUgbRY&CGkDxUh_5?3`NWEGwS7;n+Y6(spup!c*h{@AP*SUfef@0ej zlCCAABKL2mkX~}vCOp`U((16TP~2 zxKU*Dd2$2VNmPQMwt~1_3Aj|k8m7@uWe7mq1%nXTy!oGrE^CkEty^Pbnro5D>Aspl ziUt=k7gWZqNu}1Qa&_*oo?Z2$e^eRLTjSg3$omYe6;Z8!i9pU+Of8oM{Iqvl_}wkRr_ix0&v0i6~@8!2pJC z0?yO1Lt}PzprseZS^620EvXAmX#;6|$gCV5aw66pHHh;7pohN53HJUgym11h0jGT- znJ#Tb$S;1B9Xh0Q7{kcJ_icsw*?<*Go{dAqDRdLD{m}#B1gZm$H28~O^a20@7UFd; z^36^G%h6?Y1+qrj_`+%8r5B+Oov?kBJsBZ})OR8HZny>6jN6V{zL7h7RpcaO z5gO`zz>0is7z+KjO(6iDFK#}CfU5I7l!)6=*Ub>G`aIq+tQvmPydGtaCD@oHL7j90pUrRf%j^&T{Jpd~)}G*FsWLG6xG|$2-QLDh zs_|#`jtveNrTh3?w*S(#Uy?=#qbF-XKV_X`86NIM@j3^XQuIuxS==-_^47lWv$vJq zAS-P47_7Qm>CT+iJm*k8G{$l8J-3y)##sctTD3kLG_*=!qr&g1_QQB(#59Eb%crLV zyB0Zy2en_nt@k~(T!~f6Jdu38;wfg|vSD{Jz{iU_vPH+URQobavCM`S`ojBP9;v#WL= z>Z>yLbwtLvJL$L%%hHAtZ)_WxxdjDH?IaWh#|7-DgT4f|^*0Mk?5N0h@9(^Ql#GIQ zIPZo_?1=li8lhhfl>D5VUi_o>5u6|BkcdlML!dv$Kug0CZ>N#VXU~Vj14NKiemoKL z8^EUPT9E^p7+)OUXJn4d@ETz@+s$N&yHVJsIlvm?kZ-d?&o2WH?C?`O%u(#MA9=o$ zFRG_EyMLUP8e&~#83rVlo?X{NHswSt)xi)PQDuT0WK_FkPNI*INOd%XY!yZvU(ZCP zliy@uGXh7|XauM@$j8aYgvj>o&U@JHj=HIZDP;bHTs~l z#J%r#h;A3H8V{i4hs=?{$rrsAJ!&sZf`nK1fw!_E1@2Ahg8SUhmgqI(azDLQ4M@iN zC^^OE24Bns*a5 zYX13M#}>VKWJ{)NbfNLRWwol7POHxS-zz(`+@#DH?~BEaN{`5>vKM7uzs4yEHtZ6? z%b<$VnhJ`OpC?)Tqq&=9t&ST?%NVFxmMrV7#gut+RWr>z947bo(U#Wsuepn;P z2CFR7mLNf@aY{4MQuz%Ey_;>92&Gazd0)1pkuV>KwP$FYH0)fzzAyzRb18KS!#fP| zDm)@sn%t?!zS76PA{H;7zsbm`LvQ< zujr5-h3qLt)ms{ZJ(|eq>yHUna6T$~q`<+!`i{I(0_}hdrjfw{)sLA>FU8Y#MTJzp z*e50C?c_m#FH~OBZ=h(72(>P=r?NoiPd(G^7sqAn!C@OdA#19pGdl0kztLc)mT@T{ z7Be~GoNdd0Ql|LXVMXGm$s{cIE-K^)y>^vSo|GH9rXpxxY-9~l>K#GNBhG=cQF4E7 zPQ)#W|4u#$G>eS?!x}d`c5DPSs!rJR`EPK;qm=L;;3B%{6}`SczsYyVAJc^r&E~K3qG|;RjqSU&+G3p*#4?VcqDZL6ezyGN!?Y&PAwMCGXttI%{xhL8yTaq?Eq< z!Dq0=I+ttmY;wh-`*-ieub$qXlxxTIW~q$@is3z}pp}|?M^7ZTK{O0Ozv+k!XItJ+ ztD2PAu@d&U|2j?_Wf89v($Jg`iub|tXMYh$t*YDIY6l0NCw1QrW4HSAJsemBZ5|$j zc=CN$8#*Yuse0CY|4tT1nYIGD4da+(W(J81-!t|qml8NsXvJnZY`DH*u52LwX6eOO zS=lmpgRjK@9j`nq4@p?zC}%LCs(}HYF7g11dgq<8GP&Ae+?Lx6RC8wWoWnR|#or^n z#*ni+O-L?dB$%ySp}o{={FHmXPRfKTAdMzNu`Kd!M#z({447Y!hR=?#UPT;3TsRPy zp4Ci{VaAufHd_@(ddu4eCH3r1WMq6r})JmSFPFdJrM`@a{?6axWC`G}A^DqGoIlg>9x%ssmFHAc zA;yh4FL&ObY{WN%1-N@ZkQEL$$G;3WwzQ5C?2izkG6-CG9J)TO|IP@-u!NrV(IF!O z^B$y&*w-qd>0l#76lq7<_+~i>wK9}j-kQ0>a__4_Y*flT4t|0TMxo|Gdl@&YMrW|_ zyf>Rk#+sy%!PnQtW14igo!1F%z6^)&_4m-!DYYxrb*s~~n$M{#zt~jJ>Kv8V(9+i4 z*g{(07N zU#$Pmp^gUD6>_j~06U-(Tzh@KF1lDf`}$<|G`?Nw)~I&+x44+O+%wT@SuA!g(T~rN zmHKA#w_@Giy|&*|g5qw%ZWaBZm22Khof#gU!Ab#UAiM>3)4w63*ZCrZ{O}|}InXr) zDEm-=^Z;@c|HA%q!+sU`IP!MD@9;zfov$>&X%zS7{fYQ{R}k>5k%iHQbAPk6 zv>`9*-r5WeOnzihj!z!MY(Xwx=F_No(zlR6)h*&N*Y?j*K;h+iW6?!6m(t{sdS4>4 zTY#&rxiRB(jqCp|IZW2TpJOt1#LY=mIgpIsnu_FWt6e;Mw;{xXkgAk8nI`qZsD(Bv zyvkm`XZB0;m2<6&qi_R=jZU%pn;+RV=FBo@`K9B9KhnO?%gL_4Nh)<;z>P1{#oja~ zP5Tq~;tO(M&{(VFdC$4z)(}~%)j} zHaDuLH34?Tfy}eJl|Mlb3)|1$JHVBocd@TYa85+6|IRZ*9m?fCGU0)xkq{6-Cf*ZaN#F@~PP8t@EI#8X^FN|lf;z-*2tigPkH zbrg##Zrs60*X2O={)MXU%7Jr7nG#W4#aq<9*%R6EOj#p%)rC#(AeEk5y&=)qjcZUYRKJY3dvzFX0C%hZGvfmP~T#f zQE#0|`ZS;WNqe8?#T>YB${6@t4y*v{!=MN#$xTUjBy>z@K=aez!CKP*$1RsptqQGc zk|dGUV%496zS~E$+R}9%)*?sIBLm?z(d9%m`4Vn|Q4@2fa3w3t2p9ictT=2AdNUk? zLMN+KIpxkKthpLGVjEiap8)2v_dljd3GU)?Wp^bc@nX?%6L_7;3XYi#EDg^QzNTP` zBCVgG%9kK`2UACUoY-(lhqhT1bsm4*L4MLduukZszN-JxqW4DwVYV}pKLAJ%KHlO7 zpyewOysjBD1=o3I%T2PT-pko?rE%RcxC@rsV8_gkw$Oz4V4M&15?no@=0_tjhZ+fC z8$IL`v60`W-u5o)k=v(nZlh|cA|eqX{NLI6KX&^c_5V%M|5cUzFV+9;;P?NfNc#_` z|9SmC{EUV0?-Bt45rGV0H$DE%j^h-f<+aM~_CI_MRr*hAsiLC&dxP{(H~m8q(toG_ E0K6^9ApigX diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PendingPackageMigrationsTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PendingPackageMigrationsTests.cs new file mode 100644 index 0000000000..a9635b76ca --- /dev/null +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Core/Packaging/PendingPackageMigrationsTests.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Packaging; + +namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Packaging +{ + [TestFixture] + public class PendingPackageMigrationsTests + { + private static readonly Guid s_step1 = Guid.NewGuid(); + private static readonly Guid s_step2 = Guid.NewGuid(); + private const string PackageName = "Test1"; + + private class TestPackageMigrationPlan : PackageMigrationPlan + { + public TestPackageMigrationPlan() : base(PackageName) + { + } + + protected override void DefinePlan() + { + To(s_step1); + To(s_step2); + } + } + + private PendingPackageMigrations GetPendingPackageMigrations() + => new PendingPackageMigrations( + Mock.Of>(), + new PackageMigrationPlanCollection(new[] + { + new TestPackageMigrationPlan() + })); + + [Test] + public void GivenNoRegisteredMigrations_ThenPlanIsReturned() + { + PendingPackageMigrations pendingPackageMigrations = GetPendingPackageMigrations(); + var registeredMigrations = new Dictionary(); + IReadOnlyList pending = pendingPackageMigrations.GetUmbracoPendingPackageMigrations(registeredMigrations); + Assert.AreEqual(1, pending.Count); + } + + [Test] + public void GivenRegisteredMigration_WhenFinalStepMatched_ThenNoneAreReturned() + { + PendingPackageMigrations pendingPackageMigrations = GetPendingPackageMigrations(); + var registeredMigrations = new Dictionary + { + [Constants.Conventions.Migrations.KeyValuePrefix + PackageName] = s_step2.ToString() + }; + IReadOnlyList pending = pendingPackageMigrations.GetUmbracoPendingPackageMigrations(registeredMigrations); + Assert.AreEqual(0, pending.Count); + } + + [Test] + public void GivenRegisteredMigration_WhenNonFinalStepMatched_ThenPlanIsReturned() + { + PendingPackageMigrations pendingPackageMigrations = GetPendingPackageMigrations(); + var registeredMigrations = new Dictionary + { + [Constants.Conventions.Migrations.KeyValuePrefix + PackageName] = s_step1.ToString() + }; + IReadOnlyList pending = pendingPackageMigrations.GetUmbracoPendingPackageMigrations(registeredMigrations); + Assert.AreEqual(1, pending.Count); + } + + [Test] + public void GivenRegisteredMigration_WhenStepIsDifferentCase_ThenPlanIsReturned() + { + PendingPackageMigrations pendingPackageMigrations = GetPendingPackageMigrations(); + var registeredMigrations = new Dictionary + { + [Constants.Conventions.Migrations.KeyValuePrefix + PackageName] = s_step1.ToString().ToUpper() + }; + IReadOnlyList pending = pendingPackageMigrations.GetUmbracoPendingPackageMigrations(registeredMigrations); + Assert.AreEqual(1, pending.Count); + } + } +} diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs index bfe11a9878..bd54ca1b33 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs @@ -7,6 +7,7 @@ using System.Linq; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; +using Umbraco.Cms.Core.Migrations; using Umbraco.Cms.Infrastructure.Migrations; using Umbraco.Cms.Tests.Common.TestHelpers; using Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations.Stubs; @@ -16,14 +17,24 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations [TestFixture] public class AlterMigrationTests { - private readonly ILogger _logger = Mock.Of>(); + private readonly ILogger _logger = Mock.Of>(); + private class TestPlan : MigrationPlan + { + public TestPlan() : base("Test") + { + } + } + private MigrationContext GetMigrationContext(out TestDatabase db) + { + db = new TestDatabase(); + return new MigrationContext(new TestPlan(), db, _logger); + } [Test] public void Drop_Foreign_Key() { // Arrange - var database = new TestDatabase(); - var context = new MigrationContext(database, _logger); + var context = GetMigrationContext(out var database); var stub = new DropForeignKeyMigrationStub(context); // Act @@ -44,8 +55,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations [Test] public void CreateColumn() { - var database = new TestDatabase(); - var context = new MigrationContext(database, _logger); + var context = GetMigrationContext(out var database); var migration = new CreateColumnMigration(context); migration.Migrate(); @@ -74,8 +84,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations [Test] public void AlterColumn() { - var database = new TestDatabase(); - var context = new MigrationContext(database, _logger); + var context = GetMigrationContext(out var database); var migration = new AlterColumnMigration(context); migration.Migrate(); @@ -110,8 +119,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations public void Can_Get_Up_Migration_From_MigrationStub() { // Arrange - var database = new TestDatabase(); - var context = new MigrationContext(database, _logger); + var context = GetMigrationContext(out var database); var stub = new AlterUserTableMigrationStub(context); // Act diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationTests.cs index f118de46e0..8a14ae689e 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationTests.cs @@ -59,11 +59,18 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations #endif } + private class TestPlan : MigrationPlan + { + public TestPlan() : base("Test") + { + } + } + private MigrationContext GetMigrationContext() => new MigrationContext(new TestPlan(), Mock.Of(), Mock.Of>()); + [Test] public void RunGoodMigration() { - var migrationContext = - new MigrationContext(Mock.Of(), Mock.Of>()); + var migrationContext = GetMigrationContext(); IMigration migration = new GoodMigration(migrationContext); migration.Migrate(); } @@ -71,8 +78,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations [Test] public void DetectBadMigration1() { - var migrationContext = - new MigrationContext(Mock.Of(), Mock.Of>()); + var migrationContext = GetMigrationContext(); IMigration migration = new BadMigration1(migrationContext); Assert.Throws(() => migration.Migrate()); } @@ -80,8 +86,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations [Test] public void DetectBadMigration2() { - var migrationContext = - new MigrationContext(Mock.Of(), Mock.Of>()); + var migrationContext = GetMigrationContext(); IMigration migration = new BadMigration2(migrationContext); Assert.Throws(() => migration.Migrate()); } diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/PostMigrationTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/PostMigrationTests.cs index 3952dea607..2400f2560c 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/PostMigrationTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/PostMigrationTests.cs @@ -113,7 +113,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Infrastructure.Migrations TestMigration.MigrateCount = 0; TestPostMigration.MigrateCount = 0; - new MigrationContext(database, s_loggerFactory.CreateLogger()); + new MigrationContext(plan, database, s_loggerFactory.CreateLogger()); var upgrader = new Upgrader(plan); IMigrationPlanExecutor executor = GetMigrationPlanExecutor(scopeProvider, builder); diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs index 29ba133334..c3fb203ec1 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs @@ -259,10 +259,6 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers "memberApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl( controller => controller.GetByKey(Guid.Empty)) }, - { - "packageInstallApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl( - controller => controller.Fetch(string.Empty)) - }, { "packageApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl( controller => controller.GetCreatedPackages()) diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs index 79ea6f6329..d6c045af0b 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs @@ -17,11 +17,11 @@ using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; -using Umbraco.Cms.Core.Packaging; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Infrastructure.Packaging; using Umbraco.Cms.Web.Common.ActionsResults; using Umbraco.Cms.Web.Common.Attributes; using Umbraco.Cms.Web.Common.Authorization; diff --git a/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs b/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs index 99dcf161ab..66eba2d631 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/PackageController.cs @@ -106,8 +106,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers if (package == null) return NotFound(); - var fullPath = _hostingEnvironment.MapPathWebRoot(package.PackagePath); - if (!System.IO.File.Exists(fullPath)) + if (!System.IO.File.Exists(package.PackagePath)) return ValidationErrorResult.CreateNotificationValidationErrorResult("No file found for path " + package.PackagePath); var fileName = Path.GetFileName(package.PackagePath); @@ -122,20 +121,13 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers Response.Headers.Add("Content-Disposition", cd.ToString()); // Set custom header so umbRequestHelper.downloadFile can save the correct filename Response.Headers.Add("x-filename", WebUtility.UrlEncode(fileName)); - return new FileStreamResult(System.IO.File.OpenRead(fullPath), new MediaTypeHeaderValue("application/octet-stream") + return new FileStreamResult(System.IO.File.OpenRead(package.PackagePath), new MediaTypeHeaderValue("application/octet-stream") { Charset = encoding.WebName, }); } - public ActionResult GetInstalledPackageById(int id) - { - var pack = _packagingService.GetInstalledPackageById(id); - if (pack == null) return NotFound(); - return pack; - } - /// /// Returns all installed packages - only shows their latest versions /// @@ -143,20 +135,6 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers public IEnumerable GetInstalled() { return _packagingService.GetAllInstalledPackages() - .GroupBy( - //group by name - x => x.Name, - //select the package with a parsed version - pck => SemVersion.TryParse(pck.Version, out var pckVersion) - ? new { package = pck, version = pckVersion } - : new { package = pck, version = new SemVersion(0, 0, 0) }) - .Select(grouping => - { - //get the max version for the package - var maxVersion = grouping.Max(x => x.version); - //only return the first package with this version - return grouping.First(x => x.version == maxVersion).package; - }) .ToList(); } } diff --git a/src/Umbraco.Web.BackOffice/Controllers/PackageInstallController.cs b/src/Umbraco.Web.BackOffice/Controllers/PackageInstallController.cs deleted file mode 100644 index 1c874732c4..0000000000 --- a/src/Umbraco.Web.BackOffice/Controllers/PackageInstallController.cs +++ /dev/null @@ -1,389 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using Umbraco.Cms.Core.Configuration; -using Umbraco.Cms.Core.Hosting; -using Umbraco.Cms.Core.Models; -using Umbraco.Cms.Core.Models.ContentEditing; -using Umbraco.Cms.Core.Models.Packaging; -using Umbraco.Cms.Core.Packaging; -using Umbraco.Cms.Core.Security; -using Umbraco.Cms.Core.Semver; -using Umbraco.Cms.Core.Services; -using Umbraco.Cms.Core.WebAssets; -using Umbraco.Cms.Web.Common.ActionsResults; -using Umbraco.Cms.Web.Common.Attributes; -using Umbraco.Cms.Web.Common.Authorization; -using Umbraco.Extensions; -using Umbraco.Cms.Core; -namespace Umbraco.Cms.Web.BackOffice.Controllers -{ - /// - /// A controller used for installing packages and managing all of the data in the packages section in the back office - /// - [PluginController(Constants.Web.Mvc.BackOfficeApiArea)] - [Authorize(Policy = AuthorizationPolicies.SectionAccessPackages)] - public class PackageInstallController : UmbracoAuthorizedJsonController - { - - private readonly IUmbracoVersion _umbracoVersion; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime; - private readonly IRuntimeMinifier _runtimeMinifier; - private readonly IPackagingService _packagingService; - private readonly ILogger _logger; - private readonly IBackOfficeSecurityAccessor _backofficeSecurityAccessor; - private readonly ILocalizedTextService _localizedTextService; - - public PackageInstallController( - IUmbracoVersion umbracoVersion, - IHostingEnvironment hostingEnvironment, - IUmbracoApplicationLifetime umbracoApplicationLifetime, - IRuntimeMinifier runtimeMinifier, - IPackagingService packagingService, - ILogger logger, - IBackOfficeSecurityAccessor backofficeSecurityAccessor, - ILocalizedTextService localizedTextService) - { - _umbracoVersion = umbracoVersion ?? throw new ArgumentNullException(nameof(umbracoVersion)); - _hostingEnvironment = hostingEnvironment ?? throw new ArgumentNullException(nameof(hostingEnvironment)); - _umbracoApplicationLifetime = umbracoApplicationLifetime ?? throw new ArgumentNullException(nameof(umbracoApplicationLifetime)); - _runtimeMinifier = runtimeMinifier ?? throw new ArgumentNullException(nameof(runtimeMinifier)); - _packagingService = packagingService ?? throw new ArgumentNullException(nameof(packagingService)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _backofficeSecurityAccessor = backofficeSecurityAccessor ?? throw new ArgumentNullException(nameof(backofficeSecurityAccessor)); - _localizedTextService = localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService)); - } - - /// - /// This checks if this package & version is already installed - /// - /// - /// - /// - [HttpPost] - public IActionResult ValidateInstalled(string name, string version) - { - var installType = _packagingService.GetPackageInstallType(name, SemVersion.Parse(version), out _); - - if (installType == PackageInstallType.AlreadyInstalled) - return BadRequest(); - - return Ok(); - } - - [HttpPost] - public IActionResult Uninstall(int packageId) - { - try - { - - var package = _packagingService.GetInstalledPackageById(packageId); - if (package == null) return NotFound(); - - var summary = _packagingService.UninstallPackage(package.Name, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - - //now get all other packages by this name since we'll uninstall all versions - foreach (var installed in _packagingService.GetAllInstalledPackages() - .Where(x => x.Name == package.Name && x.Id != package.Id)) - { - //remove from the xml - _packagingService.DeleteInstalledPackage(installed.Id, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to uninstall."); - throw; - } - - return Ok(); - } - - - - private void PopulateFromPackageData(LocalPackageInstallModel model) - { - var zipFile = new FileInfo(Path.Combine(_hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.Packages), model.ZipFileName)); - - var ins = _packagingService.GetCompiledPackageInfo(zipFile); - - model.Name = ins.Name; - model.Author = ins.Author; - model.AuthorUrl = ins.AuthorUrl; - model.Contributors = ins.Contributors; - model.IconUrl = ins.IconUrl; - model.License = ins.License; - model.LicenseUrl = ins.LicenseUrl; - model.Readme = ins.Readme; - model.ConflictingMacroAliases = ins.Warnings.ConflictingMacros.ToDictionary(x => x.Name, x => x.Alias); - model.ConflictingStyleSheetNames = ins.Warnings.ConflictingStylesheets.ToDictionary(x => x.Name, x => x.Alias); - model.ConflictingTemplateAliases = ins.Warnings.ConflictingTemplates.ToDictionary(x => x.Name, x => x.Alias); - model.ContainsUnsecureFiles = ins.Warnings.UnsecureFiles.Any(); - model.Url = ins.Url; - model.Version = ins.Version; - - model.UmbracoVersion = ins.UmbracoVersionRequirementsType == RequirementsType.Strict - ? ins.UmbracoVersion.ToString(3) - : string.Empty; - - //now we need to check for version comparison - model.IsCompatible = true; - if (ins.UmbracoVersionRequirementsType == RequirementsType.Strict) - { - var packageMinVersion = ins.UmbracoVersion; - if (_umbracoVersion.Version < packageMinVersion) - { - model.IsCompatible = false; - } - } - } - - [HttpPost] - public async Task> UploadLocalPackage(List file) - { - //must have a file - if (file.Count == 0) - return NotFound(); - - var model = new LocalPackageInstallModel - { - //Generate a new package Id for this, we'll use this later for tracking, when persisting, saving the file, etc... - PackageGuid = Guid.NewGuid() - }; - - //get the files - foreach (var formFile in file) - { - var fileName = formFile.FileName.Trim(Constants.CharArrays.DoubleQuote); - var ext = fileName.Substring(fileName.LastIndexOf('.') + 1).ToLower(); - - if (ext.InvariantEquals("zip") || ext.InvariantEquals("umb")) - { - //we always save package files to /App_Data/packages/package-guid.umb for processing as a standard so lets copy. - - var packagesFolder = _hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.Packages); - Directory.CreateDirectory(packagesFolder); - var packageFile = Path.Combine(packagesFolder, model.PackageGuid + ".umb"); - - using (var stream = System.IO.File.Create(packageFile)) - { - await formFile.CopyToAsync(stream); - } - - model.ZipFileName = Path.GetFileName(packageFile); - - //Populate the model from the metadata in the package file (zip file) - PopulateFromPackageData(model); - - var installType = _packagingService.GetPackageInstallType(model.Name, SemVersion.Parse(model.Version), out var alreadyInstalled); - - if (installType == PackageInstallType.AlreadyInstalled) - { - //this package is already installed - return ValidationErrorResult.CreateNotificationValidationErrorResult( - _localizedTextService.Localize("packager/packageAlreadyInstalled")); - } - - model.OriginalVersion = installType == PackageInstallType.Upgrade ? alreadyInstalled.Version : null; - - } - else - { - model.Notifications.Add(new BackOfficeNotification( - _localizedTextService.Localize("speechBubbles/operationFailedHeader"), - _localizedTextService.Localize("media/disallowedFileType"), - NotificationStyle.Warning)); - } - - } - - return model; - - } - - /// - /// Gets the package from Our to install - /// - /// - /// - [HttpGet] - public async Task> Fetch(string packageGuid) - { - //Default path - string fileName = packageGuid + ".umb"; - if (System.IO.File.Exists(Path.Combine(_hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.Packages), fileName)) == false) - { - var packageFile = await _packagingService.FetchPackageFileAsync( - Guid.Parse(packageGuid), - _umbracoVersion.Version, - _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - - fileName = packageFile.Name; - } - - var model = new LocalPackageInstallModel - { - PackageGuid = Guid.Parse(packageGuid), - ZipFileName = fileName - }; - - //Populate the model from the metadata in the package file (zip file) - PopulateFromPackageData(model); - - var installType = _packagingService.GetPackageInstallType(model.Name, SemVersion.Parse(model.Version), out var alreadyInstalled); - - if (installType == PackageInstallType.AlreadyInstalled) - { - return ValidationErrorResult.CreateNotificationValidationErrorResult( - _localizedTextService.Localize("packager/packageAlreadyInstalled")); - } - - model.OriginalVersion = installType == PackageInstallType.Upgrade ? alreadyInstalled.Version : null; - - return model; - } - - /// - /// Extracts the package zip and gets the packages information - /// - /// - /// - [HttpPost] - public ActionResult Import(PackageInstallModel model) - { - var zipFile = new FileInfo(Path.Combine(_hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.Packages), model.ZipFileName)); - - var packageInfo = _packagingService.GetCompiledPackageInfo(zipFile); - - //now we need to check for version comparison - if (packageInfo.UmbracoVersionRequirementsType == RequirementsType.Strict) - { - var packageMinVersion = packageInfo.UmbracoVersion; - if (_umbracoVersion.Version < packageMinVersion) - return ValidationErrorResult.CreateNotificationValidationErrorResult( - _localizedTextService.Localize("packager/targetVersionMismatch", new[] {packageMinVersion.ToString()})); - } - - var installType = _packagingService.GetPackageInstallType(packageInfo.Name, SemVersion.Parse(packageInfo.Version), out var alreadyInstalled); - - var packageDefinition = PackageDefinition.FromCompiledPackage(packageInfo); - packageDefinition.PackagePath = zipFile.FullName; - packageDefinition.PackageId = model.PackageGuid; //We must re-map the original package GUID that was generated - - switch (installType) - { - case PackageInstallType.AlreadyInstalled: - throw new InvalidOperationException("The package is already installed"); - case PackageInstallType.NewInstall: - case PackageInstallType.Upgrade: - - //save to the installedPackages.config, this will create a new entry with a new Id - if (!_packagingService.SaveInstalledPackage(packageDefinition)) - return ValidationErrorResult.CreateNotificationValidationErrorResult("Could not save the package"); - - model.Id = packageDefinition.Id; - break; - default: - throw new ArgumentOutOfRangeException(); - } - - - return model; - } - - /// - /// Installs the package files - /// - /// - /// - [HttpPost] - public PackageInstallModel InstallFiles(PackageInstallModel model) - { - var definition = _packagingService.GetInstalledPackageById(model.Id); - if (definition == null) throw new InvalidOperationException("Not package definition found with id " + model.Id); - - var zipFile = new FileInfo(definition.PackagePath); - var installedFiles = _packagingService.InstallCompiledPackageFiles(definition, zipFile, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - - //set a restarting marker and reset the app pool - _umbracoApplicationLifetime.Restart(); - - model.IsRestarting = true; - - - return model; - } - - [HttpPost] - public PackageInstallModel CheckRestart(PackageInstallModel model) - { - if (model.IsRestarting == false) return model; - - model.IsRestarting = _umbracoApplicationLifetime.IsRestarting; - - return model; - } - - /// - /// Installs the packages data/business logic - /// - /// - /// - [HttpPost] - public PackageInstallModel InstallData(PackageInstallModel model) - { - var definition = _packagingService.GetInstalledPackageById(model.Id); - if (definition == null) throw new InvalidOperationException("Not package definition found with id " + model.Id); - - var zipFile = new FileInfo(definition.PackagePath); - var installSummary = _packagingService.InstallCompiledPackageData(definition, zipFile, _backofficeSecurityAccessor.BackOfficeSecurity.GetUserId().ResultOr(0)); - - return model; - } - - /// - /// Cleans up the package installation - /// - /// - /// - [HttpPost] - public PackageInstallResult CleanUp(PackageInstallModel model) - { - var definition = _packagingService.GetInstalledPackageById(model.Id); - if (definition == null) throw new InvalidOperationException("Not package definition found with id " + model.Id); - - var zipFile = new FileInfo(definition.PackagePath); - - var packageInfo = _packagingService.GetCompiledPackageInfo(zipFile); - - zipFile.Delete(); - - //bump cdf to be safe - _runtimeMinifier.Reset(); - - var redirectUrl = ""; - if (!packageInfo.PackageView.IsNullOrWhiteSpace()) - { - redirectUrl = $"/packages/packages/options/{model.Id}"; - } - - return new PackageInstallResult - { - Id = model.Id, - ZipFileName = model.ZipFileName, - PackageGuid = model.PackageGuid, - PostInstallationPath = redirectUrl - }; - - } - - - } -} diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs index cdd00913e7..192399b028 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs @@ -680,10 +680,10 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers IUser currentUser = _backofficeSecurityAccessor.BackOfficeSecurity.CurrentUser; - // if it's the current user, the current user cannot reset their own password - if (currentUser.Username == found.Username) + // if it's the current user, the current user cannot reset their own password without providing their old password + if (currentUser.Username == found.Username && string.IsNullOrEmpty(changingPasswordModel.OldPassword)) { - return new ValidationErrorResult("Password reset is not allowed"); + return new ValidationErrorResult("Password reset is not allowed without providing old password"); } if (!currentUser.IsAdmin() && found.IsAdmin()) diff --git a/src/Umbraco.Web.BackOffice/Install/InstallApiController.cs b/src/Umbraco.Web.BackOffice/Install/InstallApiController.cs index 9d97883bba..eb6457074e 100644 --- a/src/Umbraco.Web.BackOffice/Install/InstallApiController.cs +++ b/src/Umbraco.Web.BackOffice/Install/InstallApiController.cs @@ -90,12 +90,6 @@ namespace Umbraco.Cms.Web.BackOffice.Install return setup; } - public IEnumerable GetPackages() - { - var starterKits = InstallHelper.GetStarterKits(); - return starterKits; - } - [HttpPost] public async Task CompleteInstall() { diff --git a/src/Umbraco.Web.BackOffice/Install/InstallController.cs b/src/Umbraco.Web.BackOffice/Install/InstallController.cs index 721e6718fe..6e5b3314db 100644 --- a/src/Umbraco.Web.BackOffice/Install/InstallController.cs +++ b/src/Umbraco.Web.BackOffice/Install/InstallController.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; @@ -68,6 +68,7 @@ namespace Umbraco.Cms.Web.BackOffice.Install if (_runtime.Level == RuntimeLevel.Run) return Redirect(umbracoPath); + // TODO: Update for package migrations if (_runtime.Level == RuntimeLevel.Upgrade) { // Update ClientDependency version and delete its temp directories to make sure we get fresh caches diff --git a/src/Umbraco.Web.Common/Middleware/BootFailedMiddleware.cs b/src/Umbraco.Web.Common/Middleware/BootFailedMiddleware.cs index 4f2b35bc93..afa837c7fe 100644 --- a/src/Umbraco.Web.Common/Middleware/BootFailedMiddleware.cs +++ b/src/Umbraco.Web.Common/Middleware/BootFailedMiddleware.cs @@ -25,10 +25,14 @@ namespace Umbraco.Cms.Web.Common.Middleware public async Task InvokeAsync(HttpContext context, RequestDelegate next) { + // TODO: It would be possible to redirect to the installer here in debug mode while + // still showing the error. This would be a lot more friendly than just the YSOD. + // We could also then have a different installer view for when package migrations fails + // and to retry each one individually. Perhaps this can happen in the future. + if (_runtimeState.Level == RuntimeLevel.BootFailed) { // short circuit - // if (_hostingEnvironment.IsDebugMode) { diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index f19063fecd..db8d016817 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -11,10 +11,16 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz", + "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==", + "dev": true + }, "@babel/core": { "version": "7.6.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz", - "integrity": "sha1-br2f4Akl9sPhd7tyahiLX1eAiP8=", + "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==", "dev": true, "requires": { "@babel/code-frame": "^7.5.5", @@ -131,6 +137,57 @@ "@babel/types": "^7.4.4" } }, + "@babel/helper-compilation-targets": { + "version": "7.14.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz", + "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.4", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "caniuse-lite": { + "version": "1.0.30001234", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001234.tgz", + "integrity": "sha512-a3gjUVKkmwLdNysa1xkUAwN2VfJUJyVW47rsi3aCbkRCtbHAfo+rOsCqVw29G6coQ8gzAPb5XBXwiGHwme3isA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.748", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.748.tgz", + "integrity": "sha512-fmIKfYALVeEybk/L2ucdgt7jN3JsbGtg3K9pmF/MRWgkeADBI1VSAa5IzdG2gZwTxsnsrFtdMpOTSM5mrBRKVQ==", + "dev": true + }, + "node-releases": { + "version": "1.1.72", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", + "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "@babel/helper-define-map": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", @@ -281,6 +338,12 @@ "@babel/types": "^7.4.4" } }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", @@ -353,13 +416,42 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", - "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", + "dev": true + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", + "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + } } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -739,7 +831,7 @@ "@babel/preset-env": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz", - "integrity": "sha1-nhvwWi4taHA20kxA5GOdxGzvInE=", + "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -865,7 +957,7 @@ "@gulp-sourcemaps/identity-map": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha1-Hm/l2AJ7HyhdwNMXYvVmvM1z1ak=", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", "dev": true, "requires": { "acorn": "^5.0.3", @@ -884,7 +976,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -948,7 +1040,7 @@ "@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha1-mgb08TfuhNffBGDB/bETX/psUP0=", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true, "optional": true }, @@ -970,7 +1062,7 @@ "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, "@types/node": { @@ -994,7 +1086,7 @@ "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { "mime-types": "~2.1.24", @@ -1004,7 +1096,7 @@ "accord": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz", - "integrity": "sha1-t0HBdtAENcWSnUZt/oz2vukzseQ=", + "integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==", "dev": true, "requires": { "convert-source-map": "^1.5.0", @@ -1051,7 +1143,7 @@ "ace-builds": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.4.2.tgz", - "integrity": "sha1-avwuQ6e17/3ETYQHQ2EShSVo6A0=" + "integrity": "sha512-M1JtZctO2Zg+1qeGUFZXtYKsyaRptqQtqpVzlj80I0NzGW9MF3um0DBuizIvQlrPYUlTdm+wcOPZpZoerkxQdA==" }, "acorn": { "version": "7.1.0", @@ -1148,12 +1240,12 @@ "angular-animate": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.7.5.tgz", - "integrity": "sha1-H/xsKpze4ieiunnMbNj3HsRNtdw=" + "integrity": "sha512-kU/fHIGf2a4a3bH7E1tzALTHk+QfoUSCK9fEcMFisd6ZWvNDwPzXWAilItqOC3EDiAXPmGHaNc9/aXiD9xrAxQ==" }, "angular-aria": { "version": "1.7.9", "resolved": "https://registry.npmjs.org/angular-aria/-/angular-aria-1.7.9.tgz", - "integrity": "sha1-kMYYlf+9h26VkVIisyp70AcK9+M=" + "integrity": "sha512-luI3Jemd1AbOQW0krdzfEG3fM0IFtLY0bSSqIDEx3POE0XjKIC1MkrO8Csyq9PPgueLphyAPofzUwZ8YeZ88SA==" }, "angular-chart.js": { "version": "1.1.1", @@ -1178,12 +1270,12 @@ "angular-cookies": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.7.5.tgz", - "integrity": "sha1-HFqzwFzcQ/F3e+lQbmRYfLNUNjQ=" + "integrity": "sha512-/8xvvSl/Z9Vwu8ChRm+OQE3vmli8Icwl8uTYkHqD7j7cknJP9kNaf7SgsENlsLVtOqLE/I7TCFYrSx3bmSeNQA==" }, "angular-dynamic-locale": { "version": "0.1.37", "resolved": "https://registry.npmjs.org/angular-dynamic-locale/-/angular-dynamic-locale-0.1.37.tgz", - "integrity": "sha1-fon70uxFvdaryJ82zaiJODjkk1Q=", + "integrity": "sha512-m5Kyk8W8/mOZSqRxuByOwHBjv8labLBAgvl0Z3iQx2xT/tWCqb94imKUPwumudszdPDjxeopwyucQvm8Sw7ogw==", "requires": { "@types/angular": "^1.6.25" } @@ -1191,7 +1283,7 @@ "angular-i18n": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-i18n/-/angular-i18n-1.7.5.tgz", - "integrity": "sha1-Lie2Thl3qMa2sFHFHQF1xtTcglI=" + "integrity": "sha512-52+Jpt8HRJV2bqSbSU6fWkwOvGzj/DxbNpKXxnTuCS9heuJrlm77BS/lhrF4BA8+Uudnh7npr5/yRELobP+8Yw==" }, "angular-local-storage": { "version": "0.7.1", @@ -1201,32 +1293,32 @@ "angular-messages": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.7.5.tgz", - "integrity": "sha1-fC/XgTFaQ6GYOLEX2gFCqYhFThQ=" + "integrity": "sha512-YDpJpFLyrIgZjE/sIAjgww1y6r3QqXBJbNDI0QjftD37vHXLkwvAOo3A4bxPw8BikyGLcJrFrgf6hRAzntJIWA==" }, "angular-mocks": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.7.5.tgz", - "integrity": "sha1-yLq6WgbtYLk0aXAmtJIWliavOEs=" + "integrity": "sha512-I+Ue2Bkx6R9W5178DYrNvzjIdGh4wKKoCWsgz8dc7ysH4mA70Q3M9v5xRF0RUu7r+2CZj+nDeUecvh2paxcYvg==" }, "angular-route": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.7.5.tgz", - "integrity": "sha1-NKNkjEB6FKAw0HXPSFMY4zuiPw4=" + "integrity": "sha512-7KfyEVVOWTI+jTY/j5rUNCIHGRyeCOx7YqZI/Ci3IbDK7GIsy6xH+hS5ai0Xi0sLjzDZ0PUDO4gBn+K0dVtlOg==" }, "angular-sanitize": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.7.5.tgz", - "integrity": "sha1-ddSeFQccqccFgedtIJQPJjcuJNI=" + "integrity": "sha512-wjKCJOIwrkEvfD0keTnKGi6We13gtoCAQIHcdoqyoo3gwvcgNfYymVQIS3+iCGVcjfWz0jHuS3KgB4ysRWsTTA==" }, "angular-touch": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/angular-touch/-/angular-touch-1.7.5.tgz", - "integrity": "sha1-7SYyKmhfApmyPLauqYNMEZQk2kY=" + "integrity": "sha512-XNAZNG0RA1mtdwBJheViCF1H/7wOygp4MLIfs5y1K+rne6AeaYKZcV6EJs9fvgfLKLO6ecm1+3J8hoCkdhhxQw==" }, "angular-ui-sortable": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/angular-ui-sortable/-/angular-ui-sortable-0.19.0.tgz", - "integrity": "sha1-SsQ5H8TU3lcRDbS10xp8GY0xT9A=", + "integrity": "sha512-u/uc981Nzg4XN1bMU9qKleMTSt7F1XjMWnyGw6gxPLIeQeLZm8jWNy7tj8y2r2HmvzXFbQVq2z6rObznFKAekQ==", "requires": { "angular": ">=1.2.x", "jquery": ">=3.1.x", @@ -1289,7 +1381,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -1543,7 +1635,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } @@ -1551,7 +1643,7 @@ "array-last": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha1-eqdwc/7FZd2rJJP1+IGF9ASp0zY=", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, "requires": { "is-number": "^4.0.0" @@ -1560,7 +1652,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } @@ -1574,7 +1666,7 @@ "array-sort": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, "requires": { "default-compare": "^1.0.0", @@ -1585,7 +1677,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -1593,7 +1685,7 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, "array-uniq": { @@ -1624,7 +1716,7 @@ "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { "safer-buffer": "~2.1.0" } @@ -1643,13 +1735,13 @@ "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -1666,7 +1758,7 @@ "async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha1-XhWqcplipLB0FPUoqIzfGOCykKI=", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -1678,13 +1770,13 @@ "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=" + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "async-settle": { "version": "1.0.0", @@ -1703,13 +1795,13 @@ "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, "autoprefixer": { "version": "9.6.5", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.5.tgz", - "integrity": "sha1-mPSv5+k8zPMjKHUV1CYBlhl3Xl4=", + "integrity": "sha512-rGd50YV8LgwFQ2WQp4XzOTG69u1qQsXn0amww7tjqV5jJuNazgFKYEVItEBngyyvVITKOg20zr2V+9VsrXJQ2g==", "dev": true, "requires": { "browserslist": "^4.7.0", @@ -1742,7 +1834,7 @@ "babel-plugin-dynamic-import-node": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha1-8A9Qe9qjw+P/bn5emNkKesq5b38=", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", "dev": true, "requires": { "object.assign": "^4.1.0" @@ -1842,8 +1934,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "optional": true + "dev": true }, "base64id": { "version": "1.0.0", @@ -1877,7 +1968,7 @@ "bin-build": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", - "integrity": "sha1-xXgKJaip+WbYJEIX5sH1CCoUOGE=", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", "dev": true, "optional": true, "requires": { @@ -1928,7 +2019,7 @@ "bin-check": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha1-/ElZcL3Ii7HVo1/BfmXEoUn8Skk=", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", "dev": true, "optional": true, "requires": { @@ -1976,7 +2067,7 @@ "bin-version": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", - "integrity": "sha1-WwnrKAdSsb0o8MnbP5by9DtsCDk=", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", "dev": true, "optional": true, "requires": { @@ -1987,7 +2078,7 @@ "bin-version-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", - "integrity": "sha1-fYGcYklpkfgNiT5uAqMDI2Fgj3E=", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", "dev": true, "optional": true, "requires": { @@ -1999,7 +2090,7 @@ "bin-wrapper": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", - "integrity": "sha1-mTSPLPhQMePvfvzn5TAK6q6WBgU=", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", "dev": true, "optional": true, "requires": { @@ -2014,7 +2105,7 @@ "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha1-kFmqnXC1A+52oTKJe+beyOVYcjM=", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", "dev": true, "optional": true, "requires": { @@ -2044,7 +2135,7 @@ "file-type": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha1-JE87fvZBu+DMoZbHJ25LMyOZ9ow=", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", "dev": true, "optional": true }, @@ -2052,13 +2143,12 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "optional": true + "dev": true }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha1-HSP2Q5Dpf3dsrFLluTbl9RTS6Tc=", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "dev": true, "optional": true, "requires": { @@ -2093,7 +2183,7 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "optional": true, "requires": { @@ -2112,14 +2202,14 @@ "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha1-NfNj1n1SCByNlYXje8zrfgu8sqA=", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true, "optional": true }, "p-event": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha1-WWJ57xaassPgyuiMHPuwgHmZPvY=", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", "dev": true, "optional": true, "requires": { @@ -2129,9 +2219,8 @@ "p-timeout": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha1-2N0ZeVldLcATnh/ka4tkbLPN8Dg=", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, - "optional": true, "requires": { "p-finally": "^1.0.0" } @@ -2139,7 +2228,7 @@ "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "optional": true }, @@ -2165,7 +2254,7 @@ "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "bl": { @@ -2173,7 +2262,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, - "optional": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -2183,15 +2271,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -2207,7 +2293,6 @@ "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -2217,7 +2302,7 @@ "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha1-1oDu7yX4zZGtUz9bAe7UjmTK9oM=", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "bluebird": { @@ -2229,7 +2314,7 @@ "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { "bytes": "3.1.0", @@ -2247,7 +2332,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -2262,7 +2347,7 @@ "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true } } @@ -2276,7 +2361,7 @@ "bootstrap": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha1-w6NH1Bniia0R9AM+PEEyuHwIHXI=" + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" }, "bootstrap-social": { "version": "5.1.1", @@ -2348,7 +2433,6 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "optional": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -2374,8 +2458,7 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "optional": true + "dev": true }, "buffer-equal": { "version": "1.0.0", @@ -2392,7 +2475,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "bufferstreams": { @@ -2407,7 +2490,7 @@ "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "cache-base": { @@ -2460,7 +2543,7 @@ "normalize-url": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha1-g1qdoVUfom9w6SMpBpojqmV01+Y=", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "optional": true, "requires": { @@ -2547,7 +2630,7 @@ "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -2570,9 +2653,8 @@ "caw": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha1-bDygcfwZRyCIPC3F2psHS/x+npU=", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", "dev": true, - "optional": true, "requires": { "get-proxy": "^2.0.0", "isurl": "^1.0.0-alpha5", @@ -2593,7 +2675,7 @@ "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -2604,7 +2686,7 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "chart.js": { @@ -2628,7 +2710,7 @@ "chartjs-color-string": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", - "integrity": "sha1-HfCWYhwOcHIKZPQTXqFx0FFAL3E=", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", "requires": { "color-name": "^1.0.0" } @@ -2636,7 +2718,7 @@ "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -2686,7 +2768,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true } } @@ -2717,7 +2799,7 @@ "clean-css": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha1-LUEe92uFabbQyEBo2r6FsKpeXBc=", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -2726,7 +2808,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -2734,7 +2816,7 @@ "cli-color": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", - "integrity": "sha1-fRBzj0hSaCT4/n2lGFfLD1cv4B8=", + "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", "dev": true, "requires": { "ansi-regex": "^2.1.1", @@ -2763,7 +2845,7 @@ "clipboard": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", - "integrity": "sha1-g22v1mzw/qXXHOXVsL9ulYAJES0=", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -2812,7 +2894,7 @@ "cloneable-readable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha1-EgoAywU7+2OiIucJ+Wg+ouEdjOw=", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -2855,7 +2937,7 @@ "coa": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { "@types/q": "^1.5.1", @@ -2893,7 +2975,7 @@ "color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -2925,12 +3007,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -2943,6 +3025,12 @@ "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", "dev": true }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, "colornames": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", @@ -2952,13 +3040,13 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha1-xQSRR51MG9rtLJztMs98fcI2D3g=", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "colorspace": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha1-4BKJUNCCuGohaFgHlqCqXWxo2MU=", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", "dev": true, "requires": { "color": "3.0.x", @@ -2968,7 +3056,7 @@ "color": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha1-2SC0Mo1TSjrIKV1o971LpsQnvpo=", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", "dev": true, "requires": { "color-convert": "^1.9.1", @@ -2995,7 +3083,7 @@ "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } @@ -3015,7 +3103,7 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "component-inherit": { @@ -3033,7 +3121,7 @@ "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -3094,9 +3182,8 @@ "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, - "optional": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -3105,7 +3192,7 @@ "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { "debug": "2.6.9", @@ -3117,7 +3204,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -3141,7 +3228,7 @@ "consolidate": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", "dev": true, "requires": { "bluebird": "^3.1.1" @@ -3150,9 +3237,8 @@ "content-disposition": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dev": true, - "optional": true, "requires": { "safe-buffer": "5.1.2" } @@ -3187,7 +3273,7 @@ "copy-props": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha1-k7scrfr9MdpbuKnUtB9HHsOnLf4=", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, "requires": { "each-props": "^1.3.0", @@ -3246,7 +3332,7 @@ "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { "import-fresh": "^2.0.0", @@ -3258,7 +3344,7 @@ "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -3271,7 +3357,7 @@ "css": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk=", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -3283,7 +3369,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -3297,7 +3383,7 @@ "css-declaration-sorter": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { "postcss": "^7.0.1", @@ -3319,7 +3405,7 @@ "css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", "dev": true }, "css-tree": { @@ -3353,7 +3439,7 @@ "cssnano": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -3365,7 +3451,7 @@ "cssnano-preset-default": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { "css-declaration-sorter": "^4.0.1", @@ -3415,7 +3501,7 @@ "cssnano-util-raw-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -3424,7 +3510,7 @@ "cssnano-util-same-parent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", "dev": true }, "csso": { @@ -3496,7 +3582,7 @@ "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { "es5-ext": "^0.10.50", @@ -3537,7 +3623,7 @@ "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -3546,7 +3632,7 @@ "debug-fabulous": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha1-r4oIYyRlIk70F0qfBjCMPCoevI4=", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", "dev": true, "requires": { "debug": "3.X", @@ -3594,7 +3680,6 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, - "optional": true, "requires": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -3609,9 +3694,8 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, - "optional": true, "requires": { "pify": "^3.0.0" }, @@ -3620,8 +3704,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true + "dev": true } } } @@ -3632,7 +3715,6 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "dev": true, - "optional": true, "requires": { "mimic-response": "^1.0.0" } @@ -3640,9 +3722,8 @@ "decompress-tar": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha1-cYy9P8sWIJcW5womuE57pFkuWvE=", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, - "optional": true, "requires": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -3653,17 +3734,15 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true, - "optional": true + "dev": true } } }, "decompress-tarbz2": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha1-MIKluIDqQEOBY0nzeLVsUWvho5s=", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, - "optional": true, "requires": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -3675,18 +3754,16 @@ "file-type": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha1-5QzXXTVv/tTjBtxPW89Sp5kDqRk=", - "dev": true, - "optional": true + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true } } }, "decompress-targz": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha1-wJvDXE0R894J8tLaU+neI+fOHu4=", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, - "optional": true, "requires": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -3697,8 +3774,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", - "dev": true, - "optional": true + "dev": true } } }, @@ -3707,7 +3783,6 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", "dev": true, - "optional": true, "requires": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -3719,15 +3794,13 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "optional": true + "dev": true }, "get-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "dev": true, - "optional": true, "requires": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -3737,8 +3810,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true + "dev": true } } }, @@ -3751,7 +3823,7 @@ "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, "requires": { "kind-of": "^5.0.2" @@ -3760,7 +3832,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } @@ -3774,7 +3846,7 @@ "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" @@ -3829,7 +3901,7 @@ "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, "depd": { "version": "1.1.2", @@ -3858,7 +3930,7 @@ "diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", - "integrity": "sha1-yrasM99wydmnJ0kK5DrJladpsio=", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", "dev": true, "requires": { "colorspace": "1.1.x", @@ -3869,12 +3941,12 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=" + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { "path-type": "^4.0.0" @@ -3883,7 +3955,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true } } @@ -3891,7 +3963,7 @@ "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -3922,7 +3994,7 @@ "domelementtype": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true } } @@ -3930,7 +4002,7 @@ "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domexception": { @@ -3953,7 +4025,7 @@ "domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { "domelementtype": "1" @@ -3962,7 +4034,7 @@ "domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { "dom-serializer": "0", @@ -3981,7 +4053,7 @@ "download": { "version": "6.2.5", "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha1-rNalQuTNC7Qspwz8mMnkOwcDlxQ=", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", "dev": true, "optional": true, "requires": { @@ -4015,7 +4087,7 @@ "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "optional": true, "requires": { @@ -4026,8 +4098,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true + "dev": true } } }, @@ -4044,13 +4115,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true, - "optional": true + "dev": true }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -4094,7 +4164,7 @@ "each-props": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha1-6kWkFNFt1c+kGbGoFyDVygaJIzM=", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, "requires": { "is-plain-object": "^2.0.1", @@ -4152,7 +4222,7 @@ "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -4186,7 +4256,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -4202,7 +4272,7 @@ }, "engine.io-client": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { @@ -4228,7 +4298,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -4264,7 +4334,7 @@ "entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha1-aNYITKsbB5dnVA2A5Wo5tCPkq/Q=", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, "env-variable": { @@ -4286,7 +4356,7 @@ "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -4346,7 +4416,7 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-symbol": { @@ -4362,7 +4432,7 @@ "es6-weak-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { "d": "1", @@ -4371,6 +4441,12 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4405,7 +4481,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -4459,7 +4535,7 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "glob-parent": { @@ -4493,19 +4569,19 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -4526,7 +4602,7 @@ "eslint-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha1-dP7HxU0Hdrb2fgJRBAtYBlZOmB8=", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -4552,13 +4628,13 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", "dev": true, "requires": { "estraverse": "^4.0.0" @@ -4567,7 +4643,7 @@ "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "dev": true, "requires": { "estraverse": "^4.1.0" @@ -4594,13 +4670,13 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "event-emitter": { @@ -4630,7 +4706,7 @@ "exec-buffer": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", "dev": true, "optional": true, "requires": { @@ -4690,7 +4766,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "optional": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -4704,7 +4779,7 @@ "executable": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha1-QVMr/zYdPlevTXY7cFgtsY9dEzw=", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "dev": true, "optional": true, "requires": { @@ -4729,7 +4804,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -4773,7 +4848,7 @@ "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "^2.1.0", @@ -4830,9 +4905,8 @@ "ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha1-C5jmTtgvWs8PKTG6v2khLvUt3Tc=", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, - "optional": true, "requires": { "mime-db": "^1.28.0" } @@ -4840,9 +4914,8 @@ "ext-name": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha1-cHgZgdGD7hXROZPIgiBFxQbI8KY=", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", "dev": true, - "optional": true, "requires": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" @@ -4851,7 +4924,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -4877,7 +4950,7 @@ "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -4958,7 +5031,7 @@ "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "requires": { "ansi-gray": "^0.1.1", @@ -4989,7 +5062,7 @@ "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -4998,7 +5071,7 @@ "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -5025,13 +5098,13 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { "braces": "^3.0.1", @@ -5047,7 +5120,7 @@ "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -5080,7 +5153,6 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, - "optional": true, "requires": { "pend": "~1.2.0" } @@ -5097,7 +5169,7 @@ "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { "flat-cache": "^2.0.1" @@ -5119,15 +5191,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true, - "optional": true + "dev": true }, "filenamify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha1-iPr0lfsbR6v9YSMAACoWIoxnfuk=", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", "dev": true, - "optional": true, "requires": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.0", @@ -5160,7 +5230,7 @@ "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", @@ -5175,7 +5245,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5235,7 +5305,7 @@ "fined": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -5289,13 +5359,13 @@ "flagged-respawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha1-595vEnnd2cqarIpZcdYYYGs6q0E=", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { "flatted": "^2.0.0", @@ -5306,18 +5376,18 @@ "flatpickr": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.5.2.tgz", - "integrity": "sha1-R8itRyoJbl+350uAmwcDU1OD8g0=" + "integrity": "sha512-jDy4QYGpmiy7+Qk8QvKJ4spjDdxcx9cxMydmq1x427HkKWBw0qizLYeYM2F6tMcvvqGjU5VpJS55j4LnsaBblA==" }, "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -5404,7 +5474,7 @@ "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -5475,9 +5545,8 @@ "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=", - "dev": true, - "optional": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, "fs-mkdirp-stream": { "version": "1.0.0", @@ -5492,7 +5561,7 @@ "fs-readfile-promise": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-3.0.1.tgz", - "integrity": "sha1-0NMHt/au38kgwx+m5XEu+qKXyVg=", + "integrity": "sha512-LsSxMeaJdYH27XrW7Dmq0Gx63mioULCRel63B5VeELYLavi1wF5s0XfsIdKDFdCL9hsfQ2qBvXJszQtQJ9h17A==", "dev": true, "requires": { "graceful-fs": "^4.1.11" @@ -5524,8 +5593,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -5546,14 +5614,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5568,20 +5634,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -5698,8 +5761,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -5711,7 +5773,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5726,7 +5787,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5734,14 +5794,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5760,7 +5818,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5841,8 +5898,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -5854,7 +5910,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5940,8 +5995,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5977,7 +6031,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5997,7 +6050,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -6041,14 +6093,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -6067,15 +6117,14 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha1-NJ8rTZHUTE1NTpy6KtkBQ/rF75M=", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", "dev": true, - "optional": true, "requires": { "npm-conf": "^1.1.0" } @@ -6084,15 +6133,13 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "optional": true + "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "optional": true, "requires": { "pump": "^3.0.0" }, @@ -6102,7 +6149,6 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "optional": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6215,13 +6261,12 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "optional": true + "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "optional": true, "requires": { @@ -6371,7 +6416,7 @@ "glob-watcher": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", - "integrity": "sha1-iKir8cTRMeuTkomUvEpZPC5d1iY=", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -6421,7 +6466,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globby": { @@ -6457,7 +6502,7 @@ "glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { "sparkles": "^1.0.0" @@ -6474,7 +6519,7 @@ "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha1-BUUP2ECU5rvqVvRRpDqcKJFmOFo=", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", "dev": true, "optional": true, "requires": { @@ -6518,7 +6563,7 @@ "gulp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha1-VDZRBw/Q9qsKBlDGo+b/WnywnKo=", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, "requires": { "glob-watcher": "^5.0.3", @@ -6551,7 +6596,7 @@ "gulp-babel": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz", - "integrity": "sha1-4NqW9PLsSojdOjAw9HbjirISbYc=", + "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==", "dev": true, "requires": { "plugin-error": "^1.0.1", @@ -6571,7 +6616,7 @@ "gulp-clean-css": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.2.0.tgz", - "integrity": "sha1-kV7CWNxtPmpQBD9hAGbVwurE9U4=", + "integrity": "sha512-r4zQsSOAK2UYUL/ipkAVCTRg/2CLZ2A+oPVORopBximRksJ6qy3EX1KGrIWT4ZrHxz3Hlobb1yyJtqiut7DNjA==", "dev": true, "requires": { "clean-css": "4.2.1", @@ -6609,7 +6654,7 @@ "through2": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { "readable-stream": "2 || 3" @@ -6691,7 +6736,7 @@ "gulp-eslint": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-6.0.0.tgz", - "integrity": "sha1-fUArtF+KZ2UrhoJ3ARgSBXNwqDI=", + "integrity": "sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==", "dev": true, "requires": { "eslint": "^6.0.0", @@ -6766,7 +6811,7 @@ "gulp-less": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", - "integrity": "sha1-NIwzpd3nogfFdxsdgmHRrBAhzu0=", + "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", "dev": true, "requires": { "accord": "^0.29.0", @@ -6943,7 +6988,7 @@ "gulp-notify": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-3.2.0.tgz", - "integrity": "sha1-KugiUAnfiB7vWb5d1aLxM3OHdk4=", + "integrity": "sha512-qEocs1UVoDKKUjfsxJNMNwkRla0PbsyJwsqNNXpzYWsLQ29LhxRMY3wnTGZcc4hMHtalnvah/Dwlwb4NijH/0A==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -6995,7 +7040,7 @@ "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha1-+XYZXPPzR9DV9SSDVp/oAxzM6Ks=", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { "lodash._reinterpolate": "^3.0.0", @@ -7005,7 +7050,7 @@ "lodash.templatesettings": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha1-5IExDwSdPPbUfpEq0JMTsVTw+zM=", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { "lodash._reinterpolate": "^3.0.0" @@ -7029,7 +7074,7 @@ "gulp-postcss": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-8.0.0.tgz", - "integrity": "sha1-jTdyzU0nvKVeyMtMjlduO95NxVA=", + "integrity": "sha512-Wtl6vH7a+8IS/fU5W9IbOpcaLqKxd5L1DUOzaPmlnCbX1CrG0aWdwVnC3Spn8th0m8D59YbysV5zPUe1n/GJYg==", "dev": true, "requires": { "fancy-log": "^1.3.2", @@ -7042,7 +7087,7 @@ "gulp-rename": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha1-3hxxjnxAla6GH3KW708ySGSCQL0=", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", "dev": true }, "gulp-sort": { @@ -7057,7 +7102,7 @@ "gulp-sourcemaps": { "version": "2.6.5", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha1-o/AC2HNG0sDzrsNq9+uHPyPeiuY=", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", "dev": true, "requires": { "@gulp-sourcemaps/identity-map": "1.X", @@ -7082,7 +7127,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } @@ -7143,7 +7188,7 @@ "gulp-watch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-5.0.1.tgz", - "integrity": "sha1-g9N4dS9b+0baAj5zwX7R2nBmIV0=", + "integrity": "sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==", "dev": true, "requires": { "ansi-colors": "1.1.0", @@ -7244,7 +7289,7 @@ "gulp-wrap": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.15.0.tgz", - "integrity": "sha1-6QFMm7hkOrMQ6TjURpuFaFUaVS8=", + "integrity": "sha512-f17zkGObA+hE/FThlg55gfA0nsXbdmHK1WqzjjB2Ytq1TuhLR7JiCBJ3K4AlMzCyoFaCjfowos+VkToUNE0WTQ==", "dev": true, "requires": { "consolidate": "^0.15.1", @@ -7288,7 +7333,7 @@ "through2": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha1-OSducTwzAu3544jdnIEt07glvVo=", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { "readable-stream": "2 || 3" @@ -7353,7 +7398,7 @@ "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -7362,7 +7407,7 @@ "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -7418,9 +7463,8 @@ "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha1-FAn5i8ACR9pF2mfO4KNvKC/yZFU=", - "dev": true, - "optional": true + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true }, "has-symbols": { "version": "1.0.0", @@ -7431,9 +7475,8 @@ "has-to-string-tag-x": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha1-oEWrOD17SyASoAFIqwql8pAETU0=", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, - "optional": true, "requires": { "has-symbol-support-x": "^1.4.1" } @@ -7473,13 +7516,13 @@ "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", "dev": true }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" @@ -7506,7 +7549,7 @@ "html-comment-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true }, "html-encoding-sniffer": { @@ -7535,7 +7578,7 @@ "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, "isarray": { @@ -7573,14 +7616,14 @@ "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true, "optional": true }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", @@ -7629,7 +7672,7 @@ "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -7639,13 +7682,12 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "optional": true + "dev": true }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "image-size": { @@ -7705,7 +7747,7 @@ "imagemin-optipng": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz", - "integrity": "sha1-IiXILDXlwpt/qY1Pns7hFhpo6Ig=", + "integrity": "sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==", "dev": true, "optional": true, "requires": { @@ -7780,8 +7822,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true + "dev": true }, "svgo": { "version": "1.3.2", @@ -7838,7 +7879,7 @@ "import-lazy": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha1-iRJ5ICyKIoD9vWZ029jaGh38Z8w=", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", "dev": true, "optional": true }, @@ -7853,7 +7894,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, - "optional": true, "requires": { "repeating": "^2.0.0" } @@ -7889,7 +7929,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { @@ -7991,7 +8031,7 @@ "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { "loose-envify": "^1.0.0" @@ -8012,13 +8052,13 @@ "irregular-plurals": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha1-OdQPBbAPZW0Lf6RxIw3TtxSvKHI=", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", "dev": true }, "is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha1-Yc/23TxBk9uUo9YlggcrROVkXXk=", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, "is-absolute": { @@ -8081,7 +8121,7 @@ "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", "dev": true }, "is-color-stop": { @@ -8180,8 +8220,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "optional": true + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -8195,7 +8234,7 @@ "is-gif": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", - "integrity": "sha1-xL5gsmowHWlbuDOyDZtdZsbPg7E=", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", "dev": true, "optional": true, "requires": { @@ -8205,7 +8244,7 @@ "file-type": { "version": "10.11.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha1-KWHQnkZ1ufuaPua2npzSP0P9GJA=", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", "dev": true, "optional": true } @@ -8231,8 +8270,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", - "dev": true, - "optional": true + "dev": true }, "is-negated-glob": { "version": "1.0.0", @@ -8270,15 +8308,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", - "dev": true, - "optional": true + "dev": true }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "optional": true + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -8292,7 +8328,7 @@ "is-png": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", - "integrity": "sha1-7oy8npsFBCXO3utKb7dKZJsKSo0=", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", "dev": true, "optional": true }, @@ -8347,21 +8383,19 @@ "is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=", - "dev": true, - "optional": true + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "optional": true + "dev": true }, "is-svg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "dev": true, "requires": { "html-comment-regex": "^1.1.0" @@ -8449,9 +8483,8 @@ "isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha1-sn9PSfPNqj6kSgpbfzRi5u3DnWc=", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, - "optional": true, "requires": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" @@ -8460,7 +8493,7 @@ "jasmine-core": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", - "integrity": "sha1-Eywj5kWvlthci8oTyHWLGEKfweQ=", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", "dev": true }, "jquery": { @@ -8481,19 +8514,19 @@ "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8627,7 +8660,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-buffer": { @@ -8640,7 +8673,7 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema": { @@ -8667,7 +8700,7 @@ "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha1-gbbLBOm6SW8ccAXQe0NoomOPkLY=", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -8687,7 +8720,7 @@ "junk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha1-MUmQmNkCt+mMXZucgPQ0V6iKv6E=", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", "dev": true }, "just-debounce": { @@ -8733,7 +8766,7 @@ "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -8749,7 +8782,7 @@ "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -8774,7 +8807,7 @@ "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -8799,7 +8832,7 @@ "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" @@ -8817,7 +8850,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "mime": { @@ -8829,7 +8862,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "readdirp": { @@ -8850,7 +8883,7 @@ "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -8861,7 +8894,7 @@ "karma-jasmine": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", - "integrity": "sha1-JuPjHy+vJy3YDrsOGJiRTMOhl2M=", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", "dev": true, "requires": { "jasmine-core": "^3.3" @@ -8876,7 +8909,7 @@ "karma-junit-reporter": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz", - "integrity": "sha1-007vfwsv0GTgiWlU6IUakM8UyPM=", + "integrity": "sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==", "dev": true, "requires": { "path-is-absolute": "^1.0.0", @@ -8895,7 +8928,7 @@ "keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha1-RJI7o55osSp87H32wyaMAx8u83M=", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, "optional": true, "requires": { @@ -8905,13 +8938,13 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "kuler": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha1-73x4TzbJ+24W3TFQ0VJneysCKKY=", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", "dev": true, "requires": { "colornames": "^1.1.1" @@ -9000,7 +9033,7 @@ "less": { "version": "3.10.3", "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", - "integrity": "sha1-QXoJddXu7MUs/0vPo8CdNXgeZ5I=", + "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", "dev": true, "requires": { "clone": "^2.1.2", @@ -9023,7 +9056,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } @@ -9213,7 +9246,7 @@ "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.partialright": { @@ -9326,7 +9359,7 @@ "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -9346,9 +9379,8 @@ "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", - "dev": true, - "optional": true + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true }, "lpad-align": { "version": "1.1.2", @@ -9366,7 +9398,7 @@ "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -9394,7 +9426,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -9418,8 +9450,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "optional": true + "dev": true }, "map-visit": { "version": "1.0.0", @@ -9433,7 +9464,7 @@ "marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", - "integrity": "sha1-tkIB8FHScbHtwQoE0a6bdLuOXA4=", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", "dev": true }, "matchdep": { @@ -9465,13 +9496,13 @@ "math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw=", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, "media-typer": { @@ -9483,7 +9514,7 @@ "memoizee": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", - "integrity": "sha1-B6APIEaZ+alcLZ53IYJxx81hDVc=", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", "dev": true, "requires": { "d": "1", @@ -9527,7 +9558,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "merge2": { @@ -9560,7 +9591,7 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "optional": true }, @@ -9580,20 +9611,19 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", "dev": true }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=", - "dev": true, - "optional": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -9601,14 +9631,14 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "minimize": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/minimize/-/minimize-2.2.0.tgz", - "integrity": "sha1-ixZ28wBR2FmNdDZGvRJpCwdNpMM=", + "integrity": "sha512-IxR2XMbw9pXCxApkdD9BTcH2U4XlXhbeySUrv71rmMS9XDA8BVXEsIuFu24LtwCfBgfbL7Fuh8/ZzkO5DaTLlQ==", "dev": true, "requires": { "argh": "^0.1.4", @@ -9623,7 +9653,7 @@ "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -9633,7 +9663,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -9652,7 +9682,7 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } @@ -9678,7 +9708,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "multipipe": { @@ -9693,7 +9723,7 @@ "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha1-rLAwDrTeI6fd7sAU4+lgRLNHIzE=", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, "mute-stream": { @@ -9712,7 +9742,7 @@ "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { "arr-diff": "^4.0.0", @@ -9737,7 +9767,7 @@ "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "next-tick": { @@ -9754,13 +9784,13 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha1-y3La+UyTkECY4oucWQ/YZuRkvVA=", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "^1.3.0", @@ -9782,7 +9812,7 @@ "node.extend": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", - "integrity": "sha1-tEBFJUlKzJl0DzcDxJa31Rgsxsw=", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", "dev": true, "requires": { "has": "^1.0.3", @@ -9792,7 +9822,7 @@ "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -9819,7 +9849,7 @@ "normalize-url": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", "dev": true }, "nouislider": { @@ -9830,7 +9860,7 @@ "now-and-later": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha1-jlechoV2SnzALLaAOA6U9DzLH3w=", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, "requires": { "once": "^1.3.2" @@ -12933,9 +12963,8 @@ "npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha1-JWzEe9DiGMJZxOlVC/QTvCGSr/k=", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", "dev": true, - "optional": true, "requires": { "config-chain": "^1.1.11", "pify": "^3.0.0" @@ -12945,8 +12974,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "optional": true + "dev": true } } }, @@ -12955,7 +12983,6 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, - "optional": true, "requires": { "path-key": "^2.0.0" } @@ -12963,7 +12990,7 @@ "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { "boolbase": "~1.0.0" @@ -12990,7 +13017,7 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "3.0.0", @@ -13044,7 +13071,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object-visit": { @@ -13059,7 +13086,7 @@ "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -13191,7 +13218,7 @@ "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, @@ -13220,7 +13247,7 @@ "optipng-bin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-6.0.0.tgz", - "integrity": "sha1-N2Eg+nnV5x7uL1JBdu/dOl6r0xY=", + "integrity": "sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==", "dev": true, "optional": true, "requires": { @@ -13281,7 +13308,7 @@ "os-filter-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", - "integrity": "sha1-HAti1fOiRCdJotE55t3e5ugdjRY=", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", "dev": true, "optional": true, "requires": { @@ -13306,7 +13333,7 @@ "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha1-ueEjgAvOu3rBOkeb4ZW1B7mNMPo=", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", "dev": true, "optional": true }, @@ -13324,8 +13351,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "optional": true + "dev": true }, "p-is-promise": { "version": "1.1.0", @@ -13362,7 +13388,6 @@ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", "dev": true, - "optional": true, "requires": { "p-finally": "^1.0.0" } @@ -13370,7 +13395,7 @@ "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -13379,7 +13404,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true } } @@ -13437,7 +13462,7 @@ "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, "parse-passwd": { @@ -13473,7 +13498,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "pascalcase": { @@ -13512,7 +13537,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-root": { @@ -13553,8 +13578,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true + "dev": true }, "performance-now": { "version": "2.1.0", @@ -13591,7 +13615,7 @@ "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -13603,7 +13627,7 @@ "plur": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha1-YCZ5Z4ZqjYEVBP5Y8vqrojdUals=", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", "dev": true, "requires": { "irregular-plurals": "^2.0.0" @@ -13629,13 +13653,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -13658,7 +13682,7 @@ "postcss-colormin": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -13671,7 +13695,7 @@ "postcss-convert-values": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { "postcss": "^7.0.0", @@ -13681,7 +13705,7 @@ "postcss-discard-comments": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -13690,7 +13714,7 @@ "postcss-discard-duplicates": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -13699,7 +13723,7 @@ "postcss-discard-empty": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -13708,7 +13732,7 @@ "postcss-discard-overridden": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -13717,7 +13741,7 @@ "postcss-load-config": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", "dev": true, "requires": { "cosmiconfig": "^5.0.0", @@ -13727,7 +13751,7 @@ "postcss-merge-longhand": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { "css-color-names": "0.0.4", @@ -13739,7 +13763,7 @@ "postcss-merge-rules": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -13766,7 +13790,7 @@ "postcss-minify-font-values": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { "postcss": "^7.0.0", @@ -13776,7 +13800,7 @@ "postcss-minify-gradients": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -13788,7 +13812,7 @@ "postcss-minify-params": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -13802,7 +13826,7 @@ "postcss-minify-selectors": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -13827,7 +13851,7 @@ "postcss-normalize-charset": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { "postcss": "^7.0.0" @@ -13836,7 +13860,7 @@ "postcss-normalize-display-values": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -13847,7 +13871,7 @@ "postcss-normalize-positions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -13859,7 +13883,7 @@ "postcss-normalize-repeat-style": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -13871,7 +13895,7 @@ "postcss-normalize-string": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { "has": "^1.0.0", @@ -13882,7 +13906,7 @@ "postcss-normalize-timing-functions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -13893,7 +13917,7 @@ "postcss-normalize-unicode": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -13904,7 +13928,7 @@ "postcss-normalize-url": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { "is-absolute-url": "^2.0.0", @@ -13916,7 +13940,7 @@ "postcss-normalize-whitespace": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { "postcss": "^7.0.0", @@ -13926,7 +13950,7 @@ "postcss-ordered-values": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { "cssnano-util-get-arguments": "^4.0.0", @@ -13937,7 +13961,7 @@ "postcss-reduce-initial": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -13949,7 +13973,7 @@ "postcss-reduce-transforms": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { "cssnano-util-get-match": "^4.0.0", @@ -13972,7 +13996,7 @@ "postcss-svgo": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { "is-svg": "^3.0.0", @@ -13984,7 +14008,7 @@ "postcss-unique-selectors": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { "alphanum-sort": "^1.0.0", @@ -14032,19 +14056,19 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise": { @@ -14061,8 +14085,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true, - "optional": true + "dev": true }, "prr": { "version": "1.0.1", @@ -14085,7 +14108,7 @@ "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -14095,7 +14118,7 @@ "pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { "duplexify": "^3.6.0", @@ -14106,7 +14129,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -14123,12 +14146,12 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha1-p4wBK3HBfgXy4/ojGd0zBoLvs8s=", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "optional": true, "requires": { @@ -14154,7 +14177,7 @@ "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { "is-number": "^4.0.0", @@ -14165,7 +14188,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true } } @@ -14173,13 +14196,13 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { "bytes": "3.1.0", @@ -14224,7 +14247,7 @@ "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -14293,7 +14316,7 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha1-SoVuxLVuQHfFV1icroXnpMiGmhE=", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerate-unicode-properties": { @@ -14336,7 +14359,7 @@ "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "regexpu-core": { @@ -14356,7 +14379,7 @@ "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha1-SPC/Gl6iBRlpKcDZeYtC0e2YRDw=", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", "dev": true }, "regjsparser": { @@ -14379,7 +14402,7 @@ "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha1-wr8eN3Ug0yT2I4kuM8EMrCwlK1M=", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "requires": { "is-buffer": "^1.1.5", @@ -14406,7 +14429,7 @@ "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -14420,7 +14443,6 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, - "optional": true, "requires": { "is-finite": "^1.0.0" } @@ -14585,13 +14607,13 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rfdc": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha1-unLME2egzNnPgahws7WL060H+MI=", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", "dev": true }, "rgb-regex": { @@ -14618,7 +14640,7 @@ "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -14775,7 +14797,6 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dev": true, - "optional": true, "requires": { "commander": "^2.8.1" } @@ -14788,7 +14809,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "semver-greatest-satisfied-range": { @@ -14803,7 +14824,7 @@ "semver-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg=", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", "dev": true, "optional": true }, @@ -14826,7 +14847,7 @@ "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -14849,7 +14870,7 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "shebang-command": { @@ -14870,7 +14891,7 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha1-1rkYHBpI05cyTISHHvvPxz/AZUs=", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "signal-exit": { @@ -14891,7 +14912,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true } } @@ -14905,7 +14926,7 @@ "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -14940,7 +14961,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -15127,7 +15148,7 @@ }, "socket.io-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "dev": true, "requires": { @@ -15145,7 +15166,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -15170,7 +15191,6 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, - "optional": true, "requires": { "is-plain-obj": "^1.0.0" } @@ -15180,7 +15200,6 @@ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", "dev": true, - "optional": true, "requires": { "sort-keys": "^1.0.0" } @@ -15231,13 +15250,13 @@ "sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha1-AI22XtzmxQ7sDF4ijhlFBh3QQ3w=", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", "dev": true }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -15247,7 +15266,7 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -15263,7 +15282,7 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "spectrum-colorpicker2": { @@ -15331,7 +15350,7 @@ "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15392,7 +15411,7 @@ "stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha1-rNrI2lnvK8HheiwMz2wyDRIOVV0=", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, "stream-shift": { @@ -15526,9 +15545,8 @@ "strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha1-SYdzYmT8NEzyD2w0rKnRPR1O1sU=", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, - "optional": true, "requires": { "is-natural-number": "^4.0.1" } @@ -15537,8 +15555,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "optional": true + "dev": true }, "strip-final-newline": { "version": "2.0.0", @@ -15566,9 +15583,8 @@ "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, - "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -15576,7 +15592,7 @@ "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { "browserslist": "^4.0.0", @@ -15600,7 +15616,7 @@ "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -15646,7 +15662,7 @@ "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -15658,7 +15674,7 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { @@ -15670,7 +15686,7 @@ "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -15681,7 +15697,7 @@ "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -15692,9 +15708,8 @@ "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha1-jqVdqzeXIlPZqa+Q/c1VmuQ1xVU=", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, - "optional": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -15709,15 +15724,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true + "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, - "optional": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15733,7 +15746,6 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "optional": true, "requires": { "safe-buffer": "~5.1.0" } @@ -15744,15 +15756,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true, - "optional": true + "dev": true }, "tempfile": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", "dev": true, - "optional": true, "requires": { "temp-dir": "^1.0.0", "uuid": "^3.0.1" @@ -15780,7 +15790,7 @@ "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha1-adycGxdEbueakr9biEu0uRJ1BvU=", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, "text-table": { @@ -15798,7 +15808,7 @@ "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", @@ -15840,7 +15850,7 @@ "through2-concurrent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-2.0.0.tgz", - "integrity": "sha1-yd0sFGUE7Jli28hqUWi2PWYmafo=", + "integrity": "sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A==", "dev": true, "requires": { "through2": "^2.0.0" @@ -15849,7 +15859,7 @@ "through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha1-cA54bfI2fCyIzYqlvkz5weeDElQ=", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", @@ -15866,13 +15876,12 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true, - "optional": true + "dev": true }, "timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha1-b1ethXjgej+5+R2Th9ZWR1VeJcY=", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "dev": true, "requires": { "es5-ext": "~0.10.46", @@ -15888,7 +15897,7 @@ "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, "tinymce": { "version": "4.9.11", @@ -15923,9 +15932,8 @@ "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=", - "dev": true, - "optional": true + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -15987,7 +15995,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, "tough-cookie": { @@ -16027,7 +16035,6 @@ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", "dev": true, - "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -16061,7 +16068,7 @@ "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A=", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-check": { @@ -16076,7 +16083,7 @@ "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", @@ -16155,7 +16162,7 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "integrity": "sha1-n+FTahCmZKZSZqHjzPhf02MCvJw=", "dev": true }, "unbzip2-stream": { @@ -16163,7 +16170,6 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, - "optional": true, "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -16183,7 +16189,7 @@ "undertaker": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha1-cBZi/4zjWHFTJN/UkqTwNgVd/ks=", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", "dev": true, "requires": { "arr-flatten": "^1.0.1", @@ -16206,13 +16212,13 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", @@ -16234,7 +16240,7 @@ "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -16258,7 +16264,7 @@ "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha1-xl0RDppK35psWUiygFPZqNBMvqw=", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { "json-stable-stringify-without-jsonify": "^1.0.1", @@ -16268,7 +16274,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, "unpipe": { @@ -16332,7 +16338,7 @@ "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, "uri-js": { @@ -16372,13 +16378,12 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", - "dev": true, - "optional": true + "dev": true }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, "useragent": { @@ -16400,7 +16405,7 @@ "util.promisify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -16436,7 +16441,7 @@ "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -16515,7 +16520,7 @@ "vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha1-yFhJQF9nQo/qu71cXb3WT0fTG8c=", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, "requires": { "fs-mkdirp-stream": "^1.0.0", @@ -16724,7 +16729,7 @@ "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -16772,7 +16777,7 @@ "write": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" @@ -16781,7 +16786,7 @@ "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "integrity": "sha1-8c+E/i1ekB686U767OeF8YeiKPI=", "dev": true, "requires": { "async-limiter": "~1.0.0", @@ -16798,7 +16803,7 @@ "xmlbuilder": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz", - "integrity": "sha1-4u1nXgaDSgid37hNuW4sKwP3jBo=", + "integrity": "sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==", "dev": true }, "xmlchars": { @@ -16816,7 +16821,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { @@ -16867,7 +16872,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, - "optional": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js index 7519341327..3278ae8b94 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/package.resource.js @@ -4,16 +4,16 @@ * @description handles data for package installations **/ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { - + return { - + /** * @ngdoc method * @name umbraco.resources.packageInstallResource#getInstalled * @methodOf umbraco.resources.packageInstallResource * * @description - * Gets a list of installed packages + * Gets a list of installed packages */ getInstalled: function() { return umbRequestHelper.resourcePromise( @@ -24,133 +24,13 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to get installed packages'); }, - validateInstalled: function (name, version) { - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "ValidateInstalled", { name: name, version: version })), - 'Failed to validate package ' + name); - }, - - uninstall: function(packageId) { - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "Uninstall", { packageId: packageId })), - 'Failed to uninstall package'); - }, - - /** - * @ngdoc method - * @name umbraco.resources.packageInstallResource#fetchPackage - * @methodOf umbraco.resources.packageInstallResource - * - * @description - * Downloads a package file from our.umbraco.com to the website server. - * - * ##usage - *
-         * packageResource.download("guid-guid-guid-guid")
-         *    .then(function(path) {
-         *        alert('downloaded');
-         *    });
-         * 
- * - * @param {String} the unique package ID - * @returns {String} path to the downloaded zip file. - * - */ - fetch: function (id) { - return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "Fetch", - [{ packageGuid: id }])), - 'Failed to download package with guid ' + id); - }, - - /** - * @ngdoc method - * @name umbraco.resources.packageInstallResource#createmanifest - * @methodOf umbraco.resources.packageInstallResource - * - * @description - * Creates a package manifest for a given folder of files. - * This manifest keeps track of all installed files and data items - * so a package can be uninstalled at a later time. - * After creating a manifest, you can use the ID to install files and data. - * - * ##usage - *
-         * packageResource.createManifest("packages/id-of-install-file")
-         *    .then(function(summary) {
-         *        alert('unzipped');
-         *    });
-         * 
- * - * @param {String} folder the path to the temporary folder containing files - * @returns {Int} the ID assigned to the saved package manifest - * - */ - import: function (umbPackage) { - - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "Import"), umbPackage), - 'Failed to install package. Error during the step "Import" '); - }, - - installFiles: function (umbPackage) { - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "InstallFiles"), umbPackage), - 'Failed to install package. Error during the step "InstallFiles" '); - }, - - checkRestart: function (umbPackage) { - - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "CheckRestart"), umbPackage), - 'Failed to install package. Error during the step "CheckRestart" '); - }, - - installData: function (umbPackage) { - - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "InstallData"), umbPackage), - 'Failed to install package. Error during the step "InstallData" '); - }, - - cleanUp: function (umbPackage) { - - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "packageInstallApiBaseUrl", - "CleanUp"), umbPackage), - 'Failed to install package. Error during the step "CleanUp" '); - }, - /** * @ngdoc method * @name umbraco.resources.packageInstallResource#getCreated * @methodOf umbraco.resources.packageInstallResource * * @description - * Gets a list of created packages + * Gets a list of created packages */ getAllCreated: function() { return umbRequestHelper.resourcePromise( @@ -167,14 +47,14 @@ function packageResource($q, $http, umbDataFormatter, umbRequestHelper) { * @methodOf umbraco.resources.packageInstallResource * * @description - * Gets a created package by id + * Gets a created package by id */ getCreatedById: function(id) { return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "packageApiBaseUrl", - "GetCreatedPackageById", + "GetCreatedPackageById", { id: id })), 'Failed to get package'); }, diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less index 0045bed140..9f07bb8d14 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less @@ -190,7 +190,7 @@ border: 1px solid @gray-8; border-left: 0; padding: 10px 0; - background: @white; + background: @white; } @@ -356,7 +356,7 @@ .umb-package-details__description { margin-bottom: 20px; line-height: 1.6em; - word-wrap: break-word; + word-wrap: break-word; } .umb-package-details__description p { @@ -366,13 +366,27 @@ /* Links */ .umb-package-details__link { - font-weight: bold; - color: @black; + font-weight: bold; + color: @black; } .umb-package-details__link:hover { text-decoration: underline; } +/* Install instructions */ +.umb-package-details__install-instructions { + background: #444; + color: #fff; + font-family: Monaco,Menlo,Consolas,'Courier New',monospace; + padding: 20px 20px; + border-radius: 5px; + margin: 20px 0 10px 0; +} + +/* Install instructions */ +.umb-package-details__install-instructions span { + color: @blueMidLight; +} /* Owner profile */ @@ -452,7 +466,6 @@ .umb-package-list__item-name { font-size: 16px; - margin-bottom: 5px; color: @black; font-weight: bold; } diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js index 534b60c120..c153e5ecb2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js @@ -125,93 +125,6 @@ function startUpDynamicContentController($q, $timeout, $scope, dashboardResource angular.module("umbraco").controller("Umbraco.Dashboard.StartUpDynamicContentController", startUpDynamicContentController); - -function FormsController($scope, $cookies, packageResource, localizationService) { - - var vm = this; - - var labels = {}; - var labelKeys = [ - "packager_installStateDownloading", - "packager_installStateImporting", - "packager_installStateInstalling", - "packager_installStateRestarting", - "packager_installStateComplete" - ]; - - localizationService.localizeMany(labelKeys).then(function(values) { - labels.installStateDownloading = values[0]; - labels.installStateImporting = values[1]; - labels.installStateInstalling = values[2]; - labels.installStateRestarting = values[3]; - labels.installStateComplete = values[4]; - }); - - vm.installForms = function() { - vm.state = labels.installStateDownloading; - packageResource - .fetch("CD44CF39-3D71-4C19-B6EE-948E1FAF0525") - .then(function(pack) { - vm.state = labels.installStateImporting; - return packageResource.import(pack); - }, vm.error) - .then(function(pack) { - vm.state = labels.installStateInstalling; - return packageResource.installFiles(pack); - }, vm.error) - .then(function(pack) { - vm.state = labels.installStateRestarting; - return packageResource.installData(pack); - }, vm.error) - .then(function(pack) { - vm.state = labels.installStateComplete; - return packageResource.cleanUp(pack); - }, vm.error) - .then(vm.complete, vm.error); - }; - - vm.complete = function(result) { - window.location.href + "?init=true"; - $cookies.putObject("umbPackageInstallId", result.packageGuid); - window.location.reload(true); - }; - - vm.error = function(err) { - vm.state = undefined; - vm.error = err; - // This will return a rejection meaning that the promise change above will stop - return $q.reject(); - }; - - function Video_player (videoId) { - // Get dom elements - this.container = document.getElementById(videoId); - - // Create controls - this.controls = document.createElement('div'); - this.controls.className="video-controls"; - - this.seek_bar = document.createElement('input'); - this.seek_bar.className="seek-bar"; - this.seek_bar.type="range"; - this.seek_bar.setAttribute('value', '0'); - - this.loader = document.createElement('div'); - this.loader.className="loader"; - - this.progress_bar = document.createElement('span'); - this.progress_bar.className="progress-bar"; - - // Insert controls - this.controls.appendChild(this.seek_bar); - this.container.appendChild(this.controls); - this.controls.appendChild(this.loader); - this.loader.appendChild(this.progress_bar); - } -} - -angular.module("umbraco").controller("Umbraco.Dashboard.FormsDashboardController", FormsController); - function startupLatestEditsController($scope) { } diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/forms/formsdashboardintro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/forms/formsdashboardintro.html index 6fb0eae349..8c1412dbe9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/forms/formsdashboardintro.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/forms/formsdashboardintro.html @@ -1,4 +1,4 @@ -
+
@@ -8,34 +8,19 @@
- -
+

+ Create forms using an intuitive drag and drop interface. From simple contact forms that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it! +

-

- Create forms using an intuitive drag and drop interface. From simple contact forms that sends e-mails to advanced questionaires that integrate with CRM systems. Your clients will love it! -

+ + - - - -
- - -
-

Installing...

- -
- - - - -
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/edit.controller.js index 9a9b05fb74..2c6c489e22 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packages/edit.controller.js @@ -11,22 +11,15 @@ vm.showBackButton = true; // open all expansion panels - vm.propertiesOpen = true; - vm.contentOpen = true; - vm.filesOpen = true; - vm.actionsOpen = true; vm.loading = true; vm.mediaNodeDisplayModels = []; vm.back = back; vm.createOrUpdatePackage = createOrUpdatePackage; vm.removeContentItem = removeContentItem; vm.openContentPicker = openContentPicker; - vm.openFilePicker = openFilePicker; - vm.removeFile = removeFile; vm.openViewPicker = openViewPicker; vm.removePackageView = removePackageView; vm.downloadFile = downloadFile; - vm.contributorsEditor = null; vm.selectDocumentType = selectDocumentType; vm.selectMediaType = selectMediaType; @@ -76,8 +69,6 @@ loadResources(); - buildContributorsEditor(vm.package); - vm.loading = false; }); @@ -92,8 +83,6 @@ loadResources(); - buildContributorsEditor(vm.package); - vm.loading = false; // Get render model for content node @@ -221,10 +210,6 @@ function createOrUpdatePackage(editPackageForm) { - let contributors = vm.contributorsEditor.value.map(o => o.value) - - vm.package.contributors = contributors; - // Split by comma and remove empty entries vm.package.mediaUdis = vm.mediaPickerModel.value.split(",").filter(i => i); if (formHelper.submitForm({ formCtrl: editPackageForm, scope: $scope })) { @@ -273,46 +258,6 @@ editorService.contentPicker(contentPicker); } - function openFilePicker() { - - let selection = Utilities.copy(vm.package.files); - - const filePicker = { - title: "Select files", - section: "settings", - treeAlias: "files", - entityType: "file", - multiPicker: true, - isDialog: true, - select: function (node) { - node.selected = !node.selected; - - const id = decodeURIComponent(node.id.replace(/\+/g, " ")); - const index = selection.indexOf(id); - - if (node.selected) { - if (index === -1) { - selection.push(id); - } - } else { - selection.splice(index, 1); - } - }, - submit: function () { - vm.package.files = selection; - editorService.close(); - }, - close: function () { - editorService.close(); - } - }; - editorService.treePicker(filePicker); - } - - function removeFile(index) { - vm.package.files.splice(index, 1); - } - function openViewPicker() { const controlPicker = { title: "Select view", @@ -439,27 +384,6 @@ } } - function buildContributorsEditor(pkg) { - - vm.contributorsEditor = { - alias: "contributors", - editor: "Umbraco.MultipleTextstring", - label: "Contributors", - description: "", - hideLabel: true, - view: "views/propertyeditors/multipletextbox/multipletextbox.html", - value: getVals(pkg.contributors), - validation: { - mandatory: false, - pattern: null - }, - config: { - min: 0, - max: 0 - } - }; - } - function getVals(array) { var vals = []; for (var i = 0; i < array.length; i++) { diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/edit.html b/src/Umbraco.Web.UI.Client/src/views/packages/edit.html index 86de554b16..8a8ff0fb38 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/edit.html @@ -19,96 +19,11 @@
- - -
- - - - - - Required - {{editPackageForm.url.errorMsg}} - - - - - - - - Required - {{editPackageForm.version.errorMsg}} - - - - - - - - - - - - - - {{editPackageForm.umbracoVersion.errorMsg}} - - - - - - - - Required - {{editPackageForm.author.errorMsg}} - - - - - - - - Required - {{editPackageForm.authorUrl.errorMsg}} - - - - - - - - - - - - - - - - - - - - - +
+ Package Content
-
- -
- - - -
+
@@ -229,62 +144,6 @@
-
- - - -
- - - - - - - - - - - - - - - - - - -
- -
- diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js index b2661f6d9f..f5fd3bfd9c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js @@ -12,7 +12,7 @@ let packageInstallData = localStorageService.get("packageInstallData"); let packageUri = $routeParams.method; - if (packageInstallData) { + if (packageInstallData) { localStorageService.remove("packageInstallData"); if (packageInstallData.postInstallationPath) { @@ -73,16 +73,6 @@ $location.path("/packages/packages/installed"); } }, - { - "name": vm.page.labels.install, - "icon": "icon-cloud-upload", - "view": "views/packages/views/install-local.html", - "active": packageUri === "local", - "alias": "umbInstallLocal", - "action": function () { - $location.path("/packages/packages/local"); - } - }, { "name": vm.page.labels.created, "icon": "icon-files", diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html index 88a2b21795..64b2b20bd2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/created.html @@ -23,10 +23,7 @@
-
{{ createdPackage.name }}
-
- {{ createdPackage.version }} | {{ createdPackage.url }} | {{ createdPackage.author }} -
+
{{ createdPackage.name }}
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.controller.js deleted file mode 100644 index 5d3869283e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.controller.js +++ /dev/null @@ -1,220 +0,0 @@ -(function () { - "use strict"; - - function PackagesInstallLocalController($scope, Upload, umbRequestHelper, packageResource, localStorageService, $timeout, $window, localizationService, $q) { - - var vm = this; - vm.state = "upload"; - - vm.localPackage = {}; - vm.installPackage = installPackage; - vm.installState = { - status: "", - progress: 0 - }; - vm.installCompleted = false; - vm.zipFile = { - uploadStatus: "idle", - uploadProgress: 0, - serverErrorMessage: null - }; - - $scope.handleFiles = function (files, event) { - if (files) { - for (var i = 0; i < files.length; i++) { - upload(files[i]); - } - } - }; - - var labels = {}; - var labelKeys = [ - "packager_installStateImporting", - "packager_installStateInstalling", - "packager_installStateRestarting", - "packager_installStateComplete", - "packager_installStateCompleted" - ]; - - localizationService.localizeMany(labelKeys).then(function (values) { - labels.installStateImporting = values[0]; - labels.installStateInstalling = values[1]; - labels.installStateRestarting = values[2]; - labels.installStateComplete = values[3]; - labels.installStateCompleted = values[4]; - }); - - function upload(file) { - - Upload.upload({ - url: umbRequestHelper.getApiUrl("packageInstallApiBaseUrl", "UploadLocalPackage"), - fields: {}, - file: file - }).progress(function (evt) { - - // hack: in some browsers the progress event is called after success - // this prevents the UI from going back to a uploading state - if (vm.zipFile.uploadStatus !== "done" && vm.zipFile.uploadStatus !== "error") { - - // set view state to uploading - vm.state = 'uploading'; - - // calculate progress in percentage - var progressPercentage = parseInt(100.0 * evt.loaded / evt.total, 10); - - // set percentage property on file - vm.zipFile.uploadProgress = progressPercentage; - - // set uploading status on file - vm.zipFile.uploadStatus = "uploading"; - - } - - }).success(function (data, status, headers, config) { - - if (data.notifications && data.notifications.length > 0) { - - // set error status on file - vm.zipFile.uploadStatus = "error"; - - // Throw message back to user with the cause of the error - vm.zipFile.serverErrorMessage = data.notifications[0].message; - - } else { - - // set done status on file - vm.zipFile.uploadStatus = "done"; - loadPackage(); - vm.zipFile.uploadProgress = 100; - vm.localPackage = data; - } - - }).error(function (evt, status, headers, config) { - - // set status done - vm.zipFile.uploadStatus = "error"; - - // If file not found, server will return a 404 and display this message - if (status === 404) { - vm.zipFile.serverErrorMessage = "File not found"; - } - else if (status == 400) { - //it's a validation error - vm.zipFile.serverErrorMessage = evt.message; - } - else { - //it's an unhandled error - //if the service returns a detailed error - if (evt.InnerException) { - vm.zipFile.serverErrorMessage = evt.InnerException.ExceptionMessage; - - //Check if its the common "too large file" exception - if (evt.InnerException.StackTrace && evt.InnerException.StackTrace.indexOf("ValidateRequestEntityLength") > 0) { - vm.zipFile.serverErrorMessage = "File too large to upload"; - } - - } else if (evt.Message) { - vm.zipFile.serverErrorMessage = evt.Message; - } - } - }); - } - - function loadPackage() { - if (vm.zipFile.uploadStatus === "done") { - vm.state = "packageDetails"; - } - } - - function installPackage() { - - vm.installState.status = labels.installStateImporting; - vm.installState.progress = "0"; - - packageResource - .import(vm.localPackage) - .then(function (pack) { - vm.installState.progress = "25"; - vm.installState.status = labels.installStateInstalling; - return packageResource.installFiles(pack); - }, - installError) - .then(function (pack) { - vm.installState.status = labels.installStateRestarting; - vm.installState.progress = "50"; - var deferred = $q.defer(); - - //check if the app domain is restarted ever 2 seconds - var count = 0; - var maxCount = 5; - - function checkRestart() { - $timeout(function () { - packageResource.checkRestart(pack).then(function (d) { - count++; - //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times - if (d.isRestarting && count < maxCount) { - checkRestart(); - } - else { - //it's restarted! - deferred.resolve(d); - } - }, - function(){ - if(count >= maxCount){ - installError(); - } - else { - checkRestart(); - } - }); - }, - 2000*(count+1)); - } - - checkRestart(); - - return deferred.promise; - }, - installError) - .then(function (pack) { - vm.installState.status = labels.installStateInstalling; - vm.installState.progress = "75"; - return packageResource.installData(pack); - }, - installError) - .then(function (pack) { - vm.installState.status = labels.installStateComplete; - vm.installState.progress = "100"; - return packageResource.cleanUp(pack); - }, - installError) - .then(function (result) { - - //Put the package data in local storage so we can use after reloading - localStorageService.set("packageInstallData", result); - - vm.installState.status = labels.installStateCompleted; - vm.installCompleted = true; - - - }, installError); - } - - function installError() { - //This will return a rejection meaning that the promise change above will stop - return $q.reject(); - } - - vm.reloadPage = function () { - //reload on next digest (after cookie) - $timeout(function () { - $window.location.reload(true); - }); - } - } - - angular.module("umbraco").controller("Umbraco.Editors.Packages.InstallLocalController", PackagesInstallLocalController); - -})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.html deleted file mode 100644 index dea6dfac43..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/install-local.html +++ /dev/null @@ -1,190 +0,0 @@ -
- -
- - -
- - - -
- -
- - - - Drop to upload - - -
- - or click here to choose files -
- -
- -
- -

Upload package

-

- Install a local package by selecting it from your machine. Only install packages from sources you know and trust. -

- -
-
-
- -
- - - - - - - -
- -
-
-
- -
-
- -

Uploading package...

- - - - -
- {{ vm.zipFile.serverErrorMessage }} -
- -
-
-
- -
- -
- -
- - - - - - - -
- - -
-
- -
-
- - -
- -
-

{{ vm.localPackage.name }}

- - - -
- Contributors
- {{ vm.localPackage.contributors.join(', ')}} -
- -
- Version
- {{ vm.localPackage.version }} -

- - - Upgrading from version - {{ vm.localPackage.originalVersion }} - - -

-
- - - -
- Read me
- -
- -
- - - I accept terms of use - - - - -
- -
- - -
- -
- This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}} -
-
-

{{vm.installState.status}}

-
- -
- - -
- -
-
- -
-
-
-
- -
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/installed.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/views/installed.controller.js index ddfee19ac1..3496fca40c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/installed.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/installed.controller.js @@ -5,8 +5,6 @@ var vm = this; - vm.confirmUninstall = confirmUninstall; - vm.uninstallPackage = uninstallPackage; vm.packageOptions = packageOptions; vm.state = "list"; vm.installState = { @@ -15,7 +13,7 @@ vm.package = {}; var labels = {}; - + function init() { packageResource.getInstalled() .then(function (packs) { @@ -40,37 +38,6 @@ .search("packageId", null); //ensure the installId flag is gone, it's only available on first install } - function confirmUninstall(pck) { - vm.state = "packageDetails"; - vm.package = pck; - } - - function uninstallPackage(installedPackage) { - vm.installState.status = labels.installStateUninstalling; - vm.installState.progress = "0"; - - packageResource.uninstall(installedPackage.id) - .then(function () { - - if (installedPackage.files.length > 0) { - vm.installState.status = labels.installStateComplete; - vm.installState.progress = "100"; - - //set this flag so that on refresh it shows the installed packages list - localStorageService.set("packageInstallData", "installed"); - - //reload on next digest (after cookie) - $timeout(function () { - $window.location.reload(true); - }); - - } - else { - init(); - } - }); - } - init(); } diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js index 4a2a3f29a7..66f305956f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js @@ -14,26 +14,17 @@ pageSize: 24 }; vm.searchQuery = ""; - vm.installState = { - status: "", - progress: 0, - type: "ok" - }; vm.selectCategory = selectCategory; vm.showPackageDetails = showPackageDetails; vm.setPackageViewState = setPackageViewState; vm.nextPage = nextPage; vm.prevPage = prevPage; vm.goToPage = goToPage; - vm.installPackage = installPackage; - vm.downloadPackage = downloadPackage; vm.openLightbox = openLightbox; vm.closeLightbox = closeLightbox; vm.search = search; vm.installCompleted = false; - var labels = {}; - var defaultSort = "Latest"; var currSort = defaultSort; @@ -56,22 +47,6 @@ vm.loading = true; - var labelKeys = [ - "packager_installStateImporting", - "packager_installStateInstalling", - "packager_installStateRestarting", - "packager_installStateComplete", - "packager_installStateCompleted" - ]; - - localizationService.localizeMany(labelKeys).then(function (values) { - labels.installStateImporting = values[0]; - labels.installStateInstalling = values[1]; - labels.installStateRestarting = values[2]; - labels.installStateComplete = values[3]; - labels.installStateCompleted = values[4]; - }); - $q.all([ ourPackageRepositoryResource.getCategories() .then(function (cats) { @@ -139,18 +114,8 @@ function showPackageDetails(selectedPackage) { ourPackageRepositoryResource.getDetails(selectedPackage.id) .then(function (pack) { - packageResource.validateInstalled(pack.name, pack.latestVersion) - .then(function () { - //ok, can install - vm.package = pack; - vm.package.isValid = true; - vm.packageViewState = "packageDetails"; - }, function () { - //nope, cannot install - vm.package = pack; - vm.package.isValid = false; - vm.packageViewState = "packageDetails"; - }) + vm.package = pack; + vm.packageViewState = "packageDetails"; }); } @@ -184,96 +149,6 @@ }); } - function downloadPackage(selectedPackage) { - vm.loading = true; - - packageResource - .fetch(selectedPackage.id) - .then(function (pack) { - vm.packageViewState = "packageInstall"; - vm.loading = false; - vm.localPackage = pack; - vm.localPackage.allowed = true; - }, function (evt, status, headers, config) { - - if (status == 400) { - //it's a validation error - vm.installState.type = "error"; - vm.zipFile.serverErrorMessage = evt.message; - } - }); - } - - function error(e, args) { - //This will return a rejection meaning that the promise change above will stop - return $q.reject(); - } - - function installPackage(selectedPackage) { - - vm.installState.status = labels.installStateImporting; - vm.installState.progress = "0"; - - packageResource - .import(selectedPackage) - .then(function (pack) { - vm.installState.status = labels.installStateInstalling; - vm.installState.progress = "25"; - return packageResource.installFiles(pack); - }, - error) - .then(function (pack) { - vm.installState.status = labels.installStateRestarting; - vm.installState.progress = "50"; - var deferred = $q.defer(); - - //check if the app domain is restarted ever 2 seconds - var count = 0; - function checkRestart() { - $timeout(function () { - packageResource.checkRestart(pack).then(function (d) { - count++; - //if there is an id it means it's not restarted yet but we'll limit it to only check 10 times - if (d.isRestarting && count < 10) { - checkRestart(); - } - else { - //it's restarted! - deferred.resolve(d); - } - }, - error); - }, 2000); - } - - checkRestart(); - - return deferred.promise; - }, error) - .then(function (pack) { - vm.installState.status = labels.installStateInstalling; - vm.installState.progress = "75"; - return packageResource.installData(pack); - }, - error) - .then(function (pack) { - vm.installState.status = labels.installStateComplete; - vm.installState.progress = "100"; - return packageResource.cleanUp(pack); - }, - error) - .then(function (result) { - - //Put the package data in local storage so we can use after reloading - localStorageService.set("packageInstallData", result); - - vm.installState.status = labels.installStateCompleted; - vm.installCompleted = true; - - }, - error); - } - function openLightbox(itemIndex, items) { vm.lightbox = { show: true, diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html index 42b538f9ad..2d2473faaf 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html @@ -104,7 +104,7 @@
- +
@@ -180,26 +180,14 @@
- - - - - - - - + + +
Install Instructions
+
+ dotnet add package Umbraco.Forms +
+
+
@@ -309,99 +297,4 @@
- -
- - - - - - -
- -
- -
- -
-
- - -
- - -
-

{{ vm.localPackage.name }}

- - - -
- Version - {{ vm.localPackage.version }} -
- - - -
- Read me -
- -
- -
- - - I accept terms of use - - - - -
- -
- - -
- -
- This package cannot be installed, it requires a minimum Umbraco version of {{vm.localPackage.umbracoVersion}} -
- -
-

{{vm.installState.status}}

-
- -
- - -
- -
-
- -
-
-
-
- diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.Development.json b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json index edeb4946d6..8888a522f4 100644 --- a/src/Umbraco.Web.UI.NetCore/appsettings.Development.json +++ b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json @@ -1,50 +1,59 @@ { - "Serilog": { - "MinimumLevel": { - "Default": "Information" - }, - "WriteTo": [ - { - "Name": "Async", - "Args": { - "configure": [ - { - "Name": "Console" - } - ] - } - } - ] + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Examine.Lucene.Providers.LuceneIndex": "Debug", + "Examine.BaseIndexProvider": "Debug", + "Examine.Lucene.LoggingReplicationClient": "Debug", + "Examine.Lucene.ExamineReplicator": "Debug" + } }, - "Umbraco": { - "CMS": { - "Global": { - "Smtp": { - //"From": "your@email.here", - //"Host": "localhost", - // "Port": "25" - } - }, - "Hosting": { - "Debug": true - }, - "RuntimeMinification": { - "useInMemoryCache": true, - "cacheBuster": "Timestamp" - }, - "RichTextEditor": { - "Commands": [ + "WriteTo": [ + { + "Name": "Async", + "Args": { + "configure": [ { - "Alias": "fullscreen", - "Name": "Full Screen", - "Mode": "All" + "Name": "Console" } - ], - "Plugins": [ - "fullscreen" ] } } - + ] + }, + "Umbraco": { + "CMS": { + "Examine": { + "LuceneDirectoryFactory": "TempFileSystemDirectoryFactory" + }, + "Global": { + "Smtp": { + //"From": "your@email.here", + //"Host": "localhost", + // "Port": "25" + } + }, + "Hosting": { + "Debug": true + }, + "RuntimeMinification": { + "useInMemoryCache": true, + "cacheBuster": "Timestamp" + }, + "RichTextEditor": { + "Commands": [ + { + "Alias": "fullscreen", + "Name": "Full Screen", + "Mode": "All" + } + ], + "Plugins": [ + "fullscreen" + ] + } } + + } } diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml index f9453136d4..75159d725a 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml @@ -1102,18 +1102,12 @@ Tím se balíček odstraní Přetáhněte sem pro nahrání Zahrnout všechny podřízené uzly - nebo kliknutím sem vyberte soubor balíčku - Nahrát balíček - Nainstalujte místní balíček výběrem ze svého počítače. Instalujte pouze balíčky ze zdrojů, které znáte a kterým důvěřujete - Nahrát další balíček - Zrušit a nahrát další balíček Přijímám podmínky použití Cesta k souboru Absolutní cesta k souboru (ie: /bin/umbraco.bin) Nainstalováno Nainstalované balíčky - Instalovat místní Dokončit Tento balíček nemá žádné zobrazení konfigurace Zatím nebyly vytvořeny žádné balíčky @@ -1172,9 +1166,6 @@ Importuji... Instaluji... Restartuji, prosím čekejte... - Vše je hotovo, váš prohlížeč se nyní obnoví, prosím čekejte... - Klepnutím na tlačítko „Dokončit“ dokončete instalaci a znovu načtěte stránku. - Nahrávám balíček... Vložit s úplným formatováním (nedoporučeno) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml index 3e8e80e1f1..cd3636803d 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml @@ -974,18 +974,12 @@ Mange hilsner fra Umbraco robotten Dette vil slette pakken Slip her for at uploade Inkludér alle underliggende sider - eller klik her for at vælge pakkefil - Upload pakke - Installér en lokal pakke ved at vælge den fra din computer. Installér kun pakker fra kilder, du kender og stoler på - Upload en anden pakke - Annuller og upload en anden pakke Jeg accepterer betingelser for anvendelse Sti til fil Absolut sti til fil (f.eks.: /bin/umbraco.bin) Installeret Installerede pakker - Installér lokal Afslut Denne pakke har ingen konfigurationsvisning Der er ikke blevet oprettet nogle pakker endnu @@ -1036,14 +1030,6 @@ Mange hilsner fra Umbraco robotten Pakke version Pakke allerede installeret Denne pakke kan ikke installeres, den kræver en minimum Umbraco version af - Afinstallerer... - Downloader... - Importeret... - Installerer... - Genstarter, vent venligst... - Færdig, din browser opdateres nu, vent venligst... - Klik venligst på 'Afslut' for at gennemføre installation og opdatere siden. - Uploader pakke... Indsæt med fuld formattering (Anbefales ikke) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml index 473d6952b2..474652fa1e 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml @@ -349,7 +349,7 @@ Wählen Sie einen Namen und einen Typ Die im Inhaltsbaum ausgewählte Seite erlaubt keine Unterseiten. - Bearbeitungsrechte für diesen Dokumenttyp + Bearbeitungsrechte für diesen Dokumenttyp Das im Strukturbaum ausgewählte Medienelement erlaubt keine untergeordneten Elemente. Bearbeitungsrechte für diesen Medientyp @@ -1155,21 +1155,12 @@ Diese Aktion entfernt das Paket Hierher ziehen zum Hochladen Alle Unterknoten einschließen - oder hier klicken, um die Paket-Datei auszuwählen - Paket hochladen - - Wählen Sie ein Paket auf Ihrem lokalen Computer über "Datei auswählen" aus.
- Installieren Sie nur Pakete von Quellen, denen Sie vertrauen. -
- Ein weiteres Paket hochladen - Abbrechen und anderes Paket hochladen Ich akzeptiere Benutzungsbedingungen Dateipfad Absoluter Dateipfad (z. B.: /bin/umbraco.bin) Installiert Installierte Pakete - Lokale Installation Abschließen Diese Paket hat keine Einstellungen Es wurden noche keine Pakete angelegt @@ -1228,10 +1219,10 @@ Das Paket wurde erfolgreich deinstalliert Paket deinstallieren - - Achtung: alle Dokumente, Medien, etc, die von den zu entfernenden Elementen abhängen, - werden nicht mehr funktionieren und im Zweifelsfall kann dass gesamte CMS instabil werden. + Achtung: alle Dokumente, Medien, etc, die von den zu entfernenden Elementen abhängen, + werden nicht mehr funktionieren und im Zweifelsfall kann dass gesamte CMS instabil werden. Bitte deinstallieren Sie also mit Vorsicht. Falls Sie unsicher sind, kontaktieren Sie den Autor des Pakets.]]> Paketversion @@ -1245,7 +1236,6 @@ Es wird neu gestartet, bitte warten... Fertig, Ihr Browser aktualisiert jetzt, bitte warten... Bitte klicken Sie 'Beenden', um die Installation abzuschließen und die Seite neu zu laden. - Paket wird hochgeladen... Einfügen mit Formatierung (Nicht empfohlen) @@ -1290,7 +1280,7 @@ %0% kann nicht veröffentlicht werden, da die Veröffentlichung zeitlich geplant ist. - @@ -1516,7 +1506,7 @@ Ein Wörterbuchelement ist ein Platzhalter für lokalisierbaren Text. Das macht es einfach mehrsprachige Websites zu gestalten. Makro - Ein Makro ist eine konfigurierbare Komponente, die großartig + Ein Makro ist eine konfigurierbare Komponente, die großartig für wiederverwendbare Teile Ihres Entwurfes sind, für welche Sie optionale Parameter benötigen, wie z. B. Galerien, Formulare oder Listen. @@ -1535,7 +1525,7 @@ Untergeordnete Vorlage einfügen @RenderBody() Platzhalters. ]]> @@ -1543,7 +1533,7 @@ @section { ... }. - Dieser benannte Bereich kann in der übergeordneten Vorlage + Dieser benannte Bereich kann in der übergeordneten Vorlage durch Verwendung von @RenderSection eingefügt werden. ]]> diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml index 22a88f16e6..942fac8ad4 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml @@ -1217,19 +1217,13 @@ To manage your website, simply open the Umbraco backoffice and start adding cont This will delete the package Drop to upload Include all child nodes - or click here to choose package file - Upload package - Install a local package by selecting it from your machine. Only install packages from sources you know and trust - Upload another package - Cancel and upload another package - I accept + I accept terms of use Path to file Absolute path to file (ie: /bin/umbraco.bin) Installed Installed packages - Install local Finish This package has no configuration view No packages have been created yet @@ -1282,14 +1276,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Package version Package already installed This package cannot be installed, it requires a minimum Umbraco version of - Uninstalling... - Downloading... - Importing... - Installing... - Restarting, please wait... - All done, your browser will now refresh, please wait... - Please click 'Finish' to complete installation and reload the page. - Uploading package... Paste with full formatting (Not recommended) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml index b1c76ae3d0..26a8c3ac03 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml @@ -1230,18 +1230,12 @@ To manage your website, simply open the Umbraco backoffice and start adding cont This will delete the package Drop to upload Include all child nodes - or click here to choose package file - Upload package - Install a local package by selecting it from your machine. Only install packages from sources you know and trust - Upload another package - Cancel and upload another package I accept terms of use Path to file Absolute path to file (ie: /bin/umbraco.bin) Installed Installed packages - Install local Finish This package has no configuration view No packages have been created yet @@ -1295,14 +1289,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Upgrading from version Package already installed This package cannot be installed, it requires a minimum Umbraco version of - Uninstalling... - Downloading... - Importing... - Installing... - Restarting, please wait... - All done, your browser will now refresh, please wait... - Please click 'Finish' to complete installation and reload the page. - Uploading package... Paste with full formatting (Not recommended) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml index 7bd940a5ae..bafd8e3b6b 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/es.xml @@ -815,14 +815,9 @@ y localizando el paquete. Los paquetes de Umbraco normalmente tienen la extensión ".umb" o ".zip".]]> - Suelta para subir archivo - o Pulsa aquí para elegir paquete - Subir paquete - Instala un paquete local seleccionándolo desde tu ordenador. instala sólo paquetes de fuentes que conoces y en las que confías - Subir otro paquete - Cancelar y subir otro paquete + Suelta para subir archivo Licencia - Aceptar + Aceptar términos de uso Instalar paquete Terminar @@ -865,14 +860,6 @@ Versión del paquete Paquete ya instalado Este paquete no se puede instalar, requiere un versión mínima de Umbraco de - Desinstalando... - Descargando... - Importando... - Instalando... - Reiniciando, por favor espera... - Todo hecho, tu navegador se actualizará, por favor espera... - Por favor pulsa 'Terminar' para completar la instalación y actualizar la página. - Subiendo paquete... Pegar con formato completo (No recomendado) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml index 7a0a7f938b..549dd4cfe2 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml @@ -138,7 +138,7 @@ Sauver la mise en page de la liste Planifier Prévisualiser - Prévisualiser + Prévisualiser La prévisualisation est désactivée car aucun modèle n'a été assigné. Choisir un style Afficher les styles @@ -320,7 +320,7 @@ Cliquez pour télécharger ou cliquez ici pour choisir un fichier - Vous pouvez faire glisser des fichiers ici pour télécharger. + Vous pouvez faire glisser des fichiers ici pour télécharger. Ce fichier ne peut pas ête chargé, il n'est pas d'un type de fichier autorisé. La taille maximum de fichier est Racine du média @@ -1166,18 +1166,12 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Ceci va supprimer le package Déposez pour uploader Inclure tous les noeuds enfant - ou cliquez ici pour choisir les fichiers - Uploader un package - Installez un package local en le sélectionnant sur votre ordinateur. Installez uniquement des packages de sources fiables que vous connaissez - Uploader un autre package - Annuler et uploader un autre package J'accepte les conditions d'utilisation Chemin du fichier Le chemin absolu du fichier (eg: /bin/umbraco.bin) Installé Packages installés - Installer localement Terminer Ce package n'a pas de vue de configuration Aucun package n'a encore été créé @@ -1231,14 +1225,6 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Mise à jour à partir de la version Package déjà installé Ce package ne peut pas être installé, il nécessite au minimum la version Umbraco %0% - Désinstallation... - Téléchargement... - Import... - Installation... - Redémarrage, veuillez patienter... - Terminé, votre navigateur va être rafraîchi, veuillez patienter... - Veuillez cliquer sur terminer pour compléter l'installation et recharger la page. - Package en cours de chargement... Coller en conservant le formatage (non recommandé) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml index 1f692b8c77..d448d0b355 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/nl.xml @@ -1020,18 +1020,12 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Dit zal de package verwijderen Neerzetten om te uploaden Inclusief alle onderliggende nodes - of klik hier om een package bestand te kiezen - Package uploaden - Installeer een lokale package door het op je computer te selecteren. Installeer alleen packages van bronnen die je vertrouwt. - Nog een package uploaden - Annuleren en een andere package uploaden Accepteren gebruiksvoorwaarden Pad naar bestand Absoluut pad naar bestand (bv: /bin/umbraco.bin) Geïnstalleerd Geïnstalleerde packages - Lokaal installeren Voltooien Deze package heeft geen instellingen Er zijn nog geen packages aangemaakt @@ -1094,7 +1088,6 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Aan het herstarten, een ogenblik geduld aub... Geïnstalleerd! Je browser zal nu automatisch ververst worden... Klik op "Voltooien" om de installatie te voltooien en de pagina te vernieuwen. - Package uploaden... Plakken met alle opmaak (Niet aanbevolen) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml index b4a994ec82..f9b8b7250d 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/pl.xml @@ -809,11 +809,6 @@ Naciśnij przycisk instaluj, aby zainstalować bazę danych Umb i wskaż gdzie jest zapisany. Pakiety Umbraco przeważnie posiadają rozszerzenie ".umb" lub ".zip". ]]> Upuść, aby załadować - lub kliknij tutaj, aby wybrać pliki - Załaduj pakiet - Zainstaluj lokalny pakiet poprzez wybranie go ze swojego komputera. Instaluj jedynie te pakiety, z zaufanych i znanych Tobie źródeł - Załaduj kolejny pakiet - Anuluj i załaduj kolejny pakiet Licencja Zgadzam się zasady użytkowania @@ -861,14 +856,6 @@ Naciśnij przycisk instaluj, aby zainstalować bazę danych Umb Wersja pakietu Pakiet jest już zainstalowany Ten pakiet nie może być zainstalowany, ponieważ wymaga Umbraco w wersji przynajmniej %0% - Odinstalowywanie... - Pobieranie... - Importowanie... - Instalowanie... - Restartowanie, proszę czekać... - Wszystko skończone, Twoja przeglądarka się teraz odświeży, proszę czekać... - Proszę kliknąć Zakończ, aby zakończyć instalację i przeładować stronę. - Wgrywanie pakietu... Wklej z zachowaniem formatowania (Nie zalecane) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml index f2f314ab71..7c130a6dcd 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/ru.xml @@ -1135,11 +1135,6 @@ и указав на нужный файл. Пакеты Umbraco обычно являются архивами с расширением '.zip'. ]]> Перетащите сюда - или нажмите здесь для выбора файла пакета - Загрузить пакет - Установите локальный пакет из файла, расположенного на Вашем компьютере. Остерегайтесь устанавливать пакеты из непроверенных источников! - Загрузить еще один пакет - Отменить и загрузить другой пакет Лицензия Я принимаю условия использования @@ -1187,14 +1182,6 @@ Версия пакета Этот пакет уже установлен в системе Этот пакет не может быть установлен, он требует наличия Umbraco версии как минимум - Удаление... - Загрузка... - Импорт... - Установка... - Перезапуск, подождите, пожалуйста... - Все готово, сейчас браузер перезагрузит страницу, подождите, пожалуйста... - Пожалуйста, нажмите кнопку 'Завершить' для завершения установки и перезагрузки страницы. - Загрузка пакета... Вставить, полностью сохранив форматирование (не рекомендуется) diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml index 7cb2c78e63..403f2ff324 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/tr.xml @@ -108,7 +108,7 @@ Devral Kültür - veya kültürü üst düğümlerden devralın. Ayrıca
+ veya kültürü üst düğümlerden devralın. Ayrıca
aşağıdaki alan da geçerli değilse geçerli düğüme.]]>
Alanlar @@ -1099,7 +1099,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey - + ]]> @@ -1128,17 +1128,17 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey @@ -1218,7 +1218,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey - + ]]> @@ -1242,11 +1242,6 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Bu, paketi silecek Yüklemek için bırakın Tüm alt düğümleri dahil et - veya paket dosyasını seçmek için burayı tıklayın - Paketi yükle - Makinenizden seçerek yerel bir paket kurun. Yalnızca bildiğiniz ve güvendiğiniz kaynaklardan paket yükleyin - Başka bir paket yükleyin - İptal edin ve başka bir paketi yükleyin Kabul ediyorum kullanım şartları @@ -1254,7 +1249,6 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Dosyaya giden mutlak yol (yani: /bin/umbraco.bin) Yüklendi Yüklü paketler - Yerel yükle Bitir Bu pakette yapılandırma görünümü yok Henüz paket oluşturulmadı @@ -1311,14 +1305,6 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Paket versiyonu Paket zaten yüklü Bu paket kurulamaz, minimum Umbraco sürümü gerektirir - Kaldırılıyor ... - İndiriliyor ... - İçe Aktarılıyor ... - Kuruluyor ... - Yeniden başlatılıyor, lütfen bekleyin ... - Her şey tamam, tarayıcınız şimdi yenilenecek, lütfen bekleyin ... - Kurulumu tamamlamak ve sayfayı yeniden yüklemek için lütfen 'Bitir'i tıklayın. - Paket yükleniyor ... Tam biçimlendirmeyle yapıştırın (Önerilmez) @@ -1844,18 +1830,18 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Çevirmen kullanıcısı bulunamadı. Lütfen çeviriye içerik göndermeye başlamadan önce bir çevirmen kullanıcısı oluşturun @@ -2096,7 +2082,7 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey - + ]]> Davet Et diff --git a/src/umbraco.sln b/src/umbraco.sln index b021dfccff..a1e714c79a 100644 --- a/src/umbraco.sln +++ b/src/umbraco.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29209.152 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Web.UI", "Umbraco.Web.UI\Umbraco.Web.UI.csproj", "{4C4C194C-B5E4-4991-8F87-4373E24CC19F}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{2849E9D4-3B4E-40A3-A309-F3CB4F0E125F}" ProjectSection(SolutionItems) = preProject ..\linting\.editorconfig = ..\linting\.editorconfig @@ -96,8 +94,6 @@ Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "Umbraco.Tests.AcceptanceTes VWDPort = "62926" EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Web", "Umbraco.Web\Umbraco.Web.csproj", "{651E1350-91B6-44B7-BD60-7207006D7003}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{E3F9F378-AFE1-40A5-90BD-82833375DBFE}" ProjectSection(SolutionItems) = preProject ..\build\NuSpecs\tools\applications.config.install.xdt = ..\build\NuSpecs\tools\applications.config.install.xdt @@ -166,18 +162,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4C4C194C-B5E4-4991-8F87-4373E24CC19F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C4C194C-B5E4-4991-8F87-4373E24CC19F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C4C194C-B5E4-4991-8F87-4373E24CC19F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C4C194C-B5E4-4991-8F87-4373E24CC19F}.Release|Any CPU.Build.0 = Release|Any CPU {3819A550-DCEC-4153-91B4-8BA9F7F0B9B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3819A550-DCEC-4153-91B4-8BA9F7F0B9B4}.Release|Any CPU.ActiveCfg = Debug|Any CPU {9E4C8A12-FBE0-4673-8CE2-DF99D5D57817}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9E4C8A12-FBE0-4673-8CE2-DF99D5D57817}.Release|Any CPU.ActiveCfg = Debug|Any CPU - {651E1350-91B6-44B7-BD60-7207006D7003}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {651E1350-91B6-44B7-BD60-7207006D7003}.Debug|Any CPU.Build.0 = Debug|Any CPU - {651E1350-91B6-44B7-BD60-7207006D7003}.Release|Any CPU.ActiveCfg = Release|Any CPU - {651E1350-91B6-44B7-BD60-7207006D7003}.Release|Any CPU.Build.0 = Release|Any CPU {3A33ADC9-C6C0-4DB1-A613-A9AF0210DF3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3A33ADC9-C6C0-4DB1-A613-A9AF0210DF3D}.Debug|Any CPU.Build.0 = Debug|Any CPU {3A33ADC9-C6C0-4DB1-A613-A9AF0210DF3D}.Release|Any CPU.ActiveCfg = Release|Any CPU