From 072c1a67648ae75a8ad76666ec87cead5c0aa3a5 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 13 Jul 2018 12:45:04 +1000 Subject: [PATCH 001/275] WIP - editing all variants at once, this is getting things wired up to display a content item, lots of TODOs added, models and mappings refactored, content apps put in c# model, etc... --- src/Umbraco.Core/Constants-Conventions.cs | 5 - .../Constants-PropertyTypeGroups.cs | 8 +- .../Migrations/Install/DatabaseDataCreator.cs | 6 +- .../Mapping/ContentWebModelMappingTests.cs | 150 ++++----- .../ContentModelSerializationTests.cs | 114 +++---- .../components/content/edit.controller.js | 134 +++----- .../editor/umbeditorheader.directive.js | 38 +-- .../src/common/resources/content.resource.js | 4 +- .../src/views/components/content/edit.html | 2 +- .../apps/content/content.controller.js | 8 +- .../views/content/apps/content/content.html | 2 +- .../apps/listview/listview.controller.js | 5 + .../src/views/media/media.edit.controller.js | 19 -- src/Umbraco.Web/Editors/ContentController.cs | 307 +++++++++--------- src/Umbraco.Web/Editors/MediaController.cs | 12 +- src/Umbraco.Web/Editors/MemberController.cs | 2 +- .../Models/ContentEditing/ContentApp.cs | 24 ++ .../ContentEditing/ContentItemDisplay.cs | 159 ++++++++- .../Models/ContentEditing/ContentVariation.cs | 51 --- .../ContentEditing/ContentVariationDisplay.cs | 104 ++++++ .../ContentEditing/ITabbedContentItem.cs | 10 + .../Models/ContentEditing/MediaItemDisplay.cs | 9 + .../ContentEditing/TabbedContentItem.cs | 3 +- .../Models/Mapping/ContentAppResolver.cs | 52 +++ .../Mapping/ContentItemDisplayNameResolver.cs | 42 +-- .../ContentItemDisplayVariationResolver.cs | 87 ++--- .../Models/Mapping/ContentMapperProfile.cs | 36 +- .../Models/Mapping/MediaAppResolver.cs | 53 +++ .../Models/Mapping/MediaMapperProfile.cs | 6 +- .../Mapping/TabsAndPropertiesResolver.cs | 126 +++---- src/Umbraco.Web/Umbraco.Web.csproj | 6 +- 31 files changed, 944 insertions(+), 640 deletions(-) create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentApp.cs delete mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentVariation.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs create mode 100644 src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs create mode 100644 src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs diff --git a/src/Umbraco.Core/Constants-Conventions.cs b/src/Umbraco.Core/Constants-Conventions.cs index 524ae580a3..14ea4e23fc 100644 --- a/src/Umbraco.Core/Constants-Conventions.cs +++ b/src/Umbraco.Core/Constants-Conventions.cs @@ -34,11 +34,6 @@ namespace Umbraco.Core public const string ListViewPrefix = "List View - "; } - public static class PropertyGroups - { - public const string ListViewGroupName = "umbContainerView"; - } - /// /// Constants for Umbraco Content property aliases. /// diff --git a/src/Umbraco.Core/Constants-PropertyTypeGroups.cs b/src/Umbraco.Core/Constants-PropertyTypeGroups.cs index ef6951df1a..6a96783a26 100644 --- a/src/Umbraco.Core/Constants-PropertyTypeGroups.cs +++ b/src/Umbraco.Core/Constants-PropertyTypeGroups.cs @@ -17,10 +17,10 @@ /// public const string File = "50899F9C-023A-4466-B623-ABA9049885FE"; - /// - /// Guid for a Image PropertyTypeGroup object. - /// - public const string Contents = "79995FA2-63EE-453C-A29B-2E66F324CDBE"; + ///// + ///// Guid for a Image PropertyTypeGroup object. + ///// + //public const string Contents = "79995FA2-63EE-453C-A29B-2E66F324CDBE"; /// /// Guid for a Image PropertyTypeGroup object. diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs index 7c02f7ad75..32f8459b37 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs @@ -205,7 +205,8 @@ namespace Umbraco.Core.Migrations.Install { _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Image) }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.File) }); - _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Contents) }); + //TODO: Need a migration to remove this + //_database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Contents) }); //membership property group _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 11, ContentTypeNodeId = 1044, Text = "Membership", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Membership) }); } @@ -220,7 +221,8 @@ namespace Umbraco.Core.Migrations.Install _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 24, UniqueId = 24.ToGuid(), DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.File, Name = "Upload file", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 25, UniqueId = 25.ToGuid(), DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 26, UniqueId = 26.ToGuid(), DataTypeId = Constants.DataTypes.LabelBigint, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); - _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 27, UniqueId = 27.ToGuid(), DataTypeId = Constants.DataTypes.DefaultMediaListView, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); + //TODO: Need a migration to remove this + //_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 27, UniqueId = 27.ToGuid(), DataTypeId = Constants.DataTypes.DefaultMediaListView, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); //membership property types _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 28, UniqueId = 28.ToGuid(), DataTypeId = -89, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.Comments, Name = Constants.Conventions.Member.CommentsLabel, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 29, UniqueId = 29.ToGuid(), DataTypeId = Constants.DataTypes.LabelInt, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.FailedPasswordAttempts, Name = Constants.Conventions.Member.FailedPasswordAttemptsLabel, SortOrder = 1, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index d6ae92ebd3..ed06f224d6 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -107,93 +107,93 @@ namespace Umbraco.Tests.Models.Mapping AssertContentItem(result, content); } - [Test] - public void To_Display_Model() - { - var contentType = MockedContentTypes.CreateSimpleContentType(); - var content = MockedContent.CreateSimpleContent(contentType); - FixUsers(content); + //[Test] + //public void To_Display_Model() + //{ + // var contentType = MockedContentTypes.CreateSimpleContentType(); + // var content = MockedContent.CreateSimpleContent(contentType); + // FixUsers(content); - // need ids for tabs - var id = 1; - foreach (var g in content.PropertyGroups) - g.Id = id++; + // // need ids for tabs + // var id = 1; + // foreach (var g in content.PropertyGroups) + // g.Id = id++; - var result = Mapper.Map(content); + // var result = Mapper.Map(content); - AssertBasics(result, content); + // AssertBasics(result, content); - foreach (var p in content.Properties) - AssertDisplayProperty(result, p); + // foreach (var p in content.Properties) + // AssertDisplayProperty(result, p); - Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); - Assert.IsTrue(result.Tabs.First().IsActive); - Assert.IsTrue(result.Tabs.Except(new[] {result.Tabs.First()}).All(x => x.IsActive == false)); - } + // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); + // Assert.IsTrue(result.Tabs.First().IsActive); + // Assert.IsTrue(result.Tabs.Except(new[] {result.Tabs.First()}).All(x => x.IsActive == false)); + //} - [Test] - public void To_Display_Model_No_Tabs() - { - var contentType = MockedContentTypes.CreateSimpleContentType(); - contentType.PropertyGroups.Clear(); - var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 }; + //[Test] + //public void To_Display_Model_No_Tabs() + //{ + // var contentType = MockedContentTypes.CreateSimpleContentType(); + // contentType.PropertyGroups.Clear(); + // var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 }; - var result = Mapper.Map(content); + // var result = Mapper.Map(content); - AssertBasics(result, content); - foreach (var p in content.Properties) - { - AssertDisplayProperty(result, p); - } - Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); - } + // AssertBasics(result, content); + // foreach (var p in content.Properties) + // { + // AssertDisplayProperty(result, p); + // } + // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); + //} - [Test] - public void To_Display_Model_With_Non_Grouped_Properties() - { - var idSeed = 1; - var contentType = MockedContentTypes.CreateSimpleContentType(); - //add non-grouped properties - contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped1") { Name = "Non Grouped 1", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); - contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped2") { Name = "Non Grouped 2", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); - //set ids or it wont work - contentType.Id = idSeed; - foreach (var p in contentType.PropertyTypes) - { - p.Id = idSeed; - idSeed++; - } - var content = MockedContent.CreateSimpleContent(contentType); - FixUsers(content); + //[Test] + //public void To_Display_Model_With_Non_Grouped_Properties() + //{ + // var idSeed = 1; + // var contentType = MockedContentTypes.CreateSimpleContentType(); + // //add non-grouped properties + // contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped1") { Name = "Non Grouped 1", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); + // contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped2") { Name = "Non Grouped 2", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); + // //set ids or it wont work + // contentType.Id = idSeed; + // foreach (var p in contentType.PropertyTypes) + // { + // p.Id = idSeed; + // idSeed++; + // } + // var content = MockedContent.CreateSimpleContent(contentType); + // FixUsers(content); - foreach (var p in content.Properties) - { - p.Id = idSeed; - idSeed++; - } - //need ids for tabs - var id = 1; - foreach (var g in content.PropertyGroups) - { - g.Id = id; - id++; - } - //ensure that nothing is marked as dirty - contentType.ResetDirtyProperties(false); - //ensure that nothing is marked as dirty - content.ResetDirtyProperties(false); + // foreach (var p in content.Properties) + // { + // p.Id = idSeed; + // idSeed++; + // } + // //need ids for tabs + // var id = 1; + // foreach (var g in content.PropertyGroups) + // { + // g.Id = id; + // id++; + // } + // //ensure that nothing is marked as dirty + // contentType.ResetDirtyProperties(false); + // //ensure that nothing is marked as dirty + // content.ResetDirtyProperties(false); - var result = Mapper.Map(content); + // var result = Mapper.Map(content); - AssertBasics(result, content); - foreach (var p in content.Properties) - { - AssertDisplayProperty(result, p); - } - Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count() - 1); - Assert.IsTrue(result.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); - Assert.AreEqual(2, result.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); - } + // AssertBasics(result, content); + // foreach (var p in content.Properties) + // { + // AssertDisplayProperty(result, p); + // } + // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count() - 1); + // Assert.IsTrue(result.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); + // Assert.AreEqual(2, result.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); + //} #region Assertions diff --git a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs index fcc434a596..f344360c18 100644 --- a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs @@ -11,67 +11,67 @@ namespace Umbraco.Tests.Web.AngularIntegration [TestFixture] public class ContentModelSerializationTests { - [Test] - public void Content_Display_To_Json() - { - //create 3 tabs with 3 properties each - var tabs = new List>(); - for (var tabIndex = 0; tabIndex < 3; tabIndex ++) - { - var props = new List(); - for (var propertyIndex = 0; propertyIndex < 3; propertyIndex ++) - { - props.Add(new ContentPropertyDisplay - { - Alias = "property" + propertyIndex, - Label = "Property " + propertyIndex, - Id = propertyIndex, - Value = "value" + propertyIndex, - Config = new Dictionary {{ propertyIndex.ToInvariantString(), "value" }}, - Description = "Description " + propertyIndex, - View = "~/Views/View" + propertyIndex, - HideLabel = false - }); - } - tabs.Add(new Tab() - { - Alias = "Tab" + tabIndex, - Label = "Tab" + tabIndex, - Properties = props - }); - } + //[Test] + //public void Content_Display_To_Json() + //{ + // //create 3 tabs with 3 properties each + // var tabs = new List>(); + // for (var tabIndex = 0; tabIndex < 3; tabIndex ++) + // { + // var props = new List(); + // for (var propertyIndex = 0; propertyIndex < 3; propertyIndex ++) + // { + // props.Add(new ContentPropertyDisplay + // { + // Alias = "property" + propertyIndex, + // Label = "Property " + propertyIndex, + // Id = propertyIndex, + // Value = "value" + propertyIndex, + // Config = new Dictionary {{ propertyIndex.ToInvariantString(), "value" }}, + // Description = "Description " + propertyIndex, + // View = "~/Views/View" + propertyIndex, + // HideLabel = false + // }); + // } + // tabs.Add(new Tab() + // { + // Alias = "Tab" + tabIndex, + // Label = "Tab" + tabIndex, + // Properties = props + // }); + // } - var displayModel = new ContentItemDisplay - { - Id = 1234, - Name = "Test", - Tabs = tabs - }; + // var displayModel = new ContentItemDisplay + // { + // Id = 1234, + // Name = "Test", + // Tabs = tabs + // }; - var json = JsonConvert.SerializeObject(displayModel); + // var json = JsonConvert.SerializeObject(displayModel); - var jObject = JObject.Parse(json); + // var jObject = JObject.Parse(json); - Assert.AreEqual("1234", jObject["id"].ToString()); - Assert.AreEqual("Test", jObject["name"].ToString()); - Assert.AreEqual(3, jObject["tabs"].Count()); - for (var tab = 0; tab < jObject["tabs"].Count(); tab++) - { - Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["alias"].ToString()); - Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["label"].ToString()); - Assert.AreEqual(3, jObject["tabs"][tab]["properties"].Count()); - for (var prop = 0; prop < jObject["tabs"][tab]["properties"].Count(); prop++) - { - Assert.AreEqual("property" + prop, jObject["tabs"][tab]["properties"][prop]["alias"].ToString()); - Assert.AreEqual("Property " + prop, jObject["tabs"][tab]["properties"][prop]["label"].ToString()); - Assert.AreEqual(prop, jObject["tabs"][tab]["properties"][prop]["id"].Value()); - Assert.AreEqual("value" + prop, jObject["tabs"][tab]["properties"][prop]["value"].ToString()); - Assert.AreEqual("{\"" + prop + "\":\"value\"}", jObject["tabs"][tab]["properties"][prop]["config"].ToString(Formatting.None)); - Assert.AreEqual("Description " + prop, jObject["tabs"][tab]["properties"][prop]["description"].ToString()); - Assert.AreEqual(false, jObject["tabs"][tab]["properties"][prop]["hideLabel"].Value()); - } - } - } + // Assert.AreEqual("1234", jObject["id"].ToString()); + // Assert.AreEqual("Test", jObject["name"].ToString()); + // Assert.AreEqual(3, jObject["tabs"].Count()); + // for (var tab = 0; tab < jObject["tabs"].Count(); tab++) + // { + // Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["alias"].ToString()); + // Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["label"].ToString()); + // Assert.AreEqual(3, jObject["tabs"][tab]["properties"].Count()); + // for (var prop = 0; prop < jObject["tabs"][tab]["properties"].Count(); prop++) + // { + // Assert.AreEqual("property" + prop, jObject["tabs"][tab]["properties"][prop]["alias"].ToString()); + // Assert.AreEqual("Property " + prop, jObject["tabs"][tab]["properties"][prop]["label"].ToString()); + // Assert.AreEqual(prop, jObject["tabs"][tab]["properties"][prop]["id"].Value()); + // Assert.AreEqual("value" + prop, jObject["tabs"][tab]["properties"][prop]["value"].ToString()); + // Assert.AreEqual("{\"" + prop + "\":\"value\"}", jObject["tabs"][tab]["properties"][prop]["config"].ToString(Formatting.None)); + // Assert.AreEqual("Description " + prop, jObject["tabs"][tab]["properties"][prop]["description"].ToString()); + // Assert.AreEqual(false, jObject["tabs"][tab]["properties"][prop]["hideLabel"].Value()); + // } + // } + //} } } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index d2cbe5fe86..15f95b2a60 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -53,76 +53,28 @@ } } - //init can be called more than once and we don't want to have multiple bound events - for (var e in evts) { - eventsService.unsubscribe(evts[e]); - } - - evts.push(eventsService.on("editors.content.changePublishDate", function (event, args) { - createButtons(args.node); - })); - - evts.push(eventsService.on("editors.content.changeUnpublishDate", function (event, args) { - createButtons(args.node); - })); - - evts.push(eventsService.on("editors.documentType.saved", function (name, args) { - // if this content item uses the updated doc type we need to reload the content item - if(args && args.documentType && args.documentType.key === content.documentType.key) { - if ($scope.page.culture) { - loadContent($scope.page.culture); - } - else { - loadContent(); - } - } - })); - - // We don't get the info tab from the server from version 7.8 so we need to manually add it - //contentEditingHelper.addInfoTab($scope.content.tabs); - - // prototype content and info apps - var contentApp = { - "name": "Content", - "alias": "content", - "icon": "icon-document", - "view": "views/content/apps/content/content.html" - }; - - var infoApp = { - "name": "Info", - "alias": "info", - "icon": "icon-info", - "view": "views/content/apps/info/info.html" - }; - - var listview = { - "name": "Child items", - "alias": "childItems", - "icon": "icon-list", - "view": "views/content/apps/listview/listview.html" - }; - - $scope.content.apps = []; - - if ($scope.content.isContainer) { - // add list view app - $scope.content.apps.push(listview); - - // remove the list view tab - angular.forEach($scope.content.tabs, function (tab, index) { - if (tab.alias === "umbContainerView") { - tab.hide = true; - } - }); - } - - $scope.content.apps.push(contentApp); - $scope.content.apps.push(infoApp); + bindEvents(); // set first app to active $scope.content.apps[0].active = true; + // set the active variant + var activeCultureSet = false; + _.each($scope.content.variants, function (v) { + if (!activeCultureSet) { + if (v.language.culture === $scope.page.culture) { + v.active = true; + $scope.content.currentVariant = v; + activeCultureSet = true; + } + } + }); + if (!activeCultureSet) { + // set the first variant to active + $scope.content.variants[0].active = true; + $scope.content.currentVariant = $scope.content.variants[0]; + } + // create new editor for split view if ($scope.editors.length === 0) { var editor = { @@ -138,14 +90,35 @@ } } + function bindEvents() { + //bindEvents can be called more than once and we don't want to have multiple bound events + for (var e in evts) { + eventsService.unsubscribe(evts[e]); + } + + evts.push(eventsService.on("editors.content.changePublishDate", function (event, args) { + createButtons(args.node); + })); + + evts.push(eventsService.on("editors.content.changeUnpublishDate", function (event, args) { + createButtons(args.node); + })); + + evts.push(eventsService.on("editors.documentType.saved", function (name, args) { + // if this content item uses the updated doc type we need to reload the content item + if (args && args.documentType && args.documentType.key === content.documentType.key) { + loadContent(); + } + })); + } + /** * This does the content loading and initializes everything, called on load and changing variants - * @param {any} culture */ - function loadContent(culture) { + function loadContent() { //we are editing so get the content item from the server - return $scope.getMethod()($scope.contentId, culture) + return $scope.getMethod()($scope.contentId) .then(function (data) { $scope.content = data; @@ -305,18 +278,11 @@ } else { - //Browse content nodes based on the selected tree language variant $scope.page.loading = true; - if ($scope.page.culture) { - loadContent($scope.page.culture).then(function(){ - $scope.page.loading = false; - }); - } - else { - loadContent().then(function(){ - $scope.page.loading = false; - }); - } + + loadContent().then(function () { + $scope.page.loading = false; + }); } $scope.unPublish = function () { @@ -326,8 +292,8 @@ if ($scope.content.variants.length > 0) { _.each($scope.content.variants, function (d) { - //set the culture if this is current - if (d.current === true) { + //set the culture if this is active + if (d.active === true) { culture = d.language.culture; } }); @@ -541,9 +507,9 @@ // set selected variant on split view content angular.forEach($scope.editors[editorIndex].content.variants, function (variant) { if (variant.culture === selectedVariant.culture) { - variant.current = true; + variant.active = true; } else { - variant.current = false; + variant.active = false; } }); $scope.editors[editorIndex].loading = false; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js index 980c2f4453..a0d38667bf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js @@ -214,38 +214,16 @@ Use this directive to construct a header inside the main editor window. function onInit() { setCurrentVariant(scope.variants); - setVariantStatusColor(scope.variants); } function setCurrentVariant(variants) { - angular.forEach(variants, function (variant) { - if(variant.current) { + if(variant.active) { scope.vm.currentVariant = variant; } }); } - - //TODO: This doesn't really affect any UI currently, need some feedback from mads - function setVariantStatusColor(variants) { - angular.forEach(variants, function (variant) { - - //TODO: What about variant.exists? If we are applying colors/styles, this should be one of them - - switch (variant.state) { - case "Published": - variant.stateColor = "success"; - break; - case "Unpublished": - //TODO: Not sure if these statuses will ever bubble up to the UI? - case "Publishing": - case "Unpublishing": - default: - variant.stateColor = "gray"; - } - }); - } - + scope.goBack = function () { if (scope.onBack) { scope.onBack(); @@ -293,12 +271,12 @@ Use this directive to construct a header inside the main editor window. } }; - scope.$watch('variants', function(newValue, oldValue){ - if(!newValue) return; - if(newValue === oldValue) return; - setCurrentVariant(newValue); - setVariantStatusColor(newValue); - }, true); + //TODO: Change this, we cannot watch the whole model + //scope.$watch('variants', function(newValue, oldValue){ + // if(!newValue) return; + // if(newValue === oldValue) return; + // setCurrentVariant(newValue); + //}, true); onInit(); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index 67b50dddcb..bfe64923c3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -330,13 +330,13 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { * @returns {Promise} resourcePromise object containing the content item. * */ - getById: function (id, culture) { + getById: function (id) { return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( "contentApiBaseUrl", "GetById", - { id: id, culture: culture })), + { id: id })), 'Failed to retrieve data for content id ' + id); }, diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html index c5cecb2190..bf89bf2fe9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html @@ -17,7 +17,7 @@ -
+
{{ group.label }}
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js index d21715854d..2733b56690 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js @@ -7,6 +7,11 @@ vm.listViewGroup = {}; + //TODO: We need to fix this, there is no umbContainerView anymore since this worked as a hack by copying + // across a tab/property editor to a content App, instead we are going to need to hack the list view a different + // way since currently it still requires us to use umb-property-editor so we'll either need to construct the model + // here ourselves or somehow allow the server to pass in a model for a content app. + function onInit() { angular.forEach($scope.model.tabs, function(group){ if(group.alias === "umbContainerView") { diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js index 8c171af2f0..2f1e81d186 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.edit.controller.js @@ -116,25 +116,6 @@ function mediaEditController($scope, $routeParams, $q, appState, mediaResource, "view": "views/media/apps/listview/listview.html" }; - $scope.content.apps = []; - - if($scope.content.contentTypeAlias === "Folder") { - // add list view app - $scope.content.apps.push(listview); - - // remove the list view tab - angular.forEach($scope.content.tabs, function(tab, index){ - if(tab.alias === "Contents") { - tab.hide = true; - } - }); - - } else { - $scope.content.apps.push(contentApp); - } - - $scope.content.apps.push(infoApp); - // set first app to active $scope.content.apps[0].active = true; diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index b8dcb9e8fa..fb19131e96 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -218,16 +218,24 @@ namespace Umbraco.Web.Editors var display = new ContentItemDisplay { Id = Constants.System.RecycleBinContent, - Alias = "recycleBin", + //Alias = "recycleBin", ParentId = -1, - Name = Services.TextService.Localize("general/recycleBin"), + //Name = Services.TextService.Localize("general/recycleBin"), ContentTypeAlias = "recycleBin", - CreateDate = DateTime.Now, + //CreateDate = DateTime.Now, IsContainer = true, - Path = "-1," + Constants.System.RecycleBinContent + Path = "-1," + Constants.System.RecycleBinContent, + ContentVariants = new List + { + new ContentVariantDisplay + { + CreateDate = DateTime.Now, + Name = Services.TextService.Localize("general/recycleBin") + } + } }; - TabsAndPropertiesResolver.AddListView(display, "content", Services.DataTypeService, Services.TextService); + TabsAndPropertiesResolver.AddListView(display.ContentVariants.First(), "content", "recycleBin", Services.DataTypeService, Services.TextService); return display; } @@ -258,10 +266,11 @@ namespace Umbraco.Web.Editors content.AllowedActions = new[] { "A" }; content.IsBlueprint = true; - var excludeProps = new[] { "_umb_urls", "_umb_releasedate", "_umb_expiredate", "_umb_template" }; - var propsTab = content.Tabs.Last(); - propsTab.Properties = propsTab.Properties - .Where(p => excludeProps.Contains(p.Alias) == false); + //fixme - exclude the content apps here + //var excludeProps = new[] { "_umb_urls", "_umb_releasedate", "_umb_expiredate", "_umb_template" }; + //var propsTab = content.Tabs.Last(); + //propsTab.Properties = propsTab.Properties + // .Where(p => excludeProps.Contains(p.Alias) == false); } /// @@ -272,7 +281,7 @@ namespace Umbraco.Web.Editors /// [OutgoingEditorModelEvent] [EnsureUserPermissionForContent("id")] - public ContentItemDisplay GetById(int id, string culture = null) + public ContentItemDisplay GetById(int id) { var foundContent = GetObjectFromRequest(() => Services.ContentService.GetById(id)); if (foundContent == null) @@ -281,7 +290,7 @@ namespace Umbraco.Web.Editors return null;//irrelevant since the above throws } - var content = MapToDisplay(foundContent, culture); + var content = MapToDisplay(foundContent); return content; } @@ -289,11 +298,7 @@ namespace Umbraco.Web.Editors /// Gets an empty content item for the /// /// - /// - /// - /// If this is a container type, we'll remove the umbContainerView tab for a new item since - /// it cannot actually list children if it doesn't exist yet. - /// + /// [OutgoingEditorModelEvent] public ContentItemDisplay GetEmpty(string contentTypeAlias, int parentId) { @@ -306,16 +311,15 @@ namespace Umbraco.Web.Editors var emptyContent = Services.ContentService.Create("", parentId, contentType.Alias, Security.GetUserId().ResultOr(0)); var mapped = MapToDisplay(emptyContent); - //remove this tab if it exists: umbContainerView - var containerTab = mapped.Tabs.FirstOrDefault(x => x.Alias == Constants.Conventions.PropertyGroups.ListViewGroupName); - mapped.Tabs = mapped.Tabs.Except(new[] { containerTab }); - - if (contentType.VariesByCulture()) - { - //Remove all variants except for the default since currently the default must be saved before other variants can be edited - //TODO: Allow for editing all variants at once ... this will be a future task - mapped.Variants = new[] { mapped.Variants.FirstOrDefault(x => x.IsCurrent) }; - } + //remove the listview app if it exists + mapped.ContentApps = mapped.ContentApps.Where(x => x.Alias != "childItems").ToList(); + + //if (contentType.VariesByCulture()) + //{ + // //Remove all variants except for the default since currently the default must be saved before other variants can be edited + // //TODO: Allow for editing all variants at once ... this will be a future task + // mapped.Variants = new[] { mapped.Variants.FirstOrDefault(x => x.IsCurrent) }; + //} return mapped; } @@ -335,9 +339,9 @@ namespace Umbraco.Web.Editors var mapped = Mapper.Map(blueprint); - //remove this tab if it exists: umbContainerView - var containerTab = mapped.Tabs.FirstOrDefault(x => x.Alias == Constants.Conventions.PropertyGroups.ListViewGroupName); - mapped.Tabs = mapped.Tabs.Except(new[] { containerTab }); + //remove the listview app if it exists + mapped.ContentApps = mapped.ContentApps.Where(x => x.Alias != "childItems").ToList(); + return mapped; } @@ -571,131 +575,134 @@ namespace Umbraco.Web.Editors [OutgoingEditorModelEvent] public ContentItemDisplay PostSave([ModelBinder(typeof(ContentItemBinder))] ContentItemSave contentItem) { - var contentItemDisplay = PostSaveInternal(contentItem, content => Services.ContentService.Save(contentItem.PersistedContent, Security.CurrentUser.Id)); - //ensure the active culture is still selected - if (!contentItem.Culture.IsNullOrWhiteSpace()) - { - foreach (var contentVariation in contentItemDisplay.Variants) - { - contentVariation.IsCurrent = contentVariation.Language.IsoCode.InvariantEquals(contentItem.Culture); - } - } - return contentItemDisplay; + throw new NotImplementedException("Implement this!"); + //var contentItemDisplay = PostSaveInternal(contentItem, content => Services.ContentService.Save(contentItem.PersistedContent, Security.CurrentUser.Id)); + ////ensure the active culture is still selected + //if (!contentItem.Culture.IsNullOrWhiteSpace()) + //{ + // foreach (var contentVariation in contentItemDisplay.Variants) + // { + // contentVariation.IsCurrent = contentVariation.Language.IsoCode.InvariantEquals(contentItem.Culture); + // } + //} + //return contentItemDisplay; } private ContentItemDisplay PostSaveInternal(ContentItemSave contentItem, Func saveMethod) { - //If we've reached here it means: - // * Our model has been bound - // * and validated - // * any file attachments have been saved to their temporary location for us to use - // * we have a reference to the DTO object and the persisted object - // * Permissions are valid - MapPropertyValues(contentItem); + throw new NotImplementedException("Implement this!"); - //We need to manually check the validation results here because: - // * We still need to save the entity even if there are validation value errors - // * Depending on if the entity is new, and if there are non property validation errors (i.e. the name is null) - // then we cannot continue saving, we can only display errors - // * If there are validation errors and they were attempting to publish, we can only save, NOT publish and display - // a message indicating this - if (ModelState.IsValid == false) - { - if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) && IsCreatingAction(contentItem.Action)) - { - //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! - // add the modelstate to the outgoing object and throw a validation message - var forDisplay = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); - forDisplay.Errors = ModelState.ToErrorDictionary(); - throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); + ////If we've reached here it means: + //// * Our model has been bound + //// * and validated + //// * any file attachments have been saved to their temporary location for us to use + //// * we have a reference to the DTO object and the persisted object + //// * Permissions are valid + //MapPropertyValues(contentItem); - } + ////We need to manually check the validation results here because: + //// * We still need to save the entity even if there are validation value errors + //// * Depending on if the entity is new, and if there are non property validation errors (i.e. the name is null) + //// then we cannot continue saving, we can only display errors + //// * If there are validation errors and they were attempting to publish, we can only save, NOT publish and display + //// a message indicating this + //if (ModelState.IsValid == false) + //{ + // if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) && IsCreatingAction(contentItem.Action)) + // { + // //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! + // // add the modelstate to the outgoing object and throw a validation message + // var forDisplay = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + // forDisplay.Errors = ModelState.ToErrorDictionary(); + // throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); - //if the model state is not valid we cannot publish so change it to save - switch (contentItem.Action) - { - case ContentSaveAction.Publish: - contentItem.Action = ContentSaveAction.Save; - break; - case ContentSaveAction.PublishNew: - contentItem.Action = ContentSaveAction.SaveNew; - break; - } - } + // } - //initialize this to successful - var publishStatus = new PublishResult(null, contentItem.PersistedContent); - var wasCancelled = false; + // //if the model state is not valid we cannot publish so change it to save + // switch (contentItem.Action) + // { + // case ContentSaveAction.Publish: + // contentItem.Action = ContentSaveAction.Save; + // break; + // case ContentSaveAction.PublishNew: + // contentItem.Action = ContentSaveAction.SaveNew; + // break; + // } + //} - if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) - { - //save the item - var saveResult = saveMethod(contentItem.PersistedContent); + ////initialize this to successful + //var publishStatus = new PublishResult(null, contentItem.PersistedContent); + //var wasCancelled = false; - wasCancelled = saveResult.Success == false && saveResult.Result == OperationResultType.FailedCancelledByEvent; - } - else if (contentItem.Action == ContentSaveAction.SendPublish || contentItem.Action == ContentSaveAction.SendPublishNew) - { - var sendResult = Services.ContentService.SendToPublication(contentItem.PersistedContent, Security.CurrentUser.Id); - wasCancelled = sendResult == false; - } - else - { - PublishInternal(contentItem, ref publishStatus, ref wasCancelled); - } + //if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) + //{ + // //save the item + // var saveResult = saveMethod(contentItem.PersistedContent); - //get the updated model - var display = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + // wasCancelled = saveResult.Success == false && saveResult.Result == OperationResultType.FailedCancelledByEvent; + //} + //else if (contentItem.Action == ContentSaveAction.SendPublish || contentItem.Action == ContentSaveAction.SendPublishNew) + //{ + // var sendResult = Services.ContentService.SendToPublication(contentItem.PersistedContent, Security.CurrentUser.Id); + // wasCancelled = sendResult == false; + //} + //else + //{ + // PublishInternal(contentItem, ref publishStatus, ref wasCancelled); + //} - //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 - HandleInvalidModelState(display); + ////get the updated model + //var display = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); - //put the correct msgs in - switch (contentItem.Action) - { - case ContentSaveAction.Save: - case ContentSaveAction.SaveNew: - if (wasCancelled == false) - { - display.AddSuccessNotification( - Services.TextService.Localize("speechBubbles/editContentSavedHeader"), - Services.TextService.Localize("speechBubbles/editContentSavedText")); - } - else - { - AddCancelMessage(display); - } - break; - case ContentSaveAction.SendPublish: - case ContentSaveAction.SendPublishNew: - if (wasCancelled == false) - { - display.AddSuccessNotification( - Services.TextService.Localize("speechBubbles/editContentSendToPublish"), - Services.TextService.Localize("speechBubbles/editContentSendToPublishText")); - } - else - { - AddCancelMessage(display); - } - break; - case ContentSaveAction.Publish: - case ContentSaveAction.PublishNew: - ShowMessageForPublishStatus(publishStatus, display); - break; - } + ////lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 + //HandleInvalidModelState(display); - //If the item is new and the operation was cancelled, we need to return a different - // status code so the UI can handle it since it won't be able to redirect since there - // is no Id to redirect to! - if (wasCancelled && IsCreatingAction(contentItem.Action)) - { - throw new HttpResponseException(Request.CreateValidationErrorResponse(display)); - } + ////put the correct msgs in + //switch (contentItem.Action) + //{ + // case ContentSaveAction.Save: + // case ContentSaveAction.SaveNew: + // if (wasCancelled == false) + // { + // display.AddSuccessNotification( + // Services.TextService.Localize("speechBubbles/editContentSavedHeader"), + // Services.TextService.Localize("speechBubbles/editContentSavedText")); + // } + // else + // { + // AddCancelMessage(display); + // } + // break; + // case ContentSaveAction.SendPublish: + // case ContentSaveAction.SendPublishNew: + // if (wasCancelled == false) + // { + // display.AddSuccessNotification( + // Services.TextService.Localize("speechBubbles/editContentSendToPublish"), + // Services.TextService.Localize("speechBubbles/editContentSendToPublishText")); + // } + // else + // { + // AddCancelMessage(display); + // } + // break; + // case ContentSaveAction.Publish: + // case ContentSaveAction.PublishNew: + // ShowMessageForPublishStatus(publishStatus, display); + // break; + //} - display.PersistedContent = contentItem.PersistedContent; + ////If the item is new and the operation was cancelled, we need to return a different + //// status code so the UI can handle it since it won't be able to redirect since there + //// is no Id to redirect to! + //if (wasCancelled && IsCreatingAction(contentItem.Action)) + //{ + // throw new HttpResponseException(Request.CreateValidationErrorResponse(display)); + //} - return display; + //display.PersistedContent = contentItem.PersistedContent; + + //return display; } /// @@ -1006,7 +1013,7 @@ namespace Umbraco.Web.Editors var unpublishResult = Services.ContentService.Unpublish(foundContent, culture: culture, userId: Security.GetUserId().ResultOr(0)); - var content = MapToDisplay(foundContent, culture); + var content = MapToDisplay(foundContent); if (!unpublishResult.Success) { @@ -1273,18 +1280,20 @@ namespace Umbraco.Web.Editors /// /// /// - private ContentItemDisplay MapToDisplay(IContent content, string culture = null) + private ContentItemDisplay MapToDisplay(IContent content) { - //A culture must exist in the mapping context if this content type is CultureNeutral since for a culture variant to be edited, - // the Cuture property of ContentItemDisplay must exist (at least currently). - if (culture == null && content.ContentType.VariesByCulture()) - { - //If a culture is not explicitly sent up, then it means that the user is editing the default variant language. - culture = Services.LocalizationService.GetDefaultLanguageIsoCode(); - } + ////A culture must exist in the mapping context if this content type is CultureNeutral since for a culture variant to be edited, + //// the Cuture property of ContentItemDisplay must exist (at least currently). + //if (culture == null && content.ContentType.VariesByCulture()) + //{ + // //If a culture is not explicitly sent up, then it means that the user is editing the default variant language. + // culture = Services.LocalizationService.GetDefaultLanguageIsoCode(); + //} - var display = ContextMapper.Map(content, UmbracoContext, - new Dictionary { { ContextMapper.CultureKey, culture } }); + //var display = ContextMapper.Map(content, UmbracoContext, + // new Dictionary { { ContextMapper.CultureKey, culture } }); + + var display = ContextMapper.Map(content, UmbracoContext); return display; } diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 3fde20df28..94b88459f7 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -77,9 +77,9 @@ namespace Umbraco.Web.Editors var emptyContent = Services.MediaService.CreateMedia("", parentId, contentType.Alias, Security.GetUserId().ResultOr(0)); var mapped = ContextMapper.Map(emptyContent, UmbracoContext); - //remove this tab if it exists: umbContainerView - var containerTab = mapped.Tabs.FirstOrDefault(x => x.Alias == Constants.Conventions.PropertyGroups.ListViewGroupName); - mapped.Tabs = mapped.Tabs.Except(new[] { containerTab }); + //remove the listview app if it exists + mapped.ContentApps = mapped.ContentApps.Where(x => x.Alias != "childItems").ToList(); + return mapped; } @@ -87,9 +87,9 @@ namespace Umbraco.Web.Editors /// Returns an item to be used to display the recycle bin for media /// /// - public ContentItemDisplay GetRecycleBin() + public MediaItemDisplay GetRecycleBin() { - var display = new ContentItemDisplay + var display = new MediaItemDisplay { Id = Constants.System.RecycleBinMedia, Alias = "recycleBin", @@ -101,7 +101,7 @@ namespace Umbraco.Web.Editors Path = "-1," + Constants.System.RecycleBinMedia }; - TabsAndPropertiesResolver.AddListView(display, "media", Services.DataTypeService, Services.TextService); + TabsAndPropertiesResolver.AddListView(display, "media", "recycleBin", Services.DataTypeService, Services.TextService); return display; } diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 513f69f778..5d5367b3dc 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -138,7 +138,7 @@ namespace Umbraco.Web.Editors ParentId = -1 }; - TabsAndPropertiesResolver.AddListView(display, "member", Services.DataTypeService, Services.TextService); + TabsAndPropertiesResolver.AddListView(display, "member", listName, Services.DataTypeService, Services.TextService); return display; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs new file mode 100644 index 0000000000..3477b200cb --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs @@ -0,0 +1,24 @@ +using System.Runtime.Serialization; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Defines a "Content App" which are editor extensions + /// + [DataContract(Name = "app", Namespace = "")] + public class ContentApp + { + [DataMember(Name = "name")] + public string Name { get; set; } + + [DataMember(Name = "alias")] + public string Alias { get; set; } + + [DataMember(Name = "icon")] + public string Icon { get; set; } + + [DataMember(Name = "view")] + public string View { get; set; } + } +} + diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index 08b95a9029..8f14114c68 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -1,7 +1,12 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; +using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Serialization; using Umbraco.Web.Routing; namespace Umbraco.Web.Models.ContentEditing @@ -10,28 +15,109 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be displayed in the back office ///
[DataContract(Name = "content", Namespace = "")] - public class ContentItemDisplay : ListViewAwareContentItemDisplayBase + public class ContentItemDisplay : INotificationModel, IErrorModel //ListViewAwareContentItemDisplayBase { public ContentItemDisplay() { AllowPreview = true; + Notifications = new List(); + Errors = new Dictionary(); + ContentVariants = new List(); + ContentApps = new List(); } - [DataMember(Name = "publishDate")] - public DateTime? PublishDate { get; set; } + [DataMember(Name = "id", IsRequired = true)] + [Required] + public int Id { get; set; } + [DataMember(Name = "udi")] + [ReadOnly(true)] + [JsonConverter(typeof(UdiJsonConverter))] + public Udi Udi { get; set; } + + [DataMember(Name = "icon")] + public string Icon { get; set; } + + [DataMember(Name = "trashed")] + [ReadOnly(true)] + public bool Trashed { get; set; } + + /// + /// This is the unique Id stored in the database - but could also be the unique id for a custom membership provider + /// + [DataMember(Name = "key")] + public Guid Key { get; set; } + + [DataMember(Name = "parentId", IsRequired = true)] + [Required] + public int ParentId { get; set; } + + /// + /// The path of the entity + /// + [DataMember(Name = "path")] + public string Path { get; set; } + + /// + /// A collection of content variants + /// + /// + /// If a content item is invariant, this collection will only contain one item, else it will contain all culture variants + /// + [DataMember(Name = "variants")] + public IEnumerable ContentVariants { get; set; } + + [DataMember(Name = "owner")] + public UserProfile Owner { get; set; } + + [DataMember(Name = "updater")] + public UserProfile Updater { get; set; } + + /// + /// The name of the content type + /// + [DataMember(Name = "contentTypeName")] + public string ContentTypeName { get; set; } + + /// + /// Indicates if the content is configured as a list view container + /// + [DataMember(Name = "isContainer")] + public bool IsContainer { get; set; } + + /// + /// Property indicating if this item is part of a list view parent + /// + [DataMember(Name = "isChildOfListView")] + public bool IsChildOfListView { get; set; } + + /// + /// Property for the entity's individual tree node URL + /// + /// + /// This is required if the item is a child of a list view since the tree won't actually be loaded, + /// so the app will need to go fetch the individual tree node in order to be able to load it's action list (menu) + /// + [DataMember(Name = "treeNodeUrl")] + public string TreeNodeUrl { get; set; } + + [DataMember(Name = "contentTypeAlias", IsRequired = true)] + [Required(AllowEmptyStrings = false)] + public string ContentTypeAlias { get; set; } + + [DataMember(Name = "sortOrder")] + public int SortOrder { get; set; } + + //[DataMember(Name = "publishDate")] + //public DateTime? PublishDate { get; set; } + + //TODO: These will need to be moved once we have scheduled publishing in per culture [DataMember(Name = "releaseDate")] public DateTime? ReleaseDate { get; set; } [DataMember(Name = "removeDate")] public DateTime? ExpireDate { get; set; } - - /// - /// Represents the variant info for a content item - /// - [DataMember(Name = "variants")] - public IEnumerable Variants { get; set; } - + [DataMember(Name = "template")] public string TemplateAlias { get; set; } @@ -64,5 +150,56 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "isBlueprint")] public bool IsBlueprint { get; set; } + + [DataMember(Name = "apps")] + public IEnumerable ContentApps { get; set; } + + /// + /// The real persisted content object - used during inbound model binding + /// + /// + /// This is not used for outgoing model information. + /// + [IgnoreDataMember] + internal IContent PersistedContent { get; set; } + + /// + /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding + /// + /// + /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need + /// instead of having to look up all the data individually. + /// This is not used for outgoing model information. + /// + [IgnoreDataMember] + internal ContentItemDto ContentDto { get; set; } + + /// + /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. + /// + [DataMember(Name = "notifications")] + [ReadOnly(true)] + public List Notifications { get; private set; } + + /// + /// This is used for validation of a content item. + /// + /// + /// A content item can be invalid but still be saved. This occurs when there's property validation errors, we will + /// still save the item but it cannot be published. So we need a way of returning validation errors as well as the + /// updated model. + /// + /// NOTE: The ProperCase is important because when we return ModeState normally it will always be proper case. + /// + [DataMember(Name = "ModelState")] + [ReadOnly(true)] + public IDictionary Errors { get; set; } + + /// + /// A collection of extra data that is available for this specific entity/entity type + /// + [DataMember(Name = "metaData")] + [ReadOnly(true)] + public IDictionary AdditionalData { get; private set; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariation.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariation.cs deleted file mode 100644 index 3546b95e34..0000000000 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariation.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.Runtime.Serialization; -using Umbraco.Core.Models; - -namespace Umbraco.Web.Models.ContentEditing -{ - /// - /// Represents the variant info for a content item - /// - [DataContract(Name = "contentVariant", Namespace = "")] - public class ContentVariation - { - [DataMember(Name = "language", IsRequired = true)] - [Required] - public Language Language { get; set; } - - [DataMember(Name = "segment")] - public string Segment { get; set; } - - /// - /// The content name of the variant - /// - [DataMember(Name = "name")] - public string Name { get; set; } - - [DataMember(Name = "state")] - public string PublishedState { get; set; } - - /// - /// Determines if the content variant for this culture has been created - /// - [DataMember(Name = "exists")] - public bool Exists { get; set; } - - [DataMember(Name = "isEdited")] - public bool IsEdited { get; set; } - - /// - /// Determines if this is the variant currently being edited - /// - [DataMember(Name = "current")] - public bool IsCurrent { get; set; } - - /// - /// If the variant is a required variant for validation purposes - /// - [DataMember(Name = "mandatory")] - public bool Mandatory { get; set; } - } -} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs new file mode 100644 index 0000000000..247f88d203 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs @@ -0,0 +1,104 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Runtime.Serialization; +using Umbraco.Core.Models; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Represents the variant info for a content item + /// + [DataContract(Name = "contentVariant", Namespace = "")] + public class ContentVariantDisplay : ITabbedContentItem + { + public ContentVariantDisplay() + { + Tabs = new List>(); + } + + [DataMember(Name = "name", IsRequired = true)] + public string Name { get; set; } + + /// + /// Defines the tabs containing display properties + /// + [DataMember(Name = "tabs")] + public IEnumerable> Tabs { get; set; } + + // note + // once a [DataContract] has been defined on a class, with a [DataMember] property, + // one simply cannot ignore that property anymore - [IgnoreDataMember] on an overriden + // property is ignored, and 'newing' the property means that it's the base property + // which is used + // + // OTOH, Json.NET is happy having [JsonIgnore] on overrides, even though the base + // property is [JsonProperty]. so, forcing [JsonIgnore] here, but really, we should + // rething the whole thing. + + /// + /// Override the properties property to ensure we don't serialize this + /// and to simply return the properties based on the properties in the tabs collection + /// + /// + /// This property cannot be set + /// + [IgnoreDataMember] + [JsonIgnore] // see note above on IgnoreDataMember vs JsonIgnore + public IEnumerable Properties + { + get => Tabs.SelectMany(x => x.Properties); + set => throw new NotImplementedException(); + } + + /// + /// The language/culture assigned to this content variation + /// + /// + /// If this is null it means this content variant is an invariant culture + /// + [DataMember(Name = "language")] + public Language Language { get; set; } + + [DataMember(Name = "segment")] + public string Segment { get; set; } + + [DataMember(Name = "state")] + public string PublishedState { get; set; } + + [DataMember(Name = "updateDate")] + public DateTime UpdateDate { get; set; } + + [DataMember(Name = "createDate")] + public DateTime CreateDate { get; set; } + + //[DataMember(Name = "published")] + //public bool Published { get; set; } + + [DataMember(Name = "publishDate")] + public DateTime? PublishDate { get; set; } + + /// + /// Determines if the content variant for this culture has been created + /// + [DataMember(Name = "exists")] + public bool Exists { get; set; } + + [DataMember(Name = "isEdited")] + public bool IsEdited { get; set; } + + ///// + ///// Determines if this is the variant currently being edited + ///// + //[DataMember(Name = "current")] + //public bool IsCurrent { get; set; } + + ///// + ///// If the variant is a required variant for validation purposes + ///// + //[DataMember(Name = "mandatory")] + //public bool Mandatory { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs new file mode 100644 index 0000000000..871b9a2063 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Umbraco.Web.Models.ContentEditing +{ + public interface ITabbedContentItem where T : ContentPropertyBasic + { + IEnumerable Properties { get; set; } + IEnumerable> Tabs { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs index 45ad5f71f9..2a1c29983a 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Runtime.Serialization; using Umbraco.Core.Models; @@ -10,10 +11,18 @@ namespace Umbraco.Web.Models.ContentEditing [DataContract(Name = "content", Namespace = "")] public class MediaItemDisplay : ListViewAwareContentItemDisplayBase { + public MediaItemDisplay() + { + ContentApps = new List(); + } + [DataMember(Name = "contentType")] public ContentTypeBasic ContentType { get; set; } [DataMember(Name = "mediaLink")] public string MediaLink { get; set; } + + [DataMember(Name = "apps")] + public IEnumerable ContentApps { get; set; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs index 07def99ed3..89057bba05 100644 --- a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs +++ b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs @@ -7,8 +7,7 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { - public abstract class TabbedContentItem : ContentItemBasic - where T : ContentPropertyBasic + public abstract class TabbedContentItem : ContentItemBasic, ITabbedContentItem where T : ContentPropertyBasic where TPersisted : IContentBase { protected TabbedContentItem() diff --git a/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs new file mode 100644 index 0000000000..ca58f81b91 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + + internal class ContentAppResolver : IValueResolver> + { + private readonly ContentApp _contentApp = new ContentApp + { + Alias = "content", + Name = "Content", + Icon = "icon-document", + View = "views/content/apps/content/content.html" + }; + + private readonly ContentApp _infoApp = new ContentApp + { + Alias = "info", + Name = "Info", + Icon = "icon-info", + View = "views/content/apps/info/info.html" + }; + + private static readonly ContentApp _listViewApp = new ContentApp + { + Alias = "childItems", + Name = "Child items", + Icon = "icon-list", + View = "views/content/apps/listview/listview.html" + }; + + public IEnumerable Resolve(IContent source, ContentItemDisplay destination, IEnumerable destMember, ResolutionContext context) + { + var apps = new List + { + _contentApp, + _infoApp + }; + + if (source.ContentType.IsContainer) + { + apps.Add(_listViewApp); + } + + return apps; + } + } + +} diff --git a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs index 101fed8a06..c613b163d6 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs @@ -1,22 +1,22 @@ -using AutoMapper; -using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Web.Models.ContentEditing; -using ContentVariation = Umbraco.Core.Models.ContentVariation; +//using AutoMapper; +//using Umbraco.Core; +//using Umbraco.Core.Models; +//using Umbraco.Web.Models.ContentEditing; +//using ContentVariation = Umbraco.Core.Models.ContentVariation; -namespace Umbraco.Web.Models.Mapping -{ - /// - /// Used to map the name from an depending on it's variation settings - /// - internal class ContentItemDisplayNameResolver : IValueResolver - { - public string Resolve(IContent source, ContentItemDisplay destination, string destMember, ResolutionContext context) - { - var culture = context.GetCulture(); - return source.ContentType.VariesByCulture() && culture != null - ? source.GetCultureName(culture) - : source.Name; - } - } -} +//namespace Umbraco.Web.Models.Mapping +//{ +// /// +// /// Used to map the name from an depending on it's variation settings +// /// +// internal class ContentItemDisplayNameResolver : IValueResolver +// { +// public string Resolve(IContent source, ContentVariationDisplay destination, string destMember, ResolutionContext context) +// { +// var culture = context.GetCulture(); +// return source.ContentType.VariesByCulture() && culture != null +// ? source.GetCultureName(culture) +// : source.Name; +// } +// } +//} diff --git a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs index cb6e2938be..bd7de4176e 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs @@ -6,65 +6,66 @@ using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; -using ContentVariation = Umbraco.Web.Models.ContentEditing.ContentVariation; using Language = Umbraco.Web.Models.ContentEditing.Language; namespace Umbraco.Web.Models.Mapping { - /// - /// Used to map the variations collection from an instance - /// - internal class ContentItemDisplayVariationResolver : IValueResolver> + + internal class ContentVariantResolver : IValueResolver> { private readonly ILocalizationService _localizationService; + private readonly ILocalizedTextService _textService; - public ContentItemDisplayVariationResolver(ILocalizationService localizationService) + public ContentVariantResolver(ILocalizationService localizationService, ILocalizedTextService textService) { _localizationService = localizationService ?? throw new ArgumentNullException(nameof(localizationService)); + _textService = textService ?? throw new ArgumentNullException(nameof(textService)); } - public IEnumerable Resolve(IContent source, ContentItemDisplay destination, IEnumerable destMember, ResolutionContext context) + public IEnumerable Resolve(IContent source, ContentItemDisplay destination, IEnumerable destMember, ResolutionContext context) { + var result = new List(); if (!source.ContentType.VariesByCulture()) - return Enumerable.Empty(); - - var allLanguages = _localizationService.GetAllLanguages().OrderBy(x => x.Id).ToList(); - if (allLanguages.Count == 0) return Enumerable.Empty(); - - var langs = context.Mapper.Map, IEnumerable>(allLanguages, null, context); - var variants = langs.Select(x => new ContentVariation { - Language = x, - Mandatory = x.Mandatory, - Name = source.GetCultureName(x.IsoCode), - Exists = source.IsCultureAvailable(x.IsoCode), // segments ?? - PublishedState = (source.PublishedState == PublishedState.Unpublished //if the entire document is unpublished, then flag every variant as unpublished - ? PublishedState.Unpublished - : source.IsCulturePublished(x.IsoCode) - ? PublishedState.Published - : PublishedState.Unpublished).ToString(), - IsEdited = source.IsCultureEdited(x.IsoCode) - //Segment = ?? We'll need to populate this one day when we support segments - }).ToList(); - - var culture = context.GetCulture(); - - //set the current variant being edited to the one found in the context or the default if nothing matches - var foundCurrent = false; - foreach (var variant in variants) - { - if (culture.InvariantEquals(variant.Language.IsoCode)) - { - variant.IsCurrent = true; - foundCurrent = true; - break; - } + //this is invariant so just map the IContent instance to ContentVariationDisplay + result.Add(context.Mapper.Map(source)); } - if (!foundCurrent) - variants.First(x => x.Language.IsDefaultVariantLanguage).IsCurrent = true; + else + { + var allLanguages = _localizationService.GetAllLanguages().OrderBy(x => x.Id).ToList(); + if (allLanguages.Count == 0) return Enumerable.Empty(); //this should never happen - return variants; + var langs = context.Mapper.Map, IEnumerable>(allLanguages, null, context).ToList(); + + //create a variant for each lang, then we'll populate the values + var variants = langs.Select(x => + { + //We need to set the culture in the mapping context since this is needed to ensure that the correct property values + //are resolved during the mapping + context.Items[ContextMapper.CultureKey] = x.IsoCode; + return context.Mapper.Map(source, null, context); + }).ToList(); + + for (int i = 0; i < langs.Count; i++) + { + var x = langs[i]; + var variant = variants[i]; + + variant.Language = x; + variant.Name = source.GetCultureName(x.IsoCode); + variant.Exists = source.IsCultureAvailable(x.IsoCode); // segments ?? + variant.PublishedState = (source.PublishedState == PublishedState.Unpublished //if the entire document is unpublished, then flag every variant as unpublished + ? PublishedState.Unpublished + : source.IsCulturePublished(x.IsoCode) + ? PublishedState.Published + : PublishedState.Unpublished).ToString(); + variant.IsEdited = source.IsCultureEdited(x.IsoCode); + } + + return variants; + } + return result; } - } + } diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 059dd32499..684ee13581 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -20,21 +20,24 @@ namespace Umbraco.Web.Models.Mapping var contentOwnerResolver = new OwnerResolver(userService); var creatorResolver = new CreatorResolver(userService); var actionButtonsResolver = new ActionButtonsResolver(userService, contentService); - var tabsAndPropertiesResolver = new TabsAndPropertiesResolver(textService); + var tabsAndPropertiesResolver = new TabsAndPropertiesResolver(textService); var childOfListViewResolver = new ContentChildOfListViewResolver(contentService, contentTypeService); var contentTypeBasicResolver = new ContentTypeBasicResolver(); var contentTreeNodeUrlResolver = new ContentTreeNodeUrlResolver(); var defaultTemplateResolver = new DefaultTemplateResolver(); var contentUrlResolver = new ContentUrlResolver(textService, contentService, logger); - var variantResolver = new ContentItemDisplayVariationResolver(localizationService); + var variantResolver = new ContentVariantResolver(localizationService, textService); + var contentAppResolver = new ContentAppResolver(); //FROM IContent TO ContentItemDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src))) - .ForMember(dest => dest.Name, opt => opt.ResolveUsing()) - .ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver)) + //.ForMember(dest => dest.Name, opt => opt.ResolveUsing()) + .ForMember(dest => dest.ContentVariants, opt => opt.ResolveUsing(variantResolver)) + .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(contentAppResolver)) + //.ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver)) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name)) @@ -42,27 +45,38 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint)) .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) - .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) + //TODO: The publish date needs to be per variant - in our display models + //.ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) .ForMember(dest => dest.TemplateAlias, opt => opt.ResolveUsing(defaultTemplateResolver)) .ForMember(dest => dest.Urls, opt => opt.ResolveUsing(contentUrlResolver)) - .ForMember(dest => dest.Properties, opt => opt.Ignore()) + //.ForMember(dest => dest.Properties, opt => opt.Ignore()) .ForMember(dest => dest.AllowPreview, opt => opt.Ignore()) .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) - .ForMember(dest => dest.Alias, opt => opt.Ignore()) + //.ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.DocumentType, opt => opt.ResolveUsing(contentTypeBasicResolver)) .ForMember(dest => dest.AllowedTemplates, opt => opt.MapFrom(content => content.ContentType.AllowedTemplates .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false) - .ToDictionary(t => t.Alias, t => t.Name))) - .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) + .ToDictionary(t => t.Alias, t => t.Name))) + //.ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) .ForMember(dest => dest.AllowedActions, opt => opt.ResolveUsing(src => actionButtonsResolver.Resolve(src))) - .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) + .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); + //.AfterMap((content, display) => + //{ + // if (content.ContentType.IsContainer) + // TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, textService); + //}); + + CreateMap() + .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) + .ForMember(dest => dest.Properties, opt => opt.Ignore()) + .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) .AfterMap((content, display) => { if (content.ContentType.IsContainer) - TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, textService); + TabsAndPropertiesResolver.AddListView(display, content.ContentType.Alias, "content", dataTypeService, textService); }); //FROM IContent TO ContentItemBasic diff --git a/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs new file mode 100644 index 0000000000..cbf8cd3aa2 --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs @@ -0,0 +1,53 @@ +using System.Collections.Generic; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + internal class MediaAppResolver : IValueResolver> + { + private static readonly ContentApp _contentApp = new ContentApp + { + Alias = "content", + Name = "Content", + Icon = "icon-document", + View = "views/media/apps/content/content.html" + }; + + private static readonly ContentApp _infoApp = new ContentApp + { + Alias = "info", + Name = "Info", + Icon = "icon-info", + View = "views/media/apps/info/info.html" + }; + + private static readonly ContentApp _listViewApp = new ContentApp + { + Alias = "childItems", + Name = "Child items", + Icon = "icon-list", + View = "views/media/apps/listview/listview.html" + }; + + public IEnumerable Resolve(IMedia source, MediaItemDisplay destination, IEnumerable destMember, ResolutionContext context) + { + var apps = new List(); + + if (source.ContentType.IsContainer || source.ContentType.Alias == Umbraco.Core.Constants.Conventions.MediaTypes.Folder) + { + apps.Add(_listViewApp); + } + else + { + apps.Add(_contentApp); + } + + apps.Add(_infoApp); + + return apps; + } + } + +} diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index 61419281c4..4a5c5386f8 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -22,6 +22,7 @@ namespace Umbraco.Web.Models.Mapping var childOfListViewResolver = new MediaChildOfListViewResolver(mediaService, mediaTypeService); var contentTreeNodeUrlResolver = new ContentTreeNodeUrlResolver(); var mediaTypeBasicResolver = new ContentTypeBasicResolver(); + var mediaAppResolver = new MediaAppResolver(); //FROM IMedia TO MediaItemDisplay CreateMap() @@ -45,10 +46,11 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .ForMember(dest => dest.ContentType, opt => opt.ResolveUsing(mediaTypeBasicResolver)) .ForMember(dest => dest.MediaLink, opt => opt.ResolveUsing(content => string.Join(",", content.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, logger)))) + .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver)) .AfterMap((media, display) => { - if (media.ContentType.IsContainer) - TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, textService); + //if (media.ContentType.IsContainer) + // TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, textService); }); //FROM IMedia TO ContentItemBasic diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs index 1f8cfa920e..a92527823c 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs @@ -35,11 +35,13 @@ namespace Umbraco.Web.Models.Mapping /// This must be either 'content' or 'media' /// /// - internal static void AddListView(TabbedContentItem display, string entityType, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService) - where TPersisted : IContentBase + internal static void AddListView( + ITabbedContentItem display, + string contentTypeAlias, string entityType, + IDataTypeService dataTypeService, ILocalizedTextService localizedTextService) { int dtdId; - var customDtdName = Constants.Conventions.DataTypes.ListViewPrefix + display.ContentTypeAlias; + var customDtdName = Constants.Conventions.DataTypes.ListViewPrefix + contentTypeAlias; switch (entityType) { case "content": @@ -71,39 +73,43 @@ namespace Umbraco.Web.Models.Mapping throw new NullReferenceException("The property editor with alias " + dt.EditorAlias + " does not exist"); } - var listViewTab = new Tab - { - Alias = Constants.Conventions.PropertyGroups.ListViewGroupName, - Label = localizedTextService.Localize("content/childItems"), - Id = display.Tabs.Count() + 1, - IsActive = true - }; + //TODO: We need to move this logic elsewhere, we don't want to have to add a list view to a tab that will + // get removed later and magically move to the ListView ContentApp. The ListView ContentApp will need to + // manage this data somehow so a content app will also need to be able to specify it's own model. - var listViewConfig = editor.GetConfigurationEditor().ToConfigurationEditor(dt.Configuration); - //add the entity type to the config - listViewConfig["entityType"] = entityType; + //var listViewTab = new Tab + //{ + // Alias = Constants.Conventions.PropertyGroups.ListViewGroupName, + // Label = localizedTextService.Localize("content/childItems"), + // Id = display.Tabs.Count() + 1, + // IsActive = true + //}; - //Override Tab Label if tabName is provided - if (listViewConfig.ContainsKey("tabName")) - { - var configTabName = listViewConfig["tabName"]; - if (configTabName != null && string.IsNullOrWhiteSpace(configTabName.ToString()) == false) - listViewTab.Label = configTabName.ToString(); - } + //var listViewConfig = editor.GetConfigurationEditor().ToConfigurationEditor(dt.Configuration); + ////add the entity type to the config + //listViewConfig["entityType"] = entityType; - var listViewProperties = new List(); - listViewProperties.Add(new ContentPropertyDisplay - { - Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}containerView", - Label = "", - Value = null, - View = editor.GetValueEditor().View, - HideLabel = true, - Config = listViewConfig - }); - listViewTab.Properties = listViewProperties; + ////Override Tab Label if tabName is provided + //if (listViewConfig.ContainsKey("tabName")) + //{ + // var configTabName = listViewConfig["tabName"]; + // if (configTabName != null && string.IsNullOrWhiteSpace(configTabName.ToString()) == false) + // listViewTab.Label = configTabName.ToString(); + //} - SetChildItemsTabPosition(display, listViewConfig, listViewTab); + //var listViewProperties = new List(); + //listViewProperties.Add(new ContentPropertyDisplay + //{ + // Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}containerView", + // Label = "", + // Value = null, + // View = editor.GetValueEditor().View, + // HideLabel = true, + // Config = listViewConfig + //}); + //listViewTab.Properties = listViewProperties; + + //SetChildItemsTabPosition(display, listViewConfig, listViewTab); } private static int GetTabNumberFromConfig(IDictionary listViewConfig) @@ -120,37 +126,36 @@ namespace Umbraco.Web.Models.Mapping return -1; } - private static void SetChildItemsTabPosition(TabbedContentItem display, - IDictionary listViewConfig, - Tab listViewTab) - where TPersisted : IContentBase - { - // Find position of tab from config - var tabIndexForChildItems = GetTabNumberFromConfig(listViewConfig); - if (tabIndexForChildItems != -1) - { - // Tab position is recorded 1-based but we insert into collection 0-based - tabIndexForChildItems--; + //private static void SetChildItemsTabPosition(ITabbedContentItem display, + // IDictionary listViewConfig, + // Tab listViewTab) + //{ + // // Find position of tab from config + // var tabIndexForChildItems = GetTabNumberFromConfig(listViewConfig); + // if (tabIndexForChildItems != -1) + // { + // // Tab position is recorded 1-based but we insert into collection 0-based + // tabIndexForChildItems--; - // Ensure within bounds - if (tabIndexForChildItems < 0) - { - tabIndexForChildItems = 0; - } + // // Ensure within bounds + // if (tabIndexForChildItems < 0) + // { + // tabIndexForChildItems = 0; + // } - if (tabIndexForChildItems > display.Tabs.Count()) - { - tabIndexForChildItems = display.Tabs.Count(); - } - } - else tabIndexForChildItems = 0; + // if (tabIndexForChildItems > display.Tabs.Count()) + // { + // tabIndexForChildItems = display.Tabs.Count(); + // } + // } + // else tabIndexForChildItems = 0; - // Recreate tab list with child items tab at configured position - var tabs = new List>(); - tabs.AddRange(display.Tabs); - tabs.Insert(tabIndexForChildItems, listViewTab); - display.Tabs = tabs; - } + // // Recreate tab list with child items tab at configured position + // var tabs = new List>(); + // tabs.AddRange(display.Tabs); + // tabs.Insert(tabIndexForChildItems, listViewTab); + // display.Tabs = tabs; + //} /// /// Returns a collection of custom generic properties that exist on the generic properties tab @@ -234,7 +239,6 @@ namespace Umbraco.Web.Models.Mapping { //we need to map this way to pass the context through, I don't like it but we'll see what AutoMapper says: https://github.com/AutoMapper/AutoMapper/issues/2588 var result = context.Mapper.Map, IEnumerable>( - // Sort properties so items from different compositions appear in correct order (see U4-9298). Map sorted properties. properties.OrderBy(prop => prop.PropertyType.SortOrder), null, context) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index aedbd6e771..9bb0a54c9a 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -204,8 +204,9 @@ + - + @@ -219,6 +220,7 @@ + @@ -235,6 +237,7 @@ + @@ -243,6 +246,7 @@ + From 0e41c2dfcd2689dda9d246bf481881b13718e095 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 13 Jul 2018 15:53:59 +1000 Subject: [PATCH 002/275] Cutures can now be changed and the editor updated to the variant specific values without reloading, split view is re-enabled so working on getting that showing now. --- .../components/content/edit.controller.js | 80 +++++++++++++++---- .../editor/umbeditorheader.directive.js | 51 +++++++----- .../editor/umbeditorsubviews.directive.js | 58 +++++--------- src/Umbraco.Web.UI.Client/src/init.js | 22 ++--- src/Umbraco.Web.UI.Client/src/routes.js | 2 +- .../src/views/components/content/edit.html | 6 +- .../components/editor/umb-editor-header.html | 5 +- .../editor/umb-editor-sub-views.html | 4 +- .../apps/content/content.controller.js | 30 +++++-- .../views/content/apps/content/content.html | 2 +- .../views/content/content.edit.controller.js | 12 ++- 11 files changed, 168 insertions(+), 104 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 15f95b2a60..6fb6f0156d 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -21,7 +21,6 @@ $scope.page.listViewPath = null; $scope.page.isNew = $scope.isNew ? true : false; $scope.page.buttonGroupState = "init"; - $scope.page.culture = $scope.culture; $scope.page.hideActionsMenu = infiniteMode ? true : false; $scope.page.hideChangeVariant = infiniteMode ? true : false; $scope.allowOpen = true; @@ -56,39 +55,68 @@ bindEvents(); // set first app to active + // TODO: We need to track active $scope.content.apps[0].active = true; + setActiveCulture(); + } + + /** + * The content item(s) are loaded into an array and this will set the active content item based on the current culture. + * If the content item is invariant, then only one item exists in the array. + */ + function setActiveCulture() { // set the active variant - var activeCultureSet = false; + var activeVariant = null; _.each($scope.content.variants, function (v) { - if (!activeCultureSet) { - if (v.language.culture === $scope.page.culture) { - v.active = true; - $scope.content.currentVariant = v; - activeCultureSet = true; - } + if (v.language.culture === $scope.culture) { + v.active = true; + activeVariant = v; + } + else { + v.active = false; } }); - if (!activeCultureSet) { + if (!activeVariant) { // set the first variant to active $scope.content.variants[0].active = true; - $scope.content.currentVariant = $scope.content.variants[0]; - } + activeVariant = $scope.content.variants[0]; + } + + //If there are no editors yet then create one with the current content. + //if there's already a main editor then update it with the current content. + //The model that is assigned to the editor contains the current content variant along + //with a copy of the contentApps. This is required because each editor renders it's own + //content apps section and the content apps contains the view for editing content itself + //and we need to assign a view model to the subView so that it is scoped to the current + //editor so that split views work. This is a bit hacky but it's required because the content + //app stuff isn't built to have a scoped model to an editor, it's built to have a single global + //model but that doesn't work for having split view. + + if (!activeVariant.apps) { + //copy from the main model + activeVariant.apps = angular.copy($scope.content.apps); + } + + //the assign the activeVariant to a view model to the content app + var contentApp = _.find(activeVariant.apps, function (a) { + return a.alias === "content"; + }); + contentApp.viewModel = activeVariant; - // create new editor for split view if ($scope.editors.length === 0) { var editor = { - content: $scope.content + content: activeVariant }; $scope.editors.push(editor); } else if ($scope.editors.length === 1) { - $scope.editors[0].content = $scope.content; + $scope.editors[0].content = activeVariant; } else { //fixme - need to fix something here if we are re-loading a content item that is in a split view } - } + } function bindEvents() { //bindEvents can be called more than once and we don't want to have multiple bound events @@ -487,7 +515,21 @@ $scope.openInSplitView = function (selectedVariant) { - console.log(selectedVariant); + //only the content app can be selected since no other apps are shown, and because we copy all of these apps + //to the "editors" we need to update this across all editors + for (var e = 0; e < $scope.editors.length; e++) { + var editor = $scope.editors[e]; + for (var i = 0; i < editor.content.apps.length; i++) { + var app = editor.content.apps[i]; + if (app.alias === "content") { + app.active = true; + } + else { + app.active = false; + } + } + } + var editor = {}; // hacking animation states - these should hopefully be easier to do when we upgrade angular @@ -575,6 +617,12 @@ } }; + $scope.$watch('culture', function (newVal, oldVal) { + if (newVal !== oldVal) { + setActiveCulture(); + } + }); + //ensure to unregister from all events! $scope.$on('$destroy', function () { for (var e in evts) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js index a0d38667bf..3e318982f1 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js @@ -201,7 +201,7 @@ Use this directive to construct a header inside the main editor window. **/ -(function() { +(function () { 'use strict'; function EditorHeaderDirective(iconHelper, $location, editorService) { @@ -213,17 +213,17 @@ Use this directive to construct a header inside the main editor window. scope.vm.currentVariant = ""; function onInit() { - setCurrentVariant(scope.variants); + setCurrentVariant(); } - function setCurrentVariant(variants) { - angular.forEach(variants, function (variant) { - if(variant.active) { + function setCurrentVariant() { + angular.forEach(scope.variants, function (variant) { + if (variant.active) { scope.vm.currentVariant = variant; } }); } - + scope.goBack = function () { if (scope.onBack) { scope.onBack(); @@ -235,11 +235,11 @@ Use this directive to construct a header inside the main editor window. $location.search("cculture", variant.language.culture); }; - scope.openIconPicker = function() { + scope.openIconPicker = function () { var iconPicker = { icon: scope.icon.split(' ')[0], color: scope.icon.split(' ')[1], - submit: function(model) { + submit: function (model) { if (model.icon) { if (model.color) { scope.icon = model.icon + " " + model.color; @@ -251,35 +251,44 @@ Use this directive to construct a header inside the main editor window. } editorService.close(); }, - close: function() { + close: function () { editorService.close(); } }; editorService.iconPicker(iconPicker); }; - scope.closeSplitView = function() { - if(scope.onCloseSplitView) { + scope.closeSplitView = function () { + if (scope.onCloseSplitView) { scope.onCloseSplitView(); } }; - scope.openInSplitView = function(event, variant) { - if(scope.onOpenInSplitView) { + scope.openInSplitView = function (event, variant) { + if (scope.onOpenInSplitView) { scope.vm.dropdownOpen = false; - scope.onOpenInSplitView({"variant": variant}); + scope.onOpenInSplitView({ "variant": variant }); } }; - //TODO: Change this, we cannot watch the whole model - //scope.$watch('variants', function(newValue, oldValue){ - // if(!newValue) return; - // if(newValue === oldValue) return; - // setCurrentVariant(newValue); - //}, true); - onInit(); + //watch for the active culture changing, if it changes, update the current variant + if (scope.variants) { + scope.$watch(function () { + for (var i = 0; i < scope.variants.length; i++) { + var v = scope.variants[i]; + if (v.active) { + return v.language.culture; + } + } + return scope.vm.currentVariant.language.culture; //should never get here + }, function (newValue, oldValue) { + if (newValue !== scope.vm.currentVariant.language.culture) { + setCurrentVariant(); + } + }); + } } var directive = { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js index db0dad8de7..ea3c4799cd 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js @@ -1,48 +1,26 @@ -(function() { - 'use strict'; +(function () { + 'use strict'; - function EditorSubViewsDirective() { + function EditorSubViewsDirective() { - function link(scope, el, attr, ctrl) { + function link(scope, el, attr, ctrl) { - scope.activeView = {}; + } - // set toolbar from selected navigation item - function setActiveView(items) { + var directive = { + restrict: 'E', + replace: true, + templateUrl: 'views/components/editor/umb-editor-sub-views.html', + scope: { + subViews: "=", + model: "=" + }, + link: link + }; - for (var index = 0; index < items.length; index++) { + return directive; + } - var item = items[index]; - - if (item.active && item.view) { - scope.activeView = item; - } - } - } - - // watch for navigation changes - scope.$watch('subViews', function(newValue, oldValue) { - if (newValue) { - setActiveView(newValue); - } - }, true); - - } - - var directive = { - restrict: 'E', - replace: true, - templateUrl: 'views/components/editor/umb-editor-sub-views.html', - scope: { - subViews: "=", - model: "=" - }, - link: link - }; - - return directive; - } - - angular.module('umbraco.directives').directive('umbEditorSubViews', EditorSubViewsDirective); + angular.module('umbraco.directives').directive('umbEditorSubViews', EditorSubViewsDirective); })(); diff --git a/src/Umbraco.Web.UI.Client/src/init.js b/src/Umbraco.Web.UI.Client/src/init.js index 6e444cbf84..fb6fadb444 100644 --- a/src/Umbraco.Web.UI.Client/src/init.js +++ b/src/Umbraco.Web.UI.Client/src/init.js @@ -43,7 +43,9 @@ app.run(['userService', '$q', '$log', '$rootScope', '$route', '$location', 'urlH } var currentRouteParams = null; - var globalQueryStrings = ["mculture"]; + + //A list of query strings defined that when changed will not cause a reload of the route + var nonRoutingQueryStrings = ["mculture", "cculture"]; /** execute code on each successful route */ $rootScope.$on('$routeChangeSuccess', function (event, current, previous) { @@ -131,15 +133,17 @@ app.run(['userService', '$q', '$log', '$rootScope', '$route', '$location', 'urlH var allowRoute = true; - //the only time that we want to cancel is if any of the globalQueryStrings have changed - //in which case the number of parts need to be equal before comparing values - if (_.keys(currUrlParts).length == _.keys(nextUrlParts).length) { + //The only time that we want to cancel is if only any of the nonRoutingQueryStrings have changed/added. + //If any of the other parts have changed we do not cancel + var currRoutingKeys = _.difference(_.keys(currUrlParts), nonRoutingQueryStrings); + var nextRoutingKeys = _.difference(_.keys(nextUrlParts), nonRoutingQueryStrings); + var diff = _.difference(currRoutingKeys, nextRoutingKeys); + //if the routing parameter keys are the same, we'll compare their values to see if any have changed and if so then the routing will be allowed. + if (diff.length == 0) { var partsChanged = 0; - _.each(currUrlParts, function (value, key) { - if (globalQueryStrings.indexOf(key) === -1) { - if (value.toLowerCase() !== nextUrlParts[key].toLowerCase()) { - partsChanged++; - } + _.each(currRoutingKeys, function (k) { + if (currUrlParts[k] != nextUrlParts[k]) { + partsChanged++; } }); if (partsChanged === 0) { diff --git a/src/Umbraco.Web.UI.Client/src/routes.js b/src/Umbraco.Web.UI.Client/src/routes.js index d41427c203..be65dffd48 100644 --- a/src/Umbraco.Web.UI.Client/src/routes.js +++ b/src/Umbraco.Web.UI.Client/src/routes.js @@ -161,7 +161,7 @@ app.config(function ($routeProvider) { .when('/:section/:tree/:method?/:id', { //This allows us to dynamically change the template for this route since you cannot inject services into the templateUrl method. template: "
", - //This controller will execute for this route, then we replace the template dynamnically based on the current tree. + //This controller will execute for this route, then we replace the template dynamically based on the current tree. controller: function ($scope, $route, $routeParams, treeService) { if (!$routeParams.tree || !$routeParams.method) { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html index bf89bf2fe9..a437f3b6a7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html @@ -17,12 +17,12 @@ + model="content"> diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html index 9d259d2c70..6a545dad5e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html @@ -67,10 +67,9 @@ {{variant.state}} - - + diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html index 76d3104924..4e4a7229cc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html @@ -3,12 +3,12 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js index 26ceaaa351..32842fb94b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js @@ -1,24 +1,42 @@ (function () { "use strict"; - function ContentAppContentController($scope) { + function ContentAppContentController($scope, $timeout) { var vm = this; + vm.loading = true; function onInit() { - //select the first one in the list - //TODO: We need to track the active one - vm.content = $scope.model.variants[0]; - vm.content.active = true; + //TODO: This is pretty ugly since this component inherits the scope from umbEditorSubViews which is supplied a + //'model' which is the entire content object passed from the server which we can't use because this 'app' needs to be + //in the context of the current culture within a split view. So the content controller will assign a special 'viewModel' to the + //subView so that we have a model in the context of the editor. + //Ideally this would be a directive and we can just pass a model in but because contentApps currently are + //rendered purely based on views that won't work. Perhaps we can consider dynamically compiling directives like + // https://www.codelord.net/2015/05/19/angularjs-dynamically-loading-directives/ - angular.forEach(vm.content.tabs, function(group){ + vm.content = $scope.subView.viewModel; + + angular.forEach(vm.content.tabs, function (group) { group.open = true; }); + + vm.loading = false; } onInit(); + $scope.$watch(function () { + return $scope.subView.viewModel.language.culture; + }, function (newVal, oldVal) { + if (newVal !== oldVal) { + vm.loading = true; + $timeout(function () { + onInit(); + }); + } + }); } angular.module("umbraco").controller("Umbraco.Editors.Content.Apps.ContentController", ContentAppContentController); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html index 7cb3db570d..056933a85c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html @@ -1,6 +1,6 @@
-
+
{{ group.label }}
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.edit.controller.js index d3086a5b34..bb7f198a36 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.edit.controller.js @@ -6,7 +6,7 @@ * @description * The controller for the content editor */ -function ContentEditController($scope, $routeParams, contentResource) { +function ContentEditController($scope, $rootScope, $routeParams, contentResource) { var infiniteMode = $scope.model && $scope.model.infiniteMode; @@ -23,7 +23,15 @@ function ContentEditController($scope, $routeParams, contentResource) { $scope.getScaffoldMethod = $routeParams.blueprintId ? scaffoldBlueprint : scaffoldEmpty; $scope.page = $routeParams.page; $scope.isNew = infiniteMode ? $scope.model.create : $routeParams.create; - $scope.culture = $routeParams.cculture ? $routeParams.cculture : $routeParams.mculture; //load the default culture selected in the main tree if any + //load the default culture selected in the main tree if any + $scope.culture = $routeParams.cculture ? $routeParams.cculture : $routeParams.mculture; + + //Bind to $routeUpdate which will execute anytime a location changes but the route is not triggered. + //This is so we can listen to changes on the cculture parameter since that will not cause a route change + // and then we can pass in the updated culture to the editor + $scope.$on('$routeUpdate', function (event, next) { + $scope.culture = next.params.cculture; + }); } angular.module("umbraco").controller("Umbraco.Editors.Content.EditController", ContentEditController); From 6ffcea8aae254dd784ec96d60751c72e7ff841e9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 13 Jul 2018 17:27:34 +1000 Subject: [PATCH 003/275] Gets the content loading into split view --- .../components/content/edit.controller.js | 112 ++++++++---------- .../editor/umbeditorcontainer.directive.js | 43 +++---- .../overlays/umboverlaybackdrop.directive.js | 41 +++---- .../editor/umb-editor-container.html | 7 +- .../apps/content/content.controller.js | 4 +- 5 files changed, 103 insertions(+), 104 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 6fb6f0156d..2900d22540 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -33,8 +33,8 @@ }; function init(content) { - - if(infiniteMode) { + + if (infiniteMode) { createInfiniteModeButtons(content); } else { createButtons(content); @@ -83,8 +83,23 @@ activeVariant = $scope.content.variants[0]; } + initVariant(activeVariant); + //If there are no editors yet then create one with the current content. //if there's already a main editor then update it with the current content. + if ($scope.editors.length === 0) { + var editor = { + content: activeVariant + }; + $scope.editors.push(editor); + } + else { + //this will mean there is only one + $scope.editors[0].content = activeVariant; + } + } + + function initVariant(variant) { //The model that is assigned to the editor contains the current content variant along //with a copy of the contentApps. This is required because each editor renders it's own //content apps section and the content apps contains the view for editing content itself @@ -93,30 +108,19 @@ //app stuff isn't built to have a scoped model to an editor, it's built to have a single global //model but that doesn't work for having split view. - if (!activeVariant.apps) { + if (!variant.apps) { //copy from the main model - activeVariant.apps = angular.copy($scope.content.apps); + variant.apps = angular.copy($scope.content.apps); } - //the assign the activeVariant to a view model to the content app - var contentApp = _.find(activeVariant.apps, function (a) { + //the assign the variant to a view model to the content app + var contentApp = _.find(variant.apps, function (a) { return a.alias === "content"; }); - contentApp.viewModel = activeVariant; + contentApp.viewModel = variant; - if ($scope.editors.length === 0) { - var editor = { - content: activeVariant - }; - $scope.editors.push(editor); - } - else if ($scope.editors.length === 1) { - $scope.editors[0].content = activeVariant; - } - else { - //fixme - need to fix something here if we are re-loading a content item that is in a split view - } - } + return variant; + } function bindEvents() { //bindEvents can be called more than once and we don't want to have multiple bound events @@ -165,7 +169,7 @@ // if there are any and then clear them so the collection no longer persists them. serverValidationManager.executeAndClearAllSubscriptions(); - if(!infiniteMode) { + if (!infiniteMode) { syncTreeNode($scope.content, data.path, true); } @@ -205,11 +209,11 @@ $scope.page.allowInfiniteSaveAndClose = false; // check for publish rights - if(_.contains(content.allowedActions, "U")) { + if (_.contains(content.allowedActions, "U")) { $scope.page.allowInfinitePublishAndClose = true; - // check for save rights - } else if( _.contains(content.allowedActions, "A")) { + // check for save rights + } else if (_.contains(content.allowedActions, "A")) { $scope.page.allowInfiniteSaveAndClose = true; } @@ -254,7 +258,7 @@ //success init($scope.content); - if(!infiniteMode) { + if (!infiniteMode) { syncTreeNode($scope.content, data.path); } @@ -328,7 +332,7 @@ } if (formHelper.submitForm({ scope: $scope, skipValidation: true })) { - + $scope.page.buttonGroupState = "busy"; eventsService.emit("content.unpublishing", { content: $scope.content }); @@ -346,7 +350,7 @@ init($scope.content); - if(!infiniteMode) { + if (!infiniteMode) { syncTreeNode($scope.content, data.path); } @@ -370,7 +374,7 @@ // TODO: Add "..." to publish button label if there are more than one variant to publish - currently it just adds the elipses if there's more than 1 variant if ($scope.content.variants.length > 1) { //before we launch the dialog we want to execute all client side validations first - if (formHelper.submitForm({ scope: $scope, action: "publish"})) { + if (formHelper.submitForm({ scope: $scope, action: "publish" })) { var dialog = { view: "publish", @@ -503,9 +507,9 @@ notificationsService.error(error.headline, error.content); }); }; - + $scope.closeSplitView = function (index, editor) { - // hacky animation stuff - it will be much better when angular is upgraded + //TODO: hacking animation states - these should hopefully be easier to do when we upgrade angular editor.loading = true; editor.collapsed = true; $timeout(function () { @@ -529,40 +533,26 @@ } } } - - var editor = {}; - // hacking animation states - these should hopefully be easier to do when we upgrade angular + var editor = { + content: initVariant(selectedVariant) + }; + $scope.editors.push(editor); + + //TODO: hacking animation states - these should hopefully be easier to do when we upgrade angular editor.collapsed = true; editor.loading = true; - $scope.editors.push(editor); - var editorIndex = $scope.editors.length - 1; $timeout(function () { - $scope.editors[editorIndex].collapsed = false; + editor.collapsed = false; + editor.loading = false; }, 100); - - // fake loading of content - // TODO: Make this real, but how do we deal with saving since currently we only save one variant at a time?! - $timeout(function () { - $scope.editors[editorIndex].content = angular.copy($scope.content); - $scope.editors[editorIndex].content.name = "What a variant"; - // set selected variant on split view content - angular.forEach($scope.editors[editorIndex].content.variants, function (variant) { - if (variant.culture === selectedVariant.culture) { - variant.active = true; - } else { - variant.active = false; - } - }); - $scope.editors[editorIndex].loading = false; - }, 500); }; /* publish method used in infinite editing */ - $scope.publishAndClose = function(content) { + $scope.publishAndClose = function (content) { $scope.publishAndCloseButtonState = "busy"; - performSave({ saveMethod: contentResource.publish, action: "publish" }).then(function(){ - if($scope.infiniteModel.submit) { + performSave({ saveMethod: contentResource.publish, action: "publish" }).then(function () { + if ($scope.infiniteModel.submit) { $scope.infiniteModel.contentNode = content; $scope.infiniteModel.submit($scope.infiniteModel); } @@ -571,10 +561,10 @@ }; /* save method used in infinite editing */ - $scope.saveAndClose = function(content) { + $scope.saveAndClose = function (content) { $scope.saveAndCloseButtonState = "busy"; - performSave({ saveMethod: $scope.saveMethod(), action: "save" }).then(function(){ - if($scope.infiniteModel.submit) { + performSave({ saveMethod: $scope.saveMethod(), action: "save" }).then(function () { + if ($scope.infiniteModel.submit) { $scope.infiniteModel.contentNode = content; $scope.infiniteModel.submit($scope.infiniteModel); } @@ -593,7 +583,7 @@ } // sync the destination node - if(!infiniteMode) { + if (!infiniteMode) { navigationService.syncTree({ tree: "content", path: path, forceReload: true, activate: false }); } @@ -611,8 +601,8 @@ } // methods for infinite editing - $scope.close = function() { - if($scope.infiniteModel.close) { + $scope.close = function () { + if ($scope.infiniteModel.close) { $scope.infiniteModel.close($scope.infiniteModel); } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontainer.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontainer.directive.js index dd0b8baf71..d4b0fb158e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontainer.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorcontainer.directive.js @@ -37,34 +37,35 @@ Use this directive to construct a main content area inside the main editor windo **/ -(function() { - 'use strict'; +(function () { + 'use strict'; - function EditorContainerDirective(overlayHelper) { + function EditorContainerDirective(overlayHelper) { - function link(scope, el, attr, ctrl) { + function link(scope, el, attr, ctrl) { - scope.numberOfOverlays = 0; + scope.numberOfOverlays = 0; - scope.$watch(function(){ - return overlayHelper.getNumberOfOverlays(); - }, function (newValue) { - scope.numberOfOverlays = newValue; - }); + //TODO: this shouldn't be a watch, this should be based on an event handler + scope.$watch(function () { + return overlayHelper.getNumberOfOverlays(); + }, function (newValue) { + scope.numberOfOverlays = newValue; + }); - } + } - var directive = { - transclude: true, - restrict: 'E', - replace: true, - templateUrl: 'views/components/editor/umb-editor-container.html', - link: link - }; + var directive = { + transclude: true, + restrict: 'E', + replace: true, + templateUrl: 'views/components/editor/umb-editor-container.html', + link: link + }; - return directive; - } + return directive; + } - angular.module('umbraco.directives').directive('umbEditorContainer', EditorContainerDirective); + angular.module('umbraco.directives').directive('umbEditorContainer', EditorContainerDirective); })(); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlaybackdrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlaybackdrop.directive.js index cfcd7e064b..927481952a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlaybackdrop.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlaybackdrop.directive.js @@ -1,31 +1,32 @@ -(function() { - 'use strict'; +(function () { + 'use strict'; - function OverlayBackdropDirective(overlayHelper) { + function OverlayBackdropDirective(overlayHelper) { - function link(scope, el, attr, ctrl) { + function link(scope, el, attr, ctrl) { - scope.numberOfOverlays = 0; + scope.numberOfOverlays = 0; - scope.$watch(function(){ - return overlayHelper.getNumberOfOverlays(); - }, function (newValue) { - scope.numberOfOverlays = newValue; - }); + //TODO: this shouldn't be a watch, this should be based on an event handler + scope.$watch(function () { + return overlayHelper.getNumberOfOverlays(); + }, function (newValue) { + scope.numberOfOverlays = newValue; + }); - } + } - var directive = { - restrict: 'E', - replace: true, - templateUrl: 'views/components/overlays/umb-overlay-backdrop.html', - link: link - }; + var directive = { + restrict: 'E', + replace: true, + templateUrl: 'views/components/overlays/umb-overlay-backdrop.html', + link: link + }; - return directive; + return directive; - } + } - angular.module('umbraco.directives').directive('umbOverlayBackdrop', OverlayBackdropDirective); + angular.module('umbraco.directives').directive('umbOverlayBackdrop', OverlayBackdropDirective); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-container.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-container.html index b3978ca754..9e675b15ba 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-container.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-container.html @@ -1,5 +1,10 @@ 
- + + +
+ +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js index 32842fb94b..e50af0bfb4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js @@ -32,9 +32,11 @@ }, function (newVal, oldVal) { if (newVal !== oldVal) { vm.loading = true; + + //TODO: Can we minimize the flicker? $timeout(function () { onInit(); - }); + }, 100); } }); } From 7cc300f59c4e6bf0b3715e4bde65d142c2b93f94 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 16 Jul 2018 18:40:47 +1000 Subject: [PATCH 004/275] Gets all of the content for both variant and invariant content loading in the editor and for split views too --- src/Umbraco.Web.UI.Client/bower.json | 2 +- .../components/content/edit.controller.js | 58 +++++++++++++- .../editor/umbeditorheader.directive.js | 11 ++- .../validation/valformmanager.directive.js | 40 ++++++---- .../src/common/services/navigation.service.js | 77 +++++++++++++++++++ src/Umbraco.Web.UI.Client/src/init.js | 30 +------- .../src/views/components/content/edit.html | 5 +- .../apps/content/content.controller.js | 26 ++++--- 8 files changed, 183 insertions(+), 66 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/bower.json b/src/Umbraco.Web.UI.Client/bower.json index 71b393ae9c..1734172820 100644 --- a/src/Umbraco.Web.UI.Client/bower.json +++ b/src/Umbraco.Web.UI.Client/bower.json @@ -25,7 +25,7 @@ "angular-i18n": "~1.7.2", "signalr": "^2.2.1", "typeahead.js": "~0.10.5", - "underscore": "~1.7.0", + "underscore": "~1.9.1", "rgrove-lazyload": "*", "bootstrap-social": "~4.8.0", "jquery": "2.2.4", diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 2900d22540..76274a4901 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -69,7 +69,7 @@ // set the active variant var activeVariant = null; _.each($scope.content.variants, function (v) { - if (v.language.culture === $scope.culture) { + if (v.language && v.language.culture === $scope.culture) { v.active = true; activeVariant = v; } @@ -102,17 +102,36 @@ function initVariant(variant) { //The model that is assigned to the editor contains the current content variant along //with a copy of the contentApps. This is required because each editor renders it's own - //content apps section and the content apps contains the view for editing content itself + //header and content apps section and the content apps contains the view for editing content itself //and we need to assign a view model to the subView so that it is scoped to the current //editor so that split views work. This is a bit hacky but it's required because the content //app stuff isn't built to have a scoped model to an editor, it's built to have a single global //model but that doesn't work for having split view. + //copy the apps from the main model if not assigned yet to the variant if (!variant.apps) { - //copy from the main model variant.apps = angular.copy($scope.content.apps); } + //if this is a variant has a culture/language than we need to assign the language drop down info + if (variant.language) { + //if the variant list that defines the header drop down isn't assigned to the variant then assign it now + if (!variant.variants) { + variant.variants = _.map($scope.content.variants, function (v) { + return _.pick(v, "active", "language", "validationError", "isEdited", "state"); + }); + } + //ensure the current culture is set as the active one + for (var i = 0; i < variant.variants.length; i++) { + if (variant.variants[i].language.culture === variant.language.culture) { + variant.variants[i].active = true; + } + else { + variant.variants[i].active = false; + } + } + } + //the assign the variant to a view model to the content app var contentApp = _.find(variant.apps, function (a) { return a.alias === "content"; @@ -508,6 +527,30 @@ }); }; + $scope.selectVariant = function (editorIndex, variantDropDownItem) { + + //if the editor index is zero, then update the query string to track the lang selection, otherwise if it's part + //of a 2nd split view editor then update the model directly. + if (editorIndex === 0) { + //if we've made it this far, then update the query string + $location.search("cculture", variantDropDownItem.language.culture); + } + else { + //set all variant drop down items as inactive for this editor and then set the selected on as active + var editor = $scope.editors[editorIndex]; + for (var i = 0; i < editor.content.variants.length; i++) { + editor.content.variants[i].active = false; + } + variantDropDownItem.active = true; + + //get the variant content model and initialize the editor with that + var variant = _.find($scope.content.variants, function (v) { + return v.language.culture === variantDropDownItem.language.culture; + }); + editor.content = initVariant(variant); + } + }; + $scope.closeSplitView = function (index, editor) { //TODO: hacking animation states - these should hopefully be easier to do when we upgrade angular editor.loading = true; @@ -519,6 +562,8 @@ $scope.openInSplitView = function (selectedVariant) { + var selectedCulture = selectedVariant.language.culture; + //only the content app can be selected since no other apps are shown, and because we copy all of these apps //to the "editors" we need to update this across all editors for (var e = 0; e < $scope.editors.length; e++) { @@ -534,8 +579,13 @@ } } + //Find the whole variant model based on the culture that was chosen + var variant = _.find($scope.content.variants, function (v) { + return v.language.culture === selectedCulture; + }); + var editor = { - content: initVariant(selectedVariant) + content: initVariant(variant) }; $scope.editors.push(editor); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js index 3e318982f1..9275917578 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorheader.directive.js @@ -204,7 +204,7 @@ Use this directive to construct a header inside the main editor window. (function () { 'use strict'; - function EditorHeaderDirective(iconHelper, $location, editorService) { + function EditorHeaderDirective(iconHelper, editorService) { function link(scope, el, attr, ctrl) { @@ -231,8 +231,10 @@ Use this directive to construct a header inside the main editor window. }; scope.selectVariant = function (event, variant) { - scope.vm.dropdownOpen = false; - $location.search("cculture", variant.language.culture); + if (scope.onSelectVariant) { + scope.vm.dropdownOpen = false; + scope.onSelectVariant({ "variant": variant }); + } }; scope.openIconPicker = function () { @@ -318,7 +320,8 @@ Use this directive to construct a header inside the main editor window. showBackButton: " 1" on-open-in-split-view="openInSplitView(variant)" - on-close-split-view="closeSplitView($index, editor)"> + on-close-split-view="closeSplitView($index, editor)" + on-select-variant="selectVariant($index, variant)"> diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js index e50af0bfb4..7c4ed5aaa4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js @@ -27,18 +27,22 @@ onInit(); - $scope.$watch(function () { - return $scope.subView.viewModel.language.culture; - }, function (newVal, oldVal) { - if (newVal !== oldVal) { - vm.loading = true; + //if this variant has a culture/language assigned, then we need to watch it since it will change + //if the language drop down changes and we need to re-init + if ($scope.subView.viewModel.language) { + $scope.$watch(function () { + return $scope.subView.viewModel.language.culture; + }, function (newVal, oldVal) { + if (newVal !== oldVal) { + vm.loading = true; - //TODO: Can we minimize the flicker? - $timeout(function () { - onInit(); - }, 100); - } - }); + //TODO: Can we minimize the flicker? + $timeout(function () { + onInit(); + }, 100); + } + }); + } } angular.module("umbraco").controller("Umbraco.Editors.Content.Apps.ContentController", ContentAppContentController); From 9a2aa8fff0c47aa266a358b0697f896a9943536d Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 16 Jul 2018 20:24:49 +1000 Subject: [PATCH 005/275] Fixes up tests --- .../Mapping/ContentWebModelMappingTests.cs | 197 ++++++++++-------- .../Models/ContentEditing/ContentItemBasic.cs | 2 +- .../ContentEditing/ContentVariationDisplay.cs | 2 +- ...edContentItem.cs => IContentProperties.cs} | 4 +- .../Models/ContentEditing/ITabbedContent.cs | 11 + .../ContentEditing/TabbedContentItem.cs | 2 +- .../Models/Mapping/ContentMapperProfile.cs | 4 + .../Mapping/TabsAndPropertiesResolver.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 3 +- 9 files changed, 138 insertions(+), 89 deletions(-) rename src/Umbraco.Web/Models/ContentEditing/{ITabbedContentItem.cs => IContentProperties.cs} (54%) create mode 100644 src/Umbraco.Web/Models/ContentEditing/ITabbedContent.cs diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index ed06f224d6..7075e33fdd 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -107,102 +107,111 @@ namespace Umbraco.Tests.Models.Mapping AssertContentItem(result, content); } - //[Test] - //public void To_Display_Model() - //{ - // var contentType = MockedContentTypes.CreateSimpleContentType(); - // var content = MockedContent.CreateSimpleContent(contentType); - // FixUsers(content); + [Test] + public void To_Display_Model() + { + var contentType = MockedContentTypes.CreateSimpleContentType(); + var content = MockedContent.CreateSimpleContent(contentType); + FixUsers(content); - // // need ids for tabs - // var id = 1; - // foreach (var g in content.PropertyGroups) - // g.Id = id++; + // need ids for tabs + var id = 1; + foreach (var g in content.PropertyGroups) + g.Id = id++; - // var result = Mapper.Map(content); + var result = Mapper.Map(content); - // AssertBasics(result, content); + AssertBasics(result, content); - // foreach (var p in content.Properties) - // AssertDisplayProperty(result, p); + var invariantContent = result.ContentVariants.First(); + foreach (var p in content.Properties) + { + AssertBasicProperty(invariantContent, p); + AssertDisplayProperty(invariantContent, p); + } - // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); - // Assert.IsTrue(result.Tabs.First().IsActive); - // Assert.IsTrue(result.Tabs.Except(new[] {result.Tabs.First()}).All(x => x.IsActive == false)); - //} + Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count()); + Assert.IsTrue(invariantContent.Tabs.First().IsActive); + Assert.IsTrue(invariantContent.Tabs.Except(new[] { invariantContent.Tabs.First() }).All(x => x.IsActive == false)); + } - //[Test] - //public void To_Display_Model_No_Tabs() - //{ - // var contentType = MockedContentTypes.CreateSimpleContentType(); - // contentType.PropertyGroups.Clear(); - // var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 }; + [Test] + public void To_Display_Model_No_Tabs() + { + var contentType = MockedContentTypes.CreateSimpleContentType(); + contentType.PropertyGroups.Clear(); + var content = new Content("Home", -1, contentType) { Level = 1, SortOrder = 1, CreatorId = 0, WriterId = 0 }; - // var result = Mapper.Map(content); + var result = Mapper.Map(content); - // AssertBasics(result, content); - // foreach (var p in content.Properties) - // { - // AssertDisplayProperty(result, p); - // } - // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count()); - //} + AssertBasics(result, content); - //[Test] - //public void To_Display_Model_With_Non_Grouped_Properties() - //{ - // var idSeed = 1; - // var contentType = MockedContentTypes.CreateSimpleContentType(); - // //add non-grouped properties - // contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped1") { Name = "Non Grouped 1", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); - // contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped2") { Name = "Non Grouped 2", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); - // //set ids or it wont work - // contentType.Id = idSeed; - // foreach (var p in contentType.PropertyTypes) - // { - // p.Id = idSeed; - // idSeed++; - // } - // var content = MockedContent.CreateSimpleContent(contentType); - // FixUsers(content); + var invariantContent = result.ContentVariants.First(); + foreach (var p in content.Properties) + { + AssertBasicProperty(invariantContent, p); + AssertDisplayProperty(invariantContent, p); + } + + Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count()); + } - // foreach (var p in content.Properties) - // { - // p.Id = idSeed; - // idSeed++; - // } - // //need ids for tabs - // var id = 1; - // foreach (var g in content.PropertyGroups) - // { - // g.Id = id; - // id++; - // } - // //ensure that nothing is marked as dirty - // contentType.ResetDirtyProperties(false); - // //ensure that nothing is marked as dirty - // content.ResetDirtyProperties(false); + [Test] + public void To_Display_Model_With_Non_Grouped_Properties() + { + var idSeed = 1; + var contentType = MockedContentTypes.CreateSimpleContentType(); + //add non-grouped properties + contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped1") { Name = "Non Grouped 1", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); + contentType.AddPropertyType(new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "nonGrouped2") { Name = "Non Grouped 2", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88 }); + //set ids or it wont work + contentType.Id = idSeed; + foreach (var p in contentType.PropertyTypes) + { + p.Id = idSeed; + idSeed++; + } + var content = MockedContent.CreateSimpleContent(contentType); + FixUsers(content); - // var result = Mapper.Map(content); + foreach (var p in content.Properties) + { + p.Id = idSeed; + idSeed++; + } + //need ids for tabs + var id = 1; + foreach (var g in content.PropertyGroups) + { + g.Id = id; + id++; + } + //ensure that nothing is marked as dirty + contentType.ResetDirtyProperties(false); + //ensure that nothing is marked as dirty + content.ResetDirtyProperties(false); - // AssertBasics(result, content); - // foreach (var p in content.Properties) - // { - // AssertDisplayProperty(result, p); - // } - // Assert.AreEqual(content.PropertyGroups.Count(), result.Tabs.Count() - 1); - // Assert.IsTrue(result.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); - // Assert.AreEqual(2, result.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); - //} + var result = Mapper.Map(content); + + AssertBasics(result, content); + + var invariantContent = result.ContentVariants.First(); + foreach (var p in content.Properties) + { + AssertBasicProperty(invariantContent, p); + AssertDisplayProperty(invariantContent, p); + } + + Assert.AreEqual(content.PropertyGroups.Count(), invariantContent.Tabs.Count() - 1); + Assert.IsTrue(invariantContent.Tabs.Any(x => x.Label == Current.Services.TextService.Localize("general/properties"))); + Assert.AreEqual(2, invariantContent.Tabs.Where(x => x.Label == Current.Services.TextService.Localize("general/properties")).SelectMany(x => x.Properties.Where(p => p.Alias.StartsWith("_umb_") == false)).Count()); + } #region Assertions - private void AssertDisplayProperty(ContentItemBasic result, Property p) - where T : ContentPropertyDisplay - where TPersisted : IContentBase + private void AssertDisplayProperty(ITabbedContent result, Property p) + where T : ContentPropertyBasic { - AssertBasicProperty(result, p); - var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); Assert.IsNotNull(pDto); @@ -213,6 +222,31 @@ namespace Umbraco.Tests.Models.Mapping } + private void AssertBasics(ContentItemDisplay result, IContent content) + { + Assert.AreEqual(content.Id, result.Id); + + var ownerId = content.CreatorId; + if (ownerId != 0) + { + Assert.IsNotNull(result.Owner); + Assert.AreEqual(Constants.Security.SuperUserId, result.Owner.UserId); + Assert.AreEqual("Administrator", result.Owner.Name); + } + else + { + Assert.IsNull(result.Owner); // because, 0 is no user + } + + var invariantContent = result.ContentVariants.First(); + + Assert.AreEqual(content.ParentId, result.ParentId); + Assert.AreEqual(content.UpdateDate, invariantContent.UpdateDate); + Assert.AreEqual(content.CreateDate, invariantContent.CreateDate); + Assert.AreEqual(content.Name, invariantContent.Name); + Assert.AreEqual(content.Properties.Count(), invariantContent.Properties.Count(x => x.Alias.StartsWith("_umb_") == false)); + } + private void AssertBasics(ContentItemBasic result, TPersisted content) where T : ContentPropertyBasic where TPersisted : IContentBase @@ -238,9 +272,8 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(content.Properties.Count(), result.Properties.Count(x => x.Alias.StartsWith("_umb_") == false)); } - private void AssertBasicProperty(ContentItemBasic result, Property p) + private void AssertBasicProperty(IContentProperties result, Property p) where T : ContentPropertyBasic - where TPersisted : IContentBase { var pDto = result.Properties.SingleOrDefault(x => x.Alias == p.Alias); Assert.IsNotNull(pDto); diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs index 9471e3c4d7..5b4f710a28 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs @@ -66,7 +66,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a basic content item with properties ///
[DataContract(Name = "content", Namespace = "")] - public class ContentItemBasic : ContentItemBasic + public class ContentItemBasic : ContentItemBasic, IContentProperties where T : ContentPropertyBasic where TPersisted : IContentBase { diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs index 247f88d203..e6f32bae35 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs @@ -12,7 +12,7 @@ namespace Umbraco.Web.Models.ContentEditing /// Represents the variant info for a content item /// [DataContract(Name = "contentVariant", Namespace = "")] - public class ContentVariantDisplay : ITabbedContentItem + public class ContentVariantDisplay : ITabbedContent { public ContentVariantDisplay() { diff --git a/src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs similarity index 54% rename from src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs rename to src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs index 871b9a2063..409c758536 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ITabbedContentItem.cs +++ b/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs @@ -2,9 +2,9 @@ namespace Umbraco.Web.Models.ContentEditing { - public interface ITabbedContentItem where T : ContentPropertyBasic + public interface IContentProperties + where T : ContentPropertyBasic { IEnumerable Properties { get; set; } - IEnumerable> Tabs { get; set; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ITabbedContent.cs b/src/Umbraco.Web/Models/ContentEditing/ITabbedContent.cs new file mode 100644 index 0000000000..00cc49aecb --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ITabbedContent.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Umbraco.Web.Models.ContentEditing +{ + + public interface ITabbedContent : IContentProperties + where T : ContentPropertyBasic + { + IEnumerable> Tabs { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs index 89057bba05..ccae4906b4 100644 --- a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs +++ b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { - public abstract class TabbedContentItem : ContentItemBasic, ITabbedContentItem where T : ContentPropertyBasic + public abstract class TabbedContentItem : ContentItemBasic, ITabbedContent where T : ContentPropertyBasic where TPersisted : IContentBase { protected TabbedContentItem() diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 684ee13581..b50df61eb5 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -72,6 +72,10 @@ namespace Umbraco.Web.Models.Mapping CreateMap() .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) .ForMember(dest => dest.Properties, opt => opt.Ignore()) + .ForMember(dest => dest.Exists, opt => opt.Ignore()) + .ForMember(dest => dest.Segment, opt => opt.Ignore()) + .ForMember(dest => dest.Language, opt => opt.Ignore()) + .ForMember(dest => dest.IsEdited, opt => opt.Ignore()) .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) .AfterMap((content, display) => { diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs index a92527823c..1b5da1a398 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs @@ -36,7 +36,7 @@ namespace Umbraco.Web.Models.Mapping /// /// internal static void AddListView( - ITabbedContentItem display, + ITabbedContent display, string contentTypeAlias, string entityType, IDataTypeService dataTypeService, ILocalizedTextService localizedTextService) { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index f54509ee5d..158137724f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -221,7 +221,8 @@ - + + From c8e65f085b62a6687728a9e7cdfdb127fa6a1466 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 16 Jul 2018 22:32:46 +1000 Subject: [PATCH 006/275] Gets content apps working nicer so we can have a proper view model that is discoverable, updates list views to use the new way, removes strange hack of copying a list view from a tab that doesn't exist. --- .../components/content/edit.controller.js | 6 +- .../components/editor/umbeditorsubview.js | 33 +++++ .../editor/umbeditorsubviews.directive.js | 5 + .../validation/valsubview.directive.js | 8 +- .../src/views/components/content/edit.html | 10 +- .../editor/umb-editor-sub-view.html | 10 ++ .../apps/content/content.controller.js | 14 +-- .../views/content/apps/content/content.html | 2 +- .../src/views/content/apps/info/info.html | 6 +- .../apps/listview/listview.controller.js | 28 ----- .../views/content/apps/listview/listview.html | 4 +- .../media/apps/content/content.controller.js | 2 +- .../src/views/media/apps/content/content.html | 6 +- .../apps/listview/listview.controller.js | 23 ---- .../views/media/apps/listview/listview.html | 5 +- .../src/views/media/edit.html | 113 ++++++++---------- .../src/views/mediatypes/edit.controller.js | 3 + src/Umbraco.Web/Editors/ContentController.cs | 1 + src/Umbraco.Web/Editors/MediaController.cs | 3 +- src/Umbraco.Web/Editors/MemberController.cs | 1 + .../Models/ContentEditing/ContentApp.cs | 6 + .../Models/Mapping/ContentAppResolver.cs | 21 ++-- .../Mapping/ContentAppResolverExtensions.cs | 81 +++++++++++++ .../Models/Mapping/ContentMapperProfile.cs | 32 ++--- .../Models/Mapping/MediaAppResolver.cs | 20 ++-- .../Models/Mapping/MediaMapperProfile.cs | 12 +- .../Mapping/TabsAndPropertiesResolver.cs | 41 +------ .../PropertyEditors/ListViewConfiguration.cs | 4 +- src/Umbraco.Web/Umbraco.Web.csproj | 1 + 29 files changed, 272 insertions(+), 229 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubview.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-view.html delete mode 100644 src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.controller.js create mode 100644 src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 76274a4901..ddd98d4b8a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -104,9 +104,7 @@ //with a copy of the contentApps. This is required because each editor renders it's own //header and content apps section and the content apps contains the view for editing content itself //and we need to assign a view model to the subView so that it is scoped to the current - //editor so that split views work. This is a bit hacky but it's required because the content - //app stuff isn't built to have a scoped model to an editor, it's built to have a single global - //model but that doesn't work for having split view. + //editor so that split views work. //copy the apps from the main model if not assigned yet to the variant if (!variant.apps) { @@ -132,7 +130,7 @@ } } - //the assign the variant to a view model to the content app + //then assign the variant to a view model to the content app var contentApp = _.find(variant.apps, function (a) { return a.alias === "content"; }); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubview.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubview.js new file mode 100644 index 0000000000..e8b41529ae --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubview.js @@ -0,0 +1,33 @@ +(function () { + 'use strict'; + + /** + * A directive that renders a defined view with a view model and a the whole content model. + **/ + function EditorSubViewDirective() { + + function link(scope, el, attr, ctrl) { + //The model can contain: view, viewModel, name, alias, icon + + if (!scope.model.view) { + throw "No view defined for the content app"; + } + } + + var directive = { + restrict: 'E', + replace: true, + templateUrl: 'views/components/editor/umb-editor-sub-view.html', + scope: { + model: "=", + content: "=" + }, + link: link + }; + + return directive; + } + + angular.module('umbraco.directives').directive('umbEditorSubView', EditorSubViewDirective); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js index ea3c4799cd..7033a03943 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/editor/umbeditorsubviews.directive.js @@ -1,6 +1,11 @@ (function () { 'use strict'; + /** + * A directive that just repeats over a list of defined views which are all able to access the same common model. + * This is only used in simple cases, whereas media and content use umbEditorSubView (singular) which allows + * passing in a view model specific to the view and the entire content model for support if required. + **/ function EditorSubViewsDirective() { function link(scope, el, attr, ctrl) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valsubview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valsubview.directive.js index ca571d3954..a65a08d17e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valsubview.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valsubview.directive.js @@ -18,7 +18,7 @@ } var valFormManager = ctrl[1]; - scope.subView.hasError = false; + scope.model.hasError = false; //listen for form validation changes valFormManager.onValidationStatusChanged(function (evt, args) { @@ -27,14 +27,14 @@ var subViewContent = el.find(".ng-invalid"); if (subViewContent.length > 0) { - scope.subView.hasError = true; + scope.model.hasError = true; } else { - scope.subView.hasError = false; + scope.model.hasError = false; } } else { - scope.subView.hasError = false; + scope.model.hasError = false; } }); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html index f8ce725f18..88b5343c1f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html @@ -33,11 +33,11 @@ - - +
+
+ +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-view.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-view.html new file mode 100644 index 0000000000..068ba1a1b5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-view.html @@ -0,0 +1,10 @@ +
+ +
+
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js index 7c4ed5aaa4..3e30b25a94 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.controller.js @@ -8,15 +8,7 @@ function onInit() { - //TODO: This is pretty ugly since this component inherits the scope from umbEditorSubViews which is supplied a - //'model' which is the entire content object passed from the server which we can't use because this 'app' needs to be - //in the context of the current culture within a split view. So the content controller will assign a special 'viewModel' to the - //subView so that we have a model in the context of the editor. - //Ideally this would be a directive and we can just pass a model in but because contentApps currently are - //rendered purely based on views that won't work. Perhaps we can consider dynamically compiling directives like - // https://www.codelord.net/2015/05/19/angularjs-dynamically-loading-directives/ - - vm.content = $scope.subView.viewModel; + vm.content = $scope.model.viewModel; angular.forEach(vm.content.tabs, function (group) { group.open = true; @@ -29,9 +21,9 @@ //if this variant has a culture/language assigned, then we need to watch it since it will change //if the language drop down changes and we need to re-init - if ($scope.subView.viewModel.language) { + if ($scope.model.viewModel.language) { $scope.$watch(function () { - return $scope.subView.viewModel.language.culture; + return $scope.model.viewModel.language.culture; }, function (newVal, oldVal) { if (newVal !== oldVal) { vm.loading = true; diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html index 056933a85c..db71539c59 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/content/content.html @@ -4,7 +4,7 @@
{{ group.label }}
-   +  
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/info/info.html b/src/Umbraco.Web.UI.Client/src/views/content/apps/info/info.html index 197aeb35b9..c40486012c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/info/info.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/info/info.html @@ -1,4 +1,4 @@ - \ No newline at end of file + ng-if="content" + node="content"> + diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js deleted file mode 100644 index 2733b56690..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.controller.js +++ /dev/null @@ -1,28 +0,0 @@ -(function () { - "use strict"; - - function ContentAppListViewController($scope) { - - var vm = this; - - vm.listViewGroup = {}; - - //TODO: We need to fix this, there is no umbContainerView anymore since this worked as a hack by copying - // across a tab/property editor to a content App, instead we are going to need to hack the list view a different - // way since currently it still requires us to use umb-property-editor so we'll either need to construct the model - // here ourselves or somehow allow the server to pass in a model for a content app. - - function onInit() { - angular.forEach($scope.model.tabs, function(group){ - if(group.alias === "umbContainerView") { - vm.listViewGroup = group; - } - }); - } - - onInit(); - - } - - angular.module("umbraco").controller("Umbraco.Editors.Content.Apps.ListViewController", ContentAppListViewController); -})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.html b/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.html index 74d690c671..a19d7ea4d9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/apps/listview/listview.html @@ -1,6 +1,6 @@ -
+
- + diff --git a/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.controller.js index 3349bfbcba..6dcf1211c2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.controller.js @@ -6,7 +6,7 @@ var vm = this; function onInit() { - angular.forEach($scope.model.tabs, function(group){ + angular.forEach($scope.content.tabs, function(group){ group.open = true; }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.html b/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.html index a865e2ff5d..8c16a451d9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/apps/content/content.html @@ -1,9 +1,9 @@
-
+
{{ group.label }}
-   +  
@@ -14,4 +14,4 @@
-
\ No newline at end of file +
diff --git a/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.controller.js deleted file mode 100644 index 7ad5724e75..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.controller.js +++ /dev/null @@ -1,23 +0,0 @@ -(function () { - "use strict"; - - function MediaAppListViewController($scope) { - - var vm = this; - - vm.listViewGroup = {}; - - function onInit() { - angular.forEach($scope.model.tabs, function(group){ - if(group.alias === "Contents") { - vm.listViewGroup = group; - } - }); - } - - onInit(); - - } - - angular.module("umbraco").controller("Umbraco.Editors.Media.Apps.ListViewController", MediaAppListViewController); -})(); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.html b/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.html index e463680ae6..6c558301c7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/apps/listview/listview.html @@ -1,8 +1,7 @@ -
+
- +
- \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/views/media/edit.html b/src/Umbraco.Web.UI.Client/src/views/media/edit.html index 3de3758af2..a9afde36ac 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/edit.html @@ -1,81 +1,74 @@
- + -
+ - + - - + + - + +
+
+ +
+
+
- - + -
+ - + + - - - - - - + - + - - + + - - + + - - - + + + - + - + -
+
-
-
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/mediatypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/mediatypes/edit.controller.js index 14b3a56c9b..c8aba53cf5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/mediatypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/mediatypes/edit.controller.js @@ -76,17 +76,20 @@ vm.page.navigation = [ { "name": vm.labels.design, + "alias": "design", "icon": "icon-document-dashed-line", "view": "views/mediatypes/views/design/design.html", "active": true }, { "name": vm.labels.listview, + "alias": "listView", "icon": "icon-list", "view": "views/mediatypes/views/listview/listview.html" }, { "name": vm.labels.permissions, + "alias": "permissions", "icon": "icon-keychain", "view": "views/mediatypes/views/permissions/permissions.html" } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index fb19131e96..0af61e9a0e 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -235,6 +235,7 @@ namespace Umbraco.Web.Editors } }; + //TODO: Change this over to use "Content Apps" TabsAndPropertiesResolver.AddListView(display.ContentVariants.First(), "content", "recycleBin", Services.DataTypeService, Services.TextService); return display; diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 94b88459f7..4482df0ec7 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -101,6 +101,7 @@ namespace Umbraco.Web.Editors Path = "-1," + Constants.System.RecycleBinMedia }; + //TODO: Change this over to use "Content Apps" TabsAndPropertiesResolver.AddListView(display, "media", "recycleBin", Services.DataTypeService, Services.TextService); return display; @@ -182,7 +183,7 @@ namespace Umbraco.Web.Editors /// /// /// - public PagedResult> GetChildFolders(int id, int pageNumber, int pageSize) + public PagedResult> GetChildFolders(int id, int pageNumber = 1, int pageSize = 1000) { //Suggested convention for folder mediatypes - we can make this more or less complicated as long as we document it... //if you create a media type, which has an alias that ends with ...Folder then its a folder: ex: "secureFolder", "bannerFolder", "Folder" diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 5d5367b3dc..f235f69020 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -138,6 +138,7 @@ namespace Umbraco.Web.Editors ParentId = -1 }; + //TODO: Change this over to use "Content Apps" TabsAndPropertiesResolver.AddListView(display, "member", listName, Services.DataTypeService, Services.TextService); return display; diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs index 3477b200cb..75b5a973fe 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs @@ -19,6 +19,12 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "view")] public string View { get; set; } + + /// + /// The view model specific to this app + /// + [DataMember(Name = "viewModel")] + public object ViewModel { get; set; } } } diff --git a/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs index ca58f81b91..2c7502151d 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using AutoMapper; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping @@ -24,13 +27,14 @@ namespace Umbraco.Web.Models.Mapping View = "views/content/apps/info/info.html" }; - private static readonly ContentApp _listViewApp = new ContentApp + private readonly IDataTypeService _dataTypeService; + private readonly PropertyEditorCollection _propertyEditorCollection; + + public ContentAppResolver(IDataTypeService dataTypeService, PropertyEditorCollection propertyEditorCollection) { - Alias = "childItems", - Name = "Child items", - Icon = "icon-list", - View = "views/content/apps/listview/listview.html" - }; + _dataTypeService = dataTypeService ?? throw new ArgumentNullException(nameof(dataTypeService)); + _propertyEditorCollection = propertyEditorCollection ?? throw new ArgumentNullException(nameof(propertyEditorCollection)); + } public IEnumerable Resolve(IContent source, ContentItemDisplay destination, IEnumerable destMember, ResolutionContext context) { @@ -42,7 +46,8 @@ namespace Umbraco.Web.Models.Mapping if (source.ContentType.IsContainer) { - apps.Add(_listViewApp); + //If it's a container then add the list view app and view model + apps.Add(this.CreateListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "content")); } return apps; diff --git a/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs new file mode 100644 index 0000000000..7e2ee0301c --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using AutoMapper; +using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models.Mapping +{ + internal static class ContentAppResolverExtensions + { + /// + /// Extension method to create a list view app for the content app collection + /// + /// + /// + /// + public static ContentApp CreateListViewApp( + this IValueResolver> resolver, + IDataTypeService dataTypeService, PropertyEditorCollection propertyEditors, + string contentTypeAlias, + string entityType) + where TContent: IContentBase + { + var listViewApp = new ContentApp + { + Alias = "childItems", + Name = "Child items", + Icon = "icon-list", + View = "views/content/apps/listview/listview.html" + }; + + var customDtdName = Core.Constants.Conventions.DataTypes.ListViewPrefix + contentTypeAlias; + var dtdId = Core.Constants.DataTypes.DefaultContentListView; + //first try to get the custom one if there is one + var dt = dataTypeService.GetDataType(customDtdName) + ?? dataTypeService.GetDataType(dtdId); + + if (dt == null) + { + throw new InvalidOperationException("No list view data type was found for this document type, ensure that the default list view data types exists and/or that your custom list view data type exists"); + } + + var editor = propertyEditors[dt.EditorAlias]; + if (editor == null) + { + throw new NullReferenceException("The property editor with alias " + dt.EditorAlias + " does not exist"); + } + + var listViewConfig = editor.GetConfigurationEditor().ToConfigurationEditor(dt.Configuration); + //add the entity type to the config + listViewConfig["entityType"] = entityType; + + //Override Tab Label if tabName is provided + if (listViewConfig.ContainsKey("tabName")) + { + var configTabName = listViewConfig["tabName"]; + if (configTabName != null && string.IsNullOrWhiteSpace(configTabName.ToString()) == false) + listViewApp.Name = configTabName.ToString(); + } + + //This is the view model used for the list view app + listViewApp.ViewModel = new List + { + new ContentPropertyDisplay + { + Alias = $"{Core.Constants.PropertyEditors.InternalGenericPropertiesPrefix}containerView", + Label = "", + Value = null, + View = editor.GetValueEditor().View, + HideLabel = true, + Config = listViewConfig + } + }; + + return listViewApp; + } + } + +} diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index b50df61eb5..622220ab78 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -3,6 +3,7 @@ using AutoMapper; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Trees; @@ -14,7 +15,15 @@ namespace Umbraco.Web.Models.Mapping /// internal class ContentMapperProfile : Profile { - public ContentMapperProfile(IUserService userService, ILocalizedTextService textService, IContentService contentService, IContentTypeService contentTypeService, IDataTypeService dataTypeService, ILocalizationService localizationService, ILogger logger) + public ContentMapperProfile( + IUserService userService, + ILocalizedTextService textService, + IContentService contentService, + IContentTypeService contentTypeService, + IDataTypeService dataTypeService, + ILocalizationService localizationService, + PropertyEditorCollection propertyEditors, + ILogger logger) { // create, capture, cache var contentOwnerResolver = new OwnerResolver(userService); @@ -27,17 +36,15 @@ namespace Umbraco.Web.Models.Mapping var defaultTemplateResolver = new DefaultTemplateResolver(); var contentUrlResolver = new ContentUrlResolver(textService, contentService, logger); var variantResolver = new ContentVariantResolver(localizationService, textService); - var contentAppResolver = new ContentAppResolver(); + var contentAppResolver = new ContentAppResolver(dataTypeService, propertyEditors); //FROM IContent TO ContentItemDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src))) - //.ForMember(dest => dest.Name, opt => opt.ResolveUsing()) .ForMember(dest => dest.ContentVariants, opt => opt.ResolveUsing(variantResolver)) .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(contentAppResolver)) - //.ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver)) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) .ForMember(dest => dest.ContentTypeName, opt => opt.MapFrom(src => src.ContentType.Name)) @@ -45,29 +52,19 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.IsBlueprint, opt => opt.MapFrom(src => src.Blueprint)) .ForMember(dest => dest.IsChildOfListView, opt => opt.ResolveUsing(childOfListViewResolver)) .ForMember(dest => dest.Trashed, opt => opt.MapFrom(src => src.Trashed)) - //TODO: The publish date needs to be per variant - in our display models - //.ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) .ForMember(dest => dest.TemplateAlias, opt => opt.ResolveUsing(defaultTemplateResolver)) .ForMember(dest => dest.Urls, opt => opt.ResolveUsing(contentUrlResolver)) - //.ForMember(dest => dest.Properties, opt => opt.Ignore()) .ForMember(dest => dest.AllowPreview, opt => opt.Ignore()) .ForMember(dest => dest.TreeNodeUrl, opt => opt.ResolveUsing(contentTreeNodeUrlResolver)) .ForMember(dest => dest.Notifications, opt => opt.Ignore()) .ForMember(dest => dest.Errors, opt => opt.Ignore()) - //.ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.DocumentType, opt => opt.ResolveUsing(contentTypeBasicResolver)) .ForMember(dest => dest.AllowedTemplates, opt => opt.MapFrom(content => content.ContentType.AllowedTemplates .Where(t => t.Alias.IsNullOrWhiteSpace() == false && t.Name.IsNullOrWhiteSpace() == false) .ToDictionary(t => t.Alias, t => t.Name))) - //.ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) .ForMember(dest => dest.AllowedActions, opt => opt.ResolveUsing(src => actionButtonsResolver.Resolve(src))) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); - //.AfterMap((content, display) => - //{ - // if (content.ContentType.IsContainer) - // TabsAndPropertiesResolver.AddListView(display, "content", dataTypeService, textService); - //}); CreateMap() .ForMember(dest => dest.PublishDate, opt => opt.MapFrom(src => src.PublishDate)) @@ -76,12 +73,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Segment, opt => opt.Ignore()) .ForMember(dest => dest.Language, opt => opt.Ignore()) .ForMember(dest => dest.IsEdited, opt => opt.Ignore()) - .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)) - .AfterMap((content, display) => - { - if (content.ContentType.IsContainer) - TabsAndPropertiesResolver.AddListView(display, content.ContentType.Alias, "content", dataTypeService, textService); - }); + .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)); //FROM IContent TO ContentItemBasic CreateMap>() diff --git a/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs index cbf8cd3aa2..0455c320c7 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs @@ -1,6 +1,9 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using AutoMapper; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; +using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Models.Mapping @@ -23,13 +26,14 @@ namespace Umbraco.Web.Models.Mapping View = "views/media/apps/info/info.html" }; - private static readonly ContentApp _listViewApp = new ContentApp + private readonly IDataTypeService _dataTypeService; + private readonly PropertyEditorCollection _propertyEditorCollection; + + public MediaAppResolver(IDataTypeService dataTypeService, PropertyEditorCollection propertyEditorCollection) { - Alias = "childItems", - Name = "Child items", - Icon = "icon-list", - View = "views/media/apps/listview/listview.html" - }; + _dataTypeService = dataTypeService ?? throw new ArgumentNullException(nameof(dataTypeService)); + _propertyEditorCollection = propertyEditorCollection ?? throw new ArgumentNullException(nameof(propertyEditorCollection)); + } public IEnumerable Resolve(IMedia source, MediaItemDisplay destination, IEnumerable destMember, ResolutionContext context) { @@ -37,7 +41,7 @@ namespace Umbraco.Web.Models.Mapping if (source.ContentType.IsContainer || source.ContentType.Alias == Umbraco.Core.Constants.Conventions.MediaTypes.Folder) { - apps.Add(_listViewApp); + apps.Add(this.CreateListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "media")); } else { diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index 4a5c5386f8..65fe8cf6a9 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -3,6 +3,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Trees; @@ -14,7 +15,14 @@ namespace Umbraco.Web.Models.Mapping /// internal class MediaMapperProfile : Profile { - public MediaMapperProfile(IUserService userService, ILocalizedTextService textService, IDataTypeService dataTypeService, IMediaService mediaService, IMediaTypeService mediaTypeService, ILogger logger) + public MediaMapperProfile( + IUserService userService, + ILocalizedTextService textService, + IDataTypeService dataTypeService, + IMediaService mediaService, + IMediaTypeService mediaTypeService, + PropertyEditorCollection propertyEditors, + ILogger logger) { // create, capture, cache var mediaOwnerResolver = new OwnerResolver(userService); @@ -22,7 +30,7 @@ namespace Umbraco.Web.Models.Mapping var childOfListViewResolver = new MediaChildOfListViewResolver(mediaService, mediaTypeService); var contentTreeNodeUrlResolver = new ContentTreeNodeUrlResolver(); var mediaTypeBasicResolver = new ContentTypeBasicResolver(); - var mediaAppResolver = new MediaAppResolver(); + var mediaAppResolver = new MediaAppResolver(dataTypeService, propertyEditors); //FROM IMedia TO MediaItemDisplay CreateMap() diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs index 1b5da1a398..aaa4239f8d 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs @@ -27,14 +27,7 @@ namespace Umbraco.Web.Models.Mapping IgnoreProperties = ignoreProperties ?? throw new ArgumentNullException(nameof(ignoreProperties)); } - /// - /// Adds the container (listview) tab to the document - /// - /// - /// - /// This must be either 'content' or 'media' - /// - /// + //TODO: Get rid of this it should not be needed anymore since list views are dynamically added to "content apps" internal static void AddListView( ITabbedContent display, string contentTypeAlias, string entityType, @@ -46,7 +39,6 @@ namespace Umbraco.Web.Models.Mapping { case "content": dtdId = Constants.DataTypes.DefaultContentListView; - break; case "media": dtdId = Constants.DataTypes.DefaultMediaListView; @@ -126,37 +118,6 @@ namespace Umbraco.Web.Models.Mapping return -1; } - //private static void SetChildItemsTabPosition(ITabbedContentItem display, - // IDictionary listViewConfig, - // Tab listViewTab) - //{ - // // Find position of tab from config - // var tabIndexForChildItems = GetTabNumberFromConfig(listViewConfig); - // if (tabIndexForChildItems != -1) - // { - // // Tab position is recorded 1-based but we insert into collection 0-based - // tabIndexForChildItems--; - - // // Ensure within bounds - // if (tabIndexForChildItems < 0) - // { - // tabIndexForChildItems = 0; - // } - - // if (tabIndexForChildItems > display.Tabs.Count()) - // { - // tabIndexForChildItems = display.Tabs.Count(); - // } - // } - // else tabIndexForChildItems = 0; - - // // Recreate tab list with child items tab at configured position - // var tabs = new List>(); - // tabs.AddRange(display.Tabs); - // tabs.Insert(tabIndexForChildItems, listViewTab); - // display.Tabs = tabs; - //} - /// /// Returns a collection of custom generic properties that exist on the generic properties tab /// diff --git a/src/Umbraco.Web/PropertyEditors/ListViewConfiguration.cs b/src/Umbraco.Web/PropertyEditors/ListViewConfiguration.cs index cec8f232d3..b8811ec69c 100644 --- a/src/Umbraco.Web/PropertyEditors/ListViewConfiguration.cs +++ b/src/Umbraco.Web/PropertyEditors/ListViewConfiguration.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.PropertyEditors public BulkActionPermissionSettings BulkActionPermissions { get; set; } = new BulkActionPermissionSettings(); // fixme managing defaults? [ConfigurationField("tabName", "Tab Name", "textstring", Description = "The name of the listview tab (default if empty: 'Child Items')")] - public int TabName { get; set; } + public string TabName { get; set; } public class Property { @@ -83,4 +83,4 @@ namespace Umbraco.Web.PropertyEditors public bool AllowBulkDelete { get; set; } = true; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 158137724f..b754d7ed26 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -240,6 +240,7 @@ + From 45f959fb6baa4771843a16599abdea52a633e126 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 17 Jul 2018 11:53:46 +1000 Subject: [PATCH 007/275] updates tests --- .../ContentModelSerializationTests.cs | 121 +++++++++--------- 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs index f344360c18..7d94943a6d 100644 --- a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs @@ -11,67 +11,74 @@ namespace Umbraco.Tests.Web.AngularIntegration [TestFixture] public class ContentModelSerializationTests { - //[Test] - //public void Content_Display_To_Json() - //{ - // //create 3 tabs with 3 properties each - // var tabs = new List>(); - // for (var tabIndex = 0; tabIndex < 3; tabIndex ++) - // { - // var props = new List(); - // for (var propertyIndex = 0; propertyIndex < 3; propertyIndex ++) - // { - // props.Add(new ContentPropertyDisplay - // { - // Alias = "property" + propertyIndex, - // Label = "Property " + propertyIndex, - // Id = propertyIndex, - // Value = "value" + propertyIndex, - // Config = new Dictionary {{ propertyIndex.ToInvariantString(), "value" }}, - // Description = "Description " + propertyIndex, - // View = "~/Views/View" + propertyIndex, - // HideLabel = false - // }); - // } - // tabs.Add(new Tab() - // { - // Alias = "Tab" + tabIndex, - // Label = "Tab" + tabIndex, - // Properties = props - // }); - // } + [Test] + public void Content_Display_To_Json() + { + //create 3 tabs with 3 properties each + var tabs = new List>(); + for (var tabIndex = 0; tabIndex < 3; tabIndex++) + { + var props = new List(); + for (var propertyIndex = 0; propertyIndex < 3; propertyIndex++) + { + props.Add(new ContentPropertyDisplay + { + Alias = "property" + propertyIndex, + Label = "Property " + propertyIndex, + Id = propertyIndex, + Value = "value" + propertyIndex, + Config = new Dictionary { { propertyIndex.ToInvariantString(), "value" } }, + Description = "Description " + propertyIndex, + View = "~/Views/View" + propertyIndex, + HideLabel = false + }); + } + tabs.Add(new Tab() + { + Alias = "Tab" + tabIndex, + Label = "Tab" + tabIndex, + Properties = props + }); + } - // var displayModel = new ContentItemDisplay - // { - // Id = 1234, - // Name = "Test", - // Tabs = tabs - // }; + var displayModel = new ContentItemDisplay + { + Id = 1234, + ContentVariants = new List + { + new ContentVariantDisplay + { + Name = "Test", + Tabs = tabs + } + } + }; - // var json = JsonConvert.SerializeObject(displayModel); + var json = JsonConvert.SerializeObject(displayModel); - // var jObject = JObject.Parse(json); + var jObject = JObject.Parse(json); - // Assert.AreEqual("1234", jObject["id"].ToString()); - // Assert.AreEqual("Test", jObject["name"].ToString()); - // Assert.AreEqual(3, jObject["tabs"].Count()); - // for (var tab = 0; tab < jObject["tabs"].Count(); tab++) - // { - // Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["alias"].ToString()); - // Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["label"].ToString()); - // Assert.AreEqual(3, jObject["tabs"][tab]["properties"].Count()); - // for (var prop = 0; prop < jObject["tabs"][tab]["properties"].Count(); prop++) - // { - // Assert.AreEqual("property" + prop, jObject["tabs"][tab]["properties"][prop]["alias"].ToString()); - // Assert.AreEqual("Property " + prop, jObject["tabs"][tab]["properties"][prop]["label"].ToString()); - // Assert.AreEqual(prop, jObject["tabs"][tab]["properties"][prop]["id"].Value()); - // Assert.AreEqual("value" + prop, jObject["tabs"][tab]["properties"][prop]["value"].ToString()); - // Assert.AreEqual("{\"" + prop + "\":\"value\"}", jObject["tabs"][tab]["properties"][prop]["config"].ToString(Formatting.None)); - // Assert.AreEqual("Description " + prop, jObject["tabs"][tab]["properties"][prop]["description"].ToString()); - // Assert.AreEqual(false, jObject["tabs"][tab]["properties"][prop]["hideLabel"].Value()); - // } - // } - //} + Assert.AreEqual("1234", jObject["id"].ToString()); + Assert.AreEqual("Test", jObject["variants"][0]["name"].ToString()); + var jsonTabs = jObject["variants"][0]["tabs"]; + Assert.AreEqual(3, jsonTabs.Count()); + for (var tab = 0; tab < jsonTabs.Count(); tab++) + { + Assert.AreEqual("Tab" + tab, jsonTabs[tab]["alias"].ToString()); + Assert.AreEqual("Tab" + tab, jsonTabs[tab]["label"].ToString()); + Assert.AreEqual(3, jsonTabs[tab]["properties"].Count()); + for (var prop = 0; prop < jsonTabs[tab]["properties"].Count(); prop++) + { + Assert.AreEqual("property" + prop, jsonTabs[tab]["properties"][prop]["alias"].ToString()); + Assert.AreEqual("Property " + prop, jsonTabs[tab]["properties"][prop]["label"].ToString()); + Assert.AreEqual(prop, jsonTabs[tab]["properties"][prop]["id"].Value()); + Assert.AreEqual("value" + prop, jsonTabs[tab]["properties"][prop]["value"].ToString()); + Assert.AreEqual("{\"" + prop + "\":\"value\"}", jsonTabs[tab]["properties"][prop]["config"].ToString(Formatting.None)); + Assert.AreEqual("Description " + prop, jsonTabs[tab]["properties"][prop]["description"].ToString()); + Assert.AreEqual(false, jsonTabs[tab]["properties"][prop]["hideLabel"].Value()); + } + } + } } } From e9752cd5e1c894f6828e44670c867befd66f3ca1 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 17 Jul 2018 14:23:07 +1000 Subject: [PATCH 008/275] Gets all list views working correctly with content apps, fixes various issues, cleans up a bunch of code and reduces amount of service locator. --- .../Migrations/Install/DatabaseDataCreator.cs | 4 - src/Umbraco.Examine/UmbracoExamineIndexer.cs | 2 + .../validation/valformmanager.directive.js | 3 - .../content/content.recyclebin.controller.js | 11 +-- .../src/views/content/recyclebin.html | 25 +++--- .../media/media.recyclebin.controller.js | 11 +-- .../src/views/media/recyclebin.html | 22 +++--- .../src/views/member/list.html | 41 ++++------ .../src/views/member/listview/listview.html | 7 ++ .../propertyeditors/listview/listview.html | 2 +- src/Umbraco.Web/Editors/ContentController.cs | 17 ++-- src/Umbraco.Web/Editors/MediaController.cs | 17 +++- src/Umbraco.Web/Editors/MemberController.cs | 18 ++++- .../Models/ContentEditing/ContentApp.cs | 6 ++ .../ContentEditing/MemberListDisplay.cs | 5 +- .../Models/Mapping/ContentAppResolver.cs | 2 +- .../Mapping/ContentAppResolverExtensions.cs | 14 ++-- .../Models/Mapping/MediaAppResolver.cs | 4 +- .../Models/Mapping/MediaMapperProfile.cs | 7 +- .../Mapping/TabsAndPropertiesResolver.cs | 79 +------------------ .../WebApi/Binders/ContentItemBaseBinder.cs | 58 ++++++-------- .../WebApi/Binders/ContentItemBinder.cs | 18 ++++- .../WebApi/Binders/MediaItemBinder.cs | 11 +++ .../WebApi/Binders/MemberBinder.cs | 22 ++++-- .../Filters/ContentItemValidationHelper.cs | 13 ++- 25 files changed, 189 insertions(+), 230 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/member/listview/listview.html diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs index 32f8459b37..fbea592361 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs @@ -205,8 +205,6 @@ namespace Umbraco.Core.Migrations.Install { _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 3, ContentTypeNodeId = 1032, Text = "Image", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Image) }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 4, ContentTypeNodeId = 1033, Text = "File", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.File) }); - //TODO: Need a migration to remove this - //_database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 5, ContentTypeNodeId = 1031, Text = "Contents", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Contents) }); //membership property group _database.Insert(Constants.DatabaseSchema.Tables.PropertyTypeGroup, "id", false, new PropertyTypeGroupDto { Id = 11, ContentTypeNodeId = 1044, Text = "Membership", SortOrder = 1, UniqueId = new Guid(Constants.PropertyTypeGroups.Membership) }); } @@ -221,8 +219,6 @@ namespace Umbraco.Core.Migrations.Install _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 24, UniqueId = 24.ToGuid(), DataTypeId = -90, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.File, Name = "Upload file", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 25, UniqueId = 25.ToGuid(), DataTypeId = -92, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Extension, Name = "Type", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 26, UniqueId = 26.ToGuid(), DataTypeId = Constants.DataTypes.LabelBigint, ContentTypeId = 1033, PropertyTypeGroupId = 4, Alias = Constants.Conventions.Media.Bytes, Name = "Size", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); - //TODO: Need a migration to remove this - //_database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 27, UniqueId = 27.ToGuid(), DataTypeId = Constants.DataTypes.DefaultMediaListView, ContentTypeId = 1031, PropertyTypeGroupId = 5, Alias = "contents", Name = "Contents:", SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); //membership property types _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 28, UniqueId = 28.ToGuid(), DataTypeId = -89, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.Comments, Name = Constants.Conventions.Member.CommentsLabel, SortOrder = 0, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); _database.Insert(Constants.DatabaseSchema.Tables.PropertyType, "id", false, new PropertyTypeDto { Id = 29, UniqueId = 29.ToGuid(), DataTypeId = Constants.DataTypes.LabelInt, ContentTypeId = 1044, PropertyTypeGroupId = 11, Alias = Constants.Conventions.Member.FailedPasswordAttempts, Name = Constants.Conventions.Member.FailedPasswordAttemptsLabel, SortOrder = 1, Mandatory = false, ValidationRegExp = null, Description = null, Variations = (byte) ContentVariation.Nothing }); diff --git a/src/Umbraco.Examine/UmbracoExamineIndexer.cs b/src/Umbraco.Examine/UmbracoExamineIndexer.cs index 1c4624add2..0219ace270 100644 --- a/src/Umbraco.Examine/UmbracoExamineIndexer.cs +++ b/src/Umbraco.Examine/UmbracoExamineIndexer.cs @@ -389,6 +389,8 @@ namespace Umbraco.Examine //the value of the field 'as-is'. foreach (var value in e.IndexItem.ValueSet.Values.ToList()) //ToList here to make a diff collection else we'll get collection modified errors { + if (value.Value == null) continue; + if (value.Value.Count > 0) { if (value.Value.First() is string str) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js index e319d55d09..726103caf9 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js @@ -113,9 +113,6 @@ function valFormManager(serverValidationManager, $rootScope, $log, $timeout, not var nextPath = nextLocation.split("#")[1]; - //TODO: We need to check for the query strings that cause the route, if they are just the - //nonRoutingQueryStrings when we shouldn't show the confirm route change - if (nextPath) { if (navigationService.isRouteChangingNavigation(currentLocation, nextLocation)) { diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.recyclebin.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.recyclebin.controller.js index 4a8c50db39..ab3f5cc04a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.recyclebin.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.recyclebin.controller.js @@ -22,18 +22,9 @@ function ContentRecycleBinController($scope, $routeParams, contentResource, navi $routeParams.id = "-20"; contentResource.getRecycleBin().then(function (result) { - //we'll get the 'content item' for the recycle bin, we know that it will contain a single tab and a - // single property, so we'll extract that property (list view) and use it's data. - var listproperty = result.tabs[0].properties[0]; - - _.each(listproperty.config, function (val, key) { - $scope.model.config[key] = val; - }); - $scope.listViewPath = 'views/propertyeditors/listview/listview.html'; + $scope.content = result; }); - $scope.model = { config: { entityType: $routeParams.section, layouts: [] } }; - // sync tree node navigationService.syncTree({ tree: "content", path: ["-1", $routeParams.id], forceReload: false }); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/recyclebin.html b/src/Umbraco.Web.UI.Client/src/views/content/recyclebin.html index 3dd5e846a8..2981097656 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/recyclebin.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/recyclebin.html @@ -1,19 +1,20 @@ -
+ - + - - +
+
+ +
+
- + -
\ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.recyclebin.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.recyclebin.controller.js index 4e54bd832a..00e09bd34d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.recyclebin.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.recyclebin.controller.js @@ -22,18 +22,9 @@ function MediaRecycleBinController($scope, $routeParams, mediaResource, navigati $routeParams.id = "-21"; mediaResource.getRecycleBin().then(function (result) { - //we'll get the 'content item' for the recycle bin, we know that it will contain a single tab and a - // single property, so we'll extract that property (list view) and use it's data. - var listproperty = result.tabs[0].properties[0]; - - _.each(listproperty.config, function (val, key) { - $scope.model.config[key] = val; - }); - $scope.listViewPath = 'views/propertyeditors/listview/listview.html'; + $scope.content = result; }); - $scope.model = { config: { entityType: $routeParams.section, layouts: [] } }; - // sync tree node navigationService.syncTree({ tree: "media", path: ["-1", $routeParams.id], forceReload: false }); diff --git a/src/Umbraco.Web.UI.Client/src/views/media/recyclebin.html b/src/Umbraco.Web.UI.Client/src/views/media/recyclebin.html index 16649f214a..cd4ad6d07e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/recyclebin.html +++ b/src/Umbraco.Web.UI.Client/src/views/media/recyclebin.html @@ -1,16 +1,20 @@ -
- - + + + + -
+
+
+ +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/member/list.html b/src/Umbraco.Web.UI.Client/src/views/member/list.html index ef2fc716a1..a61614e8f5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/member/list.html +++ b/src/Umbraco.Web.UI.Client/src/views/member/list.html @@ -4,33 +4,26 @@
- + - - + + - + +
+
+ +
+
+
- - - - - - - - - - -
- -
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/member/listview/listview.html b/src/Umbraco.Web.UI.Client/src/views/member/listview/listview.html new file mode 100644 index 0000000000..6c558301c7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/member/listview/listview.html @@ -0,0 +1,7 @@ +
+ + + + + +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html index ba95610f24..a7ba9a329f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html @@ -10,7 +10,7 @@ - +
Create diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 0af61e9a0e..07d3fc45bb 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -30,6 +30,7 @@ using Umbraco.Web._Legacy.Actions; using Constants = Umbraco.Core.Constants; using ContentVariation = Umbraco.Core.Models.ContentVariation; using Language = Umbraco.Web.Models.ContentEditing.Language; +using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.Editors { @@ -46,11 +47,13 @@ namespace Umbraco.Web.Editors public class ContentController : ContentControllerBase { private readonly IPublishedSnapshotService _publishedSnapshotService; + private readonly PropertyEditorCollection _propertyEditors; - public ContentController(IPublishedSnapshotService publishedSnapshotService) + public ContentController(IPublishedSnapshotService publishedSnapshotService, PropertyEditorCollection propertyEditors) { if (publishedSnapshotService == null) throw new ArgumentNullException(nameof(publishedSnapshotService)); _publishedSnapshotService = publishedSnapshotService; + _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); } /// @@ -215,14 +218,14 @@ namespace Umbraco.Web.Editors /// public ContentItemDisplay GetRecycleBin() { + var apps = new List(); + apps.AppendListViewApp(Services.DataTypeService, _propertyEditors, "recycleBin", "content"); + apps[0].Active = true; var display = new ContentItemDisplay { Id = Constants.System.RecycleBinContent, - //Alias = "recycleBin", ParentId = -1, - //Name = Services.TextService.Localize("general/recycleBin"), ContentTypeAlias = "recycleBin", - //CreateDate = DateTime.Now, IsContainer = true, Path = "-1," + Constants.System.RecycleBinContent, ContentVariants = new List @@ -232,12 +235,10 @@ namespace Umbraco.Web.Editors CreateDate = DateTime.Now, Name = Services.TextService.Localize("general/recycleBin") } - } + }, + ContentApps = apps }; - //TODO: Change this over to use "Content Apps" - TabsAndPropertiesResolver.AddListView(display.ContentVariants.First(), "content", "recycleBin", Services.DataTypeService, Services.TextService); - return display; } diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 4482df0ec7..2d5ac19ba8 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -34,6 +34,7 @@ using Umbraco.Core.Persistence; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.Editors; using Umbraco.Core.Models.Validation; +using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.Editors { @@ -46,6 +47,11 @@ namespace Umbraco.Web.Editors [MediaControllerControllerConfiguration] public class MediaController : ContentControllerBase { + public MediaController(PropertyEditorCollection propertyEditors) + { + _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); + } + /// /// Configures this controller with a custom action selector /// @@ -89,6 +95,9 @@ namespace Umbraco.Web.Editors /// public MediaItemDisplay GetRecycleBin() { + var apps = new List(); + apps.AppendListViewApp(Services.DataTypeService, _propertyEditors, "recycleBin", "media"); + apps[0].Active = true; var display = new MediaItemDisplay { Id = Constants.System.RecycleBinMedia, @@ -98,12 +107,10 @@ namespace Umbraco.Web.Editors ContentTypeAlias = "recycleBin", CreateDate = DateTime.Now, IsContainer = true, - Path = "-1," + Constants.System.RecycleBinMedia + Path = "-1," + Constants.System.RecycleBinMedia, + ContentApps = apps }; - //TODO: Change this over to use "Content Apps" - TabsAndPropertiesResolver.AddListView(display, "media", "recycleBin", Services.DataTypeService, Services.TextService); - return display; } @@ -222,6 +229,8 @@ namespace Umbraco.Web.Editors #region GetChildren private int[] _userStartNodes; + private readonly PropertyEditorCollection _propertyEditors; + protected int[] UserStartNodes { get { return _userStartNodes ?? (_userStartNodes = Security.CurrentUser.CalculateMediaStartNodeIds(Services.EntityService)); } diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index f235f69020..7cf0e73e3c 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -26,6 +26,8 @@ using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; +using System.Collections.Generic; +using Umbraco.Core.PropertyEditors; namespace Umbraco.Web.Editors { @@ -38,7 +40,13 @@ namespace Umbraco.Web.Editors [OutgoingNoHyphenGuidFormat] public class MemberController : ContentControllerBase { + public MemberController(PropertyEditorCollection propertyEditors) + { + _propertyEditors = propertyEditors ?? throw new ArgumentNullException(nameof(propertyEditors)); + } + private readonly MembershipProvider _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + private readonly PropertyEditorCollection _propertyEditors; /// /// Returns the currently configured membership scenario for members in umbraco @@ -127,6 +135,10 @@ namespace Umbraco.Web.Editors var foundType = Services.MemberTypeService.Get(listName); var name = foundType != null ? foundType.Name : listName; + var apps = new List(); + apps.AppendListViewApp(Services.DataTypeService, _propertyEditors, listName, "member"); + apps[0].Active = true; + var display = new MemberListDisplay { ContentTypeAlias = listName, @@ -135,12 +147,10 @@ namespace Umbraco.Web.Editors IsContainer = true, Name = listName == Constants.Conventions.MemberTypes.AllMembersListId ? "All Members" : name, Path = "-1," + listName, - ParentId = -1 + ParentId = -1, + ContentApps = apps }; - //TODO: Change this over to use "Content Apps" - TabsAndPropertiesResolver.AddListView(display, "member", listName, Services.DataTypeService, Services.TextService); - return display; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs index 75b5a973fe..f95d6ac6fd 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentApp.cs @@ -25,6 +25,12 @@ namespace Umbraco.Web.Models.ContentEditing /// [DataMember(Name = "viewModel")] public object ViewModel { get; set; } + + /// + /// Normally reserved for Angular to deal with but in some cases this can be set on the server side + /// + [DataMember(Name = "active")] + public bool Active { get; set; } } } diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs index c46d5d71fb..5a851d996b 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs @@ -1,4 +1,5 @@ -using System.Runtime.Serialization; +using System.Collections.Generic; +using System.Runtime.Serialization; using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing @@ -9,5 +10,7 @@ namespace Umbraco.Web.Models.ContentEditing [DataContract(Name = "content", Namespace = "")] public class MemberListDisplay : ContentItemDisplayBase { + [DataMember(Name = "apps")] + public IEnumerable ContentApps { get; set; } } } diff --git a/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs index 2c7502151d..ae8089e459 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentAppResolver.cs @@ -47,7 +47,7 @@ namespace Umbraco.Web.Models.Mapping if (source.ContentType.IsContainer) { //If it's a container then add the list view app and view model - apps.Add(this.CreateListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "content")); + apps.AppendListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "content"); } return apps; diff --git a/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs b/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs index 7e2ee0301c..8fc77beb6b 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentAppResolverExtensions.cs @@ -11,17 +11,13 @@ namespace Umbraco.Web.Models.Mapping internal static class ContentAppResolverExtensions { /// - /// Extension method to create a list view app for the content app collection + /// Helper method to append a list view app to the content app collection /// - /// - /// /// - public static ContentApp CreateListViewApp( - this IValueResolver> resolver, + public static void AppendListViewApp( + this ICollection list, IDataTypeService dataTypeService, PropertyEditorCollection propertyEditors, - string contentTypeAlias, - string entityType) - where TContent: IContentBase + string contentTypeAlias, string entityType) { var listViewApp = new ContentApp { @@ -74,7 +70,7 @@ namespace Umbraco.Web.Models.Mapping } }; - return listViewApp; + list.Add(listViewApp); } } diff --git a/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs index 0455c320c7..6880aff9a8 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaAppResolver.cs @@ -39,9 +39,9 @@ namespace Umbraco.Web.Models.Mapping { var apps = new List(); - if (source.ContentType.IsContainer || source.ContentType.Alias == Umbraco.Core.Constants.Conventions.MediaTypes.Folder) + if (source.ContentType.IsContainer || source.ContentType.Alias == Core.Constants.Conventions.MediaTypes.Folder) { - apps.Add(this.CreateListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "media")); + apps.AppendListViewApp(_dataTypeService, _propertyEditorCollection, source.ContentType.Alias, "media"); } else { diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index 65fe8cf6a9..1b0d5cb35e 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -54,12 +54,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()) .ForMember(dest => dest.ContentType, opt => opt.ResolveUsing(mediaTypeBasicResolver)) .ForMember(dest => dest.MediaLink, opt => opt.ResolveUsing(content => string.Join(",", content.GetUrls(UmbracoConfig.For.UmbracoSettings().Content, logger)))) - .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver)) - .AfterMap((media, display) => - { - //if (media.ContentType.IsContainer) - // TabsAndPropertiesResolver.AddListView(display, "media", dataTypeService, textService); - }); + .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver)); //FROM IMedia TO ContentItemBasic CreateMap>() diff --git a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs index aaa4239f8d..417466231c 100644 --- a/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/TabsAndPropertiesResolver.cs @@ -26,84 +26,7 @@ namespace Umbraco.Web.Models.Mapping { IgnoreProperties = ignoreProperties ?? throw new ArgumentNullException(nameof(ignoreProperties)); } - - //TODO: Get rid of this it should not be needed anymore since list views are dynamically added to "content apps" - internal static void AddListView( - ITabbedContent display, - string contentTypeAlias, string entityType, - IDataTypeService dataTypeService, ILocalizedTextService localizedTextService) - { - int dtdId; - var customDtdName = Constants.Conventions.DataTypes.ListViewPrefix + contentTypeAlias; - switch (entityType) - { - case "content": - dtdId = Constants.DataTypes.DefaultContentListView; - break; - case "media": - dtdId = Constants.DataTypes.DefaultMediaListView; - break; - case "member": - dtdId = Constants.DataTypes.DefaultMembersListView; - break; - default: - throw new ArgumentOutOfRangeException(nameof(entityType), "entityType does not match a required value"); - } - - //first try to get the custom one if there is one - var dt = dataTypeService.GetDataType(customDtdName) - ?? dataTypeService.GetDataType(dtdId); - - if (dt == null) - { - throw new InvalidOperationException("No list view data type was found for this document type, ensure that the default list view data types exists and/or that your custom list view data type exists"); - } - - var editor = Current.PropertyEditors[dt.EditorAlias]; - if (editor == null) - { - throw new NullReferenceException("The property editor with alias " + dt.EditorAlias + " does not exist"); - } - - //TODO: We need to move this logic elsewhere, we don't want to have to add a list view to a tab that will - // get removed later and magically move to the ListView ContentApp. The ListView ContentApp will need to - // manage this data somehow so a content app will also need to be able to specify it's own model. - - //var listViewTab = new Tab - //{ - // Alias = Constants.Conventions.PropertyGroups.ListViewGroupName, - // Label = localizedTextService.Localize("content/childItems"), - // Id = display.Tabs.Count() + 1, - // IsActive = true - //}; - - //var listViewConfig = editor.GetConfigurationEditor().ToConfigurationEditor(dt.Configuration); - ////add the entity type to the config - //listViewConfig["entityType"] = entityType; - - ////Override Tab Label if tabName is provided - //if (listViewConfig.ContainsKey("tabName")) - //{ - // var configTabName = listViewConfig["tabName"]; - // if (configTabName != null && string.IsNullOrWhiteSpace(configTabName.ToString()) == false) - // listViewTab.Label = configTabName.ToString(); - //} - - //var listViewProperties = new List(); - //listViewProperties.Add(new ContentPropertyDisplay - //{ - // Alias = $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}containerView", - // Label = "", - // Value = null, - // View = editor.GetValueEditor().View, - // HideLabel = true, - // Config = listViewConfig - //}); - //listViewTab.Properties = listViewProperties; - - //SetChildItemsTabPosition(display, listViewConfig, listViewTab); - } - + private static int GetTabNumberFromConfig(IDictionary listViewConfig) { if (!listViewConfig.TryGetValue("displayAtTabNumber", out var displayTabNum)) diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs index 0e3d8274fe..0607b0157e 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs @@ -43,7 +43,20 @@ namespace Umbraco.Web.WebApi.Binders where TPersisted : class, IContentBase where TModelSave : ContentBaseItemSave { - protected ServiceContext Services => Current.Services; // fixme - inject + protected Core.Logging.ILogger Logger { get; } + protected ServiceContext Services { get; } + protected IUmbracoContextAccessor UmbracoContextAccessor { get; } + + public ContentItemBaseBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public ContentItemBaseBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + { + Logger = logger; + Services = services; + UmbracoContextAccessor = umbracoContextAccessor; + } public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { @@ -58,29 +71,18 @@ namespace Umbraco.Web.WebApi.Binders Directory.CreateDirectory(root); var provider = new MultipartFormDataStreamProvider(root); - var task = Task.Run(() => GetModelAsync(actionContext, bindingContext, provider)) - .ContinueWith(x => - { - if (x.IsFaulted && x.Exception != null) - { - throw x.Exception; - } - - //now that everything is binded, validate the properties - var contentItemValidator = GetValidationHelper(); - contentItemValidator.ValidateItem(actionContext, x.Result); - - bindingContext.Model = x.Result; - }); - - task.Wait(); + var model = GetModel(actionContext, bindingContext, provider); + //now that everything is binded, validate the properties + var contentItemValidator = GetValidationHelper(); + contentItemValidator.ValidateItem(actionContext, model); + bindingContext.Model = model; return bindingContext.Model != null; } protected virtual ContentItemValidationHelper GetValidationHelper() { - return new ContentItemValidationHelper(); + return new ContentItemValidationHelper(Logger, UmbracoContextAccessor); } /// @@ -90,29 +92,13 @@ namespace Umbraco.Web.WebApi.Binders /// /// /// - private async Task GetModelAsync(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider provider) + private TModelSave GetModel(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider provider) { - // note - // - // for some reason, due to the way we do async, HttpContext.Current is null - // which means that the 'current' UmbracoContext is null too since we are using HttpContextUmbracoContextAccessor - // trying to 'EnsureContext' fails because that accessor cannot access the HttpContext either to register the current UmbracoContext - // - // so either we go with an HybridUmbracoContextAccessor that relies on a ThreadStatic variable when HttpContext.Current is null - // and I don't like it - // or - // we try to force-set the current http context, because, hey... it's there. - // and then there is no need to event 'Ensure' anything - // read http://stackoverflow.com/questions/1992141/how-do-i-get-an-httpcontext-object-from-httpcontextbase-in-asp-net-mvc-1 - - // what's below works but I cannot say I am proud of it var request = actionContext.Request; - var httpContext = (HttpContextBase) request.Properties["MS_HttpContext"]; - HttpContext.Current = httpContext.ApplicationInstance.Context; var content = request.Content; - var result = await content.ReadAsMultipartAsync(provider); + var result = content.ReadAsMultipartAsync(provider).Result; if (result.FormData["contentItem"] == null) { diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs index 1df1445979..6e80ba52f7 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs @@ -5,7 +5,10 @@ using System.Net.Http; using System.Web.Http.Controllers; using AutoMapper; using Umbraco.Core; +using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Services; +using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; using Umbraco.Web.WebApi.Filters; @@ -14,9 +17,18 @@ namespace Umbraco.Web.WebApi.Binders { internal class ContentItemBinder : ContentItemBaseBinder { + public ContentItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public ContentItemBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + : base(logger, services, umbracoContextAccessor) + { + } + protected override ContentItemValidationHelper GetValidationHelper() { - return new ContentValidationHelper(); + return new ContentValidationHelper(Logger, UmbracoContextAccessor); } protected override IContent GetExisting(ContentItemSave model) @@ -49,6 +61,10 @@ namespace Umbraco.Web.WebApi.Binders internal class ContentValidationHelper : ContentItemValidationHelper { + public ContentValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) + { + } + /// /// Validates that the correct information is in the request for saving a culture variant /// diff --git a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs index 02620f348a..61dd0897db 100644 --- a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs @@ -2,6 +2,8 @@ using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Services; +using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; @@ -9,6 +11,15 @@ namespace Umbraco.Web.WebApi.Binders { internal class MediaItemBinder : ContentItemBaseBinder { + public MediaItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public MediaItemBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + : base(logger, services, umbracoContextAccessor) + { + } + protected override IMedia GetExisting(MediaItemSave model) { return Services.MediaService.GetById(Convert.ToInt32(model.Id)); diff --git a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs index 161f579bc2..df97891e3b 100644 --- a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs @@ -19,14 +19,25 @@ using Umbraco.Core.Models.Membership; using Umbraco.Core.Services.Implement; using Umbraco.Web; using Umbraco.Web.Composing; +using Umbraco.Core.Logging; namespace Umbraco.Web.WebApi.Binders { internal class MemberBinder : ContentItemBaseBinder { + + public MemberBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public MemberBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + : base(logger, services, umbracoContextAccessor) + { + } + protected override ContentItemValidationHelper GetValidationHelper() { - return new MemberValidationHelper(); + return new MemberValidationHelper(Logger, UmbracoContextAccessor); } /// @@ -179,6 +190,10 @@ namespace Umbraco.Web.WebApi.Binders /// internal class MemberValidationHelper : ContentItemValidationHelper { + public MemberValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) + { + } + /// /// We need to manually validate a few things here like email and login to make sure they are valid and aren't duplicates /// @@ -244,12 +259,9 @@ namespace Umbraco.Web.WebApi.Binders propertiesToValidate.RemoveAll(property => property.Alias == remove); } - - var umbCtx = Current.UmbracoContext; // fixme inject? - //if the user doesn't have access to sensitive values, then we need to validate the incoming properties to check //if a sensitive value is being submitted. - if (umbCtx.Security.CurrentUser.HasAccessToSensitiveData() == false) + if (UmbracoContextAccessor.UmbracoContext.Security.CurrentUser.HasAccessToSensitiveData() == false) { var sensitiveProperties = postedItem.PersistedContent.ContentType .PropertyTypes.Where(x => postedItem.PersistedContent.ContentType.IsSensitiveProperty(x.Alias)) diff --git a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs b/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs index e97289b24c..3eaf28a77b 100644 --- a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs +++ b/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs @@ -26,6 +26,14 @@ namespace Umbraco.Web.WebApi.Filters where TPersisted : class, IContentBase where TModelSave : ContentBaseItemSave { + protected IUmbracoContextAccessor UmbracoContextAccessor { get; } + protected ILogger Logger { get; } + + public ContentItemValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) + { + Logger = logger ?? throw new ArgumentNullException(nameof(logger)); + UmbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); + } /// /// Validates the content item and updates the Response and ModelState accordingly @@ -94,7 +102,7 @@ namespace Umbraco.Web.WebApi.Filters /// /// /// - protected bool ValidateProperties(List postedProperties , List persistedProperties, HttpActionContext actionContext) + protected bool ValidateProperties(List postedProperties, List persistedProperties, HttpActionContext actionContext) { foreach (var p in postedProperties) { @@ -131,7 +139,8 @@ namespace Umbraco.Web.WebApi.Filters if (editor == null) { var message = $"Could not find property editor \"{p.DataType.EditorAlias}\" for property with id {p.Id}."; - Current.Logger.Warn>(message); + + Logger.Warn>(message); continue; } From e2bcf59b0f2df1333630895079cd1f52d3893f80 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 17 Jul 2018 15:33:57 +1000 Subject: [PATCH 009/275] Fixes and documents the odd async usage for reading multipart in a model binder, fixes up navigation.service checks and adds unit tests for that --- .../src/common/services/navigation.service.js | 6 ++- .../services/navigation-service.spec.js | 50 ++++++++++++++++++ .../WebApi/Binders/ContentItemBaseBinder.cs | 52 +++++++++++++++---- 3 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/test/unit/common/services/navigation-service.spec.js diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js index 275c9ca242..74e8f7d1a5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js @@ -153,9 +153,11 @@ function navigationService($rootScope, $route, $routeParams, $log, $location, $q //If any of the other parts have changed we do not cancel var currRoutingKeys = _.difference(_.keys(currUrlParams), nonRoutingQueryStrings); var nextRoutingKeys = _.difference(_.keys(nextUrlParams), nonRoutingQueryStrings); - var diff = _.difference(currRoutingKeys, nextRoutingKeys); + var diff1 = _.difference(currRoutingKeys, nextRoutingKeys); + var diff2 = _.difference(nextRoutingKeys, currRoutingKeys); + //if the routing parameter keys are the same, we'll compare their values to see if any have changed and if so then the routing will be allowed. - if (diff.length == 0) { + if (diff1.length === 0 && diff2.length === 0) { var partsChanged = 0; _.each(currRoutingKeys, function (k) { if (currUrlParams[k] != nextUrlParams[k]) { diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/navigation-service.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/navigation-service.spec.js new file mode 100644 index 0000000000..b09d867d8d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/navigation-service.spec.js @@ -0,0 +1,50 @@ +describe('navigation services tests', function () { + var navigationService; + + beforeEach(module('umbraco.services')); + beforeEach(module('ngRoute')); + + beforeEach(inject(function ($injector) { + navigationService = $injector.get('navigationService'); + })); + + describe('determine if route change causes navigation', function () { + + it('navigates when parameters added', function () { + var currParams = { section: "content", id: 123 }; + var nextParams = { section: "content", id: 123, create: true }; + var result = navigationService.isRouteChangingNavigation(currParams, nextParams); + expect(result).toBe(true); + }); + + it('navigates when parameters removed', function () { + var currParams = { section: "content", id: 123, create: true }; + var nextParams = { section: "content", id: 123 }; + var result = navigationService.isRouteChangingNavigation(currParams, nextParams); + expect(result).toBe(true); + }); + + it('does not navigate when non routing parameters added', function () { + var currParams = { section: "content", id: 123 }; + var nextParams = { section: "content", id: 123, mculture: "abc", cculture: "xyz" }; + var result = navigationService.isRouteChangingNavigation(currParams, nextParams); + expect(result).toBe(false); + }); + + it('does not navigate when non routing parameters changed', function () { + var currParams = { section: "content", id: 123, mculture: "abc" }; + var nextParams = { section: "content", id: 123, mculture: "ooo", cculture: "xyz" }; + var result = navigationService.isRouteChangingNavigation(currParams, nextParams); + expect(result).toBe(false); + }); + + it('does not navigate when non routing parameters removed', function () { + var currParams = { section: "content", id: 123, mculture: "abc", cculture: "xyz" }; + var nextParams = { section: "content", id: 123, cculture: "xyz" }; + var result = navigationService.isRouteChangingNavigation(currParams, nextParams); + expect(result).toBe(false); + }); + + }); + +}); diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs index 0607b0157e..f7af56d2b9 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs @@ -66,12 +66,9 @@ namespace Umbraco.Web.WebApi.Binders throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } - var root = IOHelper.MapPath("~/App_Data/TEMP/FileUploads"); - //ensure it exists - Directory.CreateDirectory(root); - var provider = new MultipartFormDataStreamProvider(root); + var result = GetMultiPartResult(actionContext); - var model = GetModel(actionContext, bindingContext, provider); + var model = GetModel(actionContext, bindingContext, result); //now that everything is binded, validate the properties var contentItemValidator = GetValidationHelper(); contentItemValidator.ValidateItem(actionContext, model); @@ -85,6 +82,41 @@ namespace Umbraco.Web.WebApi.Binders return new ContentItemValidationHelper(Logger, UmbracoContextAccessor); } + private MultipartFormDataStreamProvider GetMultiPartResult(HttpActionContext actionContext) + { + var root = IOHelper.MapPath("~/App_Data/TEMP/FileUploads"); + //ensure it exists + Directory.CreateDirectory(root); + var provider = new MultipartFormDataStreamProvider(root); + + var request = actionContext.Request; + var content = request.Content; + + //NOTE: Yes this is super strange, ugly and weird. One would think that you could 'just' + // use a .Return on the ReadAsMultipartAsync but that absolutely doesn't work, it immediately deadlocks. + // We've tried all things like .Result, ConfigureAwait(false), GetAwaiter().GetResult(), a combination of + // everything and they all immediately deadlock. + // This issue has been documented in various .NET releases but there's really no info about the best way + // to do this. Ideally we'd use true async/await but in .NET Framework, model binders don't support async :( + // For some reason wrapping the operation in our own task works without deadlocking. + MultipartFormDataStreamProvider result = null; + var task = Task.Run(() => content.ReadAsMultipartAsync(provider)) + .ContinueWith(x => + { + if (x.IsFaulted && x.Exception != null) + { + throw x.Exception; + } + result = x.ConfigureAwait(false).GetAwaiter().GetResult(); + }); + task.Wait(); + + if (result == null) + throw new InvalidOperationException("Could not read multi-part message"); + + return result; + } + /// /// Builds the model from the request contents /// @@ -92,13 +124,11 @@ namespace Umbraco.Web.WebApi.Binders /// /// /// - private TModelSave GetModel(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider provider) + private TModelSave GetModel(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider result) { - var request = actionContext.Request; - - var content = request.Content; - - var result = content.ReadAsMultipartAsync(provider).Result; + //var request = actionContext.Request; + //var content = request.Content; + //var result = content.ReadAsMultipartAsync(provider).ConfigureAwait(false).GetAwaiter().GetResult(); if (result.FormData["contentItem"] == null) { From c2dae6f5a009e5a79390acdf80184d395b4201e2 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 17 Jul 2018 15:41:09 +1000 Subject: [PATCH 010/275] fixes js tests --- .../src/common/mocks/resources/media.mocks.js | 14 ++++++++++++++ .../unit/app/media/edit-media-controller.spec.js | 10 +--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js index a23fc86210..3b58c127a7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js @@ -52,6 +52,20 @@ angular.module('umbraco.mocks'). { alias: "umbracoFile", label: "File", description:"Some file", view: "rte", value: "/media/1234/random.jpg" } ] } + ], + apps: [ + { + alias: "content", + name: "Content", + icon: "icon-document", + view: "views/media/apps/content/content.html" + }, + { + alias: "info", + name: "Info", + icon: "icon-info", + view: "views/media/apps/info/info.html" + } ] }; diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/media/edit-media-controller.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/media/edit-media-controller.spec.js index c79b2ed72b..484cbeb0dc 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/app/media/edit-media-controller.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/app/media/edit-media-controller.spec.js @@ -54,14 +54,6 @@ describe('edit media controller tests', function () { it('it should have added an info app', function () { expect(scope.content.apps[1].alias).toBe("info"); }); - - it('all other tabs than the info tab should have a properties collection', function () { - $(scope.content.tabs).each(function (i, tab) { - if (tab.id !== -1 && tab.alias !== '_umb_infoTab') { - expect(tab.properties.length).toBeGreaterThan(0); - } - }); - }); - + }); }); From baead95c33e641dd4877fef0a975c988c997d624 Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 17 Jul 2018 18:42:23 +0200 Subject: [PATCH 011/275] Comments and notes --- .../Mapping/ContentItemDisplayNameResolver.cs | 1 + .../WebApi/Binders/ContentItemBaseBinder.cs | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs index c613b163d6..6cba6ff6ab 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayNameResolver.cs @@ -4,6 +4,7 @@ //using Umbraco.Web.Models.ContentEditing; //using ContentVariation = Umbraco.Core.Models.ContentVariation; +// fixme remove this file? //namespace Umbraco.Web.Models.Mapping //{ // /// diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs index f7af56d2b9..34f8d90155 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs @@ -92,13 +92,20 @@ namespace Umbraco.Web.WebApi.Binders var request = actionContext.Request; var content = request.Content; - //NOTE: Yes this is super strange, ugly and weird. One would think that you could 'just' - // use a .Return on the ReadAsMultipartAsync but that absolutely doesn't work, it immediately deadlocks. - // We've tried all things like .Result, ConfigureAwait(false), GetAwaiter().GetResult(), a combination of - // everything and they all immediately deadlock. - // This issue has been documented in various .NET releases but there's really no info about the best way - // to do this. Ideally we'd use true async/await but in .NET Framework, model binders don't support async :( - // For some reason wrapping the operation in our own task works without deadlocking. + // Note: YES this is super strange, ugly, and weird. + // One would think that you could just do: + // + //var result = content.ReadAsMultipartAsync(provider).Result; + // + // But it deadlocks. See https://stackoverflow.com/questions/15201255 for details, which + // points to https://msdn.microsoft.com/en-us/magazine/jj991977.aspx which contains more + // details under "Async All the Way" - see also https://olitee.com/2015/01/c-async-await-common-deadlock-scenario/ + // which contains a simplified explaination: ReadAsMultipartAsync is meant to be awaited, + // not used in the non-async .Result way, and there is nothing we can do about it. + // + // Alas, model binders cannot be async "all the way", so we have to wrap in a task, to + // force proper threading, and then it works. + MultipartFormDataStreamProvider result = null; var task = Task.Run(() => content.ReadAsMultipartAsync(provider)) .ContinueWith(x => From 18cd9ea1e8f4f3958e28c1ca2d316c9f3d30e805 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 19 Jul 2018 19:32:07 +1000 Subject: [PATCH 012/275] WIP refactor commit for getting all variants at once saving, this requires pulling apart a lot of the models and corresponding binders and validators. --- .../Models/Editors/ContentPropertyFile.cs | 2 + .../Mapping/ContentWebModelMappingTests.cs | 8 +- .../ContentModelSerializationTests.cs | 2 +- .../services/umbdataformatter.service.js | 1 + .../WebMappingProfilesCompositionRoot.cs | 4 +- .../Binders/ContentItemBaseBinder.cs | 45 +-- .../Editors/Binders/ContentItemBinder.cs | 61 +++ .../Binders/MediaItemBinder.cs | 25 +- .../Editors/Binders/MemberBinder.cs | 210 ++++++++++ src/Umbraco.Web/Editors/ContentController.cs | 274 +++++++------ .../Editors/ContentControllerBase.cs | 2 +- src/Umbraco.Web/Editors/EntityController.cs | 1 + .../EntityControllerConfigurationAttribute.cs | 8 - .../Filters/ContentItemValidationHelper.cs | 77 ++-- .../ContentPostValidateAttribute.cs | 4 +- .../IsCurrentUserModelFilterAttribute.cs | 2 +- .../MediaItemSaveValidationAttribute.cs | 98 +++++ .../Filters/MemberSaveValidationAttribute.cs | 38 ++ .../Editors/Filters/MemberValidationHelper.cs | 224 +++++++++++ .../UserGroupAuthorizationAttribute.cs | 3 +- .../UserGroupEditorAuthorizationHelper.cs | 2 +- .../UserGroupValidateAttribute.cs | 2 +- src/Umbraco.Web/Editors/MediaController.cs | 19 +- .../Editors/MediaPostValidateAttribute.cs | 93 ----- src/Umbraco.Web/Editors/MemberController.cs | 19 +- .../Editors/UserGroupsController.cs | 1 + src/Umbraco.Web/Editors/UsersController.cs | 1 + .../ContentEditing/ContentBaseItemSave.cs | 31 -- .../Models/ContentEditing/ContentBaseSave.cs | 59 +++ .../Models/ContentEditing/ContentItemBasic.cs | 21 - .../ContentEditing/ContentItemDisplay.cs | 4 +- .../Models/ContentEditing/ContentItemSave.cs | 73 +++- .../ContentEditing/ContentVariantSave.cs | 37 ++ .../ContentEditing/ContentVariationDisplay.cs | 2 +- .../ContentEditing/ContentVariationPublish.cs | 18 - .../Models/ContentEditing/EntityBasic.cs | 2 + .../ContentEditing/IContentProperties.cs | 17 + .../Models/ContentEditing/IContentSave.cs | 35 ++ .../Models/ContentEditing/MediaItemSave.cs | 4 +- .../Models/ContentEditing/MemberSave.cs | 9 +- .../Models/Mapping/ContentMapperProfile.cs | 6 +- .../Mapping/ContentPropertyBasicConverter.cs | 5 +- .../Models/Mapping/MediaMapperProfile.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 33 +- .../WebApi/Binders/ContentItemBinder.cs | 87 ---- .../WebApi/Binders/MemberBinder.cs | 374 ------------------ .../Filters/ValidationFilterAttribute.cs | 1 + .../ParameterSwapControllerActionSelector.cs | 7 +- src/Umbraco.Web/WebApi/TrimModelBinder.cs | 23 ++ 49 files changed, 1157 insertions(+), 919 deletions(-) rename src/Umbraco.Web/{WebApi => Editors}/Binders/ContentItemBaseBinder.cs (83%) create mode 100644 src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs rename src/Umbraco.Web/{WebApi => Editors}/Binders/MediaItemBinder.cs (62%) create mode 100644 src/Umbraco.Web/Editors/Binders/MemberBinder.cs delete mode 100644 src/Umbraco.Web/Editors/EntityControllerConfigurationAttribute.cs rename src/Umbraco.Web/{WebApi => Editors}/Filters/ContentItemValidationHelper.cs (76%) rename src/Umbraco.Web/Editors/{ => Filters}/ContentPostValidateAttribute.cs (98%) rename src/Umbraco.Web/Editors/{ => Filters}/IsCurrentUserModelFilterAttribute.cs (98%) create mode 100644 src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs create mode 100644 src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs create mode 100644 src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs rename src/Umbraco.Web/Editors/{ => Filters}/UserGroupAuthorizationAttribute.cs (97%) rename src/Umbraco.Web/Editors/{ => Filters}/UserGroupEditorAuthorizationHelper.cs (99%) rename src/Umbraco.Web/Editors/{ => Filters}/UserGroupValidateAttribute.cs (98%) delete mode 100644 src/Umbraco.Web/Editors/MediaPostValidateAttribute.cs delete mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentBaseItemSave.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs delete mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentVariationPublish.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/IContentSave.cs delete mode 100644 src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs delete mode 100644 src/Umbraco.Web/WebApi/Binders/MemberBinder.cs rename src/Umbraco.Web/{Editors => WebApi}/ParameterSwapControllerActionSelector.cs (97%) create mode 100644 src/Umbraco.Web/WebApi/TrimModelBinder.cs diff --git a/src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs b/src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs index 53c2adf7c2..f28f4766cc 100644 --- a/src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs +++ b/src/Umbraco.Core/Models/Editors/ContentPropertyFile.cs @@ -5,6 +5,8 @@ /// public class ContentPropertyFile { + //TODO: This needs to be overhauled to support variants and things like NC + /// /// Gets or sets the property alias. /// diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index 7075e33fdd..6e9c731f20 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -123,7 +123,7 @@ namespace Umbraco.Tests.Models.Mapping AssertBasics(result, content); - var invariantContent = result.ContentVariants.First(); + var invariantContent = result.Variants.First(); foreach (var p in content.Properties) { AssertBasicProperty(invariantContent, p); @@ -146,7 +146,7 @@ namespace Umbraco.Tests.Models.Mapping AssertBasics(result, content); - var invariantContent = result.ContentVariants.First(); + var invariantContent = result.Variants.First(); foreach (var p in content.Properties) { AssertBasicProperty(invariantContent, p); @@ -195,7 +195,7 @@ namespace Umbraco.Tests.Models.Mapping AssertBasics(result, content); - var invariantContent = result.ContentVariants.First(); + var invariantContent = result.Variants.First(); foreach (var p in content.Properties) { AssertBasicProperty(invariantContent, p); @@ -238,7 +238,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.IsNull(result.Owner); // because, 0 is no user } - var invariantContent = result.ContentVariants.First(); + var invariantContent = result.Variants.First(); Assert.AreEqual(content.ParentId, result.ParentId); Assert.AreEqual(content.UpdateDate, invariantContent.UpdateDate); diff --git a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs index 7d94943a6d..0c7908de9e 100644 --- a/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs @@ -44,7 +44,7 @@ namespace Umbraco.Tests.Web.AngularIntegration var displayModel = new ContentItemDisplay { Id = 1234, - ContentVariants = new List + Variants = new List { new ContentVariantDisplay { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js index 18d37ea5b2..67e7e0d2da 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js @@ -343,6 +343,7 @@ /** formats the display model used to display the content to the model used to save the content */ formatContentPostData: function (displayModel, action) { + //TODO: We need to change this since it's no longer relevant with variants //this is basically the same as for media but we need to explicitly add some extra properties var saveModel = this.formatMediaPostData(displayModel, action); diff --git a/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs b/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs index e865019790..d7b8054532 100644 --- a/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs +++ b/src/Umbraco.Web/Composing/CompositionRoots/WebMappingProfilesCompositionRoot.cs @@ -33,12 +33,14 @@ namespace Umbraco.Web.Composing.CompositionRoots //register any resolvers, etc.. that the profiles use container.Register(); container.Register>(); - container.Register>(); + container.Register>(); container.Register>(); container.Register>(); container.Register(); container.Register(); container.Register(); + container.Register(); + container.Register(); } } } diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs similarity index 83% rename from src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs rename to src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs index 34f8d90155..ec7158c10b 100644 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs @@ -13,6 +13,7 @@ using System.Web.Http.Controllers; using System.Web.Http.ModelBinding.Binders; using System.Web.Http.Validation; using System.Web.ModelBinding; +using System.Web.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Umbraco.Core; @@ -34,33 +35,33 @@ using ModelMetadataProvider = System.Web.Http.Metadata.ModelMetadataProvider; using MutableObjectModelBinder = System.Web.Http.ModelBinding.Binders.MutableObjectModelBinder; using Task = System.Threading.Tasks.Task; -namespace Umbraco.Web.WebApi.Binders +namespace Umbraco.Web.Editors.Binders { + /// /// /// Binds the content model to the controller action for the posted multi-part Post /// internal abstract class ContentItemBaseBinder : IModelBinder - where TPersisted : class, IContentBase - where TModelSave : ContentBaseItemSave + where TPersisted : class, IContentBase + //where TModelSave : ContentBaseItemSave { protected Core.Logging.ILogger Logger { get; } protected ServiceContext Services { get; } protected IUmbracoContextAccessor UmbracoContextAccessor { get; } - public ContentItemBaseBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + protected ContentItemBaseBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) { } - public ContentItemBaseBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + protected ContentItemBaseBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) { Logger = logger; Services = services; UmbracoContextAccessor = umbracoContextAccessor; } - public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + public virtual bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { - //NOTE: Validation is done in the filter if (actionContext.Request.Content.IsMimeMultipartContent() == false) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); @@ -69,19 +70,11 @@ namespace Umbraco.Web.WebApi.Binders var result = GetMultiPartResult(actionContext); var model = GetModel(actionContext, bindingContext, result); - //now that everything is binded, validate the properties - var contentItemValidator = GetValidationHelper(); - contentItemValidator.ValidateItem(actionContext, model); bindingContext.Model = model; return bindingContext.Model != null; } - protected virtual ContentItemValidationHelper GetValidationHelper() - { - return new ContentItemValidationHelper(Logger, UmbracoContextAccessor); - } - private MultipartFormDataStreamProvider GetMultiPartResult(HttpActionContext actionContext) { var root = IOHelper.MapPath("~/App_Data/TEMP/FileUploads"); @@ -129,14 +122,10 @@ namespace Umbraco.Web.WebApi.Binders /// /// /// - /// + /// /// private TModelSave GetModel(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider result) { - //var request = actionContext.Request; - //var content = request.Content; - //var result = content.ReadAsMultipartAsync(provider).ConfigureAwait(false).GetAwaiter().GetResult(); - if (result.FormData["contentItem"] == null) { var response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest); @@ -170,14 +159,14 @@ namespace Umbraco.Web.WebApi.Binders } var propAlias = parts[1]; - var fileName = file.Headers.ContentDisposition.FileName.Trim(new char[] {'\"'}); + var fileName = file.Headers.ContentDisposition.FileName.Trim(new char[] { '\"' }); model.UploadedFiles.Add(new ContentPropertyFile - { - TempFilePath = file.LocalFileName, - PropertyAlias = propAlias, - FileName = fileName - }); + { + TempFilePath = file.LocalFileName, + PropertyAlias = propAlias, + FileName = fileName + }); } if (ContentControllerBase.IsCreatingAction(model.Action)) @@ -202,8 +191,6 @@ namespace Umbraco.Web.WebApi.Binders MapPropertyValuesFromSaved(model, model.ContentDto); } - model.Name = model.Name.Trim(); - return model; } @@ -212,7 +199,7 @@ namespace Umbraco.Web.WebApi.Binders /// /// /// - private static void MapPropertyValuesFromSaved(TModelSave saveModel, ContentItemDto dto) + private static void MapPropertyValuesFromSaved(IContentProperties saveModel, ContentItemDto dto) { //NOTE: Don't convert this to linq, this is much quicker foreach (var p in saveModel.Properties) diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs new file mode 100644 index 0000000000..df5569fb34 --- /dev/null +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http.Controllers; +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Services; +using Umbraco.Web.Composing; +using Umbraco.Web.Editors.Filters; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.Models.Mapping; +using Umbraco.Web.WebApi.Filters; + +namespace Umbraco.Web.Editors.Binders +{ + internal class ContentItemBinder : ContentItemBaseBinder + { + public ContentItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public ContentItemBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + : base(logger, services, umbracoContextAccessor) + { + } + + protected override IContent GetExisting(ContentItemSave model) + { + return Services.ContentService.GetById(model.Id); + } + + protected override IContent CreateNew(ContentItemSave model) + { + var contentType = Services.ContentTypeService.Get(model.ContentTypeAlias); + if (contentType == null) + { + throw new InvalidOperationException("No content type found with alias " + model.ContentTypeAlias); + } + return new Content( + model.PersistedContent.ContentType.VariesByCulture() ? null : model.Variants.First().Name, + model.ParentId, + contentType); + } + + protected override ContentItemDto MapFromPersisted(ContentItemSave model) + { + return MapFromPersisted(model.PersistedContent); + } + + internal static ContentItemDto MapFromPersisted(IContent content) + { + return Mapper.Map>(content); + } + + + } +} diff --git a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs similarity index 62% rename from src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs rename to src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs index 61dd0897db..c97c78dc71 100644 --- a/src/Umbraco.Web/WebApi/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs @@ -1,4 +1,6 @@ using System; +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; @@ -7,8 +9,12 @@ using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; -namespace Umbraco.Web.WebApi.Binders +namespace Umbraco.Web.Editors.Binders { + /// + /// + /// The model binder for + /// internal class MediaItemBinder : ContentItemBaseBinder { public MediaItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) @@ -20,6 +26,23 @@ namespace Umbraco.Web.WebApi.Binders { } + /// + /// Overridden to trim the name + /// + /// + /// + /// + public override bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + { + var result = base.BindModel(actionContext, bindingContext); + if (result) + { + var model = (MediaItemSave) bindingContext.Model; + model.Name = model.Name.Trim(); + } + return result; + } + protected override IMedia GetExisting(MediaItemSave model) { return Services.MediaService.GetById(Convert.ToInt32(model.Id)); diff --git a/src/Umbraco.Web/Editors/Binders/MemberBinder.cs b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs new file mode 100644 index 0000000000..82647bb2a3 --- /dev/null +++ b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Net; +using System.Web.Http; +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; +using System.Web.Security; +using AutoMapper; +using Umbraco.Core; +using Umbraco.Core.Models; +using Umbraco.Core.Security; +using Umbraco.Core.Services; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.WebApi.Filters; +using System.Linq; +using System.Net.Http; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services.Implement; +using Umbraco.Web; +using Umbraco.Web.Composing; +using Umbraco.Core.Logging; +using Umbraco.Web.Editors.Filters; + +namespace Umbraco.Web.Editors.Binders +{ + /// + /// + /// The model binder for + /// + internal class MemberBinder : ContentItemBaseBinder + { + + public MemberBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + { + } + + public MemberBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) + : base(logger, services, umbracoContextAccessor) + { + } + + /// + /// Overridden to trim the name + /// + /// + /// + /// + public override bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + { + var result = base.BindModel(actionContext, bindingContext); + if (result) + { + var model = (MemberSave)bindingContext.Model; + model.Name = model.Name.Trim(); + } + return result; + } + + /// + /// Returns an IMember instance used to bind values to and save (depending on the membership scenario) + /// + /// + /// + protected override IMember GetExisting(MemberSave model) + { + var scenario = Services.MemberService.GetMembershipScenario(); + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + switch (scenario) + { + case MembershipScenario.NativeUmbraco: + return GetExisting(model.Key); + case MembershipScenario.CustomProviderWithUmbracoLink: + case MembershipScenario.StandaloneCustomProvider: + default: + var membershipUser = provider.GetUser(model.Key, false); + if (membershipUser == null) + { + throw new InvalidOperationException("Could not find member with key " + model.Key); + } + + //TODO: Support this scenario! + //if (scenario == MembershipScenario.CustomProviderWithUmbracoLink) + //{ + // //if there's a 'Member' type then we should be able to just go get it from the db since it was created with a link + // // to our data. + // var memberType = ApplicationContext.Services.MemberTypeService.GetMemberType(Constants.Conventions.MemberTypes.Member); + // if (memberType != null) + // { + // var existing = GetExisting(model.Key); + // FilterContentTypeProperties(existing.ContentType, existing.ContentType.PropertyTypes.Select(x => x.Alias).ToArray()); + // } + //} + + //generate a member for a generic membership provider + //NOTE: We don't care about the password here, so just generate something + //var member = MemberService.CreateGenericMembershipProviderMember(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N")); + + //var convertResult = membershipUser.ProviderUserKey.TryConvertTo(); + //if (convertResult.Success == false) + //{ + // throw new InvalidOperationException("Only membership providers that store a GUID as their ProviderUserKey are supported" + model.Key); + //} + //member.Key = convertResult.Result; + + var member = Mapper.Map(membershipUser); + + return member; + } + } + + private IMember GetExisting(Guid key) + { + var member = Services.MemberService.GetByKey(key); + if (member == null) + { + throw new InvalidOperationException("Could not find member with key " + key); + } + + return member; + } + + /// + /// Gets an instance of IMember used when creating a member + /// + /// + /// + /// + /// Depending on whether a custom membership provider is configured this will return different results. + /// + protected override IMember CreateNew(MemberSave model) + { + var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + + if (provider.IsUmbracoMembershipProvider()) + { + var contentType = Services.MemberTypeService.Get(model.ContentTypeAlias); + if (contentType == null) + { + throw new InvalidOperationException("No member type found wth alias " + model.ContentTypeAlias); + } + + //remove all membership properties, these values are set with the membership provider. + FilterMembershipProviderProperties(contentType); + + //return the new member with the details filled in + return new Member(model.Name, model.Email, model.Username, model.Password.NewPassword, contentType); + } + else + { + //A custom membership provider is configured + + //NOTE: Below we are assigning the password to just a new GUID because we are not actually storing the password, however that + // field is mandatory in the database so we need to put something there. + + //If the default Member type exists, we'll use that to create the IMember - that way we can associate the custom membership + // provider to our data - eventually we can support editing custom properties with a custom provider. + var memberType = Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); + if (memberType != null) + { + FilterContentTypeProperties(memberType, memberType.PropertyTypes.Select(x => x.Alias).ToArray()); + return new Member(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N"), memberType); + } + + //generate a member for a generic membership provider + var member = MemberService.CreateGenericMembershipProviderMember(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N")); + //we'll just remove all properties here otherwise we'll end up with validation errors, we don't want to persist any property data anyways + // in this case. + FilterContentTypeProperties(member.ContentType, member.ContentType.PropertyTypes.Select(x => x.Alias).ToArray()); + return member; + } + } + + /// + /// This will remove all of the special membership provider properties which were required to display the property editors + /// for editing - but the values have been mapped back ot the MemberSave object directly - we don't want to keep these properties + /// on the IMember because they will attempt to be persisted which we don't want since they might not even exist. + /// + /// + private void FilterMembershipProviderProperties(IContentTypeBase contentType) + { + var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + //remove all membership properties, these values are set with the membership provider. + var exclude = defaultProps.Select(x => x.Value.Alias).ToArray(); + FilterContentTypeProperties(contentType, exclude); + } + + private void FilterContentTypeProperties(IContentTypeBase contentType, IEnumerable exclude) + { + //remove all properties based on the exclusion list + foreach (var remove in exclude) + { + if (contentType.PropertyTypeExists(remove)) + { + contentType.RemovePropertyType(remove); + } + } + } + + protected override ContentItemDto MapFromPersisted(MemberSave model) + { + //need to explicitly cast since it's an explicit implementation + var saveModel = (IContentSave)model; + + return Mapper.Map>(saveModel.PersistedContent); + } + + + } +} diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 92d392e890..423027d6a0 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -31,6 +31,7 @@ using Constants = Umbraco.Core.Constants; using ContentVariation = Umbraco.Core.Models.ContentVariation; using Language = Umbraco.Web.Models.ContentEditing.Language; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Editors.Filters; namespace Umbraco.Web.Editors { @@ -230,7 +231,7 @@ namespace Umbraco.Web.Editors ContentTypeAlias = "recycleBin", IsContainer = true, Path = "-1," + Constants.System.RecycleBinContent, - ContentVariants = new List + Variants = new List { new ContentVariantDisplay { @@ -293,7 +294,7 @@ namespace Umbraco.Web.Editors HandleContentNotFound(id); return null;//irrelevant since the above throws } - var content = MapToDisplay(foundContent, culture); + var content = MapToDisplay(foundContent); return content; } @@ -304,7 +305,7 @@ namespace Umbraco.Web.Editors /// [OutgoingEditorModelEvent] [EnsureUserPermissionForContent("id")] - public ContentItemDisplay GetById(Guid id, string culture = null) + public ContentItemDisplay GetById(Guid id) { var foundContent = GetObjectFromRequest(() => Services.ContentService.GetById(id)); if (foundContent == null) @@ -324,12 +325,12 @@ namespace Umbraco.Web.Editors /// [OutgoingEditorModelEvent] [EnsureUserPermissionForContent("id")] - public ContentItemDisplay GetById(Udi id, string culture = null) + public ContentItemDisplay GetById(Udi id) { var guidUdi = id as GuidUdi; if (guidUdi != null) { - return GetById(guidUdi.Guid, culture); + return GetById(guidUdi.Guid); } throw new HttpResponseException(HttpStatusCode.NotFound); @@ -631,119 +632,117 @@ namespace Umbraco.Web.Editors private ContentItemDisplay PostSaveInternal(ContentItemSave contentItem, Func saveMethod) { - throw new NotImplementedException("Implement this!"); + //If we've reached here it means: + // * Our model has been bound + // * and validated + // * any file attachments have been saved to their temporary location for us to use + // * we have a reference to the DTO object and the persisted object + // * Permissions are valid + MapPropertyValues(contentItem); - ////If we've reached here it means: - //// * Our model has been bound - //// * and validated - //// * any file attachments have been saved to their temporary location for us to use - //// * we have a reference to the DTO object and the persisted object - //// * Permissions are valid - //MapPropertyValues(contentItem); + //We need to manually check the validation results here because: + // * We still need to save the entity even if there are validation value errors + // * Depending on if the entity is new, and if there are non property validation errors (i.e. the name is null) + // then we cannot continue saving, we can only display errors + // * If there are validation errors and they were attempting to publish, we can only save, NOT publish and display + // a message indicating this + if (ModelState.IsValid == false) + { + if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) && IsCreatingAction(contentItem.Action)) + { + //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! + // add the modelstate to the outgoing object and throw a validation message + var forDisplay = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + forDisplay.Errors = ModelState.ToErrorDictionary(); + throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); - ////We need to manually check the validation results here because: - //// * We still need to save the entity even if there are validation value errors - //// * Depending on if the entity is new, and if there are non property validation errors (i.e. the name is null) - //// then we cannot continue saving, we can only display errors - //// * If there are validation errors and they were attempting to publish, we can only save, NOT publish and display - //// a message indicating this - //if (ModelState.IsValid == false) - //{ - // if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) && IsCreatingAction(contentItem.Action)) - // { - // //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! - // // add the modelstate to the outgoing object and throw a validation message - // var forDisplay = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); - // forDisplay.Errors = ModelState.ToErrorDictionary(); - // throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); + } - // } + //if the model state is not valid we cannot publish so change it to save + switch (contentItem.Action) + { + case ContentSaveAction.Publish: + contentItem.Action = ContentSaveAction.Save; + break; + case ContentSaveAction.PublishNew: + contentItem.Action = ContentSaveAction.SaveNew; + break; + } + } - // //if the model state is not valid we cannot publish so change it to save - // switch (contentItem.Action) - // { - // case ContentSaveAction.Publish: - // contentItem.Action = ContentSaveAction.Save; - // break; - // case ContentSaveAction.PublishNew: - // contentItem.Action = ContentSaveAction.SaveNew; - // break; - // } - //} + //initialize this to successful + var publishStatus = new PublishResult(null, contentItem.PersistedContent); + var wasCancelled = false; - ////initialize this to successful - //var publishStatus = new PublishResult(null, contentItem.PersistedContent); - //var wasCancelled = false; + if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) + { + //save the item + var saveResult = saveMethod(contentItem.PersistedContent); - //if (contentItem.Action == ContentSaveAction.Save || contentItem.Action == ContentSaveAction.SaveNew) - //{ - // //save the item - // var saveResult = saveMethod(contentItem.PersistedContent); + wasCancelled = saveResult.Success == false && saveResult.Result == OperationResultType.FailedCancelledByEvent; + } + else if (contentItem.Action == ContentSaveAction.SendPublish || contentItem.Action == ContentSaveAction.SendPublishNew) + { + var sendResult = Services.ContentService.SendToPublication(contentItem.PersistedContent, Security.CurrentUser.Id); + wasCancelled = sendResult == false; + } + else + { + PublishInternal(contentItem, ref publishStatus, ref wasCancelled); + } - // wasCancelled = saveResult.Success == false && saveResult.Result == OperationResultType.FailedCancelledByEvent; - //} - //else if (contentItem.Action == ContentSaveAction.SendPublish || contentItem.Action == ContentSaveAction.SendPublishNew) - //{ - // var sendResult = Services.ContentService.SendToPublication(contentItem.PersistedContent, Security.CurrentUser.Id); - // wasCancelled = sendResult == false; - //} - //else - //{ - // PublishInternal(contentItem, ref publishStatus, ref wasCancelled); - //} + //get the updated model + var display = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); - ////get the updated model - //var display = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 + HandleInvalidModelState(display); - ////lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 - //HandleInvalidModelState(display); + //put the correct msgs in + switch (contentItem.Action) + { + case ContentSaveAction.Save: + case ContentSaveAction.SaveNew: + if (wasCancelled == false) + { + display.AddSuccessNotification( + Services.TextService.Localize("speechBubbles/editContentSavedHeader"), + Services.TextService.Localize("speechBubbles/editContentSavedText")); + } + else + { + AddCancelMessage(display); + } + break; + case ContentSaveAction.SendPublish: + case ContentSaveAction.SendPublishNew: + if (wasCancelled == false) + { + display.AddSuccessNotification( + Services.TextService.Localize("speechBubbles/editContentSendToPublish"), + Services.TextService.Localize("speechBubbles/editContentSendToPublishText")); + } + else + { + AddCancelMessage(display); + } + break; + case ContentSaveAction.Publish: + case ContentSaveAction.PublishNew: + ShowMessageForPublishStatus(publishStatus, display); + break; + } - ////put the correct msgs in - //switch (contentItem.Action) - //{ - // case ContentSaveAction.Save: - // case ContentSaveAction.SaveNew: - // if (wasCancelled == false) - // { - // display.AddSuccessNotification( - // Services.TextService.Localize("speechBubbles/editContentSavedHeader"), - // Services.TextService.Localize("speechBubbles/editContentSavedText")); - // } - // else - // { - // AddCancelMessage(display); - // } - // break; - // case ContentSaveAction.SendPublish: - // case ContentSaveAction.SendPublishNew: - // if (wasCancelled == false) - // { - // display.AddSuccessNotification( - // Services.TextService.Localize("speechBubbles/editContentSendToPublish"), - // Services.TextService.Localize("speechBubbles/editContentSendToPublishText")); - // } - // else - // { - // AddCancelMessage(display); - // } - // break; - // case ContentSaveAction.Publish: - // case ContentSaveAction.PublishNew: - // ShowMessageForPublishStatus(publishStatus, display); - // break; - //} + //If the item is new and the operation was cancelled, we need to return a different + // status code so the UI can handle it since it won't be able to redirect since there + // is no Id to redirect to! + if (wasCancelled && IsCreatingAction(contentItem.Action)) + { + throw new HttpResponseException(Request.CreateValidationErrorResponse(display)); + } - ////If the item is new and the operation was cancelled, we need to return a different - //// status code so the UI can handle it since it won't be able to redirect since there - //// is no Id to redirect to! - //if (wasCancelled && IsCreatingAction(contentItem.Action)) - //{ - // throw new HttpResponseException(Request.CreateValidationErrorResponse(display)); - //} + display.PersistedContent = contentItem.PersistedContent; - //display.PersistedContent = contentItem.PersistedContent; - - //return display; + return display; } /// @@ -1078,51 +1077,56 @@ namespace Umbraco.Web.Editors /// /// Maps the dto property values to the persisted model /// - /// - private void MapPropertyValues(ContentItemSave contentItem) + /// + private void MapPropertyValues(ContentItemSave contentSave) { - //Don't update the name if it is empty - if (!contentItem.Name.IsNullOrWhiteSpace()) + //set the names for the variants + foreach(var variant in contentSave.Variants) { - if (contentItem.PersistedContent.ContentType.VariesByCulture()) + //Don't update the name if it is empty + if (!variant.Name.IsNullOrWhiteSpace()) { - if (contentItem.Culture.IsNullOrWhiteSpace()) - throw new InvalidOperationException($"Cannot set culture name without a culture."); - contentItem.PersistedContent.SetCultureName(contentItem.Name, contentItem.Culture); - } - else - { - contentItem.PersistedContent.Name = contentItem.Name; + if (contentSave.PersistedContent.ContentType.VariesByCulture()) + { + if (variant.Culture.IsNullOrWhiteSpace()) + throw new InvalidOperationException($"Cannot set culture name without a culture."); + contentSave.PersistedContent.SetCultureName(variant.Name, variant.Culture); + } + else + { + contentSave.PersistedContent.Name = variant.Name; + } } } //TODO: We need to support 'send to publish' - contentItem.PersistedContent.ExpireDate = contentItem.ExpireDate; - contentItem.PersistedContent.ReleaseDate = contentItem.ReleaseDate; + contentSave.PersistedContent.ExpireDate = contentSave.ExpireDate; + contentSave.PersistedContent.ReleaseDate = contentSave.ReleaseDate; + //only set the template if it didn't change - var templateChanged = (contentItem.PersistedContent.Template == null && contentItem.TemplateAlias.IsNullOrWhiteSpace() == false) - || (contentItem.PersistedContent.Template != null && contentItem.PersistedContent.Template.Alias != contentItem.TemplateAlias) - || (contentItem.PersistedContent.Template != null && contentItem.TemplateAlias.IsNullOrWhiteSpace()); + var templateChanged = (contentSave.PersistedContent.Template == null && contentSave.TemplateAlias.IsNullOrWhiteSpace() == false) + || (contentSave.PersistedContent.Template != null && contentSave.PersistedContent.Template.Alias != contentSave.TemplateAlias) + || (contentSave.PersistedContent.Template != null && contentSave.TemplateAlias.IsNullOrWhiteSpace()); if (templateChanged) { - var template = Services.FileService.GetTemplate(contentItem.TemplateAlias); - if (template == null && contentItem.TemplateAlias.IsNullOrWhiteSpace() == false) + var template = Services.FileService.GetTemplate(contentSave.TemplateAlias); + if (template == null && contentSave.TemplateAlias.IsNullOrWhiteSpace() == false) { //ModelState.AddModelError("Template", "No template exists with the specified alias: " + contentItem.TemplateAlias); - Logger.Warn("No template exists with the specified alias: " + contentItem.TemplateAlias); + Logger.Warn("No template exists with the specified alias: " + contentSave.TemplateAlias); } else { //NOTE: this could be null if there was a template and the posted template is null, this should remove the assigned template - contentItem.PersistedContent.Template = template; + contentSave.PersistedContent.Template = template; } } bool Varies(Property property) => property.PropertyType.VariesByCulture(); MapPropertyValues( - contentItem, + contentSave, (save, property) => Varies(property) ? property.GetValue(save.Culture) : property.GetValue(), //get prop val (save, property, v) => { if (Varies(property)) property.SetValue(v, save.Culture); else property.SetValue(v); }); //set prop val } @@ -1323,19 +1327,7 @@ namespace Umbraco.Web.Editors /// private ContentItemDisplay MapToDisplay(IContent content) { - ////A culture must exist in the mapping context if this content type is CultureNeutral since for a culture variant to be edited, - //// the Cuture property of ContentItemDisplay must exist (at least currently). - //if (culture == null && content.ContentType.VariesByCulture()) - //{ - // //If a culture is not explicitly sent up, then it means that the user is editing the default variant language. - // culture = Services.LocalizationService.GetDefaultLanguageIsoCode(); - //} - - //var display = ContextMapper.Map(content, UmbracoContext, - // new Dictionary { { ContextMapper.CultureKey, culture } }); - - var display = ContextMapper.Map(content, UmbracoContext); - + var display = Mapper.Map(content); return display; } } diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index 6171ccaefc..afed9cb776 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -49,7 +49,7 @@ namespace Umbraco.Web.Editors Func getPropertyValue, Action savePropertyValue) where TPersisted : IContentBase - where TSaved : ContentBaseItemSave + where TSaved : ContentBaseSave { // map the property values foreach (var propertyDto in contentItem.ContentDto.Properties) diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index 2bd52da5d2..313693c08c 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -18,6 +18,7 @@ using Umbraco.Core.Models.Entities; using Umbraco.Core.Xml; using Umbraco.Web.Search; using Umbraco.Web.Trees; +using Umbraco.Web.WebApi; namespace Umbraco.Web.Editors { diff --git a/src/Umbraco.Web/Editors/EntityControllerConfigurationAttribute.cs b/src/Umbraco.Web/Editors/EntityControllerConfigurationAttribute.cs deleted file mode 100644 index cae0759141..0000000000 --- a/src/Umbraco.Web/Editors/EntityControllerConfigurationAttribute.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; -using System.Web.Http.Controllers; -using Umbraco.Web.WebApi; - -namespace Umbraco.Web.Editors -{ - -} diff --git a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs similarity index 76% rename from src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs rename to src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs index 3eaf28a77b..d5c3384b87 100644 --- a/src/Umbraco.Web/WebApi/Filters/ContentItemValidationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs @@ -5,26 +5,16 @@ using System.Net; using System.Net.Http; using System.Web.Http.Controllers; using System.Web.Http.ModelBinding; -using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; -namespace Umbraco.Web.WebApi.Filters +namespace Umbraco.Web.Editors.Filters { /// - /// A validation helper class used with ContentItemValidationFilterAttribute to be shared between content, media, etc... + /// A base class purely used for logging without generics /// - /// - /// - /// - /// If any severe errors occur then the response gets set to an error and execution will not continue. Property validation - /// errors will just be added to the ModelState. - /// - internal class ContentItemValidationHelper - where TPersisted : class, IContentBase - where TModelSave : ContentBaseItemSave + internal class ContentItemValidationHelper { protected IUmbracoContextAccessor UmbracoContextAccessor { get; } protected ILogger Logger { get; } @@ -34,6 +24,24 @@ namespace Umbraco.Web.WebApi.Filters Logger = logger ?? throw new ArgumentNullException(nameof(logger)); UmbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor)); } + } + + /// + /// A validation helper class used with ContentItemValidationFilterAttribute to be shared between content, media, etc... + /// + /// + /// + /// + /// If any severe errors occur then the response gets set to an error and execution will not continue. Property validation + /// errors will just be added to the ModelState. + /// + internal class ContentItemValidationHelper: ContentItemValidationHelper + where TPersisted : class, IContentBase + where TModelSave: IContentSave, IContentProperties + { + public ContentItemValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) + { + } /// /// Validates the content item and updates the Response and ModelState accordingly @@ -42,28 +50,22 @@ namespace Umbraco.Web.WebApi.Filters /// public void ValidateItem(HttpActionContext actionContext, string argumentName) { - if (!(actionContext.ActionArguments[argumentName] is TModelSave contentItem)) + if (!(actionContext.ActionArguments[argumentName] is TModelSave model)) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No " + typeof(TModelSave) + " found in request"); return; } - ValidateItem(actionContext, contentItem); + ValidateItem(actionContext, model); } - public void ValidateItem(HttpActionContext actionContext, TModelSave contentItem) + public void ValidateItem(HttpActionContext actionContext, TModelSave model) { //now do each validation step - if (ValidateExistingContent(contentItem, actionContext) == false) return; - if (ValidateCultureVariant(contentItem, actionContext) == false) return; - if (ValidateProperties(contentItem, actionContext) == false) return; - if (ValidatePropertyData(contentItem, contentItem.ContentDto, actionContext.ModelState) == false) return; - } - - protected virtual bool ValidateCultureVariant(TModelSave postedItem, HttpActionContext actionContext) - { - return true; + if (ValidateExistingContent(model, actionContext) == false) return; + if (ValidateProperties(model, actionContext) == false) return; + if (ValidatePropertyData(model, actionContext.ModelState) == false) return; } /// @@ -74,10 +76,10 @@ namespace Umbraco.Web.WebApi.Filters /// protected virtual bool ValidateExistingContent(TModelSave postedItem, HttpActionContext actionContext) { - if (postedItem.PersistedContent == null) + var persistedContent = postedItem.PersistedContent; + if (persistedContent == null) { - var message = $"content with id: {postedItem.Id} was not found"; - actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, message); + actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, "content was not found"); return false; } @@ -87,12 +89,13 @@ namespace Umbraco.Web.WebApi.Filters /// /// Ensure all of the ids in the post are valid /// - /// + /// /// /// - protected virtual bool ValidateProperties(TModelSave postedItem, HttpActionContext actionContext) + protected virtual bool ValidateProperties(TModelSave model, HttpActionContext actionContext) { - return ValidateProperties(postedItem.Properties.ToList(), postedItem.PersistedContent.Properties.ToList(), actionContext); + var persistedContent = model.PersistedContent; + return ValidateProperties(model.Properties.ToList(), persistedContent.Properties.ToList(), actionContext); } /// @@ -123,15 +126,17 @@ namespace Umbraco.Web.WebApi.Filters /// /// Validates the data for each property /// - /// - /// + /// /// /// /// /// All property data validation goes into the modelstate with a prefix of "Properties" /// - public virtual bool ValidatePropertyData(TModelSave postedItem, ContentItemDto dto, ModelStateDictionary modelState) + public virtual bool ValidatePropertyData(TModelSave model, ModelStateDictionary modelState) { + var properties = model.Properties.ToList(); + var dto = model.ContentDto; + foreach (var p in dto.Properties) { var editor = p.PropertyEditor; @@ -140,13 +145,13 @@ namespace Umbraco.Web.WebApi.Filters { var message = $"Could not find property editor \"{p.DataType.EditorAlias}\" for property with id {p.Id}."; - Logger.Warn>(message); + Logger.Warn(message); continue; } //get the posted value for this property, this may be null in cases where the property was marked as readonly which means //the angular app will not post that value. - var postedProp = postedItem.Properties.FirstOrDefault(x => x.Alias == p.Alias); + var postedProp = properties.FirstOrDefault(x => x.Alias == p.Alias); if (postedProp == null) continue; var postedValue = postedProp.Value; diff --git a/src/Umbraco.Web/Editors/ContentPostValidateAttribute.cs b/src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs similarity index 98% rename from src/Umbraco.Web/Editors/ContentPostValidateAttribute.cs rename to src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs index 17d78f2422..c044ad0b5c 100644 --- a/src/Umbraco.Web/Editors/ContentPostValidateAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Net; -using System.Net.Http; using System.Web.Http.Controllers; using System.Web.Http.Filters; using Umbraco.Core; @@ -13,7 +11,7 @@ using Umbraco.Web.Security; using Umbraco.Web.WebApi; using Umbraco.Web._Legacy.Actions; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.Editors.Filters { /// /// Checks if the user has access to post a content item based on whether it's being created or saved. diff --git a/src/Umbraco.Web/Editors/IsCurrentUserModelFilterAttribute.cs b/src/Umbraco.Web/Editors/Filters/IsCurrentUserModelFilterAttribute.cs similarity index 98% rename from src/Umbraco.Web/Editors/IsCurrentUserModelFilterAttribute.cs rename to src/Umbraco.Web/Editors/Filters/IsCurrentUserModelFilterAttribute.cs index a791be7aed..59a383dca6 100644 --- a/src/Umbraco.Web/Editors/IsCurrentUserModelFilterAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/IsCurrentUserModelFilterAttribute.cs @@ -3,7 +3,7 @@ using System.Net.Http; using System.Web.Http.Filters; using Umbraco.Web.Models.ContentEditing; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.Editors.Filters { /// /// This sets the IsCurrentUser property on any outgoing model or any collection of models diff --git a/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs new file mode 100644 index 0000000000..c63bdd5dfe --- /dev/null +++ b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs @@ -0,0 +1,98 @@ +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; +using System.Web.Http.Controllers; +using System.Web.Http.Filters; +using Umbraco.Core; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Services; +using Umbraco.Web.Composing; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.WebApi; + +namespace Umbraco.Web.Editors.Filters +{ + /// + /// Validates the incoming model + /// + internal class MediaItemSaveValidationAttribute : ActionFilterAttribute + { + private readonly ILogger _logger; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IMediaService _mediaService; + private readonly IEntityService _entityService; + + public MediaItemSaveValidationAttribute() : this(Current.Logger, Current.UmbracoContextAccessor, Current.Services.MediaService, Current.Services.EntityService) + { + } + + public MediaItemSaveValidationAttribute(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor, IMediaService mediaService, IEntityService entityService) + { + _logger = logger; + _umbracoContextAccessor = umbracoContextAccessor; + _mediaService = mediaService; + _entityService = entityService; + } + + public override void OnActionExecuting(HttpActionContext actionContext) + { + var model = (MediaItemSave)actionContext.ActionArguments["contentItem"]; + var contentItemValidator = new ContentItemValidationHelper(_logger, _umbracoContextAccessor); + + if (ValidateUserAccess(model, actionContext)) + contentItemValidator.ValidateItem(actionContext, model); + } + + /// + /// Checks if the user has access to post a content item based on whether it's being created or saved. + /// + /// + /// + private bool ValidateUserAccess(MediaItemSave mediaItem, HttpActionContext actionContext) + { + //We now need to validate that the user is allowed to be doing what they are doing. + //Then if it is new, we need to lookup those permissions on the parent. + IMedia contentToCheck; + int contentIdToCheck; + switch (mediaItem.Action) + { + case ContentSaveAction.Save: + contentToCheck = mediaItem.PersistedContent; + contentIdToCheck = contentToCheck.Id; + break; + case ContentSaveAction.SaveNew: + contentToCheck = _mediaService.GetById(mediaItem.ParentId); + + if (mediaItem.ParentId != Constants.System.Root) + { + contentToCheck = _mediaService.GetById(mediaItem.ParentId); + contentIdToCheck = contentToCheck.Id; + } + else + { + contentIdToCheck = mediaItem.ParentId; + } + + break; + default: + //we don't support this for media + actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.NotFound); + return false; + } + + if (MediaController.CheckPermissions( + actionContext.Request.Properties, + _umbracoContextAccessor.UmbracoContext.Security.CurrentUser, + _mediaService, _entityService, + contentIdToCheck, contentToCheck) == false) + { + actionContext.Response = actionContext.Request.CreateUserNoAccessResponse(); + return false; + } + + return true; + } + } +} diff --git a/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs new file mode 100644 index 0000000000..187bf7e1c8 --- /dev/null +++ b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs @@ -0,0 +1,38 @@ +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http.Controllers; +using System.Web.Http.Filters; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Web.Composing; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Editors.Filters +{ + /// + /// Validates the incoming model + /// + internal class MemberSaveValidationAttribute : ActionFilterAttribute + { + private readonly ILogger _logger; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + + public MemberSaveValidationAttribute() : this(Current.Logger, Current.UmbracoContextAccessor) + { + } + + public MemberSaveValidationAttribute(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) + { + _logger = logger; + _umbracoContextAccessor = umbracoContextAccessor; + } + + public override void OnActionExecuting(HttpActionContext actionContext) + { + var model = (MemberSave)actionContext.ActionArguments["contentItem"]; + var contentItemValidator = new MemberValidationHelper(_logger, _umbracoContextAccessor); + contentItemValidator.ValidateItem(actionContext, model); + } + } +} diff --git a/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs new file mode 100644 index 0000000000..264574453a --- /dev/null +++ b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs @@ -0,0 +1,224 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; +using System.Web.Security; +using Umbraco.Core; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Editors.Filters +{ + + //internal class ContentValidationHelper : ContentItemValidationHelper + //{ + // public ContentValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) + // { + // } + + // /// + // /// Validates that the correct information is in the request for saving a culture variant + // /// + // /// + // /// + // /// + // protected override bool ValidateCultureVariant(ContentItemSave postedItem, HttpActionContext actionContext) + // { + // var contentType = postedItem.PersistedContent.GetContentType(); + // if (contentType.VariesByCulture() && postedItem.Culture.IsNullOrWhiteSpace()) + // { + // //we cannot save a content item that is culture variant if no culture was specified in the request! + // actionContext.Response = actionContext.Request.CreateValidationErrorResponse($"No culture found in request. Cannot save a content item that varies by culture, without a specified culture."); + // return false; + // } + // return true; + // } + //} + + /// + /// Custom validation helper so that we can exclude the Member.StandardPropertyTypeStubs from being validating for existence + /// + internal class MemberValidationHelper : ContentItemValidationHelper + { + public MemberValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) + { + } + + /// + /// We need to manually validate a few things here like email and login to make sure they are valid and aren't duplicates + /// + /// + /// + /// + public override bool ValidatePropertyData(MemberSave model, ModelStateDictionary modelState) + { + if (model.Username.IsNullOrWhiteSpace()) + { + modelState.AddPropertyError( + new ValidationResult("Invalid user name", new[] { "value" }), + $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); + } + + if (model.Email.IsNullOrWhiteSpace() || new EmailAddressAttribute().IsValid(model.Email) == false) + { + modelState.AddPropertyError( + new ValidationResult("Invalid email", new[] { "value" }), + $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email"); + } + + //default provider! + var membershipProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); + + var validEmail = ValidateUniqueEmail(model, membershipProvider); + if (validEmail == false) + { + modelState.AddPropertyError( + new ValidationResult("Email address is already in use", new[] { "value" }), + $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email"); + } + + var validLogin = ValidateUniqueLogin(model, membershipProvider); + if (validLogin == false) + { + modelState.AddPropertyError( + new ValidationResult("Username is already in use", new[] { "value" }), + $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); + } + + return base.ValidatePropertyData(model, modelState); + } + + /// + /// This ensures that the internal membership property types are removed from validation before processing the validation + /// since those properties are actually mapped to real properties of the IMember. + /// This also validates any posted data for fields that are sensitive. + /// + /// + /// + /// + protected override bool ValidateProperties(MemberSave model, HttpActionContext actionContext) + { + var propertiesToValidate = model.Properties.ToList(); + var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); + var exclude = defaultProps.Select(x => x.Value.Alias).ToArray(); + foreach (var remove in exclude) + { + propertiesToValidate.RemoveAll(property => property.Alias == remove); + } + + //if the user doesn't have access to sensitive values, then we need to validate the incoming properties to check + //if a sensitive value is being submitted. + if (UmbracoContextAccessor.UmbracoContext.Security.CurrentUser.HasAccessToSensitiveData() == false) + { + var sensitiveProperties = model.PersistedContent.ContentType + .PropertyTypes.Where(x => model.PersistedContent.ContentType.IsSensitiveProperty(x.Alias)) + .ToList(); + + foreach (var sensitiveProperty in sensitiveProperties) + { + var prop = propertiesToValidate.FirstOrDefault(x => x.Alias == sensitiveProperty.Alias); + + if (prop != null) + { + //this should not happen, this means that there was data posted for a sensitive property that + //the user doesn't have access to, which means that someone is trying to hack the values. + + var message = $"property with alias: {prop.Alias} cannot be posted"; + actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, new InvalidOperationException(message)); + return false; + } + } + } + + return ValidateProperties(propertiesToValidate, model.PersistedContent.Properties.ToList(), actionContext); + } + + internal bool ValidateUniqueLogin(MemberSave model, MembershipProvider membershipProvider) + { + if (model == null) throw new ArgumentNullException(nameof(model)); + if (membershipProvider == null) throw new ArgumentNullException(nameof(membershipProvider)); + + int totalRecs; + var existingByName = membershipProvider.FindUsersByName(model.Username.Trim(), 0, int.MaxValue, out totalRecs); + switch (model.Action) + { + case ContentSaveAction.Save: + + //ok, we're updating the member, we need to check if they are changing their login and if so, does it exist already ? + if (model.PersistedContent.Username.InvariantEquals(model.Username.Trim()) == false) + { + //they are changing their login name + if (existingByName.Cast().Select(x => x.UserName) + .Any(x => x == model.Username.Trim())) + { + //the user cannot use this login + return false; + } + } + break; + case ContentSaveAction.SaveNew: + //check if the user's login already exists + if (existingByName.Cast().Select(x => x.UserName) + .Any(x => x == model.Username.Trim())) + { + //the user cannot use this login + return false; + } + break; + default: + //we don't support this for members + throw new ArgumentOutOfRangeException(); + } + + return true; + } + + internal bool ValidateUniqueEmail(MemberSave model, MembershipProvider membershipProvider) + { + if (model == null) throw new ArgumentNullException(nameof(model)); + if (membershipProvider == null) throw new ArgumentNullException(nameof(membershipProvider)); + + if (membershipProvider.RequiresUniqueEmail == false) + { + return true; + } + + int totalRecs; + var existingByEmail = membershipProvider.FindUsersByEmail(model.Email.Trim(), 0, int.MaxValue, out totalRecs); + switch (model.Action) + { + case ContentSaveAction.Save: + //ok, we're updating the member, we need to check if they are changing their email and if so, does it exist already ? + if (model.PersistedContent.Email.InvariantEquals(model.Email.Trim()) == false) + { + //they are changing their email + if (existingByEmail.Cast().Select(x => x.Email) + .Any(x => x.InvariantEquals(model.Email.Trim()))) + { + //the user cannot use this email + return false; + } + } + break; + case ContentSaveAction.SaveNew: + //check if the user's email already exists + if (existingByEmail.Cast().Select(x => x.Email) + .Any(x => x.InvariantEquals(model.Email.Trim()))) + { + //the user cannot use this email + return false; + } + break; + default: + //we don't support this for members + throw new ArgumentOutOfRangeException(); + } + + return true; + } + } +} diff --git a/src/Umbraco.Web/Editors/UserGroupAuthorizationAttribute.cs b/src/Umbraco.Web/Editors/Filters/UserGroupAuthorizationAttribute.cs similarity index 97% rename from src/Umbraco.Web/Editors/UserGroupAuthorizationAttribute.cs rename to src/Umbraco.Web/Editors/Filters/UserGroupAuthorizationAttribute.cs index 6b0bac0d69..4293c31660 100644 --- a/src/Umbraco.Web/Editors/UserGroupAuthorizationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/UserGroupAuthorizationAttribute.cs @@ -1,13 +1,12 @@ using System; using System.Linq; -using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.Controllers; using Umbraco.Core; using Umbraco.Core.Composing; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.Editors.Filters { /// /// Authorizes that the current user has access to the user group Id in the request diff --git a/src/Umbraco.Web/Editors/UserGroupEditorAuthorizationHelper.cs b/src/Umbraco.Web/Editors/Filters/UserGroupEditorAuthorizationHelper.cs similarity index 99% rename from src/Umbraco.Web/Editors/UserGroupEditorAuthorizationHelper.cs rename to src/Umbraco.Web/Editors/Filters/UserGroupEditorAuthorizationHelper.cs index 26dfb9fb1f..2b2bf337de 100644 --- a/src/Umbraco.Web/Editors/UserGroupEditorAuthorizationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/UserGroupEditorAuthorizationHelper.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.Editors.Filters { internal class UserGroupEditorAuthorizationHelper { diff --git a/src/Umbraco.Web/Editors/UserGroupValidateAttribute.cs b/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs similarity index 98% rename from src/Umbraco.Web/Editors/UserGroupValidateAttribute.cs rename to src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs index b3bc59554d..f062be1aff 100644 --- a/src/Umbraco.Web/Editors/UserGroupValidateAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/UserGroupValidateAttribute.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.WebApi; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.Editors.Filters { internal sealed class UserGroupValidateAttribute : ActionFilterAttribute { diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 2d5ac19ba8..1259ce9639 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -23,7 +23,6 @@ using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; using System.Linq; using System.Web.Http.Controllers; -using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Configuration; @@ -35,6 +34,8 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models.Editors; using Umbraco.Core.Models.Validation; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Editors.Binders; +using Umbraco.Web.Editors.Filters; namespace Umbraco.Web.Editors { @@ -81,7 +82,7 @@ namespace Umbraco.Web.Editors } var emptyContent = Services.MediaService.CreateMedia("", parentId, contentType.Alias, Security.GetUserId().ResultOr(0)); - var mapped = ContextMapper.Map(emptyContent, UmbracoContext); + var mapped = Mapper.Map(emptyContent); //remove the listview app if it exists mapped.ContentApps = mapped.ContentApps.Where(x => x.Alias != "childItems").ToList(); @@ -131,7 +132,7 @@ namespace Umbraco.Web.Editors //HandleContentNotFound will throw an exception return null; } - return ContextMapper.Map(foundContent, UmbracoContext); + return Mapper.Map(foundContent); } /// @@ -151,7 +152,7 @@ namespace Umbraco.Web.Editors //HandleContentNotFound will throw an exception return null; } - return ContextMapper.Map(foundContent, UmbracoContext); + return Mapper.Map(foundContent); } /// @@ -180,7 +181,7 @@ namespace Umbraco.Web.Editors public IEnumerable GetByIds([FromUri]int[] ids) { var foundMedia = Services.MediaService.GetByIds(ids); - return foundMedia.Select(media => ContextMapper.Map(media, UmbracoContext)); + return foundMedia.Select(media => Mapper.Map(media)); } /// @@ -430,7 +431,7 @@ namespace Umbraco.Web.Editors /// /// [FileUploadCleanupFilter] - [MediaPostValidate] + [MediaItemSaveValidation] [OutgoingEditorModelEvent] public MediaItemDisplay PostSave( [ModelBinder(typeof(MediaItemBinder))] @@ -467,7 +468,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw validation response - var forDisplay = ContextMapper.Map(contentItem.PersistedContent, UmbracoContext); + var forDisplay = Mapper.Map(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -477,7 +478,7 @@ namespace Umbraco.Web.Editors var saveStatus = Services.MediaService.Save(contentItem.PersistedContent, (int)Security.CurrentUser.Id); //return the updated model - var display = ContextMapper.Map(contentItem.PersistedContent, UmbracoContext); + var display = Mapper.Map(contentItem.PersistedContent); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); @@ -574,7 +575,7 @@ namespace Umbraco.Web.Editors var f = mediaService.CreateMedia(folder.Name, intParentId, Constants.Conventions.MediaTypes.Folder); mediaService.Save(f, Security.CurrentUser.Id); - return ContextMapper.Map(f, UmbracoContext); + return Mapper.Map(f); } /// diff --git a/src/Umbraco.Web/Editors/MediaPostValidateAttribute.cs b/src/Umbraco.Web/Editors/MediaPostValidateAttribute.cs deleted file mode 100644 index d153283025..0000000000 --- a/src/Umbraco.Web/Editors/MediaPostValidateAttribute.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Net; -using System.Net.Http; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.Filters; -using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Core.Services; -using Umbraco.Web.Composing; -using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.Security; -using Umbraco.Web.WebApi; - -namespace Umbraco.Web.Editors -{ - /// - /// Checks if the user has access to post a content item based on whether it's being created or saved. - /// - internal sealed class MediaPostValidateAttribute : ActionFilterAttribute - { - private readonly IMediaService _mediaService; - private readonly IEntityService _entityService; - private readonly WebSecurity _security; - - public MediaPostValidateAttribute() - { - } - - // fixme wtf is this? - public MediaPostValidateAttribute(IMediaService mediaService, IEntityService entityService, WebSecurity security) - { - _mediaService = mediaService ?? throw new ArgumentNullException(nameof(mediaService)); - _entityService = entityService; - _security = security ?? throw new ArgumentNullException(nameof(security)); - } - - // fixme all these should be injected properties - - private IMediaService MediaService - => _mediaService ?? Current.Services.MediaService; - - private IEntityService EntityService - => _entityService ?? Current.Services.EntityService; - - private WebSecurity Security - => _security ?? UmbracoContext.Current.Security; - - public override void OnActionExecuting(HttpActionContext actionContext) - { - var mediaItem = (MediaItemSave)actionContext.ActionArguments["contentItem"]; - - //We now need to validate that the user is allowed to be doing what they are doing. - //Then if it is new, we need to lookup those permissions on the parent. - IMedia contentToCheck; - int contentIdToCheck; - switch (mediaItem.Action) - { - case ContentSaveAction.Save: - contentToCheck = mediaItem.PersistedContent; - contentIdToCheck = contentToCheck.Id; - break; - case ContentSaveAction.SaveNew: - contentToCheck = MediaService.GetById(mediaItem.ParentId); - - if (mediaItem.ParentId != Constants.System.Root) - { - contentToCheck = MediaService.GetById(mediaItem.ParentId); - contentIdToCheck = contentToCheck.Id; - } - else - { - contentIdToCheck = mediaItem.ParentId; - } - - break; - default: - //we don't support this for media - actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.NotFound); - return; - } - - if (MediaController.CheckPermissions( - actionContext.Request.Properties, - Security.CurrentUser, - MediaService, EntityService, - contentIdToCheck, contentToCheck) == false) - { - throw new HttpResponseException(actionContext.Request.CreateUserNoAccessResponse()); - } - } - } -} diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 7cf0e73e3c..61a7f3baa9 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -23,11 +23,12 @@ using Umbraco.Web.Models.Mapping; using Umbraco.Web.WebApi; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; -using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; using System.Collections.Generic; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Editors.Binders; +using Umbraco.Web.Editors.Filters; namespace Umbraco.Web.Editors { @@ -84,7 +85,7 @@ namespace Umbraco.Web.Editors var pagedResult = new PagedResult(totalRecords, pageNumber, pageSize) { Items = members - .Select(x => ContextMapper.Map(x, UmbracoContext)) + .Select(x => Mapper.Map(x)) }; return pagedResult; } @@ -173,7 +174,7 @@ namespace Umbraco.Web.Editors { HandleContentNotFound(key); } - return ContextMapper.Map(foundMember, UmbracoContext); + return Mapper.Map(foundMember); case MembershipScenario.CustomProviderWithUmbracoLink: //TODO: Support editing custom properties for members with a custom membership provider here. @@ -233,7 +234,7 @@ namespace Umbraco.Web.Editors emptyContent = new Member(contentType); emptyContent.AdditionalData["NewPassword"] = Membership.GeneratePassword(provider.MinRequiredPasswordLength, provider.MinRequiredNonAlphanumericCharacters); - return ContextMapper.Map(emptyContent, UmbracoContext); + return Mapper.Map(emptyContent); case MembershipScenario.CustomProviderWithUmbracoLink: //TODO: Support editing custom properties for members with a custom membership provider here. @@ -242,7 +243,7 @@ namespace Umbraco.Web.Editors //we need to return a scaffold of a 'simple' member - basically just what a membership provider can edit emptyContent = MemberService.CreateGenericMembershipProviderMember("", "", "", ""); emptyContent.AdditionalData["NewPassword"] = Membership.GeneratePassword(Membership.MinRequiredPasswordLength, Membership.MinRequiredNonAlphanumericCharacters); - return ContextMapper.Map(emptyContent, UmbracoContext); + return Mapper.Map(emptyContent); } } @@ -252,6 +253,7 @@ namespace Umbraco.Web.Editors /// [FileUploadCleanupFilter] [OutgoingEditorModelEvent] + [MemberSaveValidation] public MemberDisplay PostSave( [ModelBinder(typeof(MemberBinder))] MemberSave contentItem) @@ -282,7 +284,7 @@ namespace Umbraco.Web.Editors //Unlike content/media - if there are errors for a member, we do NOT proceed to save them, we cannot so return the errors if (ModelState.IsValid == false) { - var forDisplay = ContextMapper.Map(contentItem.PersistedContent, UmbracoContext); + var forDisplay = Mapper.Map(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -324,7 +326,7 @@ namespace Umbraco.Web.Editors //If we've had problems creating/updating the user with the provider then return the error if (ModelState.IsValid == false) { - var forDisplay = ContextMapper.Map(contentItem.PersistedContent, UmbracoContext); + var forDisplay = Mapper.Map(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); } @@ -362,7 +364,7 @@ namespace Umbraco.Web.Editors contentItem.PersistedContent.AdditionalData["GeneratedPassword"] = generatedPassword; //return the updated model - var display = ContextMapper.Map(contentItem.PersistedContent, UmbracoContext); + var display = Mapper.Map(contentItem.PersistedContent); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); @@ -545,6 +547,7 @@ namespace Umbraco.Web.Editors /// Re-fetches the database data to map to the PersistedContent object and re-assigns the already mapped the posted properties so that the display object is up-to-date /// /// + /// /// /// This is done during an update if the membership provider has changed some underlying data - we need to ensure that our model is consistent with that data /// diff --git a/src/Umbraco.Web/Editors/UserGroupsController.cs b/src/Umbraco.Web/Editors/UserGroupsController.cs index 83f5db08ad..677890bcc4 100644 --- a/src/Umbraco.Web/Editors/UserGroupsController.cs +++ b/src/Umbraco.Web/Editors/UserGroupsController.cs @@ -9,6 +9,7 @@ using AutoMapper; using Umbraco.Core.Models; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; +using Umbraco.Web.Editors.Filters; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs index 73a4d9c910..28972ba7f6 100644 --- a/src/Umbraco.Web/Editors/UsersController.cs +++ b/src/Umbraco.Web/Editors/UsersController.cs @@ -25,6 +25,7 @@ using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Security; using Umbraco.Core.Services; +using Umbraco.Web.Editors.Filters; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentBaseItemSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentBaseItemSave.cs deleted file mode 100644 index 3a28793ac7..0000000000 --- a/src/Umbraco.Web/Models/ContentEditing/ContentBaseItemSave.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Runtime.Serialization; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Editors; - -namespace Umbraco.Web.Models.ContentEditing -{ - /// - /// A model representing a content base item to be saved - /// - [DataContract(Name = "content", Namespace = "")] - public abstract class ContentBaseItemSave : ContentItemBasic, IHaveUploadedFiles - where TPersisted : IContentBase - { - protected ContentBaseItemSave() - { - UploadedFiles = new List(); - } - - /// - /// The action to perform when saving this content item - /// - [DataMember(Name = "action", IsRequired = true)] - [Required] - public ContentSaveAction Action { get; set; } - - [IgnoreDataMember] - public List UploadedFiles { get; private set; } - } -} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs new file mode 100644 index 0000000000..8748a3f4e0 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// A model representing a content item to be saved + /// + [DataContract(Name = "content", Namespace = "")] + public abstract class ContentBaseSave : ContentItemBasic, IContentSave + where TPersisted : IContentBase + { + protected ContentBaseSave() + { + UploadedFiles = new List(); + } + + #region IContentSave + /// + [DataMember(Name = "action", IsRequired = true)] + [Required] + public ContentSaveAction Action { get; set; } + + [IgnoreDataMember] + public List UploadedFiles { get; } + + //These need explicit implementation because we are using internal models + /// + [IgnoreDataMember] + TPersisted IContentSave.PersistedContent { get; set; } + + //These need explicit implementation because we are using internal models + /// + [IgnoreDataMember] + ContentItemDto IContentSave.ContentDto { get; set; } + + //Non explicit internal getter so we don't need to explicitly cast in our own code + [IgnoreDataMember] + internal TPersisted PersistedContent + { + get => ((IContentSave)this).PersistedContent; + set => ((IContentSave) this).PersistedContent = value; + } + + //Non explicit internal getter so we don't need to explicitly cast in our own code + [IgnoreDataMember] + internal ContentItemDto ContentDto + { + get => ((IContentSave)this).ContentDto; + set => ((IContentSave) this).ContentDto = value; + } + + #endregion + + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs index 5b4f710a28..12764de918 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs @@ -85,26 +85,5 @@ namespace Umbraco.Web.Models.ContentEditing set => _properties = value; } - /// - /// The real persisted content object - used during inbound model binding - /// - /// - /// This is not used for outgoing model information. - /// - [IgnoreDataMember] - internal TPersisted PersistedContent { get; set; } - - /// - /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding - /// - /// - /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need - /// instead of having to look up all the data individually. - /// This is not used for outgoing model information. - /// - [IgnoreDataMember] - internal ContentItemDto ContentDto { get; set; } - - } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index 8f14114c68..1b1c5a3f8d 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -22,7 +22,7 @@ namespace Umbraco.Web.Models.ContentEditing AllowPreview = true; Notifications = new List(); Errors = new Dictionary(); - ContentVariants = new List(); + Variants = new List(); ContentApps = new List(); } @@ -65,7 +65,7 @@ namespace Umbraco.Web.Models.ContentEditing /// If a content item is invariant, this collection will only contain one item, else it will contain all culture variants /// [DataMember(Name = "variants")] - public IEnumerable ContentVariants { get; set; } + public IEnumerable Variants { get; set; } [DataMember(Name = "owner")] public UserProfile Owner { get; set; } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs index fa0bbaba3a..ba1560978c 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; using Newtonsoft.Json; using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; namespace Umbraco.Web.Models.ContentEditing { @@ -10,13 +12,28 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be saved /// [DataContract(Name = "content", Namespace = "")] - public class ContentItemSave : ContentBaseItemSave + public class ContentItemSave : IContentSave { - /// - /// The language Id for the content variation being saved - /// - [DataMember(Name = "culture")] - public string Culture { get; set; } //TODO: Change this to ContentVariationPublish, but this will all change anyways when we can edit all variants at once + protected ContentItemSave() + { + UploadedFiles = new List(); + Variants = new List(); + } + + [DataMember(Name = "id", IsRequired = true)] + [Required] + public int Id { get; set; } + + [DataMember(Name = "parentId", IsRequired = true)] + [Required] + public int ParentId { get; set; } + + [DataMember(Name = "variants", IsRequired = true)] + public IEnumerable Variants { get; set; } + + [DataMember(Name = "contentTypeAlias", IsRequired = true)] + [Required(AllowEmptyStrings = false)] + public string ContentTypeAlias { get; set; } /// /// The template alias to save @@ -24,16 +41,48 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "templateAlias")] public string TemplateAlias { get; set; } + //TODO: these will need to move to the variant [DataMember(Name = "releaseDate")] public DateTime? ReleaseDate { get; set; } - [DataMember(Name = "expireDate")] public DateTime? ExpireDate { get; set; } - /// - /// Indicates that these variations should also be published - /// - [DataMember(Name = "publishVariations")] - public IEnumerable PublishVariations { get; set; } + #region IContentSave + + [DataMember(Name = "action", IsRequired = true)] + [Required] + public ContentSaveAction Action { get; set; } + + [IgnoreDataMember] + public List UploadedFiles { get; } + + //These need explicit implementation because we are using internal models + /// + [IgnoreDataMember] + IContent IContentSave.PersistedContent { get; set; } + + //These need explicit implementation because we are using internal models + /// + [IgnoreDataMember] + ContentItemDto IContentSave.ContentDto { get; set; } + + //Non explicit internal getter so we don't need to explicitly cast in our own code + [IgnoreDataMember] + internal IContent PersistedContent + { + get => ((IContentSave)this).PersistedContent; + set => ((IContentSave)this).PersistedContent = value; + } + + //Non explicit internal getter so we don't need to explicitly cast in our own code + [IgnoreDataMember] + internal ContentItemDto ContentDto + { + get => ((IContentSave)this).ContentDto; + set => ((IContentSave)this).ContentDto = value; + } + + #endregion + } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs new file mode 100644 index 0000000000..72a59f05cc --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Validation; + +namespace Umbraco.Web.Models.ContentEditing +{ + [DataContract(Name = "contentVariant", Namespace = "")] + public class ContentVariantSave : IContentProperties + { + public ContentVariantSave() + { + Properties = new List(); + } + + [DataMember(Name = "name", IsRequired = true)] + [RequiredForPersistence(AllowEmptyStrings = false, ErrorMessage = "Required")] + public string Name { get; set; } + + [DataMember(Name = "properties")] + public IEnumerable Properties { get; set; } + + /// + /// The culture of this variant, if this is invariant than this is null or empty + /// + [DataMember(Name = "culture")] + public string Culture { get; set; } + + /// + /// Indicates if the variant should be published or unpublished + /// + [DataMember(Name = "publish")] + public bool Publish { get; set; } + + + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs index e6f32bae35..6e95991580 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariationDisplay.cs @@ -4,10 +4,10 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.Serialization; -using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { + /// /// Represents the variant info for a content item /// diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariationPublish.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariationPublish.cs deleted file mode 100644 index 71c4672ccb..0000000000 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariationPublish.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Runtime.Serialization; - -namespace Umbraco.Web.Models.ContentEditing -{ - /// - /// Used to indicate which additional variants to publish when a content item is published - /// - public class ContentVariationPublish - { - [DataMember(Name = "culture", IsRequired = true)] - [Required] - public string Culture { get; set; } - - [DataMember(Name = "segment")] - public string Segment { get; set; } - } -} diff --git a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs index 6c574bc8bd..0c633d0319 100644 --- a/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/EntityBasic.cs @@ -3,10 +3,12 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; +using System.Web.Http.ModelBinding; using Newtonsoft.Json; using Umbraco.Core; using Umbraco.Core.Models.Validation; using Umbraco.Core.Serialization; +using Umbraco.Web.WebApi; namespace Umbraco.Web.Models.ContentEditing { diff --git a/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs b/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs index 409c758536..dbb1c1da5e 100644 --- a/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs +++ b/src/Umbraco.Web/Models/ContentEditing/IContentProperties.cs @@ -1,7 +1,24 @@ using System.Collections.Generic; +using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { + ///// + ///// An interface that needs to be implemented for the ContentItemValidationHelper to be used + ///// + ///// + ///// + ///// We want to share the validation and model binding logic with content, media and members but because of variants content + ///// is now quite different than the others so this allows us to continue sharing the logic between these models. + ///// + //internal interface IContentItemValidationHelperModel + // where TPersisted : IContentBase + //{ + // TPersisted GetPersisted(); + // ContentItemDto GetDto(); + // IContentProperties GetProperties(); + //} + public interface IContentProperties where T : ContentPropertyBasic { diff --git a/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs b/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs new file mode 100644 index 0000000000..cf4d448131 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs @@ -0,0 +1,35 @@ +using Umbraco.Core.Models; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// An interface exposes the shared parts of content, media, members that we use during model binding in order to share logic + /// + /// + internal interface IContentSave : IHaveUploadedFiles + where TPersisted : IContentBase + { + /// + /// The action to perform when saving this content item + /// + ContentSaveAction Action { get; set; } + + /// + /// The real persisted content object - used during inbound model binding + /// + /// + /// This is not used for outgoing model information. + /// + TPersisted PersistedContent { get; set; } + + /// + /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding + /// + /// + /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need + /// instead of having to look up all the data individually. + /// This is not used for outgoing model information. + /// + ContentItemDto ContentDto { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Models/ContentEditing/MediaItemSave.cs b/src/Umbraco.Web/Models/ContentEditing/MediaItemSave.cs index 334c0d1ddd..b31f1d1782 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MediaItemSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MediaItemSave.cs @@ -1,5 +1,6 @@ using System.Runtime.Serialization; using Umbraco.Core.Models; +using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Models.ContentEditing { @@ -7,8 +8,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a media item to be saved /// [DataContract(Name = "content", Namespace = "")] - public class MediaItemSave : ContentBaseItemSave + public class MediaItemSave : ContentBaseSave { - } } diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberSave.cs b/src/Umbraco.Web/Models/ContentEditing/MemberSave.cs index d66ba8600f..b25a210083 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MemberSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MemberSave.cs @@ -3,14 +3,14 @@ using System.Collections.Generic; using System.Runtime.Serialization; using Newtonsoft.Json.Linq; using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; using Umbraco.Core.Models.Validation; +using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Models.ContentEditing { - /// - /// A model representing a member to be saved - /// - public class MemberSave : ContentBaseItemSave + /// + public class MemberSave : ContentBaseSave { [DataMember(Name = "username", IsRequired = true)] @@ -35,6 +35,7 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "isApproved")] public bool IsApproved { get; set; } + //TODO: Need to add question / answer support } diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 4b49a21606..0e2c3640ac 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -19,6 +19,7 @@ namespace Umbraco.Web.Models.Mapping ContentUrlResolver contentUrlResolver, ContentTreeNodeUrlResolver contentTreeNodeUrlResolver, TabsAndPropertiesResolver tabsAndPropertiesResolver, + ContentAppResolver contentAppResolver, IUserService userService, ILocalizedTextService textService, IContentService contentService, @@ -35,14 +36,13 @@ namespace Umbraco.Web.Models.Mapping var contentTypeBasicResolver = new ContentTypeBasicResolver(); var defaultTemplateResolver = new DefaultTemplateResolver(); var variantResolver = new ContentVariantResolver(localizationService, textService); - var contentAppResolver = new ContentAppResolver(dataTypeService, propertyEditors); - + //FROM IContent TO ContentItemDisplay CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) .ForMember(dest => dest.Updater, opt => opt.ResolveUsing(src => creatorResolver.Resolve(src))) - .ForMember(dest => dest.ContentVariants, opt => opt.ResolveUsing(variantResolver)) + .ForMember(dest => dest.Variants, opt => opt.ResolveUsing(variantResolver)) .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(contentAppResolver)) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) .ForMember(dest => dest.ContentTypeAlias, opt => opt.MapFrom(src => src.ContentType.Alias)) diff --git a/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs b/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs index ffcd39856e..b85ccd1523 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentPropertyBasicConverter.cs @@ -58,13 +58,14 @@ namespace Umbraco.Web.Models.Mapping // if it isn't one of the ones specified in 'includeProperties', we will just return the result without mapping the Value. if (context.Options.Items.ContainsKey("IncludeProperties")) { - var includeProperties = context.Options.Items["IncludeProperties"] as IEnumerable; - if (includeProperties != null && includeProperties.Contains(property.Alias) == false) + if (context.Options.Items["IncludeProperties"] is IEnumerable includeProperties + && includeProperties.Contains(property.Alias) == false) { return result; } } + //Get the culture from the context which will be set during the mapping operation for each property var culture = context.GetCulture(); //a culture needs to be in the context for a property type that can vary diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index fa0f576ee9..b4bae19e00 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -18,6 +18,7 @@ namespace Umbraco.Web.Models.Mapping public MediaMapperProfile( TabsAndPropertiesResolver tabsAndPropertiesResolver, ContentTreeNodeUrlResolver contentTreeNodeUrlResolver, + MediaAppResolver mediaAppResolver, IUserService userService, ILocalizedTextService textService, IDataTypeService dataTypeService, @@ -29,7 +30,6 @@ namespace Umbraco.Web.Models.Mapping var mediaOwnerResolver = new OwnerResolver(userService); var childOfListViewResolver = new MediaChildOfListViewResolver(mediaService, mediaTypeService); var mediaTypeBasicResolver = new ContentTypeBasicResolver(); - var mediaAppResolver = new MediaAppResolver(dataTypeService, propertyEditors); //FROM IMedia TO MediaItemDisplay CreateMap() diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index b754d7ed26..667e1a69af 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -115,6 +115,8 @@ + + @@ -122,11 +124,12 @@ + - + - + @@ -135,10 +138,10 @@ - - + + - + @@ -207,8 +210,8 @@ + - @@ -455,6 +458,8 @@ + + @@ -608,13 +613,12 @@ - + - @@ -634,7 +638,7 @@ - + @@ -733,7 +737,6 @@ - @@ -815,7 +818,7 @@ - + @@ -997,12 +1000,12 @@ - + - - + + - + diff --git a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs b/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs deleted file mode 100644 index 6e80ba52f7..0000000000 --- a/src/Umbraco.Web/WebApi/Binders/ContentItemBinder.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Web.Http.Controllers; -using AutoMapper; -using Umbraco.Core; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; -using Umbraco.Core.Services; -using Umbraco.Web.Composing; -using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.Models.Mapping; -using Umbraco.Web.WebApi.Filters; - -namespace Umbraco.Web.WebApi.Binders -{ - internal class ContentItemBinder : ContentItemBaseBinder - { - public ContentItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) - { - } - - public ContentItemBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - : base(logger, services, umbracoContextAccessor) - { - } - - protected override ContentItemValidationHelper GetValidationHelper() - { - return new ContentValidationHelper(Logger, UmbracoContextAccessor); - } - - protected override IContent GetExisting(ContentItemSave model) - { - return Services.ContentService.GetById(Convert.ToInt32(model.Id)); - } - - protected override IContent CreateNew(ContentItemSave model) - { - var contentType = Services.ContentTypeService.Get(model.ContentTypeAlias); - if (contentType == null) - { - throw new InvalidOperationException("No content type found with alias " + model.ContentTypeAlias); - } - return new Content(model.Name, model.ParentId, contentType); - } - - protected override ContentItemDto MapFromPersisted(ContentItemSave model) - { - return MapFromPersisted(model.PersistedContent, model.Culture); - } - - internal static ContentItemDto MapFromPersisted(IContent content, string culture) - { - return ContextMapper.Map>(content, new Dictionary - { - [ContextMapper.CultureKey] = culture - }); - } - - internal class ContentValidationHelper : ContentItemValidationHelper - { - public ContentValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) - { - } - - /// - /// Validates that the correct information is in the request for saving a culture variant - /// - /// - /// - /// - protected override bool ValidateCultureVariant(ContentItemSave postedItem, HttpActionContext actionContext) - { - var contentType = postedItem.PersistedContent.GetContentType(); - if (contentType.VariesByCulture() && postedItem.Culture.IsNullOrWhiteSpace()) - { - //we cannot save a content item that is culture variant if no culture was specified in the request! - actionContext.Response = actionContext.Request.CreateValidationErrorResponse($"No culture found in request. Cannot save a content item that varies by culture, without a specified culture."); - return false; - } - return true; - } - } - } -} diff --git a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs b/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs deleted file mode 100644 index df97891e3b..0000000000 --- a/src/Umbraco.Web/WebApi/Binders/MemberBinder.cs +++ /dev/null @@ -1,374 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Net; -using System.Web.Http; -using System.Web.Http.Controllers; -using System.Web.Http.ModelBinding; -using System.Web.Security; -using AutoMapper; -using Umbraco.Core; -using Umbraco.Core.Models; -using Umbraco.Core.Security; -using Umbraco.Core.Services; -using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.WebApi.Filters; -using System.Linq; -using System.Net.Http; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Services.Implement; -using Umbraco.Web; -using Umbraco.Web.Composing; -using Umbraco.Core.Logging; - -namespace Umbraco.Web.WebApi.Binders -{ - internal class MemberBinder : ContentItemBaseBinder - { - - public MemberBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) - { - } - - public MemberBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - : base(logger, services, umbracoContextAccessor) - { - } - - protected override ContentItemValidationHelper GetValidationHelper() - { - return new MemberValidationHelper(Logger, UmbracoContextAccessor); - } - - /// - /// Returns an IMember instance used to bind values to and save (depending on the membership scenario) - /// - /// - /// - protected override IMember GetExisting(MemberSave model) - { - var scenario = Services.MemberService.GetMembershipScenario(); - var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); - switch (scenario) - { - case MembershipScenario.NativeUmbraco: - return GetExisting(model.Key); - case MembershipScenario.CustomProviderWithUmbracoLink: - case MembershipScenario.StandaloneCustomProvider: - default: - var membershipUser = provider.GetUser(model.Key, false); - if (membershipUser == null) - { - throw new InvalidOperationException("Could not find member with key " + model.Key); - } - - //TODO: Support this scenario! - //if (scenario == MembershipScenario.CustomProviderWithUmbracoLink) - //{ - // //if there's a 'Member' type then we should be able to just go get it from the db since it was created with a link - // // to our data. - // var memberType = ApplicationContext.Services.MemberTypeService.GetMemberType(Constants.Conventions.MemberTypes.Member); - // if (memberType != null) - // { - // var existing = GetExisting(model.Key); - // FilterContentTypeProperties(existing.ContentType, existing.ContentType.PropertyTypes.Select(x => x.Alias).ToArray()); - // } - //} - - //generate a member for a generic membership provider - //NOTE: We don't care about the password here, so just generate something - //var member = MemberService.CreateGenericMembershipProviderMember(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N")); - - //var convertResult = membershipUser.ProviderUserKey.TryConvertTo(); - //if (convertResult.Success == false) - //{ - // throw new InvalidOperationException("Only membership providers that store a GUID as their ProviderUserKey are supported" + model.Key); - //} - //member.Key = convertResult.Result; - - var member = Mapper.Map(membershipUser); - - return member; - } - } - - private IMember GetExisting(Guid key) - { - var member = Services.MemberService.GetByKey(key); - if (member == null) - { - throw new InvalidOperationException("Could not find member with key " + key); - } - - return member; - } - - /// - /// Gets an instance of IMember used when creating a member - /// - /// - /// - /// - /// Depending on whether a custom membership provider is configured this will return different results. - /// - protected override IMember CreateNew(MemberSave model) - { - var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); - - if (provider.IsUmbracoMembershipProvider()) - { - var contentType = Services.MemberTypeService.Get(model.ContentTypeAlias); - if (contentType == null) - { - throw new InvalidOperationException("No member type found wth alias " + model.ContentTypeAlias); - } - - //remove all membership properties, these values are set with the membership provider. - FilterMembershipProviderProperties(contentType); - - //return the new member with the details filled in - return new Member(model.Name, model.Email, model.Username, model.Password.NewPassword, contentType); - } - else - { - //A custom membership provider is configured - - //NOTE: Below we are assigning the password to just a new GUID because we are not actually storing the password, however that - // field is mandatory in the database so we need to put something there. - - //If the default Member type exists, we'll use that to create the IMember - that way we can associate the custom membership - // provider to our data - eventually we can support editing custom properties with a custom provider. - var memberType = Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); - if (memberType != null) - { - FilterContentTypeProperties(memberType, memberType.PropertyTypes.Select(x => x.Alias).ToArray()); - return new Member(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N"), memberType); - } - - //generate a member for a generic membership provider - var member = MemberService.CreateGenericMembershipProviderMember(model.Name, model.Email, model.Username, Guid.NewGuid().ToString("N")); - //we'll just remove all properties here otherwise we'll end up with validation errors, we don't want to persist any property data anyways - // in this case. - FilterContentTypeProperties(member.ContentType, member.ContentType.PropertyTypes.Select(x => x.Alias).ToArray()); - return member; - } - } - - /// - /// This will remove all of the special membership provider properties which were required to display the property editors - /// for editing - but the values have been mapped back ot the MemberSave object directly - we don't want to keep these properties - /// on the IMember because they will attempt to be persisted which we don't want since they might not even exist. - /// - /// - private void FilterMembershipProviderProperties(IContentTypeBase contentType) - { - var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); - //remove all membership properties, these values are set with the membership provider. - var exclude = defaultProps.Select(x => x.Value.Alias).ToArray(); - FilterContentTypeProperties(contentType, exclude); - } - - private void FilterContentTypeProperties(IContentTypeBase contentType, IEnumerable exclude) - { - //remove all properties based on the exclusion list - foreach (var remove in exclude) - { - if (contentType.PropertyTypeExists(remove)) - { - contentType.RemovePropertyType(remove); - } - } - } - - protected override ContentItemDto MapFromPersisted(MemberSave model) - { - return Mapper.Map>(model.PersistedContent); - } - - /// - /// Custom validation helper so that we can exclude the Member.StandardPropertyTypeStubs from being validating for existence - /// - internal class MemberValidationHelper : ContentItemValidationHelper - { - public MemberValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) - { - } - - /// - /// We need to manually validate a few things here like email and login to make sure they are valid and aren't duplicates - /// - /// - /// - /// - /// - public override bool ValidatePropertyData(MemberSave postedItem, ContentItemDto dto, ModelStateDictionary modelState) - { - var memberSave = postedItem; - - if (memberSave.Username.IsNullOrWhiteSpace()) - { - modelState.AddPropertyError( - new ValidationResult("Invalid user name", new[] { "value" }), - $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); - } - - if (memberSave.Email.IsNullOrWhiteSpace() || new EmailAddressAttribute().IsValid(memberSave.Email) == false) - { - modelState.AddPropertyError( - new ValidationResult("Invalid email", new[] { "value" }), - $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email"); - } - - //default provider! - var membershipProvider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); - - var validEmail = ValidateUniqueEmail(memberSave, membershipProvider); - if (validEmail == false) - { - modelState.AddPropertyError( - new ValidationResult("Email address is already in use", new[] { "value" }), - $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}email"); - } - - var validLogin = ValidateUniqueLogin(memberSave, membershipProvider); - if (validLogin == false) - { - modelState.AddPropertyError( - new ValidationResult("Username is already in use", new[] { "value" }), - $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); - } - - return base.ValidatePropertyData(postedItem, dto, modelState); - } - - /// - /// This ensures that the internal membership property types are removed from validation before processing the validation - /// since those properties are actually mapped to real properties of the IMember. - /// This also validates any posted data for fields that are sensitive. - /// - /// - /// - /// - protected override bool ValidateProperties(MemberSave postedItem, HttpActionContext actionContext) - { - var propertiesToValidate = postedItem.Properties.ToList(); - var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); - var exclude = defaultProps.Select(x => x.Value.Alias).ToArray(); - foreach (var remove in exclude) - { - propertiesToValidate.RemoveAll(property => property.Alias == remove); - } - - //if the user doesn't have access to sensitive values, then we need to validate the incoming properties to check - //if a sensitive value is being submitted. - if (UmbracoContextAccessor.UmbracoContext.Security.CurrentUser.HasAccessToSensitiveData() == false) - { - var sensitiveProperties = postedItem.PersistedContent.ContentType - .PropertyTypes.Where(x => postedItem.PersistedContent.ContentType.IsSensitiveProperty(x.Alias)) - .ToList(); - - foreach (var sensitiveProperty in sensitiveProperties) - { - var prop = propertiesToValidate.FirstOrDefault(x => x.Alias == sensitiveProperty.Alias); - - if (prop != null) - { - //this should not happen, this means that there was data posted for a sensitive property that - //the user doesn't have access to, which means that someone is trying to hack the values. - - var message = $"property with alias: {prop.Alias} cannot be posted"; - actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, new InvalidOperationException(message)); - return false; - } - } - } - - return ValidateProperties(propertiesToValidate, postedItem.PersistedContent.Properties.ToList(), actionContext); - } - - internal bool ValidateUniqueLogin(MemberSave contentItem, MembershipProvider membershipProvider) - { - if (contentItem == null) throw new ArgumentNullException(nameof(contentItem)); - if (membershipProvider == null) throw new ArgumentNullException(nameof(membershipProvider)); - - int totalRecs; - var existingByName = membershipProvider.FindUsersByName(contentItem.Username.Trim(), 0, int.MaxValue, out totalRecs); - switch (contentItem.Action) - { - case ContentSaveAction.Save: - - //ok, we're updating the member, we need to check if they are changing their login and if so, does it exist already ? - if (contentItem.PersistedContent.Username.InvariantEquals(contentItem.Username.Trim()) == false) - { - //they are changing their login name - if (existingByName.Cast().Select(x => x.UserName) - .Any(x => x == contentItem.Username.Trim())) - { - //the user cannot use this login - return false; - } - } - break; - case ContentSaveAction.SaveNew: - //check if the user's login already exists - if (existingByName.Cast().Select(x => x.UserName) - .Any(x => x == contentItem.Username.Trim())) - { - //the user cannot use this login - return false; - } - break; - default: - //we don't support this for members - throw new ArgumentOutOfRangeException(); - } - - return true; - } - - internal bool ValidateUniqueEmail(MemberSave contentItem, MembershipProvider membershipProvider) - { - if (contentItem == null) throw new ArgumentNullException(nameof(contentItem)); - if (membershipProvider == null) throw new ArgumentNullException(nameof(membershipProvider)); - - if (membershipProvider.RequiresUniqueEmail == false) - { - return true; - } - - int totalRecs; - var existingByEmail = membershipProvider.FindUsersByEmail(contentItem.Email.Trim(), 0, int.MaxValue, out totalRecs); - switch (contentItem.Action) - { - case ContentSaveAction.Save: - //ok, we're updating the member, we need to check if they are changing their email and if so, does it exist already ? - if (contentItem.PersistedContent.Email.InvariantEquals(contentItem.Email.Trim()) == false) - { - //they are changing their email - if (existingByEmail.Cast().Select(x => x.Email) - .Any(x => x.InvariantEquals(contentItem.Email.Trim()))) - { - //the user cannot use this email - return false; - } - } - break; - case ContentSaveAction.SaveNew: - //check if the user's email already exists - if (existingByEmail.Cast().Select(x => x.Email) - .Any(x => x.InvariantEquals(contentItem.Email.Trim()))) - { - //the user cannot use this email - return false; - } - break; - default: - //we don't support this for members - throw new ArgumentOutOfRangeException(); - } - - return true; - } - } - } -} diff --git a/src/Umbraco.Web/WebApi/Filters/ValidationFilterAttribute.cs b/src/Umbraco.Web/WebApi/Filters/ValidationFilterAttribute.cs index cd737646bf..f56d9c28c4 100644 --- a/src/Umbraco.Web/WebApi/Filters/ValidationFilterAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/ValidationFilterAttribute.cs @@ -8,6 +8,7 @@ using System.Web.Http.Filters; namespace Umbraco.Web.WebApi.Filters { + /// /// An action filter used to do basic validation against the model and return a result /// straight away if it fails. diff --git a/src/Umbraco.Web/Editors/ParameterSwapControllerActionSelector.cs b/src/Umbraco.Web/WebApi/ParameterSwapControllerActionSelector.cs similarity index 97% rename from src/Umbraco.Web/Editors/ParameterSwapControllerActionSelector.cs rename to src/Umbraco.Web/WebApi/ParameterSwapControllerActionSelector.cs index 03e982c7cd..8145724bcc 100644 --- a/src/Umbraco.Web/Editors/ParameterSwapControllerActionSelector.cs +++ b/src/Umbraco.Web/WebApi/ParameterSwapControllerActionSelector.cs @@ -1,18 +1,13 @@ using System; -using System.Collections; using System.Linq; using System.Net.Http; -using System.Net.Http.Formatting; using System.Web; -using System.Web.Http; using System.Web.Http.Controllers; -using System.Web.Http.Validation; -using System.Web.Http.ValueProviders; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core; -namespace Umbraco.Web.Editors +namespace Umbraco.Web.WebApi { /// /// This is used to auto-select specific actions on controllers that would otherwise be ambiguous based on a single parameter type diff --git a/src/Umbraco.Web/WebApi/TrimModelBinder.cs b/src/Umbraco.Web/WebApi/TrimModelBinder.cs new file mode 100644 index 0000000000..0361612bb8 --- /dev/null +++ b/src/Umbraco.Web/WebApi/TrimModelBinder.cs @@ -0,0 +1,23 @@ +using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; + +namespace Umbraco.Web.WebApi +{ + /// + /// A model binder to trim the string + /// + internal class TrimModelBinder : IModelBinder + { + public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + { + var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); + if (valueResult?.AttemptedValue == null) + { + return false; + } + + bindingContext.Model = (string.IsNullOrWhiteSpace(valueResult.AttemptedValue) ? valueResult.AttemptedValue : valueResult.AttemptedValue.Trim()); + return true; + } + } +} From 01b37479567d8c13ad3dba72b03b8f274edd7a48 Mon Sep 17 00:00:00 2001 From: Jonas Pyfferoen Date: Fri, 27 Jul 2018 16:51:20 +0200 Subject: [PATCH 013/275] Rewrite importDocumenttype.aspx to Angular --- .../common/resources/contenttype.resource.js | 13 +- .../views/documenttypes/import.controller.js | 75 +++++++++++ .../src/views/documenttypes/import.html | 72 +++++++++++ src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../Umbraco/dialogs/importDocumenttype.aspx | 49 ------- .../Editors/ContentTypeController.cs | 96 ++++++++++++++ .../Models/ContentTypeImportModel.cs | 27 ++++ .../Trees/ContentTypeTreeController.cs | 9 +- .../Trees/LegacyTreeDataConverter.cs | 6 - src/Umbraco.Web/Umbraco.Web.csproj | 8 +- .../_Legacy/Actions/ActionImport.cs | 9 +- .../umbraco/dialogs/importDocumenttype.aspx | 49 ------- .../dialogs/importDocumenttype.aspx.cs | 121 ------------------ 13 files changed, 288 insertions(+), 247 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/views/documenttypes/import.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/documenttypes/import.html delete mode 100644 src/Umbraco.Web.UI/Umbraco/dialogs/importDocumenttype.aspx create mode 100644 src/Umbraco.Web/Models/ContentTypeImportModel.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx.cs diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index cec9cf191e..04ba315813 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -333,7 +333,18 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca notificationsService.error(value); }); }); - } + }, + + import: function (file) { + if (!file) { + throw "file cannot be null"; + } + + return umbRequestHelper.resourcePromise( + $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Import", { file: file })), + "Failed to import document type " + file + ); + }, }; } angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource); diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.controller.js b/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.controller.js new file mode 100644 index 0000000000..6356d162dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.controller.js @@ -0,0 +1,75 @@ +angular.module("umbraco") + .controller("Umbraco.Editors.DocumentTypes.ImportController", + function ($scope, contentTypeResource, navigationService, Upload, umbRequestHelper) { + var vm = this; + vm.serverErrorMessage = ""; + vm.state = "upload"; + vm.model = {}; + vm.uploadStatus = ""; + + $scope.handleFiles = function (files, event) { + if (files && files.length > 0) { + $scope.upload(files[0]); + } + }; + + $scope.upload = function (file) { + Upload.upload({ + url: umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Upload"), + fields: {}, + file: file + }).success(function (data, status, headers, config) { + if (data.notifications && data.notifications.length > 0) { + + // set error status on file + vm.uploadStatus = "error"; + + // Throw message back to user with the cause of the error + vm.serverErrorMessage = data.notifications[0].message; + } else { + + // set done status on file + vm.uploadStatus = "done"; + vm.model = data; + vm.state = "confirm"; + } + }).error(function (evt, status, headers, config) { + + // set status done + $scope.uploadStatus = "error"; + + // If file not found, server will return a 404 and display this message + if (status === 404) { + $scope.serverErrorMessage = "File not found"; + } + else if (status == 400) { + //it's a validation error + $scope.serverErrorMessage = evt.message; + } + else { + //it's an unhandled error + //if the service returns a detailed error + if (evt.InnerException) { + $scope.serverErrorMessage = evt.InnerException.ExceptionMessage; + + //Check if its the common "too large file" exception + if (evt.InnerException.StackTrace && evt.InnerException.StackTrace.indexOf("ValidateRequestEntityLength") > 0) { + $scope.serverErrorMessage = "File too large to upload"; + } + + } else if (evt.Message) { + $scope.serverErrorMessage = evt.Message; + } + } + }); + }; + + $scope.cancel = function () { + navigationService.hideDialog(); + }; + + $scope.import = function () { + contentTypeResource.import(vm.model.tempFileName); + vm.state = "done"; + } + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.html new file mode 100644 index 0000000000..3ce790513a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/import.html @@ -0,0 +1,72 @@ +
+ + + + +
+
+

+ + + To import a document type, find the '.udt' file on your computer by clicking the 'Browse' button and click 'Import' (you'll be asked for confirmation on the next screen) + + +

+ +
+
+ +
+
+ + + Drop to upload + +
+ - or click here to choose files +
+
+
+
+
+ > + cancel + +
+
+ + Name: + + {{vm.model.name}} +
+ + Alias: + + {{vm.model.alias}} +
+
+ +
+
+ {{vm.model.name}} has been imported! +
+
+
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index db6d974fc2..63b8376943 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -402,7 +402,6 @@ - diff --git a/src/Umbraco.Web.UI/Umbraco/dialogs/importDocumenttype.aspx b/src/Umbraco.Web.UI/Umbraco/dialogs/importDocumenttype.aspx deleted file mode 100644 index 44280f6710..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/dialogs/importDocumenttype.aspx +++ /dev/null @@ -1,49 +0,0 @@ -<%@ Page MasterPageFile="../masterpages/umbracoDialog.Master" Language="c#" Codebehind="importDocumenttype.aspx.cs" AutoEventWireup="false" - Inherits="umbraco.presentation.umbraco.dialogs.importDocumentType" %> - - - - - - - - - - -
- -

- - <%=Services.TextService.Localize("importDocumentTypeHelp")%> - -

- -

- -

- - - <%= Services.TextService.Localize("or") %> <%= Services.TextService.Localize("cancel") %> -
- - - - - <%=Services.TextService.Localize("name")%> - : - -
- - <%=Services.TextService.Localize("alias")%> - : - -
-
- -
- - - has been imported! - -
-
diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index 4bd74bcbd3..911f14d485 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -1,21 +1,29 @@ using AutoMapper; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Threading.Tasks; using System.Web.Http; +using System.Xml; +using System.Xml.Linq; using Umbraco.Core; +using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Composing; +using Umbraco.Web.Models; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; +using Umbraco.Web.UI; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; using Constants = Umbraco.Core.Constants; +using Notification = Umbraco.Web.Models.ContentEditing.Notification; namespace Umbraco.Web.Editors { @@ -441,5 +449,93 @@ namespace Umbraco.Web.Editors return response; } + + [HttpPost] + public HttpResponseMessage Import(string file) + { + var filePath = Path.Combine(IOHelper.MapPath(SystemDirectories.Data), file); + if (string.IsNullOrEmpty(file) || !System.IO.File.Exists(filePath)) + { + return Request.CreateResponse(HttpStatusCode.NotFound); + } + + var xd = new XmlDocument(); + xd.XmlResolver = null; + xd.Load(filePath); + + var userId = Security.GetUserId(); + var element = XElement.Parse(xd.InnerXml); + Current.Services.PackagingService.ImportContentTypes(element, userId); + + // Try to clean up the temporary file. + try + { + System.IO.File.Delete(filePath); + } + catch (Exception ex) + { + Current.Logger.Error(typeof(ContentTypeController), "Error cleaning up temporary udt file in App_Data: " + ex.Message, ex); + } + + return Request.CreateResponse(HttpStatusCode.OK); + } + + [HttpPost] + [FileUploadCleanupFilter(false)] + public async Task Upload() + { + if (Request.Content.IsMimeMultipartContent() == false) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + var root = IOHelper.MapPath("~/App_Data/TEMP/FileUploads"); + //ensure it exists + Directory.CreateDirectory(root); + var provider = new MultipartFormDataStreamProvider(root); + var result = await Request.Content.ReadAsMultipartAsync(provider); + + //must have a file + if (result.FileData.Count == 0) + { + throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound)); + } + + var model = new ContentTypeImportModel(); + var file = result.FileData[0]; + var fileName = file.Headers.ContentDisposition.FileName.Trim('\"'); + var ext = fileName.Substring(fileName.LastIndexOf('.') + 1).ToLower(); + if (ext.InvariantEquals("udt")) + { + //TODO: Currently it has to be here, it's not ideal but that's the way it is right now + var tempDir = IOHelper.MapPath(SystemDirectories.Data); + + //ensure it's there + Directory.CreateDirectory(tempDir); + + model.TempFileName = "justDelete_" + Guid.NewGuid() + ".udt"; + var tempFileLocation = Path.Combine(tempDir, model.TempFileName); + System.IO.File.Copy(file.LocalFileName, tempFileLocation, true); + + var xd = new XmlDocument + { + XmlResolver = null + }; + xd.Load(tempFileLocation); + + model.Alias = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Alias")?.FirstChild.Value; + model.Name = xd.DocumentElement?.SelectSingleNode("//DocumentType/Info/Name")?.FirstChild.Value; + } + else + { + model.Notifications.Add(new Notification( + Services.TextService.Localize("speechBubbles/operationFailedHeader"), + Services.TextService.Localize("media/disallowedFileType"), + SpeechBubbleIcon.Warning)); + } + + return model; + + } } } diff --git a/src/Umbraco.Web/Models/ContentTypeImportModel.cs b/src/Umbraco.Web/Models/ContentTypeImportModel.cs new file mode 100644 index 0000000000..961476e5f0 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentTypeImportModel.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Web.Models +{ + [DataContract(Name = "contentTypeImportModel")] + public class ContentTypeImportModel : INotificationModel + { + public ContentTypeImportModel() + { + Notifications = new List(); + } + + [DataMember(Name = "alias")] + public string Alias { get; set; } + + [DataMember(Name = "name")] + public string Name { get; set; } + + [DataMember(Name = "notifications")] + public List Notifications { get; } + + [DataMember(Name = "tempFileName")] + public string TempFileName { get; set; } + } +} diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 1295f32dd6..da1eae7b2c 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -6,7 +6,6 @@ using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Models; -using Umbraco.Core.Models.Entities; using Umbraco.Core.Services; using Umbraco.Web._Legacy.Actions; using Umbraco.Web.Models.ContentEditing; @@ -74,13 +73,7 @@ namespace Umbraco.Web.Trees // root actions menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))); - menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionImport.Instance.Alias)), true).ConvertLegacyMenuItem(new EntitySlim - { - Id = int.Parse(id), - Level = 1, - ParentId = Constants.System.Root, - Name = "" - }, "documenttypes", "settings"); + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionImport.Instance.Alias)), true); menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionRefresh.Instance.Alias)), true); return menu; } diff --git a/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs b/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs index f483b69b5d..63e68388b4 100644 --- a/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs +++ b/src/Umbraco.Web/Trees/LegacyTreeDataConverter.cs @@ -267,12 +267,6 @@ namespace Umbraco.Web.Trees new LegacyUrlAction( "dialogs/sendToTranslation.aspx?id=" + nodeId + "&rnd=" + DateTime.UtcNow.Ticks, Current.Services.TextService.Localize("actions/sendToTranslate"))); - - case "UmbClientMgr.appActions().actionImport()": - return Attempt.Succeed( - new LegacyUrlAction( - "dialogs/importDocumentType.aspx", - Current.Services.TextService.Localize("actions/importDocumentType"))); case "UmbClientMgr.appActions().actionAudit()": return Attempt.Succeed( new LegacyUrlAction( diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 581c0ae815..5064eec98b 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -237,6 +237,7 @@ + @@ -1300,10 +1301,6 @@ editPackage.aspx - - importDocumenttype.aspx - ASPXCodeBehind - notifications.aspx ASPXCodeBehind @@ -1491,7 +1488,6 @@ ASPXCodeBehind - ASPXCodeBehind @@ -1580,4 +1576,4 @@ - + \ No newline at end of file diff --git a/src/Umbraco.Web/_Legacy/Actions/ActionImport.cs b/src/Umbraco.Web/_Legacy/Actions/ActionImport.cs index 729daa367a..d284da7be4 100644 --- a/src/Umbraco.Web/_Legacy/Actions/ActionImport.cs +++ b/src/Umbraco.Web/_Legacy/Actions/ActionImport.cs @@ -1,7 +1,4 @@ -using System; -using Umbraco.Web.UI.Pages; - -namespace Umbraco.Web._Legacy.Actions +namespace Umbraco.Web._Legacy.Actions { ///
/// This action is invoked when importing a document type @@ -32,7 +29,7 @@ namespace Umbraco.Web._Legacy.Actions { get { - return string.Format("{0}.actionImport()", ClientTools.Scripts.GetAppActions); + return ""; } } @@ -48,7 +45,7 @@ namespace Umbraco.Web._Legacy.Actions { get { - return "importDocumentType"; + return "import"; } } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx deleted file mode 100644 index 44280f6710..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx +++ /dev/null @@ -1,49 +0,0 @@ -<%@ Page MasterPageFile="../masterpages/umbracoDialog.Master" Language="c#" Codebehind="importDocumenttype.aspx.cs" AutoEventWireup="false" - Inherits="umbraco.presentation.umbraco.dialogs.importDocumentType" %> - - - - - - - - - - -
- -

- - <%=Services.TextService.Localize("importDocumentTypeHelp")%> - -

- -

- -

- - - <%= Services.TextService.Localize("or") %> <%= Services.TextService.Localize("cancel") %> -
- - - - - <%=Services.TextService.Localize("name")%> - : - -
- - <%=Services.TextService.Localize("alias")%> - : - -
-
- -
- - - has been imported! - -
-
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx.cs deleted file mode 100644 index 38f061e079..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/importDocumenttype.aspx.cs +++ /dev/null @@ -1,121 +0,0 @@ -using Umbraco.Core.Services; -using System; -using System.Linq; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Xml; -using System.Xml.Linq; -using Umbraco.Core; -using Umbraco.Core.IO; -using Umbraco.Web; -using Umbraco.Web.Composing; - -namespace umbraco.presentation.umbraco.dialogs -{ - /// - /// Summary description for importDocumentType. - /// - public class importDocumentType : Umbraco.Web.UI.Pages.UmbracoEnsuredPage - { - public importDocumentType() - { - - CurrentApp = Constants.Applications.Settings.ToString(); - - } - protected Literal FeedBackMessage; - protected Literal jsShowWindow; - protected Panel Wizard; - protected HtmlTable Table1; - protected HtmlInputHidden tempFile; - protected HtmlInputFile documentTypeFile; - protected Button submit; - protected Panel Confirm; - protected Literal dtName; - protected Literal dtAlias; - protected Button import; - protected Literal dtNameConfirm; - protected Panel done; - private string tempFileName = ""; - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - submit.Text = Services.TextService.Localize("import"); - import.Text = Services.TextService.Localize("import"); - } - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.submit.Click += new System.EventHandler(this.submit_Click); - this.import.Click += new System.EventHandler(this.import_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - private void import_Click(object sender, EventArgs e) - { - var xd = new XmlDocument(); - xd.XmlResolver = null; - xd.Load(tempFile.Value); - - var userId = Security.GetUserId(); - - var element = XElement.Parse(xd.InnerXml); - var importContentTypes = Current.Services.PackagingService.ImportContentTypes(element, userId); - var contentType = importContentTypes.FirstOrDefault(); - if (contentType != null) - dtNameConfirm.Text = contentType.Name; - - // Try to clean up the temporary file. - try - { - System.IO.File.Delete(tempFile.Value); - } - catch(Exception ex) - { - Current.Logger.Error(typeof(importDocumentType), "Error cleaning up temporary udt file in App_Data: " + ex.Message, ex); - } - - Wizard.Visible = false; - Confirm.Visible = false; - done.Visible = true; - } - - private void submit_Click(object sender, EventArgs e) - { - tempFileName = "justDelete_" + Guid.NewGuid().ToString() + ".udt"; - var fileName = IOHelper.MapPath(SystemDirectories.Data + "/" + tempFileName); - tempFile.Value = fileName; - - documentTypeFile.PostedFile.SaveAs(fileName); - - var xd = new XmlDocument(); - xd.XmlResolver = null; - xd.Load(fileName); - dtName.Text = xd.DocumentElement.SelectSingleNode("//DocumentType/Info/Name").FirstChild.Value; - dtAlias.Text = xd.DocumentElement.SelectSingleNode("//DocumentType/Info/Alias").FirstChild.Value; - - Wizard.Visible = false; - done.Visible = false; - Confirm.Visible = true; - } - } -} From 9241e1fcda9b8bf32f845b88d7faddc5b0fa183d Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 31 Jul 2018 17:50:24 +1000 Subject: [PATCH 014/275] WIP Getting the content controller a bit further, now need to pull apart the content binder --- src/Umbraco.Core/Models/ContentBase.cs | 25 +----- src/Umbraco.Core/Models/IContentBase.cs | 9 +- .../Umbraco/config/lang/en_us.xml | 1 - .../Editors/Binders/ContentItemBaseBinder.cs | 27 +----- .../Editors/Binders/ContentItemBinder.cs | 1 + src/Umbraco.Web/Editors/ContentController.cs | 90 ++++++++----------- .../Editors/ContentControllerBase.cs | 9 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 - 8 files changed, 49 insertions(+), 115 deletions(-) diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 29e36829d2..d5d9fcfdac 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -376,30 +376,7 @@ namespace Umbraco.Core.Models #endregion #region Validation - - /// - public bool IsValid(string culture = "*") - { - culture = culture.NullOrWhiteSpaceAsNull(); - - if (culture == null) - { - if (Name.IsNullOrWhiteSpace()) return false; - return ValidateProperties(null).Length == 0; - } - - if (culture != "*") - { - var name = GetCultureName(culture); - if (name.IsNullOrWhiteSpace()) return false; - return ValidateProperties(culture).Length == 0; - } - - // 'all cultures' - // those that have a name are ok, those without a name... we don't validate - return AvailableCultures.All(c => ValidateProperties(c).Length == 0); - } - + /// public virtual Property[] ValidateProperties(string culture = "*") { diff --git a/src/Umbraco.Core/Models/IContentBase.cs b/src/Umbraco.Core/Models/IContentBase.cs index 3c56b2c737..2cf2d85024 100644 --- a/src/Umbraco.Core/Models/IContentBase.cs +++ b/src/Umbraco.Core/Models/IContentBase.cs @@ -137,14 +137,7 @@ namespace Umbraco.Core.Models void CopyFrom(IContent other, string culture = "*"); // fixme validate published cultures? - - /// - /// Checks if the content and property values are valid in order to be persisted. - /// - /// If the content type is variant, then culture can be either '*' or an actual culture, but neither 'null' nor - /// 'empty'. If the content type is invariant, then culture can be either '*' or null or empty. - bool IsValid(string culture = "*"); - + /// /// Validates the content item's properties. /// diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index 86b27d0ff3..4f419ccece 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -1458,7 +1458,6 @@ To manage your website, simply open the Umbraco back office and start adding con Invite user Invitation has been re-sent to %0% Cannot publish the document since the required '%0%' is not published - Validation failed for language '%0%' Unexpected validation failed for language '%0%' Document type was exported to file An error occurred while exporting the document type diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs index ec7158c10b..7ff348ebe7 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs @@ -1,49 +1,28 @@ using System; -using System.ComponentModel; using System.IO; -using System.Linq; using System.Net; using System.Net.Http; -using System.Net.Http.Formatting; -using System.Text; -using System.Threading.Tasks; -using System.Web; using System.Web.Http; using System.Web.Http.Controllers; -using System.Web.Http.ModelBinding.Binders; -using System.Web.Http.Validation; -using System.Web.ModelBinding; -using System.Web.Mvc; using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; using Umbraco.Core.Services; using Umbraco.Web.Composing; -using Umbraco.Web.Editors; using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.PublishedCache; -using Umbraco.Web.Routing; -using Umbraco.Web.Security; -using Umbraco.Web.WebApi.Filters; using IModelBinder = System.Web.Http.ModelBinding.IModelBinder; using ModelBindingContext = System.Web.Http.ModelBinding.ModelBindingContext; -using ModelMetadata = System.Web.Http.Metadata.ModelMetadata; -using ModelMetadataProvider = System.Web.Http.Metadata.ModelMetadataProvider; -using MutableObjectModelBinder = System.Web.Http.ModelBinding.Binders.MutableObjectModelBinder; using Task = System.Threading.Tasks.Task; namespace Umbraco.Web.Editors.Binders -{ - /// +{ /// /// Binds the content model to the controller action for the posted multi-part Post /// internal abstract class ContentItemBaseBinder : IModelBinder - where TPersisted : class, IContentBase - //where TModelSave : ContentBaseItemSave + where TPersisted : class, IContentBase + where TModelSave : IContentSave { protected Core.Logging.ILogger Logger { get; } protected ServiceContext Services { get; } diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs index df5569fb34..a83e192224 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs @@ -17,6 +17,7 @@ using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Editors.Binders { + /// internal class ContentItemBinder : ContentItemBaseBinder { public ContentItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 71a9f898c2..1c19ee1345 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -19,7 +19,6 @@ using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; -using Umbraco.Web.WebApi.Binders; using Umbraco.Web.WebApi.Filters; using Umbraco.Core.Persistence.Querying; using Umbraco.Web.PublishedCache; @@ -29,9 +28,9 @@ using Umbraco.Web.Models; using Umbraco.Web.WebServices; using Umbraco.Web._Legacy.Actions; using Constants = Umbraco.Core.Constants; -using ContentVariation = Umbraco.Core.Models.ContentVariation; using Language = Umbraco.Web.Models.ContentEditing.Language; using Umbraco.Core.PropertyEditors; +using Umbraco.Web.Editors.Binders; using Umbraco.Web.Editors.Filters; namespace Umbraco.Web.Editors @@ -653,7 +652,7 @@ namespace Umbraco.Web.Editors { //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! // add the modelstate to the outgoing object and throw a validation message - var forDisplay = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + var forDisplay = MapToDisplay(contentItem.PersistedContent); forDisplay.Errors = ModelState.ToErrorDictionary(); throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); @@ -693,7 +692,7 @@ namespace Umbraco.Web.Editors } //get the updated model - var display = MapToDisplay(contentItem.PersistedContent, contentItem.Culture); + var display = MapToDisplay(contentItem.PersistedContent); //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 HandleInvalidModelState(display); @@ -757,6 +756,8 @@ namespace Umbraco.Web.Editors /// private void PublishInternal(ContentItemSave contentItem, ref PublishResult publishStatus, ref bool wasCancelled) { + if (publishStatus == null) throw new ArgumentNullException(nameof(publishStatus)); + if (!contentItem.PersistedContent.ContentType.VariesByCulture()) { //its invariant, proceed normally @@ -767,47 +768,35 @@ namespace Umbraco.Web.Editors { var canPublish = true; + //All variants in this collection should have a culture if we get here! but we'll double check and filter here + var cultureVariants = contentItem.Variants.Where(x => !x.Culture.IsNullOrWhiteSpace()).ToList(); + //check if we are publishing other variants and validate them var allLangs = Services.LocalizationService.GetAllLanguages().ToDictionary(x => x.IsoCode, x => x, StringComparer.InvariantCultureIgnoreCase); - var otherVariantsToValidate = contentItem.PublishVariations.Where(x => !x.Culture.InvariantEquals(contentItem.Culture)).ToList(); - + //validate any mandatory variants that are not in the list - var mandatoryLangs = Mapper.Map, IEnumerable>(allLangs.Values) - .Where(x => otherVariantsToValidate.All(v => !v.Culture.InvariantEquals(x.IsoCode))) //don't include variants above - .Where(x => !x.IsoCode.InvariantEquals(contentItem.Culture)) //don't include the current variant - .Where(x => x.Mandatory); + var mandatoryLangs = Mapper.Map, IEnumerable>(allLangs.Values).Where(x => x.Mandatory); + foreach (var lang in mandatoryLangs) { - //cannot continue publishing since a required language that is not currently being published isn't published - if (!contentItem.PersistedContent.IsCulturePublished(lang.IsoCode)) + //Check if a mandatory language is missing from being published + //TODO: This logic is wrong, we need to also check if this language doesn't already have a published version + if (cultureVariants.Any(x => x.Culture == lang.IsoCode && !x.Publish)) { - var errMsg = Services.TextService.Localize("speechBubbles/contentReqCulturePublishError", new[] { allLangs[lang.IsoCode].CultureName }); - ModelState.AddModelError("publish_variant_" + lang.IsoCode + "_", errMsg); - canPublish = false; - } - } - - if (canPublish) - { - //validate all other variants to be published - foreach (var publishVariation in otherVariantsToValidate) - { - //validate the content item and the culture property values, we don't need to validate any invariant property values here because they will have - //been validated in the post. - var valid = contentItem.PersistedContent.IsValid(publishVariation.Culture); - if (!valid) + //cannot continue publishing since a required language that is not currently being published isn't published + if (!contentItem.PersistedContent.IsCulturePublished(lang.IsoCode)) { - var errMsg = Services.TextService.Localize("speechBubbles/contentCultureValidationError", new[] { allLangs[publishVariation.Culture].CultureName }); - ModelState.AddModelError("publish_variant_" + publishVariation.Culture + "_", errMsg); + var errMsg = Services.TextService.Localize("speechBubbles/contentReqCulturePublishError", new[] { allLangs[lang.IsoCode].CultureName }); + ModelState.AddModelError("publish_variant_" + lang.IsoCode + "_", errMsg); canPublish = false; } } } - + if (canPublish) { //try to publish all the values on the model - canPublish = PublishCulture(contentItem, otherVariantsToValidate, allLangs); + canPublish = PublishCulture(contentItem.PersistedContent, cultureVariants, allLangs); } if (canPublish) @@ -827,25 +816,22 @@ namespace Umbraco.Web.Editors } /// - /// This will call TryPublishValues on the content item for each culture that needs to be published including the invariant culture + /// This will call PublishCulture on the content item for each culture that needs to be published including the invariant culture /// - /// - /// + /// + /// /// /// - private bool PublishCulture(ContentItemSave contentItem, IEnumerable otherVariantsToValidate, IDictionary allLangs) + private bool PublishCulture(IContent persistentContent, IEnumerable cultureVariants, IDictionary allLangs) { - var culturesToPublish = new List { contentItem.Culture }; - culturesToPublish.AddRange(otherVariantsToValidate.Select(x => x.Culture)); - - foreach(var culture in culturesToPublish) + foreach(var variant in cultureVariants.Where(x => x.Publish)) { // publishing any culture, implies the invariant culture - var valid = contentItem.PersistedContent.PublishCulture(culture); + var valid = persistentContent.PublishCulture(variant.Culture); if (!valid) { - var errMsg = Services.TextService.Localize("speechBubbles/contentCultureUnexpectedValidationError", new[] { allLangs[culture].CultureName }); - ModelState.AddModelError("publish_variant_" + culture + "_", errMsg); + var errMsg = Services.TextService.Localize("speechBubbles/contentCultureUnexpectedValidationError", new[] { allLangs[variant.Culture].CultureName }); + ModelState.AddModelError("publish_variant_" + variant.Culture + "_", errMsg); return false; } } @@ -1220,8 +1206,11 @@ namespace Umbraco.Web.Editors /// private void MapPropertyValues(ContentItemSave contentSave) { - //set the names for the variants - foreach(var variant in contentSave.Variants) + //inline method to determine if a property type varies + bool Varies(Property property) => property.PropertyType.VariesByCulture(); + + //loop through each variant, set the correct name and property values + foreach (var variant in contentSave.Variants) { //Don't update the name if it is empty if (!variant.Name.IsNullOrWhiteSpace()) @@ -1237,6 +1226,12 @@ namespace Umbraco.Web.Editors contentSave.PersistedContent.Name = variant.Name; } } + + //for each variant, map the property values + MapPropertyValues( + contentSave, + (save, property) => Varies(property) ? property.GetValue(variant.Culture) : property.GetValue(), //get prop val + (save, property, v) => { if (Varies(property)) property.SetValue(v, variant.Culture); else property.SetValue(v); }); //set prop val } //TODO: We need to support 'send to publish' @@ -1262,13 +1257,6 @@ namespace Umbraco.Web.Editors contentSave.PersistedContent.Template = template; } } - - bool Varies(Property property) => property.PropertyType.VariesByCulture(); - - MapPropertyValues( - contentSave, - (save, property) => Varies(property) ? property.GetValue(save.Culture) : property.GetValue(), //get prop val - (save, property, v) => { if (Varies(property)) property.SetValue(v, save.Culture); else property.SetValue(v); }); //set prop val } ///
diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index afed9cb776..cd124d1d9c 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -44,12 +44,12 @@ namespace Umbraco.Web.Editors /// /// /// - protected void MapPropertyValues( + internal void MapPropertyValues( TSaved contentItem, Func getPropertyValue, Action savePropertyValue) where TPersisted : IContentBase - where TSaved : ContentBaseSave + where TSaved : IContentSave { // map the property values foreach (var propertyDto in contentItem.ContentDto.Properties) @@ -69,6 +69,7 @@ namespace Umbraco.Web.Editors // get the property var property = contentItem.PersistedContent.Properties[propertyDto.Alias]; + //TODO: Need to update this API to support variants and/or basically any sort of 'key' // prepare files, if any var files = contentItem.UploadedFiles.Where(x => x.PropertyAlias == propertyDto.Alias).ToArray(); foreach (var file in files) @@ -99,9 +100,7 @@ namespace Umbraco.Web.Editors } } - protected void HandleInvalidModelState(ContentItemDisplayBase display) - where TPersisted : IContentBase - where T : ContentPropertyBasic + protected void HandleInvalidModelState(IErrorModel display) { //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 if (!ModelState.IsValid) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 4ca0c398fc..8195298b55 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -213,8 +213,6 @@ - - From 9cd2db50182954901110fecfc6e0ff866f6f2495 Mon Sep 17 00:00:00 2001 From: Mundairson Date: Tue, 31 Jul 2018 09:41:15 +0100 Subject: [PATCH 015/275] U4-11546 [v7] Clean up to remove compiler warnings (#2823) --- src/Umbraco.Core/Configuration/GlobalSettings.cs | 1 - src/Umbraco.Core/Persistence/PetaPoco.cs | 2 +- src/Umbraco.Core/PluginManager.cs | 4 ++-- src/Umbraco.Core/Security/MachineKeyGenerator.cs | 4 +--- src/Umbraco.Core/Services/UserService.cs | 4 ++-- src/Umbraco.Core/StringExtensions.cs | 4 ++-- src/Umbraco.Core/Strings/DefaultShortStringHelper.cs | 1 - src/Umbraco.Tests/CodeFirst/ContentTypeMapper.cs | 5 ++--- src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs | 3 +-- src/Umbraco.Tests/DelegateExtensionsTests.cs | 3 +-- src/Umbraco.Tests/Models/Collections/Item.cs | 11 +---------- .../PublishedContent/PublishedContentTests.cs | 1 - .../Scheduling/BackgroundTaskRunnerTests.cs | 2 -- .../developer/Packages/DirectoryBrowser.aspx.cs | 4 ++-- src/Umbraco.Web/HealthCheck/HealthCheckAction.cs | 4 +--- src/Umbraco.Web/Install/FilePermissionHelper.cs | 4 ++-- .../Install/InstallSteps/NewInstallStep.cs | 2 +- src/Umbraco.Web/Trees/PackagesTreeController.cs | 2 -- src/Umbraco.Web/Trees/UserTreeController.cs | 4 +--- src/Umbraco.Web/UmbracoModule.cs | 2 +- src/Umbraco.Web/umbraco.presentation/content.cs | 2 -- src/Umbraco.Web/umbraco.presentation/requestModule.cs | 3 +-- .../BasePages/UmbracoEnsuredPage.cs | 2 +- src/umbraco.cms/businesslogic/Content.cs | 4 ++-- .../Packager/PackageActions/publishRootDocument.cs | 4 +--- src/umbraco.controls/UmbracoClientDependencyLoader.cs | 9 ++------- 26 files changed, 28 insertions(+), 63 deletions(-) diff --git a/src/Umbraco.Core/Configuration/GlobalSettings.cs b/src/Umbraco.Core/Configuration/GlobalSettings.cs index 2ac8e7d2ac..7b209a15cd 100644 --- a/src/Umbraco.Core/Configuration/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/GlobalSettings.cs @@ -32,7 +32,6 @@ namespace Umbraco.Core.Configuration #region Private static fields - private static Version _version; private static readonly object Locker = new object(); //make this volatile so that we can ensure thread safety with a double check lock private static volatile string _reservedUrlsCache; diff --git a/src/Umbraco.Core/Persistence/PetaPoco.cs b/src/Umbraco.Core/Persistence/PetaPoco.cs index 735691f6d6..ae0044035d 100644 --- a/src/Umbraco.Core/Persistence/PetaPoco.cs +++ b/src/Umbraco.Core/Persistence/PetaPoco.cs @@ -337,7 +337,7 @@ namespace Umbraco.Core.Persistence _transaction = _sharedConnection.BeginTransaction(isolationLevel); } - catch (Exception e) + catch (Exception) { throw; } diff --git a/src/Umbraco.Core/PluginManager.cs b/src/Umbraco.Core/PluginManager.cs index 44d505d1d2..ceb9b2d7d1 100644 --- a/src/Umbraco.Core/PluginManager.cs +++ b/src/Umbraco.Core/PluginManager.cs @@ -343,7 +343,7 @@ namespace Umbraco.Core { return ReadCache(); } - catch (Exception ex) + catch (Exception) { try { @@ -519,7 +519,7 @@ namespace Umbraco.Core { return new FileStream(path, fileMode, fileAccess, fileShare); } - catch (Exception ex) + catch (Exception) { if (--attempts == 0) throw; diff --git a/src/Umbraco.Core/Security/MachineKeyGenerator.cs b/src/Umbraco.Core/Security/MachineKeyGenerator.cs index 9dd06f44bd..546429b72c 100644 --- a/src/Umbraco.Core/Security/MachineKeyGenerator.cs +++ b/src/Umbraco.Core/Security/MachineKeyGenerator.cs @@ -26,8 +26,6 @@ namespace Umbraco.Core.Security validation=""HMACSHA256"" decryption=""AES"" />"; - var Xxx = 3; - return string.Format(c, GenerateAESDecryptionKey(), GenerateHMACSHA256ValidationKey()); } @@ -83,4 +81,4 @@ namespace Umbraco.Core.Security return sb.ToString(); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index 9b52af6827..0e15eb6cc1 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -207,7 +207,7 @@ namespace Umbraco.Core.Services { return repository.GetByUsername(username, includeSecurityData: true); } - catch (DbException ex) + catch (DbException) { //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special @@ -786,7 +786,7 @@ namespace Umbraco.Core.Services var result = repository.Get(id); return result; } - catch (DbException ex) + catch (DbException) { //we need to handle this one specific case which is when we are upgrading to 7.7 since the user group //tables don't exist yet. This is the 'easiest' way to deal with this without having to create special diff --git a/src/Umbraco.Core/StringExtensions.cs b/src/Umbraco.Core/StringExtensions.cs index ce9ac77712..d2a1d97709 100644 --- a/src/Umbraco.Core/StringExtensions.cs +++ b/src/Umbraco.Core/StringExtensions.cs @@ -164,7 +164,7 @@ namespace Umbraco.Core var obj = JsonConvert.DeserializeObject(input); return obj; } - catch (Exception ex) + catch (Exception) { return input; } @@ -622,7 +622,7 @@ namespace Umbraco.Core byte[] decodedBytes = UrlTokenDecode(input); return decodedBytes != null ? Encoding.UTF8.GetString(decodedBytes) : null; } - catch (FormatException ex) + catch (FormatException) { return null; } diff --git a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs index f74a8c0a59..a9d24d00c5 100644 --- a/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs +++ b/src/Umbraco.Core/Strings/DefaultShortStringHelper.cs @@ -26,7 +26,6 @@ namespace Umbraco.Core.Strings [Obsolete("Use the other ctor that specifies all dependencies")] public DefaultShortStringHelper() { - _umbracoSettings = _umbracoSettings; InitializeLegacyUrlReplaceCharacters(); } diff --git a/src/Umbraco.Tests/CodeFirst/ContentTypeMapper.cs b/src/Umbraco.Tests/CodeFirst/ContentTypeMapper.cs index 149eb19080..8caf215678 100644 --- a/src/Umbraco.Tests/CodeFirst/ContentTypeMapper.cs +++ b/src/Umbraco.Tests/CodeFirst/ContentTypeMapper.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using Umbraco.Core; using Umbraco.Core.Models; namespace Umbraco.Tests.CodeFirst @@ -32,7 +31,7 @@ namespace Umbraco.Tests.CodeFirst value = DateTime.Parse(property.Value.ToString()); else if (propertyInfo.PropertyType == typeof(Boolean)) { - if (String.IsNullOrEmpty(property.Value.ToString()) || property.Value == "0") + if (String.IsNullOrEmpty(property.Value.ToString()) || (string)property.Value == "0") { value = false; } @@ -48,4 +47,4 @@ namespace Umbraco.Tests.CodeFirst return mapped; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs b/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs index bf5100815f..3f85ecab0f 100644 --- a/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs +++ b/src/Umbraco.Tests/CoreXml/NavigableNavigatorTests.cs @@ -419,7 +419,6 @@ namespace Umbraco.Tests.CoreXml { var source = new TestSource5(); var nav = new NavigableNavigator(source); - TestContent content; Assert.AreEqual(NavigableNavigator.StatePosition.Root, nav.InternalState.Position); Assert.IsTrue(nav.MoveToFirstChild()); @@ -1162,4 +1161,4 @@ namespace Umbraco.Tests.CoreXml } #endregion -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/DelegateExtensionsTests.cs b/src/Umbraco.Tests/DelegateExtensionsTests.cs index 511440c2c7..e745e029d0 100644 --- a/src/Umbraco.Tests/DelegateExtensionsTests.cs +++ b/src/Umbraco.Tests/DelegateExtensionsTests.cs @@ -26,7 +26,6 @@ namespace Umbraco.Tests [Test] public void Quits_On_Success_Count() { - var maxTries = 5; var totalTries = 0; DelegateExtensions.RetryUntilSuccessOrMaxAttempts((currentTry) => { @@ -43,4 +42,4 @@ namespace Umbraco.Tests } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/Models/Collections/Item.cs b/src/Umbraco.Tests/Models/Collections/Item.cs index ff1789a850..f20648fd41 100644 --- a/src/Umbraco.Tests/Models/Collections/Item.cs +++ b/src/Umbraco.Tests/Models/Collections/Item.cs @@ -12,7 +12,6 @@ namespace Umbraco.Tests.Models.Collections public abstract class Item : IEntity, ICanBeDirty { private bool _hasIdentity; - private int? _hash; private int _id; private Guid _key; @@ -173,15 +172,7 @@ namespace Umbraco.Tests.Models.Collections public static bool operator ==(Item left, Item right) { - /*if (ReferenceEquals(null, left)) - return false; - - if(ReferenceEquals(null, right)) - return false;*/ - return ReferenceEquals(left, right); - - return left.Equals(right); } public static bool operator !=(Item left, Item right) @@ -250,4 +241,4 @@ namespace Umbraco.Tests.Models.Collections return this.MemberwiseClone(); } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs index db7fcb815a..5ec34ea781 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTests.cs @@ -935,7 +935,6 @@ namespace Umbraco.Tests.PublishedContent { // the converter args PublishedPropertyType argPropertyType = null; - object argSource = null; bool argPreview = false; var pt1 = new PublishedPropertyType("legend", 0, Constants.PropertyEditors.TextboxAlias); diff --git a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs index dee8a26743..0712056a30 100644 --- a/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs +++ b/src/Umbraco.Tests/Scheduling/BackgroundTaskRunnerTests.cs @@ -943,8 +943,6 @@ namespace Umbraco.Tests.Scheduling throw new NotImplementedException(); } - private int i; - public async Task RunAsync(CancellationToken token) { Console.WriteLine("boom"); diff --git a/src/Umbraco.Web.UI/umbraco/developer/Packages/DirectoryBrowser.aspx.cs b/src/Umbraco.Web.UI/umbraco/developer/Packages/DirectoryBrowser.aspx.cs index c2995b6793..cd71ece0db 100644 --- a/src/Umbraco.Web.UI/umbraco/developer/Packages/DirectoryBrowser.aspx.cs +++ b/src/Umbraco.Web.UI/umbraco/developer/Packages/DirectoryBrowser.aspx.cs @@ -95,7 +95,7 @@ namespace Umbraco.Web.UI.Umbraco.Developer.Packages { _sb.Append("" + oDir.Name + " (Include entire folder)"); } - catch (Exception ex) + catch (Exception) { _sb.Append("" + oDir.Name + " (Access Denied)"); } @@ -139,4 +139,4 @@ namespace Umbraco.Web.UI.Umbraco.Developer.Packages } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/HealthCheck/HealthCheckAction.cs b/src/Umbraco.Web/HealthCheck/HealthCheckAction.cs index 18931cf1dd..861363422a 100644 --- a/src/Umbraco.Web/HealthCheck/HealthCheckAction.cs +++ b/src/Umbraco.Web/HealthCheck/HealthCheckAction.cs @@ -8,8 +8,6 @@ namespace Umbraco.Web.HealthCheck [DataContract(Name = "healtCheckAction", Namespace = "")] public class HealthCheckAction { - private readonly ILocalizedTextService _textService; - /// /// Empty ctor used for serialization /// @@ -78,4 +76,4 @@ namespace Umbraco.Web.HealthCheck [DataMember(Name = "providedValue")] public string ProvidedValue { get; set; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Install/FilePermissionHelper.cs b/src/Umbraco.Web/Install/FilePermissionHelper.cs index a91bd6d306..73a74654ad 100644 --- a/src/Umbraco.Web/Install/FilePermissionHelper.cs +++ b/src/Umbraco.Web/Install/FilePermissionHelper.cs @@ -163,7 +163,7 @@ namespace Umbraco.Web.Install if (accessRules == null) return false; } - catch (Exception e) + catch (Exception) { //This is not 100% accurate btw because it could turn out that the current user doesn't //have access to read the current permissions but does have write access. @@ -198,4 +198,4 @@ namespace Umbraco.Web.Install return true; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs index 2d0daf1aa9..dfcb441cce 100644 --- a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs +++ b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs @@ -64,7 +64,7 @@ namespace Umbraco.Web.Install.InstallSteps throw new FormatException("Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols"); } } - catch (Exception ex) + catch (Exception) { throw new FormatException("Password must be at least " + CurrentProvider.MinRequiredPasswordLength + " characters long and contain at least " + CurrentProvider.MinRequiredNonAlphanumericCharacters + " symbols"); } diff --git a/src/Umbraco.Web/Trees/PackagesTreeController.cs b/src/Umbraco.Web/Trees/PackagesTreeController.cs index 68acfe3d1f..eb4b0e51f9 100644 --- a/src/Umbraco.Web/Trees/PackagesTreeController.cs +++ b/src/Umbraco.Web/Trees/PackagesTreeController.cs @@ -36,8 +36,6 @@ namespace Umbraco.Web.Trees protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { - var baseUrl = Constants.Applications.Developer + "/packages/"; - var nodes = new TreeNodeCollection(); var createdPackages = CreatedPackage.GetAllCreatedPackages(); diff --git a/src/Umbraco.Web/Trees/UserTreeController.cs b/src/Umbraco.Web/Trees/UserTreeController.cs index 89963a17e4..2c201d93d2 100644 --- a/src/Umbraco.Web/Trees/UserTreeController.cs +++ b/src/Umbraco.Web/Trees/UserTreeController.cs @@ -47,8 +47,6 @@ namespace Umbraco.Web.Trees protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings) { - var baseUrl = Constants.Applications.Users + "/users/"; - var nodes = new TreeNodeCollection(); return nodes; } @@ -84,4 +82,4 @@ namespace Umbraco.Web.Trees return menu; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/UmbracoModule.cs b/src/Umbraco.Web/UmbracoModule.cs index 8e472f7cea..99043143a7 100644 --- a/src/Umbraco.Web/UmbracoModule.cs +++ b/src/Umbraco.Web/UmbracoModule.cs @@ -503,7 +503,7 @@ namespace Umbraco.Web httpContext.Response.Headers.Remove("X-AspNet-Version"); httpContext.Response.Headers.Remove("X-AspNetMvc-Version"); } - catch (PlatformNotSupportedException ex) + catch (PlatformNotSupportedException) { // can't remove headers this way on IIS6 or cassini. } diff --git a/src/Umbraco.Web/umbraco.presentation/content.cs b/src/Umbraco.Web/umbraco.presentation/content.cs index c8daf43715..ccd2e009a7 100644 --- a/src/Umbraco.Web/umbraco.presentation/content.cs +++ b/src/Umbraco.Web/umbraco.presentation/content.cs @@ -428,8 +428,6 @@ namespace umbraco if (!e.Cancel) { - XmlNode x; - //Hack: this is here purely for backwards compat if someone for some reason is using the // ClearDocumentCache(int documentId) method and expecting it to remove the xml if (removeDbXmlEntry) diff --git a/src/Umbraco.Web/umbraco.presentation/requestModule.cs b/src/Umbraco.Web/umbraco.presentation/requestModule.cs index 9e2eeff4e6..7c49802d2e 100644 --- a/src/Umbraco.Web/umbraco.presentation/requestModule.cs +++ b/src/Umbraco.Web/umbraco.presentation/requestModule.cs @@ -253,7 +253,6 @@ namespace umbraco.presentation + ex; // Hide error if getting the user throws an error (e.g. corrupt / blank db) - User staticUser = null; try { User.GetCurrent(); @@ -473,4 +472,4 @@ namespace umbraco.presentation } -} \ No newline at end of file +} diff --git a/src/umbraco.businesslogic/BasePages/UmbracoEnsuredPage.cs b/src/umbraco.businesslogic/BasePages/UmbracoEnsuredPage.cs index d5867fbc68..aefd999c9d 100644 --- a/src/umbraco.businesslogic/BasePages/UmbracoEnsuredPage.cs +++ b/src/umbraco.businesslogic/BasePages/UmbracoEnsuredPage.cs @@ -165,7 +165,7 @@ namespace umbraco.BasePages throw new UserAuthorizationException(String.Format("The current user doesn't have access to the section/app '{0}'", CurrentApp)); } } - catch (UserAuthorizationException ex) + catch (UserAuthorizationException) { LogHelper.Warn(string.Format("{0} tried to access '{1}'", CurrentUser.Id, CurrentApp)); throw; diff --git a/src/umbraco.cms/businesslogic/Content.cs b/src/umbraco.cms/businesslogic/Content.cs index b0ad710f2c..519fc2e006 100644 --- a/src/umbraco.cms/businesslogic/Content.cs +++ b/src/umbraco.cms/businesslogic/Content.cs @@ -149,7 +149,7 @@ namespace umbraco.cms.businesslogic { _contentType = new ContentType(contentTypeId); } - catch (Exception e) + catch (Exception) { return null; } @@ -809,4 +809,4 @@ namespace umbraco.cms.businesslogic } #endregion } -} \ No newline at end of file +} diff --git a/src/umbraco.cms/businesslogic/Packager/PackageActions/publishRootDocument.cs b/src/umbraco.cms/businesslogic/Packager/PackageActions/publishRootDocument.cs index 7bc48d3e05..760a3a4cf1 100644 --- a/src/umbraco.cms/businesslogic/Packager/PackageActions/publishRootDocument.cs +++ b/src/umbraco.cms/businesslogic/Packager/PackageActions/publishRootDocument.cs @@ -25,8 +25,6 @@ namespace umbraco.cms.businesslogic.packager.standardPackageActions string documentName = xmlData.Attributes["documentName"].Value; - int parentDocid = 0; - web.Document[] rootDocs = web.Document.GetRootDocuments(); foreach (web.Document rootDoc in rootDocs) @@ -71,4 +69,4 @@ namespace umbraco.cms.businesslogic.packager.standardPackageActions } } -} \ No newline at end of file +} diff --git a/src/umbraco.controls/UmbracoClientDependencyLoader.cs b/src/umbraco.controls/UmbracoClientDependencyLoader.cs index 06c369a5a1..e2320cedce 100644 --- a/src/umbraco.controls/UmbracoClientDependencyLoader.cs +++ b/src/umbraco.controls/UmbracoClientDependencyLoader.cs @@ -1,15 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Web.UI; +using System.Web.UI; using ClientDependency.Core.Controls; using ClientDependency.Core.FileRegistration.Providers; using Umbraco.Core.IO; namespace umbraco.uicontrols { - /// /// Used to load in all client dependencies for Umbraco. /// Ensures that both UmbracoClient and UmbracoRoot paths are added to the loader. @@ -28,7 +23,7 @@ namespace umbraco.uicontrols } - public static new ClientDependencyLoader TryCreate(Control parent, out bool isNew) + public static ClientDependencyLoader TryCreate(Control parent, out bool isNew) { if (ClientDependencyLoader.Instance == null) { From ee5a834ab0aa381c79d656396a1e5c4e16713c8c Mon Sep 17 00:00:00 2001 From: Stephan Date: Tue, 31 Jul 2018 15:55:31 +0200 Subject: [PATCH 016/275] Ensure build respects NUGET_PACKAGES --- build/build.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build/build.ps1 b/build/build.ps1 index 5f85284431..964c29fb63 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -298,7 +298,11 @@ # copy libs Write-Host "Copy SqlCE libraries" - $nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages") + $nugetPackages = $env:NUGET_PACKAGES + if (-not $nugetPackages) + { + $nugetPackages = [System.Environment]::ExpandEnvironmentVariables("%userprofile%\.nuget\packages") + } $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\bin\x86") $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x64\native", "*.*", "$tmp\bin\amd64") $this.CopyFiles("$nugetPackages\umbraco.sqlserverce\4.0.0.1\runtimes\win-x86\native", "*.*", "$tmp\WebApp\bin\x86") From a2cb5fac98c46fd453f5514ab0607f027ceb9ae0 Mon Sep 17 00:00:00 2001 From: Chris Houston Date: Tue, 31 Jul 2018 11:06:06 -0400 Subject: [PATCH 017/275] Fixes issue #U4-11472 Document type, Media Type & Data Type folders did not support Ampersands in their names, now they do. --- .../src/common/resources/contenttype.resource.js | 2 +- .../src/common/resources/datatype.resource.js | 10 +++++----- .../src/common/resources/mediatype.resource.js | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 7edd3cdb96..d006951b8a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -293,7 +293,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { createContainer: function (parentId, name) { return umbRequestHelper.resourcePromise( - $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateContainer", { parentId: parentId, name: name })), + $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "PostCreateContainer", { parentId: parentId, name: encodeURIComponent(name) })), 'Failed to create a folder under parent id ' + parentId); }, diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js index 11b6969479..c938909f2f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js @@ -355,14 +355,14 @@ function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) { umbRequestHelper.getApiUrl( "dataTypeApiBaseUrl", "PostCreateContainer", - { parentId: parentId, name: name })), + { parentId: parentId, name: encodeURIComponent(name) })), 'Failed to create a folder under parent id ' + parentId); - }, - + }, + renameContainer: function (id, name) { return umbRequestHelper.resourcePromise( - $http.post - (umbRequestHelper.getApiUrl( + $http.post + (umbRequestHelper.getApiUrl( "dataTypeApiBaseUrl", "PostRenameContainer", { id: id, name: name })), diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js index 572b2ba3fd..140995cd57 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/mediatype.resource.js @@ -244,7 +244,7 @@ function mediaTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { umbRequestHelper.getApiUrl( "mediaTypeApiBaseUrl", "PostCreateContainer", - { parentId: parentId, name: name })), + { parentId: parentId, name: encodeURIComponent(name) })), 'Failed to create a folder under parent id ' + parentId); }, From 1bdd848582335ca4fa740a624c49041de66d513a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 31 Jul 2018 20:48:44 +0200 Subject: [PATCH 018/275] Post-merge color picker fixes --- .../components/umbcolorswatches.directive.js | 2 -- .../src/less/components/check-circle.less | 1 - .../less/components/umb-color-swatches.less | 6 ---- .../src/less/property-editors.less | 6 ---- .../iconpicker/iconpicker.controller.js | 28 ++++++++++++++++ .../iconpicker/iconpicker.html | 32 +++++-------------- .../views/components/umb-color-swatches.html | 4 +-- .../colorpicker/colorpicker.html | 4 +-- .../colorpicker/colorpicker.prevalues.html | 2 +- 9 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js index 6ed65a9431..2b4004da11 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbcolorswatches.directive.js @@ -29,9 +29,7 @@ Use this directive to generate color swatches to pick from. function link(scope, el, attr, ctrl) { scope.setColor = function (color) { - //scope.selectedColor({color: color }); scope.selectedColor = color; - if (scope.onSelect) { scope.onSelect(color); } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/check-circle.less b/src/Umbraco.Web.UI.Client/src/less/components/check-circle.less index a4c3a89c99..fadf9c7940 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/check-circle.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/check-circle.less @@ -1,6 +1,5 @@ .check_circle { display: flex; - opacity: 0; width: 20px; height: 20px; margin: 0 auto; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-color-swatches.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-color-swatches.less index e27bd0d654..c7905879d8 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-color-swatches.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-color-swatches.less @@ -18,12 +18,6 @@ box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); } - &.active { - .check_circle { - opacity: 1; - } - } - &.umb-color-box--m { width: 40px; height: 40px; diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index fd9296259f..283d538b75 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -139,12 +139,6 @@ ul.color-picker li { border: 2px solid transparent; width: 60px; - &.active { - .check_circle { - opacity: 1; - } - } - .thumbnail{ min-width: auto; width: inherit; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.controller.js index f428e64e3e..05c76beeae 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.controller.js @@ -13,6 +13,28 @@ function IconPickerController($scope, iconHelper, localizationService) { vm.selectIcon = selectIcon; vm.close = close; + vm.colors = [ + { name: "Black", value: "color-black" }, + { name: "Blue Grey", value: "color-blue-grey" }, + { name: "Grey", value: "color-grey" }, + { name: "Brown", value: "color-brown" }, + { name: "Blue", value: "color-blue" }, + { name: "Light Blue", value: "color-light-blue" }, + { name: "Indigo", value: "color-indigo" }, + { name: "Purple", value: "color-purple" }, + { name: "Deep Purple", value: "color-deep-purple" }, + { name: "Cyan", value: "color-cyan" }, + { name: "Green", value: "color-green" }, + { name: "Light Green", value: "color-light-green" }, + { name: "Lime", value: "color-lime" }, + { name: "Yellow", value: "color-yellow" }, + { name: "Amber", value: "color-amber" }, + { name: "Orange", value: "color-orange" }, + { name: "Deep Orange", value: "color-deep-orange" }, + { name: "Red", value: "color-red" }, + { name: "Pink", value: "color-pink" } + ]; + function onInit() { vm.loading = true; @@ -24,6 +46,12 @@ function IconPickerController($scope, iconHelper, localizationService) { vm.loading = false; }); + // set a default color if nothing is passed in + vm.color = $scope.model.color ? $scope.model.color : vm.colors[0].value; + + // if an icon is passed in - preselect it + vm.icon = $scope.model.icon ? $scope.model.icon : undefined; + } function setTitle() { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.html index 320e0cee8a..8a7358116a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/iconpicker/iconpicker.html @@ -32,35 +32,19 @@
- + +
-
    -
  • - +
      +
    • +
    • diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-color-swatches.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-color-swatches.html index eae299e579..d3105d52a1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/umb-color-swatches.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-color-swatches.html @@ -1,7 +1,7 @@ 
      - diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html index 1cb61f4168..f726800696 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.html @@ -5,9 +5,9 @@
        -
      • +
      • -
        +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html index 7d88fb068f..a70ecabf35 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/colorpicker/colorpicker.prevalues.html @@ -1,4 +1,4 @@ -
        +
        From fe914dc33974f2b11d55730e41404279348b46f3 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 31 Jul 2018 22:01:35 +0200 Subject: [PATCH 019/275] Also make sure the alias gets generated from the full name and not just the part before the & --- .../common/directives/components/umbGenerateAlias.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbGenerateAlias.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbGenerateAlias.directive.js index 4bc6f08eb9..66e93d70d8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbGenerateAlias.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbGenerateAlias.directive.js @@ -82,7 +82,7 @@ angular.module("umbraco.directives") generateAliasTimeout = $timeout(function () { updateAlias = true; - entityResource.getSafeAlias(value, true).then(function (safeAlias) { + entityResource.getSafeAlias(encodeURIComponent(value), true).then(function (safeAlias) { if (updateAlias) { scope.alias = safeAlias.alias; } From 63bbbbab31ac419f8fe7b34f69f4fd4a4b0777ed Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 31 Jul 2018 22:15:30 +0200 Subject: [PATCH 020/275] Adjust multivalues styles --- .../src/less/components/prevalues/multivalues.less | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less b/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less index a307e5c585..5363a8db9b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/prevalues/multivalues.less @@ -1,5 +1,10 @@ .umb-prevalues-multivalues { width: 400px; + max-width: 100%; + + .umb-overlay & { + width: 500px; + } } .umb-prevalues-multivalues__left { @@ -27,7 +32,7 @@ .umb-prevalues-multivalues__add button { margin: 0 6px 0 0; - float: right + margin-left: auto; } .umb-prevalues-multivalues__listitem { @@ -46,6 +51,7 @@ .umb-prevalues-multivalues__listitem a { cursor: pointer; + margin-left: auto; } .umb-prevalues-multivalues__listitem input { From c4fc5a04f9b73c02ece0db86200eae1a5ffcd7f2 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 31 Jul 2018 22:16:33 +0200 Subject: [PATCH 021/275] Adjust color picker prevalues to fit within overlay --- src/Umbraco.Web.UI.Client/src/less/property-editors.less | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index fbca881d91..4d8079ee24 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -202,13 +202,16 @@ ul.color-picker li { } input[type="text"] { - min-width: 40%; - width: 320px; - display: inline-block; + display: flex; + flex: 1 1 100px; margin-top: 1px; + margin-right: 15px; + min-width: auto; + width: auto; } .sp-replacer { + display: inline-flex; margin-right: 18px; } From 4422c5ec521493dac0efaae564745ceb7a29b117 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Tue, 31 Jul 2018 22:39:22 +0200 Subject: [PATCH 022/275] Update AllowedTemplates list as well if the doctype alias is not the generated one --- src/Umbraco.Web/Editors/ContentTypeController.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs index 0273931df8..22f1fb7457 100644 --- a/src/Umbraco.Web/Editors/ContentTypeController.cs +++ b/src/Umbraco.Web/Editors/ContentTypeController.cs @@ -290,6 +290,19 @@ namespace Umbraco.Web.Editors template = tryCreateTemplate.Result.Entity; } + // If the alias has been manually updated before the first save, + // make sure to also update the first allowed template, as the + // name will come back as a SafeAlias of the document type name, + // not as the actual document type alias. + // For more info: http://issues.umbraco.org/issue/U4-11059 + if (ctSave.DefaultTemplate != template.Alias) + { + var allowedTemplates = ctSave.AllowedTemplates.ToArray(); + if (allowedTemplates.Any()) + allowedTemplates[0] = template.Alias; + ctSave.AllowedTemplates = allowedTemplates; + } + //make sure the template alias is set on the default and allowed template so we can map it back ctSave.DefaultTemplate = template.Alias; From a6d9b4b260e5219d0e622239a69434bf98ad4061 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 31 Jul 2018 23:25:56 +0200 Subject: [PATCH 023/275] Add text-overflow for long labels --- src/Umbraco.Web.UI.Client/src/less/property-editors.less | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 4d8079ee24..1855a3a6b0 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -180,13 +180,13 @@ ul.color-picker li { div.color-picker-prediv { display: inline-flex; align-items: center; + max-width: 80%; pre { - display: inline; + display: inline-flex; font-family: monospace; margin-right: 10px; margin-left: 10px; - width: 50%; white-space: nowrap; overflow: hidden; margin-bottom: 0; @@ -194,10 +194,14 @@ ul.color-picker li { padding-top: 7px; padding-bottom: 7px; background: #f7f7f7; + flex: 0 0 auto; } span { margin-left: 5px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } } From 55e1a792dab21b653ed7507c70e171ca82c37d62 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 12:15:18 +1000 Subject: [PATCH 024/275] Fixes migrations for 7.12.0 --- .../AddRelationTypeForMediaFolderOnDelete.cs | 20 ++++++++-------- .../IncreaseLanguageIsoCodeColumnLength.cs | 23 ++++++++++++++----- .../UpdateUmbracoConsent.cs | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/AddRelationTypeForMediaFolderOnDelete.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/AddRelationTypeForMediaFolderOnDelete.cs index 9de051e725..668b6070ef 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/AddRelationTypeForMediaFolderOnDelete.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/AddRelationTypeForMediaFolderOnDelete.cs @@ -19,20 +19,20 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZ var exists = Context.Database.FirstOrDefault("WHERE alias=@alias", new { alias = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias }); if (exists == null) { - var relationTypeDto = new RelationTypeDto + var uniqueId = (Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias + "____" + Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteName).ToGuid(); + Insert.IntoTable("umbracoRelationType").Row(new { - Alias = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias, - Name = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteName, - ChildObjectType = Guid.Parse(Constants.ObjectTypes.MediaType), - ParentObjectType = Guid.Parse(Constants.ObjectTypes.MediaType), - Dual = false - }; - - Context.Database.Insert(relationTypeDto); + typeUniqueId = uniqueId, + alias = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias, + name = Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteName, + childObjectType = Constants.ObjectTypes.MediaType, + parentObjectType = Constants.ObjectTypes.MediaType, + dual = false + }); } } public override void Down() { } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/IncreaseLanguageIsoCodeColumnLength.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/IncreaseLanguageIsoCodeColumnLength.cs index 8a4a453cdf..4341aa4bf4 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/IncreaseLanguageIsoCodeColumnLength.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/IncreaseLanguageIsoCodeColumnLength.cs @@ -1,4 +1,6 @@ -using Umbraco.Core.Logging; +using System.Linq; +using Umbraco.Core.Logging; +using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZero @@ -13,12 +15,21 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZ public override void Up() { - Execute.Code(database => - { - database.Execute("DROP INDEX [umbracoLanguage].[IX_umbracoLanguage_languageISOCode]"); - return null; - }); + var dbIndexes = SqlSyntax.GetDefinedIndexes(Context.Database) + .Select(x => new DbIndexDefinition() + { + TableName = x.Item1, + IndexName = x.Item2, + ColumnName = x.Item3, + IsUnique = x.Item4 + }).ToArray(); + //Ensure the index exists before dropping it + if (dbIndexes.Any(x => x.IndexName.InvariantEquals("IX_umbracoLanguage_languageISOCode"))) + { + Delete.Index("IX_umbracoLanguage_languageISOCode").OnTable("umbracoLanguage"); + } + Alter.Table("umbracoLanguage") .AlterColumn("languageISOCode") .AsString(14) diff --git a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/UpdateUmbracoConsent.cs b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/UpdateUmbracoConsent.cs index 077cd01bbd..c16ce55233 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/UpdateUmbracoConsent.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Upgrades/TargetVersionSevenTwelveZero/UpdateUmbracoConsent.cs @@ -13,7 +13,7 @@ namespace Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSevenTwelveZ public override void Up() { - this.Alter.Table("umbracoConsent").AlterColumn("comment").AsString().Nullable(); + Alter.Table("umbracoConsent").AlterColumn("comment").AsString().Nullable(); } public override void Down() From f36a23dd42b2fb07c5a7e1c6d6bf41624516bbda Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 12:16:03 +1000 Subject: [PATCH 025/275] WIP sln builds now --- .../Editors/Binders/ContentItemBaseBinder.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs index 7ff348ebe7..7ace0e5787 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs @@ -48,7 +48,7 @@ namespace Umbraco.Web.Editors.Binders var result = GetMultiPartResult(actionContext); - var model = GetModel(actionContext, bindingContext, result); + var model = GetModel(actionContext, result); bindingContext.Model = model; return bindingContext.Model != null; @@ -100,10 +100,9 @@ namespace Umbraco.Web.Editors.Binders /// Builds the model from the request contents /// /// - /// /// /// - private TModelSave GetModel(HttpActionContext actionContext, ModelBindingContext bindingContext, MultipartFormDataStreamProvider result) + private TModelSave GetModel(HttpActionContext actionContext, MultipartFormDataStreamProvider result) { if (result.FormData["contentItem"] == null) { @@ -178,10 +177,14 @@ namespace Umbraco.Web.Editors.Binders /// /// /// - private static void MapPropertyValuesFromSaved(IContentProperties saveModel, ContentItemDto dto) + protected virtual void MapPropertyValuesFromSaved(TModelSave saveModel, ContentItemDto dto) { + //TODO: This needs to be overridden for content but I'm pretty sure these DTO models won't even work for content + //Continue if this is a property model (i.e. media or members) + if (!(saveModel is IContentProperties propertyModel)) return; + //NOTE: Don't convert this to linq, this is much quicker - foreach (var p in saveModel.Properties) + foreach (var p in propertyModel.Properties) { foreach (var propertyDto in dto.Properties) { @@ -190,6 +193,7 @@ namespace Umbraco.Web.Editors.Binders break; } } + } protected abstract TPersisted GetExisting(TModelSave model); From 35af025ae39a7d53538c0439743ce99fb3429ca9 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 12:37:44 +1000 Subject: [PATCH 026/275] fixes migrations for v8 --- .../Migrations/Upgrade/V_7_12_0/SetDefaultTagsStorageType.cs | 2 +- .../Migrations/Upgrade/V_7_12_0/UpdateUmbracoConsent.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/SetDefaultTagsStorageType.cs b/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/SetDefaultTagsStorageType.cs index 08598f1779..d8f2d37067 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/SetDefaultTagsStorageType.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/SetDefaultTagsStorageType.cs @@ -22,7 +22,7 @@ namespace Umbraco.Core.Migrations.Upgrade.V_7_12_0 if (Context?.Database == null) return; // We need to get all datatypes with an alias of "umbraco.tags" so we can loop over them and set the missing values if needed - var datatypes = Context.Database.Fetch("SELECT * FROM cmsDataType"); + var datatypes = Context.Database.Fetch(); var tagsDataTypes = datatypes.Where(x => string.Equals(x.EditorAlias, Constants.PropertyEditors.Aliases.Tags, StringComparison.InvariantCultureIgnoreCase)); foreach (var datatype in tagsDataTypes) diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/UpdateUmbracoConsent.cs b/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/UpdateUmbracoConsent.cs index 942d32f83d..7596e3d7dd 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/UpdateUmbracoConsent.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/V_7_12_0/UpdateUmbracoConsent.cs @@ -9,7 +9,7 @@ namespace Umbraco.Core.Migrations.Upgrade.V_7_12_0 public UpdateUmbracoConsent(IMigrationContext context) : base(context) { } - - public override void Migrate() { Alter.Table("umbracoConsent").AlterColumn("comment").AsString().Nullable().Do(); } + + public override void Migrate() { Alter.Table(Constants.DatabaseSchema.Tables.Consent).AlterColumn("comment").AsString().Nullable().Do(); } } } From 23fda3a0edd12e33ea8e24098077db8a5fe4a2df Mon Sep 17 00:00:00 2001 From: Chris Houston Date: Tue, 31 Jul 2018 23:00:46 -0400 Subject: [PATCH 027/275] Fixing various broken links in the source code, some are just in comments and others are actually used within Umbraco, also added HTTPS where possible. --- .../forms/checklistmodel.directive.js | 6 ++-- .../components/umbaceeditor.directive.js | 2 +- .../components/umbdatetimepicker.directive.js | 2 +- .../directives/util/konami.directive.js | 4 +-- .../validation/nodirtycheck.directive.js | 4 +-- .../mocks/services/localization.mocks.js | 8 +++--- .../src/common/services/help.service.js | 4 +-- .../common/services/listviewhelper.service.js | 2 +- .../src/installer/steps/user.html | 28 +++++++++---------- .../src/less/application/animations.less | 4 +-- .../src/less/variables.less | 2 +- .../src/views/common/dialogs/help.html | 4 +-- .../src/views/common/drawers/help/help.html | 2 +- .../default/StartupDashboardVideos.html | 4 +-- .../developer/developerdashboardintro.html | 8 +++--- .../developer/developerdashboardvideos.html | 4 +-- .../dashboard/media/desktopmediauploader.html | 2 +- .../dashboard/media/mediadashboardintro.html | 2 +- .../members/membersdashboardvideos.html | 6 ++-- .../settings/settingsdashboardintro.html | 6 ++-- .../relatedlinks/relatedlinks.controller.js | 4 +-- .../propertyeditors/tags/tags.controller.js | 2 +- 22 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js index 181d8a1881..6ab6e1cad7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js @@ -1,6 +1,6 @@ /* - http://vitalets.github.io/checklist-model/ + https://vitalets.github.io/checklist-model/ @@ -44,7 +44,7 @@ angular.module('umbraco.directives') return arr; } - // http://stackoverflow.com/a/19228302/1458162 + // https://stackoverflow.com/a/19228302/1458162 function postLinkFn(scope, elem, attrs) { // compile with `ng-model` pointing to `checked` $compile(elem)(scope); @@ -98,4 +98,4 @@ angular.module('umbraco.directives') return postLinkFn; } }; -}]); \ No newline at end of file +}]); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js index ca389a74a7..a215bca645 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbaceeditor.directive.js @@ -161,7 +161,7 @@ /** * ACE editor session. * @type object - * @see [EditSession]{@link http://ace.c9.io/#nav=api&api=edit_session} + * @see [EditSession]{@link https://ace.c9.io/#nav=api&api=edit_session} */ var session = acee.getSession(); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js index 19ab789363..8d2b83d065 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js @@ -7,7 +7,7 @@ @description Added in Umbraco version 7.6 This directive is a wrapper of the bootstrap datetime picker version 3.1.3. Use it to render a date time picker. -For extra details about options and events take a look here: http://eonasdan.github.io/bootstrap-datetimepicker/ +For extra details about options and events take a look here: https://eonasdan.github.io/bootstrap-datetimepicker/ Use this directive to render a date time picker diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/util/konami.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/util/konami.directive.js index 7c96e0e050..7914dfc3f0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/util/konami.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/util/konami.directive.js @@ -1,7 +1,7 @@ /** * Konami Code directive for AngularJS * @version v0.0.1 - * @license MIT License, http://www.opensource.org/licenses/MIT + * @license MIT License, https://www.opensource.org/licenses/MIT */ angular.module('umbraco.directives') @@ -59,4 +59,4 @@ angular.module('umbraco.directives') scope.$on('$destroy', stopListening); } }; - }]); \ No newline at end of file + }]); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/nodirtycheck.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/nodirtycheck.directive.js index 104736530f..800ac87480 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/nodirtycheck.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/nodirtycheck.directive.js @@ -2,7 +2,7 @@ * @ngdoc directive * @name umbraco.directives.directive:noDirtyCheck * @restrict A -* @description Can be attached to form inputs to prevent them from setting the form as dirty (http://stackoverflow.com/questions/17089090/prevent-input-from-setting-form-dirty-angularjs) +* @description Can be attached to form inputs to prevent them from setting the form as dirty (https://stackoverflow.com/questions/17089090/prevent-input-from-setting-form-dirty-angularjs) **/ function noDirtyCheck() { return { @@ -20,4 +20,4 @@ function noDirtyCheck() { } }; } -angular.module('umbraco.directives.validation').directive("noDirtyCheck", noDirtyCheck); \ No newline at end of file +angular.module('umbraco.directives.validation').directive("noDirtyCheck", noDirtyCheck); diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/services/localization.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/services/localization.mocks.js index 0308ab6197..2665716ac4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/services/localization.mocks.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/services/localization.mocks.js @@ -371,7 +371,7 @@ angular.module('umbraco.mocks'). "installer_databaseHeader": "Database configuration", "installer_databaseInstall": " Press the install button to install the Umbraco %0% database ", "installer_databaseInstallDone": "Umbraco %0% has now been copied to your database. Press Next to proceed.", - "installer_databaseNotFound": "

        Database not found! Please check that the information in the 'connection string' of the \"web.config\" file is correct.

        To proceed, please edit the 'web.config' file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named 'UmbracoDbDSN' and save the file.

        Click the retry button when done.
        More information on editing web.config here.

        ", + "installer_databaseNotFound": "

        Database not found! Please check that the information in the 'connection string' of the \"web.config\" file is correct.

        To proceed, please edit the 'web.config' file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named 'UmbracoDbDSN' and save the file.

        Click the retry button when done.
        More information on editing web.config here.

        ", "installer_databaseText": "To complete this step, you must know some information regarding your database server ('connection string').
        Please contact your ISP if necessary. If you're installing on a local machine or server you might need information from your system administrator.", "installer_databaseUpgrade": "

        Press the upgrade button to upgrade your database to Umbraco %0%

        Don't worry - no content will be deleted and everything will continue working afterwards!

        ", "installer_databaseUpgradeDone": "Your database has been upgraded to the final version %0%.
        Press Next to proceed. ", @@ -399,7 +399,7 @@ angular.module('umbraco.mocks'). "installer_permissionsSettingUpPermissions": "Setting up folder permissions", "installer_permissionsText": " Umbraco needs write/modify access to certain directories in order to store files like pictures and PDF's. It also stores temporary data (aka: cache) for enhancing the performance of your website. ", "installer_runwayFromScratch": "I want to start from scratch", - "installer_runwayFromScratchText": " Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own document types and templates. (learn how) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ", + "installer_runwayFromScratchText": " Your website is completely empty at the moment, so that's perfect if you want to start from scratch and create your own document types and templates. (learn how) You can still choose to install Runway later on. Please go to the Developer section and choose Packages. ", "installer_runwayHeader": "You've just set up a clean Umbraco platform. What do you want to do next?", "installer_runwayInstalled": "Runway is installed", "installer_runwayInstalledText": " You have the foundation in place. Select what modules you wish to install on top of it.
        This is our list of recommended modules, check off the ones you would like to install, or view the full list of modules ", @@ -436,7 +436,7 @@ angular.module('umbraco.mocks'). "login_greeting6": "Happy friendly Friday", "login_greeting7": "Happy shiny Saturday", "login_instruction": "Log in below:", - "login_bottomText": "

        © 2001 - %0%
        Umbraco.org

        ", + "login_bottomText": "

        © 2001 - %0%
        Umbraco.org

        ", "main_dashboard": "Dashboard", "main_sections": "Sections", "main_tree": "Content", @@ -767,4 +767,4 @@ angular.module('umbraco.mocks'). .respond(getLanguageResource); } }; - }]); \ No newline at end of file + }]); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/help.service.js b/src/Umbraco.Web.UI.Client/src/common/services/help.service.js index 1de992d9db..ff8d487bb7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/help.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/help.service.js @@ -3,7 +3,7 @@ angular.module('umbraco.services') var helpTopics = {}; var defaultUrl = "https://our.umbraco.com/rss/help"; - var tvUrl = "http://umbraco.tv/feeds/help"; + var tvUrl = "https://umbraco.tv/feeds/help"; function getCachedHelp(url){ if(helpTopics[url]){ @@ -85,4 +85,4 @@ angular.module('umbraco.services') return service; - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js index 86553139c0..1dda682f87 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js @@ -495,7 +495,7 @@ }); //we need to use 'apply' to call intersection with an array of arrays, - //see: http://stackoverflow.com/a/16229480/694494 + //see: https://stackoverflow.com/a/16229480/694494 var intersectPermissions = _.intersection.apply(_, arr); return { diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html index f33fd0068a..52a2fce4bc 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html @@ -25,21 +25,21 @@
        -
        - - + + - At least {{installer.current.model.minCharLength}} characters long - - - At least {{installer.current.model.minNonAlphaNumericLength}} symbol{{installer.current.model.minNonAlphaNumericLength > 1 ? 's' : ''}} - -
        + At least {{installer.current.model.minCharLength}} characters long + + + At least {{installer.current.model.minNonAlphaNumericLength}} symbol{{installer.current.model.minNonAlphaNumericLength > 1 ? 's' : ''}} + +
        diff --git a/src/Umbraco.Web.UI.Client/src/less/application/animations.less b/src/Umbraco.Web.UI.Client/src/less/application/animations.less index dae428c18a..110d3700d0 100644 --- a/src/Umbraco.Web.UI.Client/src/less/application/animations.less +++ b/src/Umbraco.Web.UI.Client/src/less/application/animations.less @@ -1,8 +1,8 @@ // Animations // ------------------------- -//Animate.css - http://daneden.me/animate -//Licensed under the MIT license - http://opensource.org/licenses/MIT +//Animate.css - https://daneden.github.io/animate.css/ +//Licensed under the MIT license - https://opensource.org/licenses/MIT //Copyright (c) 2013 Daniel Eden .animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);-ms-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);-ms-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);-ms-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);-ms-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);-ms-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);-ms-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);-ms-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);-ms-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);-ms-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);-ms-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);-ms-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);-ms-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);-ms-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);-ms-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);-ms-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;-ms-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);-ms-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);-ms-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);-ms-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);-ms-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);-ms-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);-ms-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);-ms-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);-ms-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);-ms-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);-ms-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);-ms-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);-ms-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);-ms-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);-ms-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);-ms-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);-ms-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);-ms-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;-ms-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);-ms-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);-ms-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);-ms-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);-ms-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);-ms-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);-ms-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);-ms-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);-ms-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);-ms-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);-ms-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);-ms-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);-ms-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);-ms-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);-ms-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-ms-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);-ms-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;-ms-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);-ms-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);-ms-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-ms-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-ms-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);-ms-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);-ms-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);-ms-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;-ms-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);-ms-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);-ms-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);-ms-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);-ms-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);-ms-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);-ms-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);-ms-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;-ms-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;-ms-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);-ms-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate(0,0,1,45deg);-ms-transform:rotate(0,0,1,45deg);transform:rotate(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);-ms-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);-ms-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);-ms-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);-ms-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;-ms-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);-ms-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);-ms-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;-ms-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);-ms-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-ms-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);-ms-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);-ms-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;-ms-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);-ms-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);-ms-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;-ms-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-ms-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-ms-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp} diff --git a/src/Umbraco.Web.UI.Client/src/less/variables.less b/src/Umbraco.Web.UI.Client/src/less/variables.less index a120e3eb6a..3ea09e02fd 100644 --- a/src/Umbraco.Web.UI.Client/src/less/variables.less +++ b/src/Umbraco.Web.UI.Client/src/less/variables.less @@ -126,7 +126,7 @@ .color-green, .color-green i{color: @green-d1 !important;} .color-yellow, .color-yellow i{color: @yellowIcon !important;} -/* Colors based on http://zavoloklom.github.io/material-design-color-palette/colors.html */ +/* Colors based on https://zavoloklom.github.io/material-design-color-palette/colors.html */ .btn-color-black {background-color: @black;} .color-black i { color: @black;} diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/help.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/help.html index 036ae38695..be985652b9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/help.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/help.html @@ -46,7 +46,7 @@
        -
        \ No newline at end of file +
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html index e8f80c7d89..2d1f23a4f9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html @@ -95,7 +95,7 @@
- +
Visit umbraco.tv
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardVideos.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardVideos.html index 478688f585..6bf63051f8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardVideos.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/StartupDashboardVideos.html @@ -1,9 +1,9 @@

Hours of Umbraco training videos are only a click away

-

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

To get you started:

    diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardintro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardintro.html index d8d3d127eb..5b4bc988c0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardintro.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardintro.html @@ -5,10 +5,10 @@

    Find out more:

    diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardvideos.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardvideos.html index 84de8029f2..11d5d59b9a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardvideos.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/developer/developerdashboardvideos.html @@ -1,7 +1,7 @@

    Hours of Umbraco training videos are only a click away

    -

    Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco, then visit umbraco.tv for even more Umbraco videos.

    +

    Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco, then visit umbraco.tv for even more Umbraco videos.

    -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/media/desktopmediauploader.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/media/desktopmediauploader.html index 59a50f44fb..10609bf497 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/media/desktopmediauploader.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/media/desktopmediauploader.html @@ -8,7 +8,7 @@

    Download Desktop Media Uploader now.

    - This application requires Adobe® AIR™ to be installed for Mac OS or Windows. + This application requires Adobe® AIR™ to be installed for Mac OS or Windows.

    diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardintro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardintro.html index 0af91b4544..b8c28bbd39 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardintro.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/media/mediadashboardintro.html @@ -10,4 +10,4 @@
  • Drag the files and folders you wish to upload directly into the Desktop Media Uploader application
  • Click Upload to start uploading
-

For a more thorough guide on how to use the Desktop Media Uploader, checkout this video.

+

For a more thorough guide on how to use the Desktop Media Uploader, checkout this video.

diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html index 08e7fb3c41..f04aff24c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/members/membersdashboardvideos.html @@ -1,9 +1,9 @@

Hours of Umbraco training videos are only a click away

-

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

+

Want to master Umbraco? Spend a couple of minutes learning some best practices by watching one of these videos about using Umbraco. And visit umbraco.tv for even more Umbraco videos

To get you started:

    @@ -15,4 +15,4 @@
-
\ No newline at end of file +
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardintro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardintro.html index bc3b87663d..54bcf19abe 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardintro.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/settingsdashboardintro.html @@ -8,7 +8,7 @@
  • Read more about working with the Items in Settings in the Documentation section of Our Umbraco
  • Download the Editors Manual for details on working with the Umbraco UI
  • Ask a question in the Community Forum
  • -
  • Watch our tutorial videos (some are free, some require a subscription)
  • -
  • Find out about our productivity boosting tools and commercial support
  • -
  • Find out about real-life training and certification opportunities
  • +
  • Watch our tutorial videos (some are free, some require a subscription)
  • +
  • Find out about our productivity boosting tools and commercial support
  • +
  • Find out about real-life training and certification opportunities
  • diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.controller.js index 51c5baf55b..142298e0d8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/relatedlinks/relatedlinks.controller.js @@ -167,7 +167,7 @@ placeholder: 'sortable-placeholder', forcePlaceholderSize: true, helper: function (e, ui) { - // When sorting table rows, the cells collapse. This helper fixes that: http://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/ + // When sorting table rows, the cells collapse. This helper fixes that: https://www.foliotek.com/devblog/make-table-rows-sortable-using-jquery-ui-sortable/ ui.children().each(function () { $(this).width($(this).width()); }); @@ -189,7 +189,7 @@ start: function (e, ui) { //ui.placeholder.html(""); - // Build a placeholder cell that spans all the cells in the row: http://stackoverflow.com/questions/25845310/jquery-ui-sortable-and-table-cell-size + // Build a placeholder cell that spans all the cells in the row: https://stackoverflow.com/questions/25845310/jquery-ui-sortable-and-table-cell-size var cellCount = 0; $('td, th', ui.helper).each(function () { // For each td or th try and get it's colspan attribute, and add that or 1 to the total diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js index 15a67629e6..d55a2bf65a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js @@ -79,7 +79,7 @@ angular.module("umbraco") addTag($scope.tagToAdd); $scope.tagToAdd = ""; //this clears the value stored in typeahead so it doesn't try to add the text again - // http://issues.umbraco.org/issue/U4-4947 + // https://issues.umbraco.org/issue/U4-4947 $typeahead.typeahead('val', ''); }; From bb59c4708d0a92cac1edf6198ca0a543a849693f Mon Sep 17 00:00:00 2001 From: Chris Houston Date: Wed, 1 Aug 2018 00:30:44 -0400 Subject: [PATCH 028/275] Just triggering AppVeyor :) As per my other pull request, pretty sure the one unit test failed due to it running close to midnight on the last day of the month. --- .../directives/components/forms/checklistmodel.directive.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js index 6ab6e1cad7..a89477b001 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/checklistmodel.directive.js @@ -19,7 +19,7 @@ angular.module('umbraco.directives') return false; } - // add + // add function add(arr, item) { arr = angular.isArray(arr) ? arr : []; for (var i = 0; i < arr.length; i++) { From 9663cfde82f68039a10a758fb2755152fbc2cb23 Mon Sep 17 00:00:00 2001 From: Chris Houston Date: Wed, 1 Aug 2018 01:16:38 -0400 Subject: [PATCH 029/275] Fixed issue with creating doctypes & templated with an Ampersand : http://issues.umbraco.org/issue/U4-11550 (#2828) --- .../src/common/resources/entity.resource.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js index 72f8ad5539..780a336fce 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js @@ -46,7 +46,7 @@ function entityResource($q, $http, umbRequestHelper) { $http.get( umbRequestHelper.getApiUrl( "entityApiBaseUrl", - "GetSafeAlias", { value: value, camelCase: camelCase })), + "GetSafeAlias", { value: encodeURIComponent(value), camelCase: camelCase })), 'Failed to retrieve content type scaffold'); }, From 11aea0f51510d9981f3211fe0afe86ed99f850a3 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 1 Aug 2018 07:18:24 +0200 Subject: [PATCH 030/275] We need to create the template from it's alias, which is the safeAlias, which is the correct filename Relates to: https://github.com/umbraco/Umbraco-CMS/pull/2828#issuecomment-409452155 --- src/Umbraco.Web/Editors/TemplateController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Editors/TemplateController.cs b/src/Umbraco.Web/Editors/TemplateController.cs index 100a266dff..e38f08665e 100644 --- a/src/Umbraco.Web/Editors/TemplateController.cs +++ b/src/Umbraco.Web/Editors/TemplateController.cs @@ -184,7 +184,7 @@ namespace Umbraco.Web.Editors throw new HttpResponseException(HttpStatusCode.NotFound); } - var template = Services.FileService.CreateTemplateWithIdentity(display.Name, display.Content, master); + var template = Services.FileService.CreateTemplateWithIdentity(display.Alias, display.Content, master); Mapper.Map(template, display); } From c073ab27317ecc9043321c156fa61f78afb76470 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 15:40:54 +1000 Subject: [PATCH 031/275] WIP still pulling apart models, binders, validators --- .../Mapping/ContentWebModelMappingTests.cs | 15 +- .../Editors/Binders/ContentItemBaseBinder.cs | 203 ------------------ .../Editors/Binders/ContentItemBinder.cs | 64 ++++-- .../Binders/ContentModelBinderHelper.cs | 73 +++++++ .../Editors/Binders/MediaItemBinder.cs | 52 +++-- .../Editors/Binders/MemberBinder.cs | 62 +++--- src/Umbraco.Web/Editors/ContentController.cs | 15 +- .../Editors/ContentControllerBase.cs | 6 +- .../Filters/ContentItemValidationHelper.cs | 52 +++-- .../MediaItemSaveValidationAttribute.cs | 2 +- .../Filters/MemberSaveValidationAttribute.cs | 2 +- .../Editors/Filters/MemberValidationHelper.cs | 9 +- src/Umbraco.Web/Editors/MediaController.cs | 41 ++-- src/Umbraco.Web/Editors/MemberController.cs | 1 + .../Models/ContentEditing/ContentBaseSave.cs | 24 +-- .../Models/ContentEditing/ContentItemBasic.cs | 3 +- .../ContentEditing/ContentItemDisplay.cs | 2 +- .../ContentEditing/ContentItemDisplayBase.cs | 3 +- .../Models/ContentEditing/ContentItemDto.cs | 4 +- .../Models/ContentEditing/ContentItemSave.cs | 17 +- .../Models/ContentEditing/IContentSave.cs | 12 +- .../ListViewAwareContentItemDisplayBase.cs | 4 +- .../Models/ContentEditing/MediaItemDisplay.cs | 2 +- .../Models/ContentEditing/MemberBasic.cs | 2 +- .../Models/ContentEditing/MemberDisplay.cs | 2 +- .../ContentEditing/MemberListDisplay.cs | 2 +- .../ContentEditing/TabbedContentItem.cs | 3 +- .../Models/Mapping/ContentMapperProfile.cs | 4 +- .../Models/Mapping/MediaMapperProfile.cs | 4 +- .../Models/Mapping/MemberMapperProfile.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 3 +- .../WebApi/HttpActionContextExtensions.cs | 101 +++++++++ 32 files changed, 404 insertions(+), 387 deletions(-) delete mode 100644 src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs create mode 100644 src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs create mode 100644 src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index 6e9c731f20..c171b76762 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -56,7 +56,7 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedMedia.CreateMediaImage(contentType, -1); FixUsers(content); - var result = Mapper.Map>(content); + var result = Mapper.Map>(content); AssertBasics(result, content); @@ -73,7 +73,7 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedContent.CreateSimpleContent(contentType); FixUsers(content); - var result = Mapper.Map>(content); + var result = Mapper.Map>(content); AssertBasics(result, content); @@ -90,7 +90,7 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedContent.CreateSimpleContent(contentType); FixUsers(content); - var result = Mapper.Map>(content); + var result = Mapper.Map(content); AssertContentItem(result, content); } @@ -102,7 +102,7 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedMedia.CreateMediaImage(contentType, -1); FixUsers(content); - var result = Mapper.Map>(content); + var result = Mapper.Map(content); AssertContentItem(result, content); } @@ -247,7 +247,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(content.Properties.Count(), invariantContent.Properties.Count(x => x.Alias.StartsWith("_umb_") == false)); } - private void AssertBasics(ContentItemBasic result, TPersisted content) + private void AssertBasics(ContentItemBasic result, TPersisted content) where T : ContentPropertyBasic where TPersisted : IContentBase { @@ -288,8 +288,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(pDto.Value, p.GetValue().ToString()); } - private void AssertProperty(ContentItemBasic result, Property p) - where TPersisted : IContentBase + private void AssertProperty(ContentItemBasic result, Property p) { AssertBasicProperty(result, p); @@ -303,7 +302,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(Current.PropertyEditors[p.PropertyType.PropertyEditorAlias], pDto.PropertyEditor); } - private void AssertContentItem(ContentItemBasic result, T content) + private void AssertContentItem(ContentItemBasic result, T content) where T : IContentBase { AssertBasics(result, content); diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs deleted file mode 100644 index 7ace0e5787..0000000000 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBaseBinder.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System; -using System.IO; -using System.Net; -using System.Net.Http; -using System.Web.Http; -using System.Web.Http.Controllers; -using Newtonsoft.Json; -using Umbraco.Core.IO; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Editors; -using Umbraco.Core.Services; -using Umbraco.Web.Composing; -using Umbraco.Web.Models.ContentEditing; -using IModelBinder = System.Web.Http.ModelBinding.IModelBinder; -using ModelBindingContext = System.Web.Http.ModelBinding.ModelBindingContext; -using Task = System.Threading.Tasks.Task; - -namespace Umbraco.Web.Editors.Binders -{ - /// - /// Binds the content model to the controller action for the posted multi-part Post - /// - internal abstract class ContentItemBaseBinder : IModelBinder - where TPersisted : class, IContentBase - where TModelSave : IContentSave - { - protected Core.Logging.ILogger Logger { get; } - protected ServiceContext Services { get; } - protected IUmbracoContextAccessor UmbracoContextAccessor { get; } - - protected ContentItemBaseBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) - { - } - - protected ContentItemBaseBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - { - Logger = logger; - Services = services; - UmbracoContextAccessor = umbracoContextAccessor; - } - - public virtual bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) - { - if (actionContext.Request.Content.IsMimeMultipartContent() == false) - { - throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); - } - - var result = GetMultiPartResult(actionContext); - - var model = GetModel(actionContext, result); - bindingContext.Model = model; - - return bindingContext.Model != null; - } - - private MultipartFormDataStreamProvider GetMultiPartResult(HttpActionContext actionContext) - { - var root = IOHelper.MapPath("~/App_Data/TEMP/FileUploads"); - //ensure it exists - Directory.CreateDirectory(root); - var provider = new MultipartFormDataStreamProvider(root); - - var request = actionContext.Request; - var content = request.Content; - - // Note: YES this is super strange, ugly, and weird. - // One would think that you could just do: - // - //var result = content.ReadAsMultipartAsync(provider).Result; - // - // But it deadlocks. See https://stackoverflow.com/questions/15201255 for details, which - // points to https://msdn.microsoft.com/en-us/magazine/jj991977.aspx which contains more - // details under "Async All the Way" - see also https://olitee.com/2015/01/c-async-await-common-deadlock-scenario/ - // which contains a simplified explaination: ReadAsMultipartAsync is meant to be awaited, - // not used in the non-async .Result way, and there is nothing we can do about it. - // - // Alas, model binders cannot be async "all the way", so we have to wrap in a task, to - // force proper threading, and then it works. - - MultipartFormDataStreamProvider result = null; - var task = Task.Run(() => content.ReadAsMultipartAsync(provider)) - .ContinueWith(x => - { - if (x.IsFaulted && x.Exception != null) - { - throw x.Exception; - } - result = x.ConfigureAwait(false).GetAwaiter().GetResult(); - }); - task.Wait(); - - if (result == null) - throw new InvalidOperationException("Could not read multi-part message"); - - return result; - } - - /// - /// Builds the model from the request contents - /// - /// - /// - /// - private TModelSave GetModel(HttpActionContext actionContext, MultipartFormDataStreamProvider result) - { - if (result.FormData["contentItem"] == null) - { - var response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest); - response.ReasonPhrase = "The request was not formatted correctly and is missing the 'contentItem' parameter"; - throw new HttpResponseException(response); - } - - //get the string json from the request - var contentItem = result.FormData["contentItem"]; - - //deserialize into our model - var model = JsonConvert.DeserializeObject(contentItem); - - //get the default body validator and validate the object - var bodyValidator = actionContext.ControllerContext.Configuration.Services.GetBodyModelValidator(); - var metadataProvider = actionContext.ControllerContext.Configuration.Services.GetModelMetadataProvider(); - //all validation errors will not contain a prefix - bodyValidator.Validate(model, typeof(TModelSave), metadataProvider, actionContext, ""); - - //get the files - foreach (var file in result.FileData) - { - //The name that has been assigned in JS has 2 parts and the second part indicates the property id - // for which the file belongs. - var parts = file.Headers.ContentDisposition.Name.Trim(new char[] { '\"' }).Split('_'); - if (parts.Length != 2) - { - var response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest); - response.ReasonPhrase = "The request was not formatted correctly the file name's must be underscore delimited"; - throw new HttpResponseException(response); - } - var propAlias = parts[1]; - - var fileName = file.Headers.ContentDisposition.FileName.Trim(new char[] { '\"' }); - - model.UploadedFiles.Add(new ContentPropertyFile - { - TempFilePath = file.LocalFileName, - PropertyAlias = propAlias, - FileName = fileName - }); - } - - if (ContentControllerBase.IsCreatingAction(model.Action)) - { - //we are creating new content - model.PersistedContent = CreateNew(model); - } - else - { - //finally, let's lookup the real content item and create the DTO item - model.PersistedContent = GetExisting(model); - } - - //create the dto from the persisted model - if (model.PersistedContent != null) - { - model.ContentDto = MapFromPersisted(model); - } - if (model.ContentDto != null) - { - //now map all of the saved values to the dto - MapPropertyValuesFromSaved(model, model.ContentDto); - } - - return model; - } - - /// - /// we will now assign all of the values in the 'save' model to the DTO object - /// - /// - /// - protected virtual void MapPropertyValuesFromSaved(TModelSave saveModel, ContentItemDto dto) - { - //TODO: This needs to be overridden for content but I'm pretty sure these DTO models won't even work for content - //Continue if this is a property model (i.e. media or members) - if (!(saveModel is IContentProperties propertyModel)) return; - - //NOTE: Don't convert this to linq, this is much quicker - foreach (var p in propertyModel.Properties) - { - foreach (var propertyDto in dto.Properties) - { - if (propertyDto.Alias != p.Alias) continue; - propertyDto.Value = p.Value; - break; - } - } - - } - - protected abstract TPersisted GetExisting(TModelSave model); - protected abstract TPersisted CreateNew(TModelSave model); - protected abstract ContentItemDto MapFromPersisted(TModelSave model); - } -} diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs index a83e192224..43d6eb888d 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs @@ -3,40 +3,78 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; +using System.Web.Http; using System.Web.Http.Controllers; +using System.Web.Http.ModelBinding; using AutoMapper; using Umbraco.Core; using Umbraco.Core.Logging; using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.Editors.Filters; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; +using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Editors.Binders { - /// - internal class ContentItemBinder : ContentItemBaseBinder + /// + /// The model binder for + /// + internal class ContentItemBinder : IModelBinder { + private readonly ServiceContext _services; + private readonly ContentModelBinderHelper _modelBinderHelper; + public ContentItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) { } public ContentItemBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - : base(logger, services, umbracoContextAccessor) { - } - - protected override IContent GetExisting(ContentItemSave model) - { - return Services.ContentService.GetById(model.Id); + _services = services; + _modelBinderHelper = new ContentModelBinderHelper(); } - protected override IContent CreateNew(ContentItemSave model) + /// + /// Creates the model from the request and binds it to the context + /// + /// + /// + /// + public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { - var contentType = Services.ContentTypeService.Get(model.ContentTypeAlias); + var model = _modelBinderHelper.BindModelFromMultipartRequest(actionContext, bindingContext); + if (model == null) return false; + + model.PersistedContent = ContentControllerBase.IsCreatingAction(model.Action) ? CreateNew(model) : GetExisting(model); + + //TODO: Implement this! + ////create the dto from the persisted model + //if (model.PersistedContent != null) + //{ + // model.ContentDto = MapFromPersisted(model); + //} + //if (model.ContentDto != null) + //{ + // //now map all of the saved values to the dto + // _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); + //} + + return true; + } + + private IContent GetExisting(ContentItemSave model) + { + return _services.ContentService.GetById(model.Id); + } + + private IContent CreateNew(ContentItemSave model) + { + var contentType = _services.ContentTypeService.Get(model.ContentTypeAlias); if (contentType == null) { throw new InvalidOperationException("No content type found with alias " + model.ContentTypeAlias); @@ -47,14 +85,14 @@ namespace Umbraco.Web.Editors.Binders contentType); } - protected override ContentItemDto MapFromPersisted(ContentItemSave model) + private static ContentItemDto MapFromPersisted(ContentItemSave model) { return MapFromPersisted(model.PersistedContent); } - internal static ContentItemDto MapFromPersisted(IContent content) + internal static ContentItemDto MapFromPersisted(IContent content) { - return Mapper.Map>(content); + return Mapper.Map(content); } diff --git a/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs b/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs new file mode 100644 index 0000000000..16f7c70b0b --- /dev/null +++ b/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs @@ -0,0 +1,73 @@ +using System.Net; +using System.Net.Http; +using System.Web.Http; +using System.Web.Http.Controllers; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Editors; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.WebApi; +using ModelBindingContext = System.Web.Http.ModelBinding.ModelBindingContext; + +namespace Umbraco.Web.Editors.Binders +{ + /// + /// Helper methods to bind media/member models + /// + internal class ContentModelBinderHelper + { + public TModelSave BindModelFromMultipartRequest(HttpActionContext actionContext, ModelBindingContext bindingContext) + where TModelSave : IHaveUploadedFiles + { + var result = actionContext.ReadAsMultipart("~/App_Data/TEMP/FileUploads"); + + var model = actionContext.GetModelFromMultipartRequest(result, "contentItem"); + + //get the files + foreach (var file in result.FileData) + { + //The name that has been assigned in JS has 2 parts and the second part indicates the property id + // for which the file belongs. + var parts = file.Headers.ContentDisposition.Name.Trim('\"').Split('_'); + if (parts.Length != 2) + { + var response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest); + response.ReasonPhrase = "The request was not formatted correctly the file name's must be underscore delimited"; + throw new HttpResponseException(response); + } + var propAlias = parts[1]; + + var fileName = file.Headers.ContentDisposition.FileName.Trim('\"'); + + model.UploadedFiles.Add(new ContentPropertyFile + { + TempFilePath = file.LocalFileName, + PropertyAlias = propAlias, + FileName = fileName + }); + } + + bindingContext.Model = model; + + return model; + } + + /// + /// we will now assign all of the values in the 'save' model to the DTO object + /// + /// + /// + public void MapPropertyValuesFromSaved(IContentProperties saveModel, ContentItemDto dto) + { + //NOTE: Don't convert this to linq, this is much quicker + foreach (var p in saveModel.Properties) + { + foreach (var propertyDto in dto.Properties) + { + if (propertyDto.Alias != p.Alias) continue; + propertyDto.Value = p.Value; + break; + } + } + } + } +} diff --git a/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs index c97c78dc71..718850c07a 100644 --- a/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs @@ -8,49 +8,65 @@ using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Mapping; +using Umbraco.Web.WebApi; namespace Umbraco.Web.Editors.Binders { - /// /// /// The model binder for /// - internal class MediaItemBinder : ContentItemBaseBinder + internal class MediaItemBinder : IModelBinder { - public MediaItemBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + private readonly ContentModelBinderHelper _modelBinderHelper; + private readonly ServiceContext _services; + + public MediaItemBinder() : this(Current.Services) { } - public MediaItemBinder(Core.Logging.ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - : base(logger, services, umbracoContextAccessor) + public MediaItemBinder(ServiceContext services) { + _services = services; + _modelBinderHelper = new ContentModelBinderHelper(); } /// - /// Overridden to trim the name + /// Creates the model from the request and binds it to the context /// /// /// /// - public override bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { - var result = base.BindModel(actionContext, bindingContext); - if (result) + var model = _modelBinderHelper.BindModelFromMultipartRequest(actionContext, bindingContext); + if (model == null) return false; + + model.PersistedContent = ContentControllerBase.IsCreatingAction(model.Action) ? CreateNew(model) : GetExisting(model); + + //create the dto from the persisted model + if (model.PersistedContent != null) { - var model = (MediaItemSave) bindingContext.Model; - model.Name = model.Name.Trim(); + model.ContentDto = MapFromPersisted(model); } - return result; + if (model.ContentDto != null) + { + //now map all of the saved values to the dto + _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); + } + + model.Name = model.Name.Trim(); + + return true; } - protected override IMedia GetExisting(MediaItemSave model) + private IMedia GetExisting(MediaItemSave model) { - return Services.MediaService.GetById(Convert.ToInt32(model.Id)); + return _services.MediaService.GetById(Convert.ToInt32(model.Id)); } - protected override IMedia CreateNew(MediaItemSave model) + private IMedia CreateNew(MediaItemSave model) { - var mediaType = Services.MediaTypeService.Get(model.ContentTypeAlias); + var mediaType = _services.MediaTypeService.Get(model.ContentTypeAlias); if (mediaType == null) { throw new InvalidOperationException("No media type found with alias " + model.ContentTypeAlias); @@ -58,9 +74,9 @@ namespace Umbraco.Web.Editors.Binders return new Core.Models.Media(model.Name, model.ParentId, mediaType); } - protected override ContentItemDto MapFromPersisted(MediaItemSave model) + private ContentItemDto MapFromPersisted(MediaItemSave model) { - return Mapper.Map>(model.PersistedContent); + return Mapper.Map(model.PersistedContent); } } } diff --git a/src/Umbraco.Web/Editors/Binders/MemberBinder.cs b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs index 82647bb2a3..7b48b7a4ff 100644 --- a/src/Umbraco.Web/Editors/Binders/MemberBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Net; -using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.ModelBinding; using System.Web.Security; @@ -12,49 +9,58 @@ using Umbraco.Core.Models; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.WebApi.Filters; using System.Linq; -using System.Net.Http; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services.Implement; -using Umbraco.Web; using Umbraco.Web.Composing; -using Umbraco.Core.Logging; -using Umbraco.Web.Editors.Filters; namespace Umbraco.Web.Editors.Binders { - /// /// /// The model binder for /// - internal class MemberBinder : ContentItemBaseBinder + internal class MemberBinder : IModelBinder { + private readonly ContentModelBinderHelper _modelBinderHelper; + private readonly ServiceContext _services; - public MemberBinder() : this(Current.Logger, Current.Services, Current.UmbracoContextAccessor) + public MemberBinder() : this(Current.Services) { } - public MemberBinder(ILogger logger, ServiceContext services, IUmbracoContextAccessor umbracoContextAccessor) - : base(logger, services, umbracoContextAccessor) + public MemberBinder(ServiceContext services) { + _services = services; + _modelBinderHelper = new ContentModelBinderHelper(); } /// - /// Overridden to trim the name + /// Creates the model from the request and binds it to the context /// /// /// /// - public override bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) + public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) { - var result = base.BindModel(actionContext, bindingContext); - if (result) + var model = _modelBinderHelper.BindModelFromMultipartRequest(actionContext, bindingContext); + if (model == null) return false; + + model.PersistedContent = ContentControllerBase.IsCreatingAction(model.Action) ? CreateNew(model) : GetExisting(model); + + //create the dto from the persisted model + if (model.PersistedContent != null) { - var model = (MemberSave)bindingContext.Model; - model.Name = model.Name.Trim(); + model.ContentDto = MapFromPersisted(model); } - return result; + if (model.ContentDto != null) + { + //now map all of the saved values to the dto + _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); + } + + model.Name = model.Name.Trim(); + + return true; } /// @@ -62,9 +68,9 @@ namespace Umbraco.Web.Editors.Binders /// /// /// - protected override IMember GetExisting(MemberSave model) + private IMember GetExisting(MemberSave model) { - var scenario = Services.MemberService.GetMembershipScenario(); + var scenario = _services.MemberService.GetMembershipScenario(); var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); switch (scenario) { @@ -111,7 +117,7 @@ namespace Umbraco.Web.Editors.Binders private IMember GetExisting(Guid key) { - var member = Services.MemberService.GetByKey(key); + var member = _services.MemberService.GetByKey(key); if (member == null) { throw new InvalidOperationException("Could not find member with key " + key); @@ -128,13 +134,13 @@ namespace Umbraco.Web.Editors.Binders /// /// Depending on whether a custom membership provider is configured this will return different results. /// - protected override IMember CreateNew(MemberSave model) + private IMember CreateNew(MemberSave model) { var provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider(); if (provider.IsUmbracoMembershipProvider()) { - var contentType = Services.MemberTypeService.Get(model.ContentTypeAlias); + var contentType = _services.MemberTypeService.Get(model.ContentTypeAlias); if (contentType == null) { throw new InvalidOperationException("No member type found wth alias " + model.ContentTypeAlias); @@ -155,7 +161,7 @@ namespace Umbraco.Web.Editors.Binders //If the default Member type exists, we'll use that to create the IMember - that way we can associate the custom membership // provider to our data - eventually we can support editing custom properties with a custom provider. - var memberType = Services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); + var memberType = _services.MemberTypeService.Get(Constants.Conventions.MemberTypes.DefaultAlias); if (memberType != null) { FilterContentTypeProperties(memberType, memberType.PropertyTypes.Select(x => x.Alias).ToArray()); @@ -197,12 +203,12 @@ namespace Umbraco.Web.Editors.Binders } } - protected override ContentItemDto MapFromPersisted(MemberSave model) + private ContentItemDto MapFromPersisted(MemberSave model) { //need to explicitly cast since it's an explicit implementation var saveModel = (IContentSave)model; - return Mapper.Map>(saveModel.PersistedContent); + return Mapper.Map(saveModel.PersistedContent); } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 1c19ee1345..2e41c01296 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -432,8 +432,8 @@ namespace Umbraco.Web.Editors /// Gets the children for the content id passed in /// /// - [FilterAllowedOutgoingContent(typeof(IEnumerable>), "Items")] - public PagedResult> GetChildren( + [FilterAllowedOutgoingContent(typeof(IEnumerable>), "Items")] + public PagedResult> GetChildren( int id, int pageNumber = 0, //TODO: This should be '1' as it's not the index int pageSize = 0, @@ -449,8 +449,8 @@ namespace Umbraco.Web.Editors /// Gets the children for the content id passed in /// /// - [FilterAllowedOutgoingContent(typeof(IEnumerable>), "Items")] - public PagedResult> GetChildren( + [FilterAllowedOutgoingContent(typeof(IEnumerable>), "Items")] + public PagedResult> GetChildren( int id, string includeProperties, int pageNumber = 0, //TODO: This should be '1' as it's not the index @@ -487,12 +487,12 @@ namespace Umbraco.Web.Editors if (totalChildren == 0) { - return new PagedResult>(0, 0, 0); + return new PagedResult>(0, 0, 0); } - var pagedResult = new PagedResult>(totalChildren, pageNumber, pageSize); + var pagedResult = new PagedResult>(totalChildren, pageNumber, pageSize); pagedResult.Items = children.Select(content => - Mapper.Map>(content, + Mapper.Map>(content, opts => { // if there's a list of property aliases to map - we will make sure to store this in the mapping context. @@ -1230,6 +1230,7 @@ namespace Umbraco.Web.Editors //for each variant, map the property values MapPropertyValues( contentSave, + null, //TODO: Fix this! (save, property) => Varies(property) ? property.GetValue(variant.Culture) : property.GetValue(), //get prop val (save, property, v) => { if (Varies(property)) property.SetValue(v, variant.Culture); else property.SetValue(v); }); //set prop val } diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index cd124d1d9c..931ef46dcd 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -18,7 +18,7 @@ using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.Editors { /// - /// An abstract base controller used for media/content (and probably members) to try to reduce code replication. + /// An abstract base controller used for media/content/members to try to reduce code replication. /// [OutgoingDateTimeFormat] public abstract class ContentControllerBase : BackOfficeNotificationsController @@ -42,17 +42,19 @@ namespace Umbraco.Web.Editors /// /// /// + /// /// /// internal void MapPropertyValues( TSaved contentItem, + ContentItemDto dto, Func getPropertyValue, Action savePropertyValue) where TPersisted : IContentBase where TSaved : IContentSave { // map the property values - foreach (var propertyDto in contentItem.ContentDto.Properties) + foreach (var propertyDto in dto.Properties) { // get the property editor if (propertyDto.PropertyEditor == null) diff --git a/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs index d5c3384b87..d75c4c8a63 100644 --- a/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs @@ -37,35 +37,35 @@ namespace Umbraco.Web.Editors.Filters /// internal class ContentItemValidationHelper: ContentItemValidationHelper where TPersisted : class, IContentBase - where TModelSave: IContentSave, IContentProperties + where TModelSave: IContentSave { public ContentItemValidationHelper(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, umbracoContextAccessor) { } - /// - /// Validates the content item and updates the Response and ModelState accordingly - /// - /// - /// - public void ValidateItem(HttpActionContext actionContext, string argumentName) - { - if (!(actionContext.ActionArguments[argumentName] is TModelSave model)) - { - actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No " + typeof(TModelSave) + " found in request"); - return; - } + ///// + ///// Validates the content item and updates the Response and ModelState accordingly + ///// + ///// + ///// + //public void ValidateItem(HttpActionContext actionContext, string argumentName) + //{ + // if (!(actionContext.ActionArguments[argumentName] is TModelSave model)) + // { + // actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No " + typeof(TModelSave) + " found in request"); + // return; + // } - ValidateItem(actionContext, model); + // ValidateItem(actionContext, model); - } + //} - public void ValidateItem(HttpActionContext actionContext, TModelSave model) + public void ValidateItem(HttpActionContext actionContext, TModelSave model, IContentProperties modelWithProperties, ContentItemDto dto) { //now do each validation step if (ValidateExistingContent(model, actionContext) == false) return; - if (ValidateProperties(model, actionContext) == false) return; - if (ValidatePropertyData(model, actionContext.ModelState) == false) return; + if (ValidateProperties(model, modelWithProperties, actionContext) == false) return; + if (ValidatePropertyData(model, modelWithProperties, dto, actionContext.ModelState) == false) return; } /// @@ -90,12 +90,13 @@ namespace Umbraco.Web.Editors.Filters /// Ensure all of the ids in the post are valid /// /// + /// /// /// - protected virtual bool ValidateProperties(TModelSave model, HttpActionContext actionContext) + protected virtual bool ValidateProperties(TModelSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) { var persistedContent = model.PersistedContent; - return ValidateProperties(model.Properties.ToList(), persistedContent.Properties.ToList(), actionContext); + return ValidateProperties(modelWithProperties.Properties.ToList(), persistedContent.Properties.ToList(), actionContext); } /// @@ -127,15 +128,20 @@ namespace Umbraco.Web.Editors.Filters /// Validates the data for each property /// /// + /// + /// /// /// /// /// All property data validation goes into the modelstate with a prefix of "Properties" /// - public virtual bool ValidatePropertyData(TModelSave model, ModelStateDictionary modelState) + public virtual bool ValidatePropertyData( + TModelSave model, + IContentProperties modelWithProperties, + ContentItemDto dto, + ModelStateDictionary modelState) { - var properties = model.Properties.ToList(); - var dto = model.ContentDto; + var properties = modelWithProperties.Properties.ToList(); foreach (var p in dto.Properties) { diff --git a/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs index c63bdd5dfe..7f2901e69e 100644 --- a/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs @@ -42,7 +42,7 @@ namespace Umbraco.Web.Editors.Filters var contentItemValidator = new ContentItemValidationHelper(_logger, _umbracoContextAccessor); if (ValidateUserAccess(model, actionContext)) - contentItemValidator.ValidateItem(actionContext, model); + contentItemValidator.ValidateItem(actionContext, model, model, model.ContentDto); } /// diff --git a/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs index 187bf7e1c8..930e8319f6 100644 --- a/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.Editors.Filters { var model = (MemberSave)actionContext.ActionArguments["contentItem"]; var contentItemValidator = new MemberValidationHelper(_logger, _umbracoContextAccessor); - contentItemValidator.ValidateItem(actionContext, model); + contentItemValidator.ValidateItem(actionContext, model, model, model.ContentDto); } } } diff --git a/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs index 264574453a..5fa5e955b6 100644 --- a/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs @@ -52,9 +52,11 @@ namespace Umbraco.Web.Editors.Filters /// We need to manually validate a few things here like email and login to make sure they are valid and aren't duplicates /// /// + /// /// + /// /// - public override bool ValidatePropertyData(MemberSave model, ModelStateDictionary modelState) + public override bool ValidatePropertyData(MemberSave model, IContentProperties modelWithProperties, ContentItemDto dto, ModelStateDictionary modelState) { if (model.Username.IsNullOrWhiteSpace()) { @@ -89,7 +91,7 @@ namespace Umbraco.Web.Editors.Filters $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); } - return base.ValidatePropertyData(model, modelState); + return base.ValidatePropertyData(model, modelWithProperties, dto, modelState); } /// @@ -98,9 +100,10 @@ namespace Umbraco.Web.Editors.Filters /// This also validates any posted data for fields that are sensitive. /// /// + /// /// /// - protected override bool ValidateProperties(MemberSave model, HttpActionContext actionContext) + protected override bool ValidateProperties(MemberSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) { var propertiesToValidate = model.Properties.ToList(); var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 1259ce9639..9da9107534 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -191,7 +191,7 @@ namespace Umbraco.Web.Editors /// /// /// - public PagedResult> GetChildFolders(int id, int pageNumber = 1, int pageSize = 1000) + public PagedResult> GetChildFolders(int id, int pageNumber = 1, int pageSize = 1000) { //Suggested convention for folder mediatypes - we can make this more or less complicated as long as we document it... //if you create a media type, which has an alias that ends with ...Folder then its a folder: ex: "secureFolder", "bannerFolder", "Folder" @@ -203,28 +203,28 @@ namespace Umbraco.Web.Editors if (folderTypes.Length == 0) { - return new PagedResult>(0, pageNumber, pageSize); + return new PagedResult>(0, pageNumber, pageSize); } long total; var children = Services.MediaService.GetPagedChildren(id, pageNumber - 1, pageSize, out total, "Name", Direction.Ascending, true, null, folderTypes.ToArray()); - return new PagedResult>(total, pageNumber, pageSize) + return new PagedResult>(total, pageNumber, pageSize) { - Items = children.Select(Mapper.Map>) + Items = children.Select(Mapper.Map>) }; } /// /// Returns the root media objects /// - [FilterAllowedOutgoingMedia(typeof(IEnumerable>))] - public IEnumerable> GetRootMedia() + [FilterAllowedOutgoingMedia(typeof(IEnumerable>))] + public IEnumerable> GetRootMedia() { //TODO: Add permissions check! return Services.MediaService.GetRootMedia() - .Select(Mapper.Map>); + .Select(Mapper.Map>); } #region GetChildren @@ -240,8 +240,8 @@ namespace Umbraco.Web.Editors /// /// Returns the child media objects - using the entity INT id /// - [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] - public PagedResult> GetChildren(int id, + [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] + public PagedResult> GetChildren(int id, int pageNumber = 0, int pageSize = 0, string orderBy = "SortOrder", @@ -254,14 +254,14 @@ namespace Umbraco.Web.Editors if (id == Constants.System.Root && UserStartNodes.Length > 0 && UserStartNodes.Contains(Constants.System.Root) == false) { if (pageNumber > 0) - return new PagedResult>(0, 0, 0); + return new PagedResult>(0, 0, 0); var nodes = Services.MediaService.GetByIds(UserStartNodes).ToArray(); if (nodes.Length == 0) - return new PagedResult>(0, 0, 0); + return new PagedResult>(0, 0, 0); if (pageSize < nodes.Length) pageSize = nodes.Length; // bah - var pr = new PagedResult>(nodes.Length, pageNumber, pageSize) + var pr = new PagedResult>(nodes.Length, pageNumber, pageSize) { - Items = nodes.Select(Mapper.Map>) + Items = nodes.Select(Mapper.Map>) }; return pr; } @@ -295,12 +295,12 @@ namespace Umbraco.Web.Editors if (totalChildren == 0) { - return new PagedResult>(0, 0, 0); + return new PagedResult>(0, 0, 0); } - var pagedResult = new PagedResult>(totalChildren, pageNumber, pageSize); + var pagedResult = new PagedResult>(totalChildren, pageNumber, pageSize); pagedResult.Items = children - .Select(Mapper.Map>); + .Select(Mapper.Map>); return pagedResult; } @@ -316,8 +316,8 @@ namespace Umbraco.Web.Editors /// /// /// - [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] - public PagedResult> GetChildren(Guid id, + [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] + public PagedResult> GetChildren(Guid id, int pageNumber = 0, int pageSize = 0, string orderBy = "SortOrder", @@ -344,8 +344,8 @@ namespace Umbraco.Web.Editors /// /// /// - [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] - public PagedResult> GetChildren(Udi id, + [FilterAllowedOutgoingMedia(typeof(IEnumerable>), "Items")] + public PagedResult> GetChildren(Udi id, int pageNumber = 0, int pageSize = 0, string orderBy = "SortOrder", @@ -452,6 +452,7 @@ namespace Umbraco.Web.Editors MapPropertyValues( contentItem, + contentItem.ContentDto, (save, property) => property.GetValue(), //get prop val (save, property, v) => property.SetValue(v)); //set prop val diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 61a7f3baa9..39e081bc64 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -397,6 +397,7 @@ namespace Umbraco.Web.Editors //use the base method to map the rest of the properties base.MapPropertyValues( contentItem, + contentItem.ContentDto, (save, property) => property.GetValue(), //get prop val (save, property, v) => property.SetValue(v)); //set prop val } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs index 8748a3f4e0..a9fefbc62e 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be saved /// [DataContract(Name = "content", Namespace = "")] - public abstract class ContentBaseSave : ContentItemBasic, IContentSave + public abstract class ContentBaseSave : ContentItemBasic, IContentSave where TPersisted : IContentBase { protected ContentBaseSave() @@ -31,12 +31,7 @@ namespace Umbraco.Web.Models.ContentEditing /// [IgnoreDataMember] TPersisted IContentSave.PersistedContent { get; set; } - - //These need explicit implementation because we are using internal models - /// - [IgnoreDataMember] - ContentItemDto IContentSave.ContentDto { get; set; } - + //Non explicit internal getter so we don't need to explicitly cast in our own code [IgnoreDataMember] internal TPersisted PersistedContent @@ -45,13 +40,16 @@ namespace Umbraco.Web.Models.ContentEditing set => ((IContentSave) this).PersistedContent = value; } - //Non explicit internal getter so we don't need to explicitly cast in our own code + /// + /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding + /// + /// + /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need + /// instead of having to look up all the data individually. + /// This is not used for outgoing model information. + /// [IgnoreDataMember] - internal ContentItemDto ContentDto - { - get => ((IContentSave)this).ContentDto; - set => ((IContentSave) this).ContentDto = value; - } + internal ContentItemDto ContentDto { get; set; } #endregion diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs index 12764de918..db788c9d95 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs @@ -66,9 +66,8 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a basic content item with properties /// [DataContract(Name = "content", Namespace = "")] - public class ContentItemBasic : ContentItemBasic, IContentProperties + public class ContentItemBasic : ContentItemBasic, IContentProperties where T : ContentPropertyBasic - where TPersisted : IContentBase { public ContentItemBasic() { diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index 9e5fce6d12..7ce6dd9000 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -181,7 +181,7 @@ namespace Umbraco.Web.Models.ContentEditing /// This is not used for outgoing model information. /// [IgnoreDataMember] - internal ContentItemDto ContentDto { get; set; } + internal ContentItemDto ContentDto { get; set; } /// /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs index af5201009b..7e2ba8e6cd 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplayBase.cs @@ -5,9 +5,8 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { - public abstract class ContentItemDisplayBase : TabbedContentItem, INotificationModel, IErrorModel + public abstract class ContentItemDisplayBase : TabbedContentItem, INotificationModel, IErrorModel where T : ContentPropertyBasic - where TPersisted : IContentBase { protected ContentItemDisplayBase() { diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs index 7d91f86221..2d039dddd6 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs @@ -6,9 +6,7 @@ namespace Umbraco.Web.Models.ContentEditing /// /// Represents a content item from the database including all of the required data that we need to work with such as data type data /// - internal class ContentItemDto : ContentItemBasic - where TPersisted : IContentBase + internal class ContentItemDto: ContentItemBasic { - } } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs index ba1560978c..98ccd47d5a 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs @@ -60,12 +60,7 @@ namespace Umbraco.Web.Models.ContentEditing /// [IgnoreDataMember] IContent IContentSave.PersistedContent { get; set; } - - //These need explicit implementation because we are using internal models - /// - [IgnoreDataMember] - ContentItemDto IContentSave.ContentDto { get; set; } - + //Non explicit internal getter so we don't need to explicitly cast in our own code [IgnoreDataMember] internal IContent PersistedContent @@ -74,13 +69,9 @@ namespace Umbraco.Web.Models.ContentEditing set => ((IContentSave)this).PersistedContent = value; } - //Non explicit internal getter so we don't need to explicitly cast in our own code - [IgnoreDataMember] - internal ContentItemDto ContentDto - { - get => ((IContentSave)this).ContentDto; - set => ((IContentSave)this).ContentDto = value; - } + ////Non explicit internal getter so we don't need to explicitly cast in our own code + //[IgnoreDataMember] + //internal ContentItemDto ContentDto { get;set; } #endregion diff --git a/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs b/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs index cf4d448131..bcac5d0aea 100644 --- a/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/IContentSave.cs @@ -21,15 +21,5 @@ namespace Umbraco.Web.Models.ContentEditing /// This is not used for outgoing model information. /// TPersisted PersistedContent { get; set; } - - /// - /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding - /// - /// - /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need - /// instead of having to look up all the data individually. - /// This is not used for outgoing model information. - /// - ContentItemDto ContentDto { get; set; } } -} \ No newline at end of file +} diff --git a/src/Umbraco.Web/Models/ContentEditing/ListViewAwareContentItemDisplayBase.cs b/src/Umbraco.Web/Models/ContentEditing/ListViewAwareContentItemDisplayBase.cs index 0982389a4c..6ec1a0c96a 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ListViewAwareContentItemDisplayBase.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ListViewAwareContentItemDisplayBase.cs @@ -7,10 +7,8 @@ namespace Umbraco.Web.Models.ContentEditing /// An abstract model representing a content item that can be contained in a list view /// /// - /// - public abstract class ListViewAwareContentItemDisplayBase : ContentItemDisplayBase + public abstract class ListViewAwareContentItemDisplayBase : ContentItemDisplayBase where T : ContentPropertyBasic - where TPersisted : IContentBase { /// /// Property indicating if this item is part of a list view parent diff --git a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs index 2a1c29983a..d979ffbf4e 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MediaItemDisplay.cs @@ -9,7 +9,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a content item to be displayed in the back office /// [DataContract(Name = "content", Namespace = "")] - public class MediaItemDisplay : ListViewAwareContentItemDisplayBase + public class MediaItemDisplay : ListViewAwareContentItemDisplayBase { public MediaItemDisplay() { diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberBasic.cs b/src/Umbraco.Web/Models/ContentEditing/MemberBasic.cs index ceb16ed748..00d2df0020 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MemberBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MemberBasic.cs @@ -6,7 +6,7 @@ namespace Umbraco.Web.Models.ContentEditing /// /// Used for basic member information /// - public class MemberBasic : ContentItemBasic + public class MemberBasic : ContentItemBasic { [DataMember(Name = "username")] public string Username { get; set; } diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MemberDisplay.cs index 3d5ae799fb..fd1c1ed5b8 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MemberDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MemberDisplay.cs @@ -10,7 +10,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a member to be displayed in the back office /// [DataContract(Name = "content", Namespace = "")] - public class MemberDisplay : ListViewAwareContentItemDisplayBase + public class MemberDisplay : ListViewAwareContentItemDisplayBase { public MemberDisplay() { diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs index 5a851d996b..ae9469989a 100644 --- a/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/MemberListDisplay.cs @@ -8,7 +8,7 @@ namespace Umbraco.Web.Models.ContentEditing /// A model representing a member list to be displayed in the back office /// [DataContract(Name = "content", Namespace = "")] - public class MemberListDisplay : ContentItemDisplayBase + public class MemberListDisplay : ContentItemDisplayBase { [DataMember(Name = "apps")] public IEnumerable ContentApps { get; set; } diff --git a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs index ccae4906b4..604e726e6f 100644 --- a/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs +++ b/src/Umbraco.Web/Models/ContentEditing/TabbedContentItem.cs @@ -7,8 +7,7 @@ using Umbraco.Core.Models; namespace Umbraco.Web.Models.ContentEditing { - public abstract class TabbedContentItem : ContentItemBasic, ITabbedContent where T : ContentPropertyBasic - where TPersisted : IContentBase + public abstract class TabbedContentItem : ContentItemBasic, ITabbedContent where T : ContentPropertyBasic { protected TabbedContentItem() { diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 0e2c3640ac..3f6d9461d1 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -75,7 +75,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Tabs, opt => opt.ResolveUsing(tabsAndPropertiesResolver)); //FROM IContent TO ContentItemBasic - CreateMap>() + CreateMap>() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) @@ -87,7 +87,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); //FROM IContent TO ContentItemDto - CreateMap>() + CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index b4bae19e00..6d81957a24 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -56,7 +56,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.ContentApps, opt => opt.ResolveUsing(mediaAppResolver)); //FROM IMedia TO ContentItemBasic - CreateMap>() + CreateMap>() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentType.Icon)) @@ -69,7 +69,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); //FROM IMedia TO ContentItemDto - CreateMap>() + CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) .ForMember(dest => dest.Published, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs index ae4fc19d54..a54baa8124 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs @@ -123,7 +123,7 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.ContentTypeAlias, opt => opt.Ignore()); //FROM IMember TO ContentItemDto - CreateMap>() + CreateMap() .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) .ForMember(dest => dest.Published, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index fa408a100b..47868dd48e 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -115,6 +115,7 @@ + @@ -999,7 +1000,7 @@ - + diff --git a/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs b/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs new file mode 100644 index 0000000000..6390ead73e --- /dev/null +++ b/src/Umbraco.Web/WebApi/HttpActionContextExtensions.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using System.Web.Http; +using System.Web.Http.Controllers; +using Newtonsoft.Json; +using Umbraco.Core.IO; + +namespace Umbraco.Web.WebApi +{ + internal static class HttpActionContextExtensions + { + /// + /// Helper method to get a model from a multipart request and ensure that the model is validated + /// + /// + /// + /// + /// + /// + /// + public static T GetModelFromMultipartRequest(this HttpActionContext actionContext, MultipartFormDataStreamProvider result, string requestKey, string validationKeyPrefix = "") + { + if (result.FormData[requestKey/*"contentItem"*/] == null) + { + var response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest); + response.ReasonPhrase = $"The request was not formatted correctly and is missing the '{requestKey}' parameter"; + throw new HttpResponseException(response); + } + + //get the string json from the request + var contentItem = result.FormData[requestKey]; + + //deserialize into our model + var model = JsonConvert.DeserializeObject(contentItem); + + //get the default body validator and validate the object + var bodyValidator = actionContext.ControllerContext.Configuration.Services.GetBodyModelValidator(); + var metadataProvider = actionContext.ControllerContext.Configuration.Services.GetModelMetadataProvider(); + //by default all validation errors will not contain a prefix (empty string) unless specified + bodyValidator.Validate(model, typeof(T), metadataProvider, actionContext, validationKeyPrefix); + + return model; + } + + /// + /// Helper method to get the from the request in a non-async manner + /// + /// + /// + /// + public static MultipartFormDataStreamProvider ReadAsMultipart(this HttpActionContext actionContext, string rootVirtualPath) + { + if (actionContext.Request.Content.IsMimeMultipartContent() == false) + { + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + } + + var root = IOHelper.MapPath(rootVirtualPath); + //ensure it exists + Directory.CreateDirectory(root); + var provider = new MultipartFormDataStreamProvider(root); + + var request = actionContext.Request; + var content = request.Content; + + // Note: YES this is super strange, ugly, and weird. + // One would think that you could just do: + // + //var result = content.ReadAsMultipartAsync(provider).Result; + // + // But it deadlocks. See https://stackoverflow.com/questions/15201255 for details, which + // points to https://msdn.microsoft.com/en-us/magazine/jj991977.aspx which contains more + // details under "Async All the Way" - see also https://olitee.com/2015/01/c-async-await-common-deadlock-scenario/ + // which contains a simplified explaination: ReadAsMultipartAsync is meant to be awaited, + // not used in the non-async .Result way, and there is nothing we can do about it. + // + // Alas, model binders cannot be async "all the way", so we have to wrap in a task, to + // force proper threading, and then it works. + + MultipartFormDataStreamProvider result = null; + var task = Task.Run(() => content.ReadAsMultipartAsync(provider)) + .ContinueWith(x => + { + if (x.IsFaulted && x.Exception != null) + { + throw x.Exception; + } + result = x.ConfigureAwait(false).GetAwaiter().GetResult(); + }); + task.Wait(); + + if (result == null) + throw new InvalidOperationException("Could not read multi-part message"); + + return result; + } + } +} From 6a94694f1607327ea3dd66e95d8b3e96a872cb4c Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 16:46:13 +1000 Subject: [PATCH 032/275] Got models pulled apart and simplified, much less inheritance and easier to follow, start wiring up the model binding logic for content along with validation for each variant --- .../Mapping/ContentWebModelMappingTests.cs | 16 ++-- .../Editors/Binders/ContentItemBinder.cs | 44 +++++------ .../Binders/ContentModelBinderHelper.cs | 2 +- .../Editors/Binders/MediaItemBinder.cs | 11 +-- .../Editors/Binders/MemberBinder.cs | 16 +--- src/Umbraco.Web/Editors/ContentController.cs | 4 +- .../Editors/ContentControllerBase.cs | 2 +- .../Filters/ContentItemValidationHelper.cs | 33 ++------ ...e.cs => ContentSaveValidationAttribute.cs} | 76 +++++++++++-------- .../MediaItemSaveValidationAttribute.cs | 7 +- .../Filters/MemberSaveValidationAttribute.cs | 5 +- .../Editors/Filters/MemberValidationHelper.cs | 4 +- src/Umbraco.Web/Editors/MediaController.cs | 2 +- src/Umbraco.Web/Editors/MemberController.cs | 2 +- .../Models/ContentEditing/ContentBaseSave.cs | 4 +- .../Models/ContentEditing/ContentItemBasic.cs | 3 +- .../ContentEditing/ContentItemDisplay.cs | 2 +- .../Models/ContentEditing/ContentItemDto.cs | 12 --- .../Models/ContentEditing/ContentItemSave.cs | 4 - .../ContentPropertyCollectionDto.cs | 23 ++++++ .../ContentEditing/ContentVariantSave.cs | 11 ++- .../ContentItemDisplayVariationResolver.cs | 2 +- .../Models/Mapping/ContentMapperProfile.cs | 12 +-- .../Models/Mapping/ContextMapper.cs | 58 -------------- .../Models/Mapping/MediaMapperProfile.cs | 18 ++--- .../Models/Mapping/MemberMapperProfile.cs | 16 ++-- .../Mapping/ResolutionContextExtensions.cs | 28 +++++++ src/Umbraco.Web/Umbraco.Web.csproj | 6 +- 28 files changed, 197 insertions(+), 226 deletions(-) rename src/Umbraco.Web/Editors/Filters/{ContentPostValidateAttribute.cs => ContentSaveValidationAttribute.cs} (65%) delete mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs create mode 100644 src/Umbraco.Web/Models/ContentEditing/ContentPropertyCollectionDto.cs delete mode 100644 src/Umbraco.Web/Models/Mapping/ContextMapper.cs create mode 100644 src/Umbraco.Web/Models/Mapping/ResolutionContextExtensions.cs diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs index c171b76762..8f30e88a5e 100644 --- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs +++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs @@ -90,9 +90,12 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedContent.CreateSimpleContent(contentType); FixUsers(content); - var result = Mapper.Map(content); + var result = Mapper.Map(content); - AssertContentItem(result, content); + foreach (var p in content.Properties) + { + AssertProperty(result, p); + } } [Test] @@ -102,9 +105,12 @@ namespace Umbraco.Tests.Models.Mapping var content = MockedMedia.CreateMediaImage(contentType, -1); FixUsers(content); - var result = Mapper.Map(content); + var result = Mapper.Map(content); - AssertContentItem(result, content); + foreach (var p in content.Properties) + { + AssertProperty(result, p); + } } [Test] @@ -288,7 +294,7 @@ namespace Umbraco.Tests.Models.Mapping Assert.AreEqual(pDto.Value, p.GetValue().ToString()); } - private void AssertProperty(ContentItemBasic result, Property p) + private void AssertProperty(IContentProperties result, Property p) { AssertBasicProperty(result, p); diff --git a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs index 43d6eb888d..180d9746a3 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentItemBinder.cs @@ -52,17 +52,28 @@ namespace Umbraco.Web.Editors.Binders model.PersistedContent = ContentControllerBase.IsCreatingAction(model.Action) ? CreateNew(model) : GetExisting(model); - //TODO: Implement this! - ////create the dto from the persisted model - //if (model.PersistedContent != null) - //{ - // model.ContentDto = MapFromPersisted(model); - //} - //if (model.ContentDto != null) - //{ - // //now map all of the saved values to the dto - // _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); - //} + //create the dto from the persisted model + if (model.PersistedContent != null) + { + foreach (var variant in model.Variants) + { + if (variant.Culture.IsNullOrWhiteSpace()) + { + //map the property dto collection (no culture is passed to the mapping context so it will be invariant) + variant.PropertyCollectionDto = Mapper.Map(model.PersistedContent); + } + else + { + //map the property dto collection with the culture of the current variant + variant.PropertyCollectionDto = Mapper.Map( + model.PersistedContent, + options => options.Items[ResolutionContextExtensions.CultureKey] = variant.Culture); + } + + //now map all of the saved values to the dto + _modelBinderHelper.MapPropertyValuesFromSaved(variant, variant.PropertyCollectionDto); + } + } return true; } @@ -84,17 +95,6 @@ namespace Umbraco.Web.Editors.Binders model.ParentId, contentType); } - - private static ContentItemDto MapFromPersisted(ContentItemSave model) - { - return MapFromPersisted(model.PersistedContent); - } - - internal static ContentItemDto MapFromPersisted(IContent content) - { - return Mapper.Map(content); - } - } } diff --git a/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs b/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs index 16f7c70b0b..284b4b0c05 100644 --- a/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs +++ b/src/Umbraco.Web/Editors/Binders/ContentModelBinderHelper.cs @@ -56,7 +56,7 @@ namespace Umbraco.Web.Editors.Binders /// /// /// - public void MapPropertyValuesFromSaved(IContentProperties saveModel, ContentItemDto dto) + public void MapPropertyValuesFromSaved(IContentProperties saveModel, ContentPropertyCollectionDto dto) { //NOTE: Don't convert this to linq, this is much quicker foreach (var p in saveModel.Properties) diff --git a/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs index 718850c07a..bbba9d8122 100644 --- a/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/MediaItemBinder.cs @@ -46,12 +46,9 @@ namespace Umbraco.Web.Editors.Binders //create the dto from the persisted model if (model.PersistedContent != null) { - model.ContentDto = MapFromPersisted(model); - } - if (model.ContentDto != null) - { + model.PropertyCollectionDto = Mapper.Map(model.PersistedContent); //now map all of the saved values to the dto - _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); + _modelBinderHelper.MapPropertyValuesFromSaved(model, model.PropertyCollectionDto); } model.Name = model.Name.Trim(); @@ -74,9 +71,5 @@ namespace Umbraco.Web.Editors.Binders return new Core.Models.Media(model.Name, model.ParentId, mediaType); } - private ContentItemDto MapFromPersisted(MediaItemSave model) - { - return Mapper.Map(model.PersistedContent); - } } } diff --git a/src/Umbraco.Web/Editors/Binders/MemberBinder.cs b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs index 7b48b7a4ff..f50122bc9b 100644 --- a/src/Umbraco.Web/Editors/Binders/MemberBinder.cs +++ b/src/Umbraco.Web/Editors/Binders/MemberBinder.cs @@ -50,12 +50,9 @@ namespace Umbraco.Web.Editors.Binders //create the dto from the persisted model if (model.PersistedContent != null) { - model.ContentDto = MapFromPersisted(model); - } - if (model.ContentDto != null) - { + model.PropertyCollectionDto = Mapper.Map(model.PersistedContent); //now map all of the saved values to the dto - _modelBinderHelper.MapPropertyValuesFromSaved(model, model.ContentDto); + _modelBinderHelper.MapPropertyValuesFromSaved(model, model.PropertyCollectionDto); } model.Name = model.Name.Trim(); @@ -202,15 +199,6 @@ namespace Umbraco.Web.Editors.Binders } } } - - private ContentItemDto MapFromPersisted(MemberSave model) - { - //need to explicitly cast since it's an explicit implementation - var saveModel = (IContentSave)model; - - return Mapper.Map(saveModel.PersistedContent); - } - } } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 2e41c01296..8eb29887a0 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -591,7 +591,7 @@ namespace Umbraco.Web.Editors /// /// [FileUploadCleanupFilter] - [ContentPostValidate] + [ContentSaveValidation] public ContentItemDisplay PostSaveBlueprint([ModelBinder(typeof(ContentItemBinder))] ContentItemSave contentItem) { var contentItemDisplay = PostSaveInternal(contentItem, @@ -613,7 +613,7 @@ namespace Umbraco.Web.Editors /// /// [FileUploadCleanupFilter] - [ContentPostValidate] + [ContentSaveValidation] [OutgoingEditorModelEvent] public ContentItemDisplay PostSave([ModelBinder(typeof(ContentItemBinder))] ContentItemSave contentItem) { diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index 931ef46dcd..1ea1372d81 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -47,7 +47,7 @@ namespace Umbraco.Web.Editors /// internal void MapPropertyValues( TSaved contentItem, - ContentItemDto dto, + ContentPropertyCollectionDto dto, Func getPropertyValue, Action savePropertyValue) where TPersisted : IContentBase diff --git a/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs index d75c4c8a63..dc9beae392 100644 --- a/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentItemValidationHelper.cs @@ -43,38 +43,21 @@ namespace Umbraco.Web.Editors.Filters { } - ///// - ///// Validates the content item and updates the Response and ModelState accordingly - ///// - ///// - ///// - //public void ValidateItem(HttpActionContext actionContext, string argumentName) + //public void ValidateItem(HttpActionContext actionContext, TModelSave model, IContentProperties modelWithProperties, ContentPropertyCollectionDto dto) //{ - // if (!(actionContext.ActionArguments[argumentName] is TModelSave model)) - // { - // actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No " + typeof(TModelSave) + " found in request"); - // return; - // } - - // ValidateItem(actionContext, model); - + // //now do each validation step + // if (ValidateExistingContent(model, actionContext) == false) return; + // if (ValidateProperties(model, modelWithProperties, actionContext) == false) return; + // if (ValidatePropertyData(model, modelWithProperties, dto, actionContext.ModelState) == false) return; //} - public void ValidateItem(HttpActionContext actionContext, TModelSave model, IContentProperties modelWithProperties, ContentItemDto dto) - { - //now do each validation step - if (ValidateExistingContent(model, actionContext) == false) return; - if (ValidateProperties(model, modelWithProperties, actionContext) == false) return; - if (ValidatePropertyData(model, modelWithProperties, dto, actionContext.ModelState) == false) return; - } - /// /// Ensure the content exists /// /// /// /// - protected virtual bool ValidateExistingContent(TModelSave postedItem, HttpActionContext actionContext) + public virtual bool ValidateExistingContent(TModelSave postedItem, HttpActionContext actionContext) { var persistedContent = postedItem.PersistedContent; if (persistedContent == null) @@ -93,7 +76,7 @@ namespace Umbraco.Web.Editors.Filters /// /// /// - protected virtual bool ValidateProperties(TModelSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) + public virtual bool ValidateProperties(TModelSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) { var persistedContent = model.PersistedContent; return ValidateProperties(modelWithProperties.Properties.ToList(), persistedContent.Properties.ToList(), actionContext); @@ -138,7 +121,7 @@ namespace Umbraco.Web.Editors.Filters public virtual bool ValidatePropertyData( TModelSave model, IContentProperties modelWithProperties, - ContentItemDto dto, + ContentPropertyCollectionDto dto, ModelStateDictionary modelState) { var properties = modelWithProperties.Properties.ToList(); diff --git a/src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs b/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs similarity index 65% rename from src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs rename to src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs index c044ad0b5c..7bb803ffa8 100644 --- a/src/Umbraco.Web/Editors/Filters/ContentPostValidateAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Web.Http.Controllers; using System.Web.Http.Filters; using Umbraco.Core; +using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Services; using Umbraco.Web.Composing; @@ -14,47 +15,55 @@ using Umbraco.Web._Legacy.Actions; namespace Umbraco.Web.Editors.Filters { /// - /// Checks if the user has access to post a content item based on whether it's being created or saved. + /// Validates the incoming model along with if the user is allowed to perform the operation /// - internal sealed class ContentPostValidateAttribute : ActionFilterAttribute + internal sealed class ContentSaveValidationAttribute : ActionFilterAttribute { - private readonly IContentService _contentService; - private readonly WebSecurity _security; - private readonly IUserService _userService; - private readonly IEntityService _entityService; - - public ContentPostValidateAttribute() + public ContentSaveValidationAttribute(): this(Current.Logger, Current.UmbracoContextAccessor, Current.Services.ContentService, Current.Services.UserService, Current.Services.EntityService, UmbracoContext.Current.Security) { } - // fixme wtf is this? - public ContentPostValidateAttribute(IContentService contentService, IUserService userService, IEntityService entityService, WebSecurity security) + public ContentSaveValidationAttribute(ILogger logger, IUmbracoContextAccessor umbracoContextAccessor, IContentService contentService, IUserService userService, IEntityService entityService, WebSecurity security) { + _logger = logger; + _umbracoContextAccessor = umbracoContextAccessor; _contentService = contentService ?? throw new ArgumentNullException(nameof(contentService)); _userService = userService ?? throw new ArgumentNullException(nameof(userService)); _entityService = entityService ?? throw new ArgumentNullException(nameof(entityService)); _security = security ?? throw new ArgumentNullException(nameof(security)); } - // fixme all these should be injected properties - - private IContentService ContentService - => _contentService ?? Current.Services.ContentService; - - private WebSecurity Security - => _security ?? UmbracoContext.Current.Security; - - private IUserService UserService - => _userService ?? Current.Services.UserService; - - private IEntityService EntityService - => _entityService ?? Current.Services.EntityService; - - public override bool AllowMultiple - => true; + private readonly ILogger _logger; + private readonly IUmbracoContextAccessor _umbracoContextAccessor; + private readonly IContentService _contentService; + private readonly WebSecurity _security; + private readonly IUserService _userService; + private readonly IEntityService _entityService; public override void OnActionExecuting(HttpActionContext actionContext) { - var contentItem = (ContentItemSave)actionContext.ActionArguments["contentItem"]; + var model = (ContentItemSave)actionContext.ActionArguments["contentItem"]; + var contentItemValidator = new ContentItemValidationHelper(_logger, _umbracoContextAccessor); + + if (ValidateUserAccess(model, actionContext)) + { + //now do each validation step + if (contentItemValidator.ValidateExistingContent(model, actionContext) == false) return; + //validate for each variant + foreach (var variant in model.Variants) + { + if (contentItemValidator.ValidateProperties(model, variant, actionContext) == false) return; + if (contentItemValidator.ValidatePropertyData(model, variant, variant.PropertyCollectionDto, actionContext.ModelState) == false) return; + } + } + } + + /// + /// Checks if the user has access to post a content item based on whether it's being created or saved. + /// + /// + /// + private bool ValidateUserAccess(ContentItemSave contentItem, HttpActionContext actionContext) + { //We now need to validate that the user is allowed to be doing what they are doing. //Based on the action we need to check different permissions. @@ -87,7 +96,7 @@ namespace Umbraco.Web.Editors.Filters if (contentItem.ParentId != Constants.System.Root) { - contentToCheck = ContentService.GetById(contentItem.ParentId); + contentToCheck = _contentService.GetById(contentItem.ParentId); contentIdToCheck = contentToCheck.Id; } else @@ -102,7 +111,7 @@ namespace Umbraco.Web.Editors.Filters permissionToCheck.Add(ActionToPublish.Instance.Letter); if (contentItem.ParentId != Constants.System.Root) { - contentToCheck = ContentService.GetById(contentItem.ParentId); + contentToCheck = _contentService.GetById(contentItem.ParentId); contentIdToCheck = contentToCheck.Id; } else @@ -119,7 +128,7 @@ namespace Umbraco.Web.Editors.Filters if (contentItem.ParentId != Constants.System.Root) { - contentToCheck = ContentService.GetById(contentItem.ParentId); + contentToCheck = _contentService.GetById(contentItem.ParentId); contentIdToCheck = contentToCheck.Id; } else @@ -133,12 +142,15 @@ namespace Umbraco.Web.Editors.Filters if (ContentController.CheckPermissions( actionContext.Request.Properties, - Security.CurrentUser, - UserService, ContentService, EntityService, + _security.CurrentUser, + _userService, _contentService, _entityService, contentIdToCheck, permissionToCheck.ToArray(), contentToCheck) == false) { actionContext.Response = actionContext.Request.CreateUserNoAccessResponse(); + return false; } + + return true; } } } diff --git a/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs index 7f2901e69e..4bb2e72b0c 100644 --- a/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/MediaItemSaveValidationAttribute.cs @@ -42,7 +42,12 @@ namespace Umbraco.Web.Editors.Filters var contentItemValidator = new ContentItemValidationHelper(_logger, _umbracoContextAccessor); if (ValidateUserAccess(model, actionContext)) - contentItemValidator.ValidateItem(actionContext, model, model, model.ContentDto); + { + //now do each validation step + if (!contentItemValidator.ValidateExistingContent(model, actionContext)) return; + if (!contentItemValidator.ValidateProperties(model, model, actionContext)) return; + if (!contentItemValidator.ValidatePropertyData(model, model, model.PropertyCollectionDto, actionContext.ModelState)) return; + } } /// diff --git a/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs index 930e8319f6..7333a39536 100644 --- a/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/MemberSaveValidationAttribute.cs @@ -32,7 +32,10 @@ namespace Umbraco.Web.Editors.Filters { var model = (MemberSave)actionContext.ActionArguments["contentItem"]; var contentItemValidator = new MemberValidationHelper(_logger, _umbracoContextAccessor); - contentItemValidator.ValidateItem(actionContext, model, model, model.ContentDto); + //now do each validation step + if (!contentItemValidator.ValidateExistingContent(model, actionContext)) return; + if (!contentItemValidator.ValidateProperties(model, model, actionContext)) return; + if (!contentItemValidator.ValidatePropertyData(model, model, model.PropertyCollectionDto, actionContext.ModelState)) return; } } } diff --git a/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs index 5fa5e955b6..74fcac60ea 100644 --- a/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs +++ b/src/Umbraco.Web/Editors/Filters/MemberValidationHelper.cs @@ -56,7 +56,7 @@ namespace Umbraco.Web.Editors.Filters /// /// /// - public override bool ValidatePropertyData(MemberSave model, IContentProperties modelWithProperties, ContentItemDto dto, ModelStateDictionary modelState) + public override bool ValidatePropertyData(MemberSave model, IContentProperties modelWithProperties, ContentPropertyCollectionDto dto, ModelStateDictionary modelState) { if (model.Username.IsNullOrWhiteSpace()) { @@ -103,7 +103,7 @@ namespace Umbraco.Web.Editors.Filters /// /// /// - protected override bool ValidateProperties(MemberSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) + public override bool ValidateProperties(MemberSave model, IContentProperties modelWithProperties, HttpActionContext actionContext) { var propertiesToValidate = model.Properties.ToList(); var defaultProps = Constants.Conventions.Member.GetStandardPropertyTypeStubs(); diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index 9da9107534..4a7dae9ed0 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -452,7 +452,7 @@ namespace Umbraco.Web.Editors MapPropertyValues( contentItem, - contentItem.ContentDto, + contentItem.PropertyCollectionDto, (save, property) => property.GetValue(), //get prop val (save, property, v) => property.SetValue(v)); //set prop val diff --git a/src/Umbraco.Web/Editors/MemberController.cs b/src/Umbraco.Web/Editors/MemberController.cs index 39e081bc64..448da27290 100644 --- a/src/Umbraco.Web/Editors/MemberController.cs +++ b/src/Umbraco.Web/Editors/MemberController.cs @@ -397,7 +397,7 @@ namespace Umbraco.Web.Editors //use the base method to map the rest of the properties base.MapPropertyValues( contentItem, - contentItem.ContentDto, + contentItem.PropertyCollectionDto, (save, property) => property.GetValue(), //get prop val (save, property, v) => property.SetValue(v)); //set prop val } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs index a9fefbc62e..8a840a60c3 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentBaseSave.cs @@ -41,7 +41,7 @@ namespace Umbraco.Web.Models.ContentEditing } /// - /// The DTO object used to gather all required content data including data type information etc... for use with validation - used during inbound model binding + /// The property DTO object is used to gather all required property data including data type information etc... for use with validation - used during inbound model binding /// /// /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need @@ -49,7 +49,7 @@ namespace Umbraco.Web.Models.ContentEditing /// This is not used for outgoing model information. /// [IgnoreDataMember] - internal ContentItemDto ContentDto { get; set; } + internal ContentPropertyCollectionDto PropertyCollectionDto { get; set; } #endregion diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs index db788c9d95..427dadb2c9 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemBasic.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Linq; using System.Runtime.Serialization; using Newtonsoft.Json; using Umbraco.Core.Models; @@ -72,7 +73,7 @@ namespace Umbraco.Web.Models.ContentEditing public ContentItemBasic() { //ensure its not null - _properties = new List(); + _properties = Enumerable.Empty(); } private IEnumerable _properties; diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs index 7ce6dd9000..b63fa38ed6 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemDisplay.cs @@ -181,7 +181,7 @@ namespace Umbraco.Web.Models.ContentEditing /// This is not used for outgoing model information. /// [IgnoreDataMember] - internal ContentItemDto ContentDto { get; set; } + internal ContentPropertyCollectionDto ContentDto { get; set; } /// /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes. diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs deleted file mode 100644 index 2d039dddd6..0000000000 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemDto.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Newtonsoft.Json; -using Umbraco.Core.Models; - -namespace Umbraco.Web.Models.ContentEditing -{ - /// - /// Represents a content item from the database including all of the required data that we need to work with such as data type data - /// - internal class ContentItemDto: ContentItemBasic - { - } -} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs index 98ccd47d5a..0c5f0b8c19 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentItemSave.cs @@ -69,10 +69,6 @@ namespace Umbraco.Web.Models.ContentEditing set => ((IContentSave)this).PersistedContent = value; } - ////Non explicit internal getter so we don't need to explicitly cast in our own code - //[IgnoreDataMember] - //internal ContentItemDto ContentDto { get;set; } - #endregion } diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentPropertyCollectionDto.cs b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyCollectionDto.cs new file mode 100644 index 0000000000..dc6a92cc93 --- /dev/null +++ b/src/Umbraco.Web/Models/ContentEditing/ContentPropertyCollectionDto.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Umbraco.Core.Models; + +namespace Umbraco.Web.Models.ContentEditing +{ + /// + /// Used to map property values when saving content/media/members + /// + /// + /// This is only used during mapping operations, it is not used for angular purposes + /// + internal class ContentPropertyCollectionDto : IContentProperties + { + public ContentPropertyCollectionDto() + { + Properties = Enumerable.Empty(); + } + + public IEnumerable Properties { get; set; } + } +} diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs index 72a59f05cc..dc50129b37 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs @@ -32,6 +32,15 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "publish")] public bool Publish { get; set; } - + /// + /// The property DTO object is used to gather all required property data including data type information etc... for use with validation - used during inbound model binding + /// + /// + /// We basically use this object to hydrate all required data from the database into one object so we can validate everything we need + /// instead of having to look up all the data individually. + /// This is not used for outgoing model information. + /// + [IgnoreDataMember] + internal ContentPropertyCollectionDto PropertyCollectionDto { get; set; } } } diff --git a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs index bd7de4176e..cea151f6ca 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentItemDisplayVariationResolver.cs @@ -42,7 +42,7 @@ namespace Umbraco.Web.Models.Mapping { //We need to set the culture in the mapping context since this is needed to ensure that the correct property values //are resolved during the mapping - context.Items[ContextMapper.CultureKey] = x.IsoCode; + context.Items[ResolutionContextExtensions.CultureKey] = x.IsoCode; return context.Mapper.Map(source, null, context); }).ToList(); diff --git a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs index 3f6d9461d1..8786ab61ac 100644 --- a/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/ContentMapperProfile.cs @@ -86,15 +86,9 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); - //FROM IContent TO ContentItemDto - CreateMap() - .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => - Udi.Create(src.Blueprint ? Constants.UdiEntityType.DocumentBlueprint : Constants.UdiEntityType.Document, src.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => contentOwnerResolver.Resolve(src))) - .ForMember(dest => dest.Updater, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.Ignore()) - .ForMember(dest => dest.Alias, opt => opt.Ignore()) - .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); + //FROM IContent TO ContentPropertyCollectionDto + //NOTE: the property mapping for cultures relies on a culture being set in the mapping context + CreateMap(); } } } diff --git a/src/Umbraco.Web/Models/Mapping/ContextMapper.cs b/src/Umbraco.Web/Models/Mapping/ContextMapper.cs deleted file mode 100644 index 6897a8ae62..0000000000 --- a/src/Umbraco.Web/Models/Mapping/ContextMapper.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections.Generic; -using AutoMapper; -using ClientDependency.Core; - -namespace Umbraco.Web.Models.Mapping -{ - /// - /// Extends AutoMapper's class to handle Umbraco's context and other contextual data - /// - internal static class ContextMapper - { - //public const string UmbracoContextKey = "ContextMapper.UmbracoContext"; - public const string CultureKey = "ContextMapper.Culture"; - - public static TDestination Map(TSource obj, IDictionary contextVals) - => Mapper.Map(obj, opt => - { - //set other supplied context vals - if (contextVals != null) - { - foreach (var contextVal in contextVals) - { - opt.Items[contextVal.Key] = contextVal.Value; - } - } - }); - - public static TDestination Map(TSource obj, object contextVals) - => Mapper.Map(obj, opt => - { - //set other supplied context vals - if (contextVals != null) - { - foreach (var contextVal in contextVals.ToDictionary()) - { - opt.Items[contextVal.Key] = contextVal.Value; - } - } - }); - - /// - /// Returns the language Id in the mapping context if one is found - /// - /// - /// - public static string GetCulture(this ResolutionContext resolutionContext) - { - if (!resolutionContext.Options.Items.TryGetValue(CultureKey, out var obj)) return null; - - if (obj is string s) - return s; - - return null; - } - } -} - diff --git a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs index 6d81957a24..caa9f29e70 100644 --- a/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MediaMapperProfile.cs @@ -69,15 +69,15 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); //FROM IMedia TO ContentItemDto - CreateMap() - .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) - .ForMember(dest => dest.Published, opt => opt.Ignore()) - .ForMember(dest => dest.Edited, opt => opt.Ignore()) - .ForMember(dest => dest.Updater, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.Ignore()) - .ForMember(dest => dest.Alias, opt => opt.Ignore()) - .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); + CreateMap(); + //.ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(Constants.UdiEntityType.Media, src.Key))) + //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => mediaOwnerResolver.Resolve(src))) + //.ForMember(dest => dest.Published, opt => opt.Ignore()) + //.ForMember(dest => dest.Edited, opt => opt.Ignore()) + //.ForMember(dest => dest.Updater, opt => opt.Ignore()) + //.ForMember(dest => dest.Icon, opt => opt.Ignore()) + //.ForMember(dest => dest.Alias, opt => opt.Ignore()) + //.ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); } } } diff --git a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs index a54baa8124..22d499f3d6 100644 --- a/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/MemberMapperProfile.cs @@ -123,14 +123,14 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.ContentTypeAlias, opt => opt.Ignore()); //FROM IMember TO ContentItemDto - CreateMap() - .ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) - .ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) - .ForMember(dest => dest.Published, opt => opt.Ignore()) - .ForMember(dest => dest.Edited, opt => opt.Ignore()) - .ForMember(dest => dest.Updater, opt => opt.Ignore()) - .ForMember(dest => dest.Icon, opt => opt.Ignore()) - .ForMember(dest => dest.Alias, opt => opt.Ignore()) + CreateMap() + //.ForMember(dest => dest.Udi, opt => opt.MapFrom(content => Udi.Create(Constants.UdiEntityType.Member, content.Key))) + //.ForMember(dest => dest.Owner, opt => opt.ResolveUsing(src => memberOwnerResolver.Resolve(src))) + //.ForMember(dest => dest.Published, opt => opt.Ignore()) + //.ForMember(dest => dest.Edited, opt => opt.Ignore()) + //.ForMember(dest => dest.Updater, opt => opt.Ignore()) + //.ForMember(dest => dest.Icon, opt => opt.Ignore()) + //.ForMember(dest => dest.Alias, opt => opt.Ignore()) //do no map the custom member properties (currently anyways, they were never there in 6.x) .ForMember(dest => dest.Properties, opt => opt.ResolveUsing(src => memberDtoPropertiesResolver.Resolve(src))); diff --git a/src/Umbraco.Web/Models/Mapping/ResolutionContextExtensions.cs b/src/Umbraco.Web/Models/Mapping/ResolutionContextExtensions.cs new file mode 100644 index 0000000000..27f00ce91c --- /dev/null +++ b/src/Umbraco.Web/Models/Mapping/ResolutionContextExtensions.cs @@ -0,0 +1,28 @@ +using AutoMapper; + +namespace Umbraco.Web.Models.Mapping +{ + /// + /// Extension methods for AutoMapper's + /// + internal static class ResolutionContextExtensions + { + public const string CultureKey = "ContextMapper.Culture"; + + /// + /// Returns the language Id in the mapping context if one is found + /// + /// + /// + public static string GetCulture(this ResolutionContext resolutionContext) + { + if (!resolutionContext.Options.Items.TryGetValue(CultureKey, out var obj)) return null; + + if (obj is string s) + return s; + + return null; + } + } +} + diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 47868dd48e..8c00d18e9a 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -250,7 +250,7 @@ - + @@ -616,7 +616,7 @@ - + @@ -930,7 +930,7 @@ - + From 778a557f3c66c54ab8d29a9695f0b0dc1068d2f3 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 1 Aug 2018 17:28:39 +1000 Subject: [PATCH 033/275] Gets the correct content posting which now binds and validates on the server properly --- .../services/umbdataformatter.service.js | 88 ++++++++++--------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js index 67e7e0d2da..a93cdf93d8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js @@ -7,7 +7,34 @@ * @description A helper object used to format/transform JSON Umbraco data, mostly used for persisting data to the server **/ function umbDataFormatter() { - + + /** + * maps the display properties to a property collection for persisting/POSTing + * @param {any} tabs + */ + function getContentProperties(tabs) { + + var properties = []; + + _.each(tabs, function (tab) { + + _.each(tab.properties, function (prop) { + + //don't include the custom generic tab properties + //don't include a property that is marked readonly + if (!prop.alias.startsWith("_umb_") && !prop.readonly) { + properties.push({ + id: prop.id, + alias: prop.alias, + value: prop.value + }); + } + }); + }); + + return properties; + } + return { formatChangePasswordModel: function(model) { @@ -313,7 +340,7 @@ // we don't want to post all of the data as it is unecessary. var saveModel = { id: displayModel.id, - properties: [], + properties: getContentProperties(displayModel.tabs), name: displayModel.name, contentTypeAlias: displayModel.contentTypeAlias, parentId: displayModel.parentId, @@ -321,51 +348,30 @@ action: action }; - _.each(displayModel.tabs, function (tab) { - - _.each(tab.properties, function (prop) { - - //don't include the custom generic tab properties - //don't include a property that is marked readonly - if (!prop.alias.startsWith("_umb_") && !prop.readonly) { - saveModel.properties.push({ - id: prop.id, - alias: prop.alias, - value: prop.value - }); - } - }); - }); - return saveModel; }, /** formats the display model used to display the content to the model used to save the content */ formatContentPostData: function (displayModel, action) { - //TODO: We need to change this since it's no longer relevant with variants - //this is basically the same as for media but we need to explicitly add some extra properties - var saveModel = this.formatMediaPostData(displayModel, action); - - //get the selected variant and build the additional published variants - saveModel.publishVariations = []; - - //if there's any variants than we need to set the language and include the variants to publish - if (displayModel.variants.length > 0) { - _.each(displayModel.variants, - function (d) { - //set the selected variant if this is current - if (d.current === true) { - saveModel.culture = d.language.culture; - } - if (d.publish === true) { - saveModel.publishVariations.push({ - culture: d.language.culture, - segment: d.segment - }); - } - }); - } + //NOTE: the display model inherits from the save model so we can in theory just post up the display model but + // we don't want to post all of the data as it is unecessary. + var saveModel = { + id: displayModel.id, + name: displayModel.name, + contentTypeAlias: displayModel.contentTypeAlias, + parentId: displayModel.parentId, + //set the action on the save model + action: action, + variants: _.map(displayModel.variants, function(v) { + return { + name: v.name, + properties: getContentProperties(v.tabs), + culture: v.language.culture, + publish: v.publish + }; + }) + }; var propExpireDate = displayModel.removeDate; var propReleaseDate = displayModel.releaseDate; From 4ede57836e418d7217ad4970d3be2d537b28bc9d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 09:51:44 +0200 Subject: [PATCH 034/275] move insertfield files to new location --- .../insertfield/insertfield.controller.js | 0 .../{overlays => infiniteeditors}/insertfield/insertfield.html | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/insertfield/insertfield.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/insertfield/insertfield.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/insertfield/insertfield.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html From 04775098febca714fe9e0f0349817c3f65683d64 Mon Sep 17 00:00:00 2001 From: Karl Tynan Date: Wed, 1 Aug 2018 09:10:40 +0100 Subject: [PATCH 035/275] Updated some grammar on en.xml --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 57cc9a84ad..5e1ed29573 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -2039,9 +2039,9 @@ To manage your website, simply open the Umbraco back office and start adding con Validation - Validate as email + Validate as an email Validate as a number - Validate as a Url + Validate as a url ...or enter a custom validation Field is mandatory Enter a regular expression From dbd9db780c4ef6917939b57cab37e59f54668dfc Mon Sep 17 00:00:00 2001 From: Karl Tynan Date: Wed, 1 Aug 2018 09:11:19 +0100 Subject: [PATCH 036/275] Also updated the en_us.xml --- src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index c4eae684ca..6517a7fcbc 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -2031,9 +2031,9 @@ To manage your website, simply open the Umbraco back office and start adding con Validation - Validate as email + Validate as an email Validate as a number - Validate as a Url + Validate as a url ...or enter a custom validation Field is mandatory Enter a regular expression From c97311607dd817424588ac68d80f97b009adacad Mon Sep 17 00:00:00 2001 From: Karl Tynan Date: Wed, 1 Aug 2018 09:22:45 +0100 Subject: [PATCH 037/275] Improved text for email and capitalisation for URL --- src/Umbraco.Web.UI/umbraco/config/lang/en.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml index 5e1ed29573..d676e67b9c 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml @@ -2039,9 +2039,9 @@ To manage your website, simply open the Umbraco back office and start adding con Validation - Validate as an email + Validate as an email address Validate as a number - Validate as a url + Validate as a URL ...or enter a custom validation Field is mandatory Enter a regular expression From db2d7687e4aa58e66d51b2879d12a38af37037ec Mon Sep 17 00:00:00 2001 From: Karl Tynan Date: Wed, 1 Aug 2018 09:23:15 +0100 Subject: [PATCH 038/275] And updated the en_us.xml version too --- src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml index 6517a7fcbc..70f6470a20 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml @@ -2031,9 +2031,9 @@ To manage your website, simply open the Umbraco back office and start adding con Validation - Validate as an email + Validate as an email address Validate as a number - Validate as a url + Validate as a URL ...or enter a custom validation Field is mandatory Enter a regular expression From f049d1b479eff81833049de2efbf44be103f77bd Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 1 Aug 2018 10:42:50 +0200 Subject: [PATCH 039/275] Ensure PublishedRequest always has a culture --- src/Umbraco.Web/Routing/PublishedRequest.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web/Routing/PublishedRequest.cs b/src/Umbraco.Web/Routing/PublishedRequest.cs index 1acf794abe..078aef8a54 100644 --- a/src/Umbraco.Web/Routing/PublishedRequest.cs +++ b/src/Umbraco.Web/Routing/PublishedRequest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.Threading; using System.Web; using umbraco; using Umbraco.Core.Configuration; @@ -345,7 +346,7 @@ namespace Umbraco.Web.Routing /// public CultureInfo Culture { - get { return _culture; } + get { return _culture ?? Thread.CurrentThread.CurrentCulture; } set { EnsureWriteable(); From 4cc31a62c00697b8be0d24b57bf2ff8f3b455269 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 11:46:28 +0200 Subject: [PATCH 040/275] convert insertfeld overlay to an infinite editor --- .../src/common/services/editor.service.js | 18 + .../insertfield/insertfield.controller.js | 19 +- .../insertfield/insertfield.html | 369 ++++++++++-------- 3 files changed, 236 insertions(+), 170 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 0bbfe34fe1..87c0e12514 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -249,6 +249,23 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#insertField + * @methodOf umbraco.services.editorService + * + * @description + * Opens the insert field editor in infinite editing, the submit callback returns the code snippet + * @param {Callback} editor.submit Submits the editor + * @param {Callback} editor.close Closes the editor + * @returns {Object} editor object + */ + function insertField(editor) { + editor.view = "views/common/infiniteeditors/insertfield/insertfield.html"; + editor.size = "small"; + open(editor); + } + /** * @ngdoc method * @name umbraco.services.editorService#sectionPicker @@ -283,6 +300,7 @@ insertCodeSnippet: insertCodeSnippet, userGroupPicker: userGroupPicker, sectionPicker: sectionPicker, + insertField: insertField, userPicker: userPicker }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js index ebe2feabb9..db3e16f8b6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function InsertFieldController($scope, $http, contentTypeResource, localizationService) { + function InsertFieldController($scope, contentTypeResource, localizationService) { var vm = this; @@ -29,6 +29,8 @@ vm.setCasingOption = setCasingOption; vm.setEncodingOption = setEncodingOption; vm.generateOutputSample = generateOutputSample; + vm.submit = submit; + vm.close = close; function onInit() { @@ -139,10 +141,21 @@ } - onInit(); + function submit(model) { + if($scope.model.submit) { + $scope.model.submit(model); + } + } + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + + onInit(); } - angular.module("umbraco").controller("Umbraco.Overlays.InsertFieldController", InsertFieldController); + angular.module("umbraco").controller("Umbraco.Editors.InsertFieldController", InsertFieldController); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html index 3218b44dd8..56bd498fd1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertfield/insertfield.html @@ -1,188 +1,223 @@ -
    +
    - -
    -
    - -
    - -
    -
    -
    + -
    - - -
    + + - -
    - - Add fallback field + + + -
    -
    - -
    - + +
    +
    + +
    + +
    +
    -
    -
    -
    -
    - -
    - +
    + + +
    -
    -
    - -
    - + +
    + + Add fallback field + +
    +
    + +
    + +
    +
    +
    +
    -
    -
    -
    - -
    -
    -
    - - -
    -
    -
    - -
    Format and encoding
    - - -
    -
    -
    +
    - + + +
    +
    + +
    + +
    +
    +
    - Date only - Date and time - -
    -
    -
    - -
    -
    -
    -
    - + +
    +
    +
    + + +
    +
    - Uppercase - Lowercase -
    -
    -
    - -
    -
    -
    -
    - +
    Format and encoding
    + + +
    +
    +
    +
    + +
    + Date only + Date and time + +
    +
    - HTML - URL -
    -
    -
    -
    Modify output
    - - -
    -
    - -
    - -
    -
    -
    - - -
    -
    - -
    - -
    -
    -
    - - -
    -
    -
    -
    - + +
    +
    +
    +
    + +
    + Uppercase + Lowercase +
    +
    - -
    -
    -
    - -
    -
    -
    - -
    {{ vm.generateOutputSample() }}
    -
    -
    -
    + +
    +
    +
    +
    + +
    + HTML + URL +
    +
    +
    -
    +
    Modify output
    + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    + +
    + +
    +
    +
    + + +
    +
    +
    +
    + +
    + +
    +
    +
    + + +
    +
    +
    + +
    {{ vm.generateOutputSample() }}
    +
    +
    +
    + + + + + + + + + + + + + + +
    From d88ed02a8d5d6e50ed421dedecfa1e53bcfeb30f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 11:47:48 +0200 Subject: [PATCH 041/275] use insert field infinite editor in template, partial views and macro partial views editors --- .../partialviewmacros/edit.controller.js | 19 ++++++------------- .../src/views/partialviewmacros/edit.html | 7 ------- .../src/views/partialviews/edit.controller.js | 17 +++++------------ .../src/views/partialviews/edit.html | 7 ------- .../src/views/templates/edit.controller.js | 19 ++++++------------- .../src/views/templates/edit.html | 7 ------- 6 files changed, 17 insertions(+), 59 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js index c58a5573a9..52499aa47f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js @@ -180,24 +180,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor - vm.editor.focus(); + close: function () { + editorService.close(); + vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html index 810b1cb8ae..dde5fc8171 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html @@ -83,11 +83,4 @@ position="right"> - - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js index d5a17c83c7..b125324833 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js @@ -187,24 +187,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor + close: function () { + editorService.close(); vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html index 4a16ad4ebf..5fc8f19d6c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html @@ -91,11 +91,4 @@ position="right"> - - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 39ae1dd583..1a0cd93a35 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -407,24 +407,17 @@ function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function (model) { insert(model.umbracoField); - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, - close: function (model) { - // close the dialog - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; - // focus editor - vm.editor.focus(); + close: function () { + editorService.close(); + vm.editor.focus(); } }; + editorService.insertField(insertFieldEditor); } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 0b1b574e70..b68c1845c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -131,13 +131,6 @@ position="right"> - - - Date: Wed, 1 Aug 2018 12:30:31 +0200 Subject: [PATCH 042/275] update insert code snippet infinite editor to use new insert field editor --- .../insertcodesnippet.controller.js | 16 ++++------------ .../insertcodesnippet/insertcodesnippet.html | 6 +----- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js index 90d3e945a4..e24f8cd80b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js @@ -52,28 +52,20 @@ } function openPageFieldOverlay() { - vm.pageFieldOverlay = { - submitButtonLabel: "Insert", - closeButtonlabel: "Cancel", - view: "insertfield", - show: true, + var insertFieldEditor = { submit: function(model) { - $scope.model.insert = { "type": "umbracoField", "umbracoField": model.umbracoField }; - $scope.model.submit($scope.model); - - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); }, close: function (model) { - vm.pageFieldOverlay.show = false; - vm.pageFieldOverlay = null; + editorService.close(); } }; + editorService.insertField(insertFieldEditor); } function openDictionaryItemOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html index 2cc5cb2e5c..405a56e79b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html @@ -60,9 +60,5 @@ view="vm.macroPickerOverlay.view" position="right"> - - +
    From 37db8516ed46b815c1f5882c7c0c2f7db232bb2b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:13:09 +0200 Subject: [PATCH 043/275] move template sections overlay to infinite editors --- .../src/common/services/editor.service.js | 18 ++++++++++++++++++ .../templatesections.controller.js | 0 .../templatesections/templatesections.html | 0 3 files changed, 18 insertions(+) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/templatesections/templatesections.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/templatesections/templatesections.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 87c0e12514..d3f3209559 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -266,6 +266,23 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#templateSections + * @methodOf umbraco.services.editorService + * + * @description + * Opens the template sections editor in infinite editing, the submit callback returns the type to insert + * @param {Callback} editor.submit Submits the editor + * @param {Callback} editor.close Closes the editor + * @returns {Object} editor object + */ + function templateSections(editor) { + editor.view = "views/common/infiniteeditors/templatesections/templatesections.html"; + editor.size = "small"; + open(editor); + } + /** * @ngdoc method * @name umbraco.services.editorService#sectionPicker @@ -301,6 +318,7 @@ userGroupPicker: userGroupPicker, sectionPicker: sectionPicker, insertField: insertField, + templateSections: templateSections, userPicker: userPicker }; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/templatesections/templatesections.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html From fbfcccc13df41d9152638b1d6907c637ba7e05f9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:33:17 +0200 Subject: [PATCH 044/275] add infinite editor markup to template sections --- .../templatesections.controller.js | 24 ++- .../templatesections/templatesections.html | 145 +++++++++++------- 2 files changed, 111 insertions(+), 58 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js index d8cc93c1b8..36d7c0f4ed 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.controller.js @@ -1,35 +1,47 @@ (function () { "use strict"; - function TemplateSectionsOverlayController($scope) { + function TemplateSectionsController($scope, formHelper) { var vm = this; + vm.select = select; + vm.submit = submit; + vm.close = close; + $scope.model.mandatoryRenderSection = false; if(!$scope.model.title) { $scope.model.title = "Sections"; } - vm.select = select; - function onInit() { - if($scope.model.hasMaster) { $scope.model.insertType = 'addSection'; } else { $scope.model.insertType = 'renderBody'; } - } function select(type) { $scope.model.insertType = type; } + function submit(model) { + if (formHelper.submitForm({scope: $scope})) { + $scope.model.submit($scope.model); + } + } + + function close() { + if($scope.model.close) { + $scope.model.close(); + } + } + onInit(); } - angular.module("umbraco").controller("Umbraco.Overlays.TemplateSectionsOverlay", TemplateSectionsOverlayController); + angular.module("umbraco").controller("Umbraco.Editors.TemplateSectionsController", TemplateSectionsController); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html index b97057302e..d6e3996287 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/templatesections/templatesections.html @@ -1,64 +1,105 @@ -
    +
    - -
    -
    +
    -
    + -
    - -
    -
    + + -
    + + + -
    -
    -
    - -
    - -
    -
    - - - - - -
    - -
    - - -
    - +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + +
    + +
    + + +
    + +
    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + +
    +
    +
    -
    -
    -
    +
    +
    -
    + -
    -
    -
    - -
    + + + + + + + + -
    -
    - - - - - -
    -
    + + + -
    -
    From b5f02367ab0906d6dfa59b12b48267b04f1fed06 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 13:34:01 +0200 Subject: [PATCH 045/275] Use new template section infinite editor instead of the old overlay in the template editor --- .../src/views/templates/edit.controller.js | 15 ++++----------- .../src/views/templates/edit.html | 7 ------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 1a0cd93a35..1b58f14c03 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -510,12 +510,8 @@ function openSectionsOverlay() { - - vm.sectionsOverlay = { - view: "templatesections", + var templateSections = { isMaster: vm.template.isMasterTemplate, - submitButtonLabel: "Insert", - show: true, submit: function(model) { if (model.insertType === 'renderBody') { @@ -533,18 +529,15 @@ wrap(code); } - vm.sectionsOverlay.show = false; - vm.sectionsOverlay = null; + editorService.close(); }, close: function(model) { - // close dialog - vm.sectionsOverlay.show = false; - vm.sectionsOverlay = null; - // focus editor + editorService.close(); vm.editor.focus(); } } + editorService.templateSections(templateSections); } function openMasterTemplateOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index b68c1845c1..09eb0ad988 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -130,13 +130,6 @@ view="vm.macroPickerOverlay.view" position="right"> - - - Date: Wed, 1 Aug 2018 13:03:29 +0100 Subject: [PATCH 046/275] Bye bye knockout.js - you were cool before the new kids on the block such as VueJS, React & Angular were about --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 - .../Umbraco/dashboard/UserControlProxy.aspx | 2 - .../UserControlProxy.aspx.designer.cs | 42 +++------ .../umbraco_client/ui/knockout.js | 86 ------------------- .../umbraco_client/ui/knockout.mapping.js | 20 ----- .../UI/Bundles/JsApplicationLib.cs | 2 - 6 files changed, 12 insertions(+), 142 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/ui/knockout.js delete mode 100644 src/Umbraco.Web.UI/umbraco_client/ui/knockout.mapping.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index db6d974fc2..acfebc4664 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -371,8 +371,6 @@ - - diff --git a/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx b/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx index 399d2cff3a..bc9019f246 100644 --- a/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx +++ b/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx @@ -15,8 +15,6 @@ - - diff --git a/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx.designer.cs b/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx.designer.cs index a08f6c3392..84a5a63087 100644 --- a/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx.designer.cs +++ b/src/Umbraco.Web.UI/Umbraco/dashboard/UserControlProxy.aspx.designer.cs @@ -3,15 +3,15 @@ // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ namespace Umbraco.Web.UI.Umbraco.Dashboard { - - + + public partial class UserControlProxy { - + /// /// ClientLoader control. /// @@ -20,7 +20,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::Umbraco.Web.UI.JavaScript.UmbracoClientDependencyLoader ClientLoader; - + /// /// CssInclude1 control. /// @@ -29,7 +29,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.CssInclude CssInclude1; - + /// /// JsInclude1 control. /// @@ -38,7 +38,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; - + /// /// JsInclude3 control. /// @@ -47,7 +47,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.JsInclude JsInclude3; - + /// /// JsInclude4 control. /// @@ -56,7 +56,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.JsInclude JsInclude4; - + /// /// JsInclude6 control. /// @@ -65,25 +65,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.JsInclude JsInclude6; - - /// - /// JsInclude11 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude11; - - /// - /// JsInclude12 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude12; - + /// /// JsInclude2 control. /// @@ -92,7 +74,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::ClientDependency.Core.Controls.JsInclude JsInclude2; - + /// /// form1 control. /// @@ -101,7 +83,7 @@ namespace Umbraco.Web.UI.Umbraco.Dashboard { /// To modify move field declaration from designer file to code-behind file. /// protected global::System.Web.UI.HtmlControls.HtmlForm form1; - + /// /// container control. /// diff --git a/src/Umbraco.Web.UI/umbraco_client/ui/knockout.js b/src/Umbraco.Web.UI/umbraco_client/ui/knockout.js deleted file mode 100644 index 107026da16..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/ui/knockout.js +++ /dev/null @@ -1,86 +0,0 @@ -// Knockout JavaScript library v2.1.0 -// (c) Steven Sanderson - http://knockoutjs.com/ -// License: MIT (http://www.opensource.org/licenses/mit-license.php) - -(function(window,document,navigator,undefined){ -function m(w){throw w;}var n=void 0,p=!0,s=null,t=!1;function A(w){return function(){return w}};function E(w){function B(b,c,d){d&&c!==a.k.r(b)&&a.k.S(b,c);c!==a.k.r(b)&&a.a.va(b,"change")}var a="undefined"!==typeof w?w:{};a.b=function(b,c){for(var d=b.split("."),f=a,g=0;g",c[0];);return 4a.a.j(c,b[e])&&c.push(b[e]);return c},T:function(a,b){for(var a=a||[],c=[], -e=0,f=a.length;ea.length?t:a.substring(0,b.length)===b},eb:function(a,b){for(var c="return ("+a+")",e=0;e",""]||!d.indexOf("",""]||(!d.indexOf("",""]||[0,"",""];b="ignored
    "+d[1]+b+d[2]+"
    ";for("function"==typeof window.innerShiv?c.appendChild(window.innerShiv(b)):c.innerHTML=b;d[0]--;)c=c.lastChild;c=a.a.L(c.lastChild.childNodes)}return c}; -a.a.Y=function(b,c){a.a.ga(b);if(c!==s&&c!==n)if("string"!=typeof c&&(c=c.toString()),"undefined"!=typeof jQuery)jQuery(b).html(c);else for(var d=a.a.pa(c),f=0;f"},Va:function(a,b){var c=d[a];c===n&&m(Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized."));try{return c.apply(s,b||[]),p}finally{delete d[a]}},Wa:function(b,d){var e=[];c(b,e);for(var h=0,j=e.length;hc;c++)b=b();return b})};a.toJSON=function(b,c,e){b=a.Ta(b);return a.a.sa(b,c,e)}})();a.b("toJS",a.Ta);a.b("toJSON",a.toJSON);(function(){a.k={r:function(b){switch(a.a.o(b)){case "option":return b.__ko__hasDomDataOptionValue__===p?a.a.f.get(b,a.c.options.oa):b.getAttribute("value");case "select":return 0<=b.selectedIndex?a.k.r(b.options[b.selectedIndex]):n;default:return b.value}},S:function(b,c){switch(a.a.o(b)){case "option":switch(typeof c){case "string":a.a.f.set(b,a.c.options.oa, -n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.f.set(b,a.c.options.oa,c),b.__ko__hasDomDataOptionValue__=p,b.value="number"===typeof c?c:""}break;case "select":for(var d=b.options.length-1;0<=d;d--)if(a.k.r(b.options[d])==c){b.selectedIndex=d;break}break;default:if(c===s||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.k);a.b("selectExtensions.readValue",a.k.r);a.b("selectExtensions.writeValue",a.k.S);a.g=function(){function b(a,b){for(var d= -s;a!=d;)d=a,a=a.replace(c,function(a,c){return b[c]});return a}var c=/\@ko_token_(\d+)\@/g,d=/^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i,f=["true","false"];return{D:[],W:function(c){var e=a.a.w(c);if(3>e.length)return[];"{"===e.charAt(0)&&(e=e.substring(1,e.length-1));for(var c=[],d=s,f,k=0;k$/: -/^\s*ko\s+(.*\:.*)\s*$/,h=g?/^<\!--\s*\/ko\s*--\>$/:/^\s*\/ko\s*$/,j={ul:p,ol:p};a.e={C:{},childNodes:function(a){return b(a)?d(a):a.childNodes},ha:function(c){if(b(c))for(var c=a.e.childNodes(c),e=0,d=c.length;e"),t))}};a.c.uniqueName.gb=0;a.c.checked={init:function(b,c,d){a.a.n(b,"click",function(){var f;if("checkbox"==b.type)f=b.checked;else if("radio"==b.type&&b.checked)f=b.value;else return;var g=c();"checkbox"==b.type&&a.a.d(g)instanceof Array?(f=a.a.j(a.a.d(g),b.value), -b.checked&&0>f?g.push(b.value):!b.checked&&0<=f&&g.splice(f,1)):a.g.$(g,d,"checked",f,p)});"radio"==b.type&&!b.name&&a.c.uniqueName.init(b,A(p))},update:function(b,c){var d=a.a.d(c());"checkbox"==b.type?b.checked=d instanceof Array?0<=a.a.j(d,b.value):d:"radio"==b.type&&(b.checked=b.value==d)}};var F={"class":"className","for":"htmlFor"};a.c.attr={update:function(b,c){var d=a.a.d(c())||{},f;for(f in d)if("string"==typeof f){var g=a.a.d(d[f]),e=g===t||g===s||g===n;e&&b.removeAttribute(f);8>=a.a.ja&& -f in F?(f=F[f],e?b.removeAttribute(f):b[f]=g):e||b.setAttribute(f,g.toString())}}};a.c.hasfocus={init:function(b,c,d){function f(b){var e=c();a.g.$(e,d,"hasfocus",b,p)}a.a.n(b,"focus",function(){f(p)});a.a.n(b,"focusin",function(){f(p)});a.a.n(b,"blur",function(){f(t)});a.a.n(b,"focusout",function(){f(t)})},update:function(b,c){var d=a.a.d(c());d?b.focus():b.blur();a.a.va(b,d?"focusin":"focusout")}};a.c["with"]={p:function(b){return function(){var c=b();return{"if":c,data:c,templateEngine:a.q.K}}}, -init:function(b,c){return a.c.template.init(b,a.c["with"].p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c["with"].p(c),d,f,g)}};a.g.D["with"]=t;a.e.C["with"]=p;a.c["if"]={p:function(b){return function(){return{"if":b(),templateEngine:a.q.K}}},init:function(b,c){return a.c.template.init(b,a.c["if"].p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c["if"].p(c),d,f,g)}};a.g.D["if"]=t;a.e.C["if"]=p;a.c.ifnot={p:function(b){return function(){return{ifnot:b(),templateEngine:a.q.K}}}, -init:function(b,c){return a.c.template.init(b,a.c.ifnot.p(c))},update:function(b,c,d,f,g){return a.c.template.update(b,a.c.ifnot.p(c),d,f,g)}};a.g.D.ifnot=t;a.e.C.ifnot=p;a.c.foreach={p:function(b){return function(){var c=a.a.d(b());return!c||"number"==typeof c.length?{foreach:c,templateEngine:a.q.K}:{foreach:c.data,includeDestroyed:c.includeDestroyed,afterAdd:c.afterAdd,beforeRemove:c.beforeRemove,afterRender:c.afterRender,templateEngine:a.q.K}}},init:function(b,c){return a.c.template.init(b,a.c.foreach.p(c))}, -update:function(b,c,d,f,g){return a.c.template.update(b,a.c.foreach.p(c),d,f,g)}};a.g.D.foreach=t;a.e.C.foreach=p;a.t=function(){};a.t.prototype.renderTemplateSource=function(){m(Error("Override renderTemplateSource"))};a.t.prototype.createJavaScriptEvaluatorBlock=function(){m(Error("Override createJavaScriptEvaluatorBlock"))};a.t.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){var c=c||document,d=c.getElementById(b);d||m(Error("Cannot find template with ID "+b));return new a.l.i(d)}if(1== -b.nodeType||8==b.nodeType)return new a.l.M(b);m(Error("Unknown template type: "+b))};a.t.prototype.renderTemplate=function(a,c,d,f){return this.renderTemplateSource(this.makeTemplateSource(a,f),c,d)};a.t.prototype.isTemplateRewritten=function(a,c){return this.allowTemplateRewriting===t||!(c&&c!=document)&&this.V&&this.V[a]?p:this.makeTemplateSource(a,c).data("isRewritten")};a.t.prototype.rewriteTemplate=function(a,c,d){var f=this.makeTemplateSource(a,d),c=c(f.text());f.text(c);f.data("isRewritten", -p);!(d&&d!=document)&&"string"==typeof a&&(this.V=this.V||{},this.V[a]=p)};a.b("templateEngine",a.t);a.Z=function(){function b(b,c,e){for(var b=a.g.W(b),d=a.g.D,j=0;j/g;return{mb:function(b,c,e){c.isTemplateRewritten(b,e)||c.rewriteTemplate(b,function(b){return a.Z.zb(b,c)},e)},zb:function(a,g){return a.replace(c,function(a,c,d,f,i,l,q){return b(q,c,g)}).replace(d,function(a,c){return b(c,"<\!-- ko --\>",g)})},Za:function(b){return a.s.na(function(c, -e){c.nextSibling&&a.ya(c.nextSibling,b,e)})}}}();a.b("templateRewriting",a.Z);a.b("templateRewriting.applyMemoizedBindingsToNextSibling",a.Z.Za);(function(){a.l={};a.l.i=function(a){this.i=a};a.l.i.prototype.text=function(){var b=a.a.o(this.i),b="script"===b?"text":"textarea"===b?"value":"innerHTML";if(0==arguments.length)return this.i[b];var c=arguments[0];"innerHTML"===b?a.a.Y(this.i,c):this.i[b]=c};a.l.i.prototype.data=function(b){if(1===arguments.length)return a.a.f.get(this.i,"templateSourceData_"+ -b);a.a.f.set(this.i,"templateSourceData_"+b,arguments[1])};a.l.M=function(a){this.i=a};a.l.M.prototype=new a.l.i;a.l.M.prototype.text=function(){if(0==arguments.length){var b=a.a.f.get(this.i,"__ko_anon_template__")||{};b.ua===n&&b.da&&(b.ua=b.da.innerHTML);return b.ua}a.a.f.set(this.i,"__ko_anon_template__",{ua:arguments[0]})};a.l.i.prototype.nodes=function(){if(0==arguments.length)return(a.a.f.get(this.i,"__ko_anon_template__")||{}).da;a.a.f.set(this.i,"__ko_anon_template__",{da:arguments[0]})}; -a.b("templateSources",a.l);a.b("templateSources.domElement",a.l.i);a.b("templateSources.anonymousTemplate",a.l.M)})();(function(){function b(b,c,d){for(var f,c=a.e.nextSibling(c);b&&(f=b)!==c;)b=a.e.nextSibling(f),(1===f.nodeType||8===f.nodeType)&&d(f)}function c(c,d){if(c.length){var f=c[0],g=c[c.length-1];b(f,g,function(b){a.xa(d,b)});b(f,g,function(b){a.s.Wa(b,[d])})}}function d(a){return a.nodeType?a:0a.a.ja)&&b.nodes?b.nodes():s; -if(c)return a.a.L(c.cloneNode(p).childNodes);b=b.text();return a.a.pa(b)};a.q.K=new a.q;a.ra(a.q.K);a.b("nativeTemplateEngine",a.q);(function(){a.ma=function(){var a=this.vb=function(){if("undefined"==typeof jQuery||!jQuery.tmpl)return 0;try{if(0<=jQuery.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,f,g){g=g||{};2>a&&m(Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later."));var e=b.data("precompiled"); -e||(e=b.text()||"",e=jQuery.template(s,"{{ko_with $item.koBindingContext}}"+e+"{{/ko_with}}"),b.data("precompiled",e));b=[f.$data];f=jQuery.extend({koBindingContext:f},g.templateOptions);f=jQuery.tmpl(e,b,f);f.appendTo(document.createElement("div"));jQuery.fragments={};return f};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){document.write(" - - - - - - -
    - - - - -
    - -
    diff --git a/src/Umbraco.Web.UI/umbraco_client/Dialogs/UmbracoField.js b/src/Umbraco.Web.UI/umbraco_client/Dialogs/UmbracoField.js deleted file mode 100644 index 894830ab6a..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Dialogs/UmbracoField.js +++ /dev/null @@ -1,145 +0,0 @@ -Umbraco.Sys.registerNamespace("Umbraco.Dialogs"); - -(function($) { - - - Umbraco.Dialogs.UmbracoField = base2.Base.extend({ - //private methods/variables - _opts: null, - - // Constructor - constructor: function (opts) { - // Merge options with default - this._opts = $.extend({ - // Default options go here - }, opts); - }, - - //public methods/variables - - init: function () { - var self = this; - //bind to the submit handler of the button - this._opts.submitButton.click(function () { - self.doSubmit(); - }); - this._opts.cancelButton.click(function () { - UmbClientMgr.closeModalWindow(); - }); - }, - - doSubmit: function() { - //find out if this is an MVC View. - var url = window.location.href; - var isMvcView = url.indexOf('mvcView=') != -1; - var tagString = ""; - - //get the form - var fieldForm = this._opts.form; - - //formfields - var field = fieldForm.field.value; - var useIfEmpty = fieldForm.useIfEmpty.value; - var alternativeText = fieldForm.alternativeText.value; - var insertTextBefore = fieldForm.insertTextBefore.value; - var insertTextAfter = fieldForm.insertTextAfter.value; - - if(isMvcView) { - tagString = "@Umbraco.Field(\"" + field + "\""; - - if (useIfEmpty != '') - tagString += ", altFieldAlias: \"" + useIfEmpty + "\""; - - if (alternativeText != '') - tagString += ", altText: \"" + alternativeText + "\""; - - if (fieldForm.recursive.checked) - tagString += ", recursive: true"; - - if (insertTextBefore != '') - tagString += ", insertBefore: \"" + insertTextBefore.replace(/\"/gi, """).replace(/\/gi, ">") + "\""; - - if (insertTextAfter != "") - tagString += ", insertAfter: \"" + insertTextAfter.replace(/\"/gi, """).replace(/\/gi, ">") + "\""; - - if (fieldForm.formatAsDate[1].checked) - tagString += ", formatAsDateWithTime: true, formatAsDateWithTimeSeparator: \"" + fieldForm.formatAsDateWithTimeSeparator.value + "\""; - else if (fieldForm.formatAsDate[0].checked) - tagString += ", formatAsDate: true"; - - if (fieldForm.toCase[1].checked) - tagString += ", casing: RenderFieldCaseType.Lower"; - else if(fieldForm.toCase[2].checked) - tagString += ", casing: RenderFieldCaseType.Upper"; - - if (fieldForm.urlEncode[1].checked) - tagString += ", encoding: RenderFieldEncodingType.Url"; - else if (fieldForm.urlEncode[2].checked) - tagString += ", encoding: RenderFieldEncodingType.Html"; - - if (fieldForm.convertLineBreaks.checked) - tagString += ", convertLineBreaks: true"; - - if (fieldForm.stripParagraph.checked) - tagString += ", removeParagraphTags: true"; - - tagString += ")"; - - } - else - { - - tagString = '<' + this._opts.tagName; - - if (field != '') - tagString += ' field="' + field + '"'; - - if (useIfEmpty != '') - tagString += ' useIfEmpty="' + useIfEmpty + '"'; - - if (alternativeText != '') - tagString += ' textIfEmpty="' + alternativeText + '"'; - - if (insertTextBefore != '') - tagString += ' insertTextBefore="' + insertTextBefore.replace(/\"/gi, """).replace(/\/gi, ">") + '"'; - - if (insertTextAfter != '') - tagString += ' insertTextAfter="' + insertTextAfter.replace(/\"/gi, """).replace(/\/gi, ">") + '"'; - - if (fieldForm.formatAsDate[1].checked) - tagString += ' formatAsDateWithTime="true" formatAsDateWithTimeSeparator="' + fieldForm.formatAsDateWithTimeSeparator.value + '"'; - else if (fieldForm.formatAsDate[0].checked) - tagString += ' formatAsDate="true"'; - - if (fieldForm.toCase[1].checked) - tagString += ' case="' + fieldForm.toCase[1].value + '"'; - else if (fieldForm.toCase[2].checked) - tagString += ' case="' + fieldForm.toCase[2].value + '"'; - - if (fieldForm.recursive.checked) - tagString += ' recursive="true"'; - - if (fieldForm.urlEncode[1].checked) - tagString += ' urlEncode="true"'; - else if (fieldForm.urlEncode[2].checked) - tagString += ' htmlEncode="true"'; - - if (fieldForm.stripParagraph.checked) - tagString += ' stripParagraph="true"'; - - if (fieldForm.convertLineBreaks.checked) - tagString += ' convertLineBreaks="true"'; - - tagString += " runat=\"server\" />"; - } - - - UmbClientMgr.contentFrame().focus(); - UmbClientMgr.contentFrame().UmbEditor.Insert(tagString, '', this._opts.objectId); - UmbClientMgr.closeModalWindow(); - } - }); - - - -})(jQuery); \ No newline at end of file From a884a9c56cd420cad243e3cca47432334bbcefd2 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:06:01 +0100 Subject: [PATCH 060/275] UmbracoClientManager is next for the chopping block but a legacy copy is in the umbraco/lib/ folder for safe keeping for the time being :) --- .../Application/UmbracoClientManager.js | 257 ------------------ .../UI/Bundles/JsUmbracoApplicationCore.cs | 1 - .../controls/Tree/CustomTreeControl.cs | 1 - 3 files changed, 259 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js deleted file mode 100644 index c3de3c43d0..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoClientManager.js +++ /dev/null @@ -1,257 +0,0 @@ -Umbraco.Sys.registerNamespace("Umbraco.Application"); - -(function($) { - Umbraco.Application.ClientManager = function() { - /// - /// A class which ensures that all calls made to the objects that it owns are done in the context - /// of the main Umbraco application window. - /// - - return { - _isDirty: false, - _isDebug: false, - _mainTree: null, - _appActions: null, - _historyMgr: null, - _rootPath: "/umbraco", //this is the default - _modal: new Array(), //track all modal window objects (they get stacked) - - historyManager: function() { - if (!this._historyMgr) { - this._historyMgr = new Umbraco.Controls.HistoryManager(); - } - return this._historyMgr; - }, - - setUmbracoPath: function(strPath) { - /// - /// sets the Umbraco root path folder - /// - this._debug("setUmbracoPath: " + strPath); - this._rootPath = strPath; - }, - - mainWindow: function() { - /// - /// Returns a reference to the main frame of the application - /// - return top; - }, - mainTree: function() { - /// - /// Returns a reference to the main UmbracoTree API object. - /// Sometimes an Umbraco page will need to be opened without being contained in the iFrame from the main window - /// so this method is will construct a false tree to be returned if this is the case as to avoid errors. - /// - /// - - - if (this._mainTree == null) { - this._mainTree = top.UmbClientMgr.mainTree(); - } - return this._mainTree; - }, - appActions: function() { - /// - /// Returns a reference to the application actions object - /// - - //if the main window has no actions, we'll create some - if (this._appActions == null) { - if (typeof this.mainWindow().appActions == 'undefined') { - this._appActions = new Umbraco.Application.Actions(); - } - else this._appActions = this.mainWindow().appActions; - } - return this._appActions; - }, - uiKeys: function() { - /// - /// Returns a reference to the main windows uiKeys object for globalization - /// - - //TODO: If there is no main window, we need to go retrieve the appActions from the server! - return this.mainWindow().uiKeys; - }, - // windowMgr: function() - // return null; - // }, - contentFrameAndSection: function(app, rightFrameUrl) { - //this.appActions().shiftApp(app, this.uiKeys()['sections_' + app]); - var self = this; - self.mainWindow().UmbClientMgr.historyManager().addHistory(app, true); - window.setTimeout(function() { - self.mainWindow().UmbClientMgr.contentFrame(rightFrameUrl); - }, 200); - }, - contentFrame: function (strLocation) { - /// - /// This will return the reference to the right content frame if strLocation is null or empty, - /// or set the right content frames location to the one specified by strLocation. - /// - - this._debug("contentFrame: " + strLocation); - - if (strLocation == null || strLocation == "") { - if (typeof this.mainWindow().right != "undefined") { - return this.mainWindow().right; - } - else { - return this.mainWindow(); //return the current window if the content frame doesn't exist in the current context - } - } - else { - - //its a hash change so process that like angular - if (strLocation.substr(0, 1) !== "#") { - if (strLocation.substr(0, 1) != "/") { - //if the path doesn't start with "/" or with the root path then - //prepend the root path - strLocation = this._rootPath + "/" + strLocation; - } - else if (strLocation.length >= this._rootPath.length - && strLocation.substr(0, this._rootPath.length) != this._rootPath) { - strLocation = this._rootPath + "/" + strLocation; - } - } - - this._debug("contentFrame: parsed location: " + strLocation); - - if (!this.mainWindow().UmbClientMgr) { - window.setTimeout(function() { - var self = this; - self.mainWindow().location.href = strLocation; - }, 200); - } - else { - this.mainWindow().UmbClientMgr.contentFrame(strLocation); - } - } - }, - reloadContentFrameUrlIfPathLoaded: function (url) { - var contentFrame; - if (typeof this.mainWindow().right != "undefined") { - contentFrame = this.mainWindow().right; - } - else { - contentFrame = this.mainWindow(); - } - - var currentPath = contentFrame.location.pathname + (contentFrame.location.search ? contentFrame.location.search : ""); - if (currentPath == url) { - contentFrame.location.reload(); - } - }, - - /** This is used to launch an angular based modal window instead of the legacy window */ - openAngularModalWindow: function (options) { - if (!this.mainWindow().UmbClientMgr) { - throw "An angular modal window can only be launched when the modal is running within the main Umbraco application"; - } - else { - this.mainWindow().UmbClientMgr.openAngularModalWindow.apply(this.mainWindow().UmbClientMgr, [options]); - } - - }, - - /** This is used to launch an angular based modal window instead of the legacy window */ - rootScope: function () { - - if (!this.mainWindow().UmbClientMgr) { - throw "An angular modal window can only be launched when the modal is running within the main Umbraco application"; - } - else { - return this.mainWindow().UmbClientMgr.rootScope(); - } - - }, - - reloadLocation: function (pathToMatch) { - if (this.mainWindow().UmbClientMgr) { - this.mainWindow().UmbClientMgr.reloadLocation(pathToMatch); - } - }, - - openModalWindow: function(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { - //need to create the modal on the top window if the top window has a client manager, if not, create it on the current window - - //if this is the top window, or if the top window doesn't have a client manager, create the modal in this manager - if (window == this.mainWindow() || !this.mainWindow().UmbClientMgr) { - var m = new Umbraco.Controls.ModalWindow(); - this._modal.push(m); - m.open(url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); - } - else { - //if the main window has a client manager, then call the main window's open modal method whilst keeping the context of it's manager. - if (this.mainWindow().UmbClientMgr) { - this.mainWindow().UmbClientMgr.openModalWindow.apply(this.mainWindow().UmbClientMgr, - [url, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback]); - } - else { - return; //exit recurse. - } - } - }, - openModalWindowForContent: function (jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback) { - //need to create the modal on the top window if the top window has a client manager, if not, create it on the current window - - //if this is the top window, or if the top window doesn't have a client manager, create the modal in this manager - if (window == this.mainWindow() || !this.mainWindow().UmbClientMgr) { - var m = new Umbraco.Controls.ModalWindow(); - this._modal.push(m); - m.show(jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback); - } - else { - //if the main window has a client manager, then call the main window's open modal method whilst keeping the context of it's manager. - if (this.mainWindow().UmbClientMgr) { - this.mainWindow().UmbClientMgr.openModalWindowForContent.apply(this.mainWindow().UmbClientMgr, - [jQueryElement, name, showHeader, width, height, top, leftOffset, closeTriggers, onCloseCallback]); - } - else { - return; //exit recurse. - } - } - }, - closeModalWindow: function(rVal) { - /// - /// will close the latest open modal window. - /// if an rVal is passed in, then this will be sent to the onCloseCallback method if it was specified. - /// - if (this._modal != null && this._modal.length > 0) { - this._modal.pop().close(rVal); - } - else { - //this will recursively try to close a modal window until the parent window has a modal object or the window is the top and has the modal object - var mgr = null; - if (window.parent == null || window.parent == window) { - //we are at the root window, check if we can close the modal window from here - if (window.UmbClientMgr != null && window.UmbClientMgr._modal != null && window.UmbClientMgr._modal.length > 0) { - mgr = window.UmbClientMgr; - } - else { - return; //exit recursion. - } - } - else if (typeof window.parent.UmbClientMgr != "undefined") { - mgr = window.parent.UmbClientMgr; - } - mgr.closeModalWindow.call(mgr, rVal); - } - }, - _debug: function(strMsg) { - if (this._isDebug) { - Sys.Debug.trace("UmbClientMgr: " + strMsg); - } - }, - get_isDirty: function() { - return this._isDirty; - }, - set_isDirty: function(value) { - this._isDirty = value; - } - }; - }; -})(jQuery); - -//define alias for use throughout application -var UmbClientMgr = new Umbraco.Application.ClientManager(); diff --git a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs b/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs index 505f9efdc3..6fa0a9a0d0 100644 --- a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs +++ b/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs @@ -8,7 +8,6 @@ namespace Umbraco.Web.UI.Bundles ///
    [ClientDependency(ClientDependencyType.Javascript, "Application/Extensions.js", "UmbracoClient", Priority = 0, Group = 2)] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient", Priority = 1, Group = 2)] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoClientManager.js", "UmbracoClient", Priority = 3, Group = 3)] public class JsUmbracoApplicationCore : Control { } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs index 7b8b92384b..fac5b6ebb0 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs @@ -18,7 +18,6 @@ namespace umbraco.controls.Tree /// to re-register the ClientDependencies. /// [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoClientManager.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient")] [ClientDependency(10, ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient")] From 5b4c897892b0dad7f96edb668efa05fff30caf00 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:07:11 +0100 Subject: [PATCH 061/275] Yet again I forgot to save the CSProj - you would have thought I would have learnt --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 4d833dee7e..aa1af2f426 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -384,7 +384,6 @@ - From a2839876c6b292524ffe94d94b8bbd8046c22f77 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:30:16 +0100 Subject: [PATCH 062/275] Extnesions.js removed from umbraco_client as it has a new home in umbraco/lib/umbraco --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../umbraco_client/Application/Extensions.js | 403 ------------------ .../UI/Bundles/JsUmbracoApplicationCore.cs | 1 - 3 files changed, 405 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index aa1af2f426..0540b9cd06 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -348,7 +348,6 @@ ASPXCodeBehind - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js b/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js deleted file mode 100644 index 9fddaad998..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/Extensions.js +++ /dev/null @@ -1,403 +0,0 @@ -(function ($) { - - //extensions to base classes such as String and extension methods for jquery. - //NOTE: jquery must be loaded before this file. - - //create guid object on the window (which makes it global) - if (window.Guid == null) { - window.Guid = { - generate: function () { - ///generates a new Guid - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - }); - } - }; - } - - if (!window.__debug__) { - window.__debug__ = function (msg, category, isErr) { - ///global method to send debug statements to console that is cross browser (or at least checks if its possible) - - if (((typeof console) != "undefined") && console.log && console.error) { - if (isErr) console.error(category + ": " + msg); - else console.log(category + ": " + msg); - } - }; - } - - if (!window.location.getParams) { - var pl = /\+/g; // Regex for replacing addition symbol with a space - var search = /([^&=]+)=?([^&]*)/g; - var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); }; - - window.location.getParams = function() { - var match; - var query = window.location.search.substring(1); - - var urlParams = {}; - while (match = search.exec(query)) - urlParams[decode(match[1])] = decode(match[2]); - - return urlParams; - } - } - - if (!String.prototype.startsWith) { - String.prototype.startsWith = function (str) { - ///startsWith extension method for string - - return this.substr(0, str.length) === str; - }; - } - - if (!String.prototype.endsWith) { - String.prototype.endsWith = function (str) { - ///endsWith extension method for string - - return this.substr(this.length - str.length) === str; - }; - } - - if (!String.prototype.utf8Encode) { - String.prototype.utf8Encode = function () { - ///UTF8 encoder for string - - var str = this.replace(/\r\n/g, "\n"); - var utftext = ""; - for (var n = 0; n < str.length; n++) { - var c = str.charCodeAt(n); - if (c < 128) { - utftext += String.fromCharCode(c); - } - else if ((c > 127) && (c < 2048)) { - utftext += String.fromCharCode((c >> 6) | 192); - utftext += String.fromCharCode((c & 63) | 128); - } - else { - utftext += String.fromCharCode((c >> 12) | 224); - utftext += String.fromCharCode(((c >> 6) & 63) | 128); - utftext += String.fromCharCode((c & 63) | 128); - } - } - return utftext; - }; - } - - if (!String.prototype.utf8Decode) { - String.prototype.utf8Decode = function () { - var utftext = this; - var string = ""; - var i = 0; - var c = c1 = c2 = 0; - - while (i < utftext.length) { - - c = utftext.charCodeAt(i); - - if (c < 128) { - string += String.fromCharCode(c); - i++; - } - else if ((c > 191) && (c < 224)) { - c2 = utftext.charCodeAt(i + 1); - string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); - i += 2; - } - else { - c2 = utftext.charCodeAt(i + 1); - c3 = utftext.charCodeAt(i + 2); - string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - i += 3; - } - - } - - return string; - }; - } - - if (!String.prototype.base64Encode) { - String.prototype.base64Encode = function () { - ///Base64 encoder for string - - var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - var output = ""; - var chr1, chr2, chr3, enc1, enc2, enc3, enc4; - var i = 0; - - var input = this.utf8Encode(); - - while (i < input.length) { - - chr1 = input.charCodeAt(i++); - chr2 = input.charCodeAt(i++); - chr3 = input.charCodeAt(i++); - - enc1 = chr1 >> 2; - enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); - enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); - enc4 = chr3 & 63; - - if (isNaN(chr2)) { - enc3 = enc4 = 64; - } else if (isNaN(chr3)) { - enc4 = 64; - } - - output = output + - keyStr.charAt(enc1) + keyStr.charAt(enc2) + - keyStr.charAt(enc3) + keyStr.charAt(enc4); - - } - - return output; - }; - } - - if (!String.prototype.base64Decode) { - String.prototype.base64Decode = function () { - ///Base64 decoder for string - - var input = this; - var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - var output = ""; - var chr1, chr2, chr3; - var enc1, enc2, enc3, enc4; - var i = 0; - - input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); - - while (i < input.length) { - - enc1 = keyStr.indexOf(input.charAt(i++)); - enc2 = keyStr.indexOf(input.charAt(i++)); - enc3 = keyStr.indexOf(input.charAt(i++)); - enc4 = keyStr.indexOf(input.charAt(i++)); - - chr1 = (enc1 << 2) | (enc2 >> 4); - chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); - chr3 = ((enc3 & 3) << 6) | enc4; - - output = output + String.fromCharCode(chr1); - - if (enc3 != 64) { - output = output + String.fromCharCode(chr2); - } - if (enc4 != 64) { - output = output + String.fromCharCode(chr3); - } - - } - - return output.utf8Decode(); - - }; - } - - - if (!Math.randomRange) { - Math.randomRange = function (from, to) { - ///randomRange extension for math - - return Math.floor(Math.random() * (to - from + 1) + from); - }; - } - - if (!String.prototype.toCamelCase) { - String.prototype.toCamelCase = function () { - ///toCamelCase extension method for string - - var s = this.toPascalCase(); - if ($.trim(s) == "") - return ""; - if (s.length > 1) { - var regex = /^([A-Z]*)([A-Z].*)/g; - if (s.match(regex)) { - var match = regex.exec(s); - s = match[1].toLowerCase() + match[2]; - s = s.substr(0, 1).toLowerCase() + s.substr(1); - } - } else { - s = s.toLowerCase(); - } - return s; - }; - } - - if (!String.prototype.toPascalCase) { - String.prototype.toPascalCase = function () { - ///toPascalCase extension method for string - - var s = ""; - $.each($.trim(this).split(/[\s\.-]+/g), function (idx, val) { - if ($.trim(val) == "") - return; - if (val.length > 1) - s += val.substr(0, 1).toUpperCase() + val.substr(1); - else - s += val.toUpperCase(); - }); - return s; - }; - } - - if (!String.prototype.toUmbracoAlias) { - String.prototype.toUmbracoAlias = function () { - //////toUmbracoAlias extension method for string - - var s = this.replace(/[^a-zA-Z0-9\s\.-]+/g, ''); // Strip none alphanumeric chars - return s.toCamelCase(); // Convert to camelCase - }; - } - - if (!String.prototype.toFunction) { - String.prototype.toFunction = function () { - var arr = this.split("."); - var fn = (window || this); - for (var i = 0, len = arr.length; i < len; i++) { - fn = fn[arr[i]]; - } - if (typeof fn !== "function") { - throw new Error("function not found"); - } - return fn; - }; - } - - //sets defaults for ajax - $.ajaxSetup({ - dataType: 'json', - cache: false, - contentType: 'application/json; charset=utf-8', - error: function (x, t, e) { - if (x.status.toString().startsWith("500")) { - //show ysod overlay if we can - if (UmbClientMgr) { - var startIndex = x.responseText.indexOf(""); - var body = x.responseText.substring(startIndex, endIndex + 7); - var $div = $(body.replace("", "
    ").replace("", "
    ")); - $div.appendTo($(UmbClientMgr.mainWindow().document.getElementsByTagName("body")[0])); - UmbClientMgr.openModalWindowForContent($div, "ysod", true, 640, 640, null, null, null, function() { - //remove the $div - $div.closest(".umbModalBox").remove(); - }); - } - else { - alert("Unhandled exception occurred.\nStatus: " + x.status + "\nMessage: " + x.statusText + "\n\n" + x.responseText); - } - } - } - }); - - $.fn.getAllAttributes = function () { - ///extension method to get all attributes of a selected element - - if ($(this).length != 1) { - throw "the getAllAttributes method can only be called when matching one jQuery selector"; - }; - var el = $(this).get(0); - var arr = []; - for (var i = 0, attrs = el.attributes; i < attrs.length; i++) { - arr.push({ name: attrs.item(i).nodeName, value: attrs.item(i).nodeValue }); - } - return arr; - }; - - $.fn.outerHtml = function () { - ///extension to get the 'outer html' of an element - - if ($(this).length != 1) { - throw "the getAllAttributes method can only be called when matching one jQuery selector"; - }; - var nodeName = $(_opts.content).get(0).nodeName.toLowerCase(); - //start creating raw html - var outerHtml = "<" + nodeName; - //get all the attributes/values from the original element and add them to the new one - var allAttributes = $(_opts.content).getAllAttributes(); - for (var a in allAttributes) { - outerHtml += " " + allAttributes[a].name + "='" + allAttributes[a].value + "'"; - } - outerHtml += ">"; - outerHtml += $(_opts.content).html(); - outerHtml += ""; - return outerHtml; - }; - - $.fn.focusFirst = function () { - ///extension to focus the first editable field in a form - - return $(this).each(function () { - if ($(this).get(0).nodeName.toLowerCase() != "form") { - throw "The focusFirst method can only be applied to a form element"; - } - var first = $(this).find(":input:enabled:visible").not(":submit").not(":button").not(":file").not(":image").not(":radio"); - if (first.length > 0) { - $(first[0]).focus(); - } - }); - }; - - $.fn.getAttributes = function () { - ///Extension method to return all of the attributes for an element - - var attributes = []; - - if (!this.length) - return this; - - $.each(this[0].attributes, function (index, attr) { - attributes.push({ name: attr.name, value: attr.value }); - }); - - return attributes; - }; - - - //defaults that need to be set on ready - $(document).ready(function () { - - //adds a default ignore parameter to jquery validation - if ($.validator) { - $.validator.setDefaults({ ignore: ".ignore" }); - } - - //adds a "re-parse" method to the Unobtrusive JS framework since Parse doesn't actually reparse - if ($.validator && $.validator.unobtrusive) { - $.validator.unobtrusive.reParse = function ($selector) { - $selector.removeData("validator"); - $.validator.unobtrusive.parse($selector); - }; - } - - }); - - //This sets the default jquery ajax headers to include our csrf token, we - // need to user the beforeSend method because our token changes per user/login so - // it cannot be static - $.ajaxSetup({ - beforeSend: function (xhr) { - - function getCookie(name) { - var value = "; " + document.cookie; - var parts = value.split("; " + name + "="); - if (parts.length === 2) - return parts.pop().split(";").shift(); - return null; - } - - var cookieVal = getCookie("UMB-XSRF-TOKEN"); - if (cookieVal) { - xhr.setRequestHeader("X-UMB-XSRF-TOKEN", cookieVal); - } - - var queryString = window.location.getParams(); - if (queryString.umbDebug === "true") { - xhr.setRequestHeader("X-UMB-DEBUG", cookieVal); - } - } - }); - -})(jQuery); \ No newline at end of file diff --git a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs b/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs index 6fa0a9a0d0..712f6e6a1d 100644 --- a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs +++ b/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs @@ -6,7 +6,6 @@ namespace Umbraco.Web.UI.Bundles /// /// The core libs that require JQuery to be loaded /// - [ClientDependency(ClientDependencyType.Javascript, "Application/Extensions.js", "UmbracoClient", Priority = 0, Group = 2)] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient", Priority = 1, Group = 2)] public class JsUmbracoApplicationCore : Control { From 2fec8b6b028420e0186316ac91ddddfe46a2e5ee Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:32:43 +0100 Subject: [PATCH 063/275] Remove jQuer fieldselection lib - its not being used --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../JQuery/jquery-fieldselection.js | 83 ------------------- 2 files changed, 84 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery-fieldselection.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 0540b9cd06..2662c2c795 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -379,7 +379,6 @@ - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery-fieldselection.js b/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery-fieldselection.js deleted file mode 100644 index dc4dcee5c0..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery-fieldselection.js +++ /dev/null @@ -1,83 +0,0 @@ -// -// jQuery plugin: fieldSelection - v0.1.0 - last change: 2006-12-16 -// (c) 2006 Alex Brem - http://blog.0xab.cd -// - -(function() { - - var fieldSelection = { - - getSelection: function() { - - var e = this.jquery ? this[0] : this; - - return ( - - // mozilla or dom 3.0 - ('selectionStart' in e && function() { - var l = e.selectionEnd - e.selectionStart; - return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) }; - }) || - - // exploder - (document.selection && function() { - - e.focus(); - - var r = document.selection.createRange(); - if (r == null) { - return { start: 0, end: e.value.length, length: 0 } - } - - var re = e.createTextRange(); - var rc = re.duplicate(); - re.moveToBookmark(r.getBookmark()); - rc.setEndPoint('EndToStart', re); - - return { start: rc.text.length, end: rc.text.length + r.text.length, length: r.text.length, text: r.text }; - }) || - - // browser not supported - function() { - return { start: 0, end: e.value.length, length: 0 }; - } - - )(); - - }, - - replaceSelection: function() { - - var e = this.jquery ? this[0] : this; - var text = arguments[0] || ''; - - return ( - - // mozilla or dom 3.0 - ('selectionStart' in e && function() { - e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length); - return this; - }) || - - // exploder - (document.selection && function() { - e.focus(); - document.selection.createRange().text = text; - return this; - }) || - - // browser not supported - function() { - e.value += text; - return this; - } - - )(); - - } - - }; - - jQuery.each(fieldSelection, function(i) { jQuery.fn[i] = this; }); - -})(); From 3bc6bf6da5369459bf2828ac8f70963e1bf5a773 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:34:32 +0100 Subject: [PATCH 064/275] jQuery.cookie lib has ran off into the woods --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../Application/JQuery/jquery.cookie.js | 96 ------------------- src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs | 1 - 3 files changed, 98 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.cookie.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 2662c2c795..1982d6b018 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -374,7 +374,6 @@ - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.cookie.js b/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.cookie.js deleted file mode 100644 index f27f7df16c..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.cookie.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Cookie plugin - * - * Copyright (c) 2006 Klaus Hartl (stilbuero.de) - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ - -/** - * Create a cookie with the given name and value and other optional parameters. - * - * @example $.cookie('the_cookie', 'the_value'); - * @desc Set the value of a cookie. - * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true }); - * @desc Create a cookie with all available options. - * @example $.cookie('the_cookie', 'the_value'); - * @desc Create a session cookie. - * @example $.cookie('the_cookie', null); - * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain - * used when the cookie was set. - * - * @param String name The name of the cookie. - * @param String value The value of the cookie. - * @param Object options An object literal containing key/value pairs to provide optional cookie attributes. - * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object. - * If a negative value is specified (e.g. a date in the past), the cookie will be deleted. - * If set to null or omitted, the cookie will be a session cookie and will not be retained - * when the the browser exits. - * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie). - * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie). - * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will - * require a secure protocol (like HTTPS). - * @type undefined - * - * @name $.cookie - * @cat Plugins/Cookie - * @author Klaus Hartl/klaus.hartl@stilbuero.de - */ - -/** - * Get the value of a cookie with the given name. - * - * @example $.cookie('the_cookie'); - * @desc Get the value of a cookie. - * - * @param String name The name of the cookie. - * @return The value of the cookie. - * @type String - * - * @name $.cookie - * @cat Plugins/Cookie - * @author Klaus Hartl/klaus.hartl@stilbuero.de - */ -jQuery.cookie = function(name, value, options) { - if (typeof value != 'undefined') { // name and value given, set cookie - options = options || {}; - if (value === null) { - value = ''; - options.expires = -1; - } - var expires = ''; - if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { - var date; - if (typeof options.expires == 'number') { - date = new Date(); - date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); - } else { - date = options.expires; - } - expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE - } - // CAUTION: Needed to parenthesize options.path and options.domain - // in the following expressions, otherwise they evaluate to undefined - // in the packed version for some reason... - var path = options.path ? '; path=' + (options.path) : ''; - var domain = options.domain ? '; domain=' + (options.domain) : ''; - var secure = options.secure ? '; secure' : ''; - document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); - } else { // only name given, get cookie - var cookieValue = null; - if (document.cookie && document.cookie != '') { - var cookies = document.cookie.split(';'); - for (var i = 0; i < cookies.length; i++) { - var cookie = jQuery.trim(cookies[i]); - // Does this cookie string begin with the name we want? - if (cookie.substring(0, name.length + 1) == (name + '=')) { - cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); - break; - } - } - } - return cookieValue; - } -}; \ No newline at end of file diff --git a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs index 245abc2420..413b5f82df 100644 --- a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs +++ b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs @@ -7,7 +7,6 @@ namespace Umbraco.Web.UI.Bundles /// The core Jquery libs /// [ClientDependency(ClientDependencyType.Javascript, "modal/jquery.simplemodal.1.4.1.custom.js", "UmbracoClient", Priority = 2, Group = 4)] - [ClientDependency(ClientDependencyType.Javascript, "Application/jQuery/jquery.cookie.js", "UmbracoClient", Priority = 3, Group = 4)] [ClientDependency(ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient", Priority = 4, Group = 4)] [ClientDependency(ClientDependencyType.Javascript, "Application/jQuery/jquery.hotkeys.js", "UmbracoClient", Priority = 5, Group = 4)] public class JsJQueryPlugins : Control From 0e6465ee14835c89ff702de7fb3a0b331577758e Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:48:19 +0100 Subject: [PATCH 065/275] See ya later alligator jQuery.hotkeys.js - CTRL+S still wortks in DocType editor so all good --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../Umbraco/masterpages/umbracoPage.Master | 1 - .../Application/JQuery/jquery.hotkeys.js | 99 ------------------- src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs | 1 - 4 files changed, 102 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.hotkeys.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 1982d6b018..a0ca59736f 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -358,7 +358,6 @@ - diff --git a/src/Umbraco.Web.UI/Umbraco/masterpages/umbracoPage.Master b/src/Umbraco.Web.UI/Umbraco/masterpages/umbracoPage.Master index 97b5daefd4..529c68db63 100644 --- a/src/Umbraco.Web.UI/Umbraco/masterpages/umbracoPage.Master +++ b/src/Umbraco.Web.UI/Umbraco/masterpages/umbracoPage.Master @@ -21,7 +21,6 @@ - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.hotkeys.js b/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.hotkeys.js deleted file mode 100644 index fbd71c71ec..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.hotkeys.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * jQuery Hotkeys Plugin - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Based upon the plugin by Tzury Bar Yochay: - * http://github.com/tzuryby/hotkeys - * - * Original idea by: - * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ -*/ - -(function(jQuery){ - - jQuery.hotkeys = { - version: "0.8", - - specialKeys: { - 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", - 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", - 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", - 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", - 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", - 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", - 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" - }, - - shiftNums: { - "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", - "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", - ".": ">", "/": "?", "\\": "|" - } - }; - - function keyHandler( handleObj ) { - // Only care when a possible input has been specified - if ( typeof handleObj.data !== "string" ) { - return; - } - - var origHandler = handleObj.handler, - keys = handleObj.data.toLowerCase().split(" "); - - handleObj.handler = function( event ) { - // Don't fire in text-accepting inputs that we didn't directly bind to - if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || - event.target.type === "text") ) { - return; - } - - // Keypress represents characters, not special keys - var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], - character = String.fromCharCode( event.which ).toLowerCase(), - key, modif = "", possible = {}; - - // check combinations (alt|ctrl|shift+anything) - if ( event.altKey && special !== "alt" ) { - modif += "alt+"; - } - - if ( event.ctrlKey && special !== "ctrl" ) { - modif += "ctrl+"; - } - - // TODO: Need to make sure this works consistently across platforms - if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { - modif += "meta+"; - } - - if ( event.shiftKey && special !== "shift" ) { - modif += "shift+"; - } - - if ( special ) { - possible[ modif + special ] = true; - - } else { - possible[ modif + character ] = true; - possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; - - // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" - if ( modif === "shift+" ) { - possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; - } - } - - for ( var i = 0, l = keys.length; i < l; i++ ) { - if ( possible[ keys[i] ] ) { - return origHandler.apply( this, arguments ); - } - } - }; - } - - jQuery.each([ "keydown", "keyup", "keypress" ], function() { - jQuery.event.special[ this ] = { add: keyHandler }; - }); - -})( jQuery ); \ No newline at end of file diff --git a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs index 413b5f82df..0c0ebde767 100644 --- a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs +++ b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs @@ -8,7 +8,6 @@ namespace Umbraco.Web.UI.Bundles /// [ClientDependency(ClientDependencyType.Javascript, "modal/jquery.simplemodal.1.4.1.custom.js", "UmbracoClient", Priority = 2, Group = 4)] [ClientDependency(ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient", Priority = 4, Group = 4)] - [ClientDependency(ClientDependencyType.Javascript, "Application/jQuery/jquery.hotkeys.js", "UmbracoClient", Priority = 5, Group = 4)] public class JsJQueryPlugins : Control { } From 6e08a7d8ce45f27a182aef67b9f2eb2ddea0ab62 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 15:57:21 +0100 Subject: [PATCH 066/275] jQuery.metadata.js is on garden leave --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 1 - .../Application/JQuery/jquery.metadata.min.js | 13 ------------- src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs | 1 - .../umbraco/controls/Tree/CustomTreeControl.cs | 1 - 4 files changed, 16 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.metadata.min.js diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index a0ca59736f..cbbe28365e 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -377,7 +377,6 @@ - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.metadata.min.js b/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.metadata.min.js deleted file mode 100644 index 1490a7e64e..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/JQuery/jquery.metadata.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Metadata - jQuery plugin for parsing metadata from elements - * - * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Revision: $Id: jquery.metadata.js 3620 2007-10-10 20:55:38Z pmclanahan $ - * - */ -(function($){$.extend({metadata:{defaults:{type:'class',name:'metadata',cre:/({.*})/,single:'metadata'},setType:function(type,name){this.defaults.type=type;this.defaults.name=name;},get:function(elem,opts){var settings=$.extend({},this.defaults,opts);if(!settings.single.length)settings.single='metadata';var data=$.data(elem,settings.single);if(data)return data;data="{}";if(settings.type=="class"){var m=settings.cre.exec(elem.className);if(m)data=m[1];}else if(settings.type=="elem"){if(!elem.getElementsByTagName)return;var e=elem.getElementsByTagName(settings.name);if(e.length)data=$.trim(e[0].innerHTML);}else if(elem.getAttribute!=undefined){var attr=elem.getAttribute(settings.name);if(attr)data=attr;}if(data.indexOf('{')<0)data="{"+data+"}";data=eval("("+data+")");$.data(elem,settings.single,data);return data;}}});$.fn.metadata=function(opts){return $.metadata.get(this[0],opts);};})(jQuery); \ No newline at end of file diff --git a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs index 0c0ebde767..4c1b444d9b 100644 --- a/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs +++ b/src/Umbraco.Web/UI/Bundles/JsJQueryPlugins.cs @@ -7,7 +7,6 @@ namespace Umbraco.Web.UI.Bundles /// The core Jquery libs /// [ClientDependency(ClientDependencyType.Javascript, "modal/jquery.simplemodal.1.4.1.custom.js", "UmbracoClient", Priority = 2, Group = 4)] - [ClientDependency(ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient", Priority = 4, Group = 4)] public class JsJQueryPlugins : Control { } diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs index fac5b6ebb0..783044ac75 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs @@ -20,7 +20,6 @@ namespace umbraco.controls.Tree [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient")] [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient")] - [ClientDependency(10, ClientDependencyType.Javascript, "Application/JQuery/jquery.metadata.min.js", "UmbracoClient")] [ClientDependency(11, ClientDependencyType.Javascript, "Tree/jquery.tree.js", "UmbracoClient")] [ClientDependency(12, ClientDependencyType.Javascript, "Tree/UmbracoContext.js", "UmbracoClient")] [ClientDependency(12, ClientDependencyType.Javascript, "Tree/jquery.tree.contextmenu.js", "UmbracoClient")] From bf4b48aa9d637d5696c59e40a9c0794709e8b8f9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 18:47:08 +0200 Subject: [PATCH 067/275] move the macropicker files to the infinite editor folder --- .../macropicker/macropicker.controller.js | 0 .../{overlays => infiniteeditors}/macropicker/macropicker.html | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/macropicker/macropicker.controller.js (100%) rename src/Umbraco.Web.UI.Client/src/views/common/{overlays => infiniteeditors}/macropicker/macropicker.html (100%) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.controller.js rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html similarity index 100% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/macropicker/macropicker.html rename to src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html From 0a31ac6ef3832496586531d4451fc4026e2d56fd Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 18:47:55 +0200 Subject: [PATCH 068/275] use macropicker in template editor --- .../src/common/services/editor.service.js | 21 ++++++++++++++++++- .../src/views/templates/edit.controller.js | 20 +++++------------- .../src/views/templates/edit.html | 8 ------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 1334456b99..cbe05529a2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -321,6 +321,24 @@ open(editor); } + /** + * @ngdoc method + * @name umbraco.services.editorService#macroPicker + * @methodOf umbraco.services.editorService + * + * @description + * Opens a macro picker in infinite editing, the submit callback returns an array of the selected items + * + * @param {Callback} editor.submit Submits the editor. + * @param {Callback} editor.close Closes the editor. + * @returns {Object} editor object + */ + function macroPicker(editor) { + editor.view = "views/common/infiniteeditors/macropicker/macropicker.html"; + editor.size = "small"; + open(editor); + } + var service = { getEditors: getEditors, open: open, @@ -341,7 +359,8 @@ insertField: insertField, templateSections: templateSections, userPicker: userPicker, - itemPicker: itemPicker + itemPicker: itemPicker, + macroPicker: macroPicker }; return service; diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 8c425a97b6..52802d0f48 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -381,31 +381,21 @@ } function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } - function openPageFieldOverlay() { var insertFieldEditor = { submit: function (model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index 09eb0ad988..f2ee70801d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -123,13 +123,6 @@
    - - - -
    From 3e36e06d77f15b53237493205549cd4b6fc5bd8b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 19:01:44 +0200 Subject: [PATCH 069/275] add extra markup for the infinite editor --- .../macropicker/macropicker.controller.js | 6 + .../macropicker/macropicker.html | 136 +++++++++++------- 2 files changed, 88 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js index 058f71bfcf..aa63f2d6d6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.controller.js @@ -26,6 +26,12 @@ function MacroPickerController($scope, entityResource, macroResource, umbPropEdi } }; + $scope.close = function() { + if($scope.model.close) { + $scope.model.close(); + } + } + /** changes the view to edit the params of the selected macro */ /** if there is pnly one macro, and it has parameters - editor can skip selecting the Macro **/ function editParams(insertIfNoParameters) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html index 8f16bc40d4..a9551138e1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html @@ -1,63 +1,91 @@
    -
    + + + -
    + + + +
    - +
    + + + + + + + + There are no macros available to insert + + +
    + +
    + +
    {{model.selectedMacro.name}}
    + +
      +
    • + + + + + + + +
    • +
    + + + There are no parameters for this macro + + +
    +
    +
    +
    +
    - + + + + + + - - - There are no macros available to insert - - -
    - -
    - -
    {{model.selectedMacro.name}}
    - -
      -
    • - - - - - - - -
    • -
    - - - There are no parameters for this macro - - -
    -
    +
    From 759c21cec9658b5b66bc2a86e73164cddad73a67 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 1 Aug 2018 20:06:35 +0200 Subject: [PATCH 070/275] use infinite macropicker in partial views and partial view macro editior --- .../insertcodesnippet.controller.js | 17 ++++++---------- .../partialviewmacros/edit.controller.js | 19 +++++------------- .../src/views/partialviewmacros/edit.html | 7 ------- .../src/views/partialviews/edit.controller.js | 20 +++++-------------- .../src/views/partialviews/edit.html | 7 ------- .../src/views/templates/edit.html | 7 ------- 6 files changed, 16 insertions(+), 61 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js index e24f8cd80b..526d076048 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.controller.js @@ -28,27 +28,22 @@ } function openMacroPicker() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function(model) { - $scope.model.insert = { "type": "macro", "macroParams": model.macroParams, "selectedMacro": model.selectedMacro }; - $scope.model.submit($scope.model); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); + }, + close: function() { + editorService.close(); } }; - + editorService.macroPicker(macroPicker); } function openPageFieldOverlay() { diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js index 52499aa47f..84b58cac94 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.controller.js @@ -154,28 +154,19 @@ } function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html index dde5fc8171..e28b76d785 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviewmacros/edit.html @@ -76,11 +76,4 @@ - - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js index b125324833..a337a00acc 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js @@ -161,31 +161,21 @@ function openMacroOverlay() { - - vm.macroPickerOverlay = { - view: "macropicker", + var macroPicker = { dialogData: {}, - show: true, submit: function (model) { - var macroObject = macroService.collectValueData(model.selectedMacro, model.macroParams, "Mvc"); insert(macroObject.syntax); - - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - + editorService.close(); }, - close: function(oldModel) { - // close the dialog - vm.macroPickerOverlay.show = false; - vm.macroPickerOverlay = null; - // focus editor + close: function() { + editorService.close(); vm.editor.focus(); } }; + editorService.macroPicker(macroPicker); } - function openPageFieldOverlay() { var insertFieldEditor = { submit: function (model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html index 5fc8f19d6c..a222234e80 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.html @@ -84,11 +84,4 @@ - - -
    diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index f2ee70801d..7bc063b020 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -123,12 +123,5 @@ - - -
    From eb220b6db0b52c42af8b0cab84630049ea28486b Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 1 Aug 2018 22:35:03 +0100 Subject: [PATCH 071/275] Add in jQuery VUpalidate & Unobtrusive into bower Update ref's to new path --- src/Umbraco.Web.UI.Client/bower.json | 70 ++++++++++--------- .../Templates/EditProfile.cshtml | 4 +- .../PartialViewMacros/Templates/Login.cshtml | 4 +- .../Templates/RegisterMember.cshtml | 4 +- .../Umbraco/dialogs/AssignDomain2.aspx | 4 +- .../umbraco/dialogs/AssignDomain2.aspx | 2 +- 6 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/bower.json b/src/Umbraco.Web.UI.Client/bower.json index 71b393ae9c..b88b6faeec 100644 --- a/src/Umbraco.Web.UI.Client/bower.json +++ b/src/Umbraco.Web.UI.Client/bower.json @@ -31,6 +31,8 @@ "jquery": "2.2.4", "jquery-ui": "~1.12.0", "jquery-migrate": "1.4.0", + "jquery-validate": "~1.17.0", + "jquery-validation-unobtrusive": "3.2.10", "angular-dynamic-locale": "~0.1.36", "ng-file-upload": "~12.2.13", "tinymce": "~4.7.1", @@ -53,39 +55,41 @@ "ace-builds" ], "sources": { - "moment": [ - "bower_components/moment/min/moment.min.js", - "bower_components/moment/min/moment-with-locales.js", - "bower_components/moment/min/moment-with-locales.min.js", - "bower_components/moment/locale/*.js" - ], - "underscore": [ - "bower_components/underscore/underscore-min.js", - "bower_components/underscore/underscore-min.map" - ], - "jquery": [ - "bower_components/jquery/dist/jquery.min.js", - "bower_components/jquery/dist/jquery.min.map" - ], - "angular-dynamic-locale": [ - "bower_components/angular-dynamic-locale/tmhDynamicLocale.min.js", - "bower_components/angular-dynamic-locale/tmhDynamicLocale.min.js.map" - ], - "angular-local-storage": [ - "bower_components/angular-local-storage/dist/angular-local-storage.min.js", - "bower_components/angular-local-storage/dist/angular-local-storage.min.js.map" - ], - "tinymce": [ - "bower_components/tinymce/tinymce.min.js" - ], - "angular-i18n": "bower_components/angular-i18n/angular-locale_*.js", - "typeahead.js": "bower_components/typeahead.js/dist/typeahead.bundle.min.js", - "rgrove-lazyload": "bower_components/rgrove-lazyload/lazyload.js", - "ng-file-upload": "bower_components/ng-file-upload/ng-file-upload.min.js", - "jquery-ui": "bower_components/jquery-ui/jquery-ui.min.js", - "jquery-migrate": "bower_components/jquery-migrate/jquery-migrate.min.js", - "clipboard": "bower_components/clipboard/dist/clipboard.min.js", - "animejs": "bower_components/animejs/anime.min.js" + "moment": [ + "bower_components/moment/min/moment.min.js", + "bower_components/moment/min/moment-with-locales.js", + "bower_components/moment/min/moment-with-locales.min.js", + "bower_components/moment/locale/*.js" + ], + "underscore": [ + "bower_components/underscore/underscore-min.js", + "bower_components/underscore/underscore-min.map" + ], + "jquery": [ + "bower_components/jquery/dist/jquery.min.js", + "bower_components/jquery/dist/jquery.min.map" + ], + "angular-dynamic-locale": [ + "bower_components/angular-dynamic-locale/tmhDynamicLocale.min.js", + "bower_components/angular-dynamic-locale/tmhDynamicLocale.min.js.map" + ], + "angular-local-storage": [ + "bower_components/angular-local-storage/dist/angular-local-storage.min.js", + "bower_components/angular-local-storage/dist/angular-local-storage.min.js.map" + ], + "tinymce": [ + "bower_components/tinymce/tinymce.min.js" + ], + "angular-i18n": "bower_components/angular-i18n/angular-locale_*.js", + "typeahead.js": "bower_components/typeahead.js/dist/typeahead.bundle.min.js", + "rgrove-lazyload": "bower_components/rgrove-lazyload/lazyload.js", + "ng-file-upload": "bower_components/ng-file-upload/ng-file-upload.min.js", + "jquery-ui": "bower_components/jquery-ui/jquery-ui.min.js", + "jquery-migrate": "bower_components/jquery-migrate/jquery-migrate.min.js", + "clipboard": "bower_components/clipboard/dist/clipboard.min.js", + "animejs": "bower_components/animejs/anime.min.js", + "jquery-validate": "bower_components/jquery-validate/dist/jquery.validate.min.js", + "jquery-validation-unobtrusive": "bower_components/jquery-validation-unobtrusive/dist/jquery.validate.unobtrusive.min.js" } }, "devDependencies": { diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml index a494728d8a..dd17f9d6f5 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/EditProfile.cshtml @@ -11,8 +11,8 @@ Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); Html.RequiresJs("/umbraco/lib/jquery/jquery.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validate/jquery.validate.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"); var success = TempData["ProfileUpdateSuccess"] != null; } diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml index 2542683f6e..c3fcf04ba3 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/Login.cshtml @@ -12,8 +12,8 @@ Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); Html.RequiresJs("/umbraco/lib/jquery/jquery.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validate/jquery.validate.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"); } @* NOTE: This RenderJsHere code should be put on your main template page where the rest of your script tags are placed *@ diff --git a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml index d9d80959c9..51c0cc0443 100644 --- a/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/PartialViewMacros/Templates/RegisterMember.cshtml @@ -35,8 +35,8 @@ Html.EnableClientValidation(); Html.EnableUnobtrusiveJavaScript(); Html.RequiresJs("/umbraco/lib/jquery/jquery.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.min.js"); - Html.RequiresJs("/umbraco_client/Application/JQuery/jquery.validate.unobtrusive.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validate/jquery.validate.min.js"); + Html.RequiresJs("/Umbraco/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"); var success = TempData["FormSuccess"] != null; } diff --git a/src/Umbraco.Web.UI/Umbraco/dialogs/AssignDomain2.aspx b/src/Umbraco.Web.UI/Umbraco/dialogs/AssignDomain2.aspx index 82faad7c36..60601d1ac0 100644 --- a/src/Umbraco.Web.UI/Umbraco/dialogs/AssignDomain2.aspx +++ b/src/Umbraco.Web.UI/Umbraco/dialogs/AssignDomain2.aspx @@ -6,7 +6,7 @@ - + - - \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.css b/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.css deleted file mode 100644 index a562e4475e..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.css +++ /dev/null @@ -1,58 +0,0 @@ -#sortableFrame -{ - height: auto; - overflow: auto; -} - -#sortableNodes -{ - padding: 4px; - display: block; - border-spacing:0; - border-collapse:collapse; -} - - #sortableNodes thead tr th - { - border-bottom: 1px solid #ccc; - padding: 4px; - padding-right: 25px; - background-image: url(../tableSorting/img/bg.gif); - cursor: pointer; - font-weight: bold; - background-repeat: no-repeat; - background-position: center right; - } - - #sortableNodes thead tr th.headerSortDown - { - background-image: url(../tableSorting/img/desc.gif); - } - - #sortableNodes thead tr th.headerSortUp - { - background-image: url(../tableSorting/img/asc.gif); - } - - #sortableNodes tbody tr td - { - border-bottom: 1px solid #efefef; - } - - #sortableNodes td - { - padding: 4px; - cursor: move; - } - -tr.tDnD_whileDrag, tr.tDnD_whileDrag td -{ - background: #dcecf3; - border-color: #a8d8eb !Important; - margin-top: 20px; -} - -#sortableNodes .nowrap -{ - white-space: nowrap; -} diff --git a/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.js b/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.js deleted file mode 100644 index da5ae6d61e..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Dialogs/SortDialog.js +++ /dev/null @@ -1,122 +0,0 @@ -Umbraco.Sys.registerNamespace("Umbraco.Dialogs"); - -(function ($) { - - - Umbraco.Dialogs.SortDialog = base2.Base.extend({ - //private methods/variables - _opts: null, - - _setupTableSorter: function () { - //adds a custom sorter to the tablesorter based on the current cultures date/time format - $.tablesorter.addParser({ - // use a unique id - id: 'cultureDateParser', - is: function() { - //don't auto-detect this parser - return false; - }, - format: function(s, table) { - var c = table.config; - - s = s.replace(/\-/g, "/"); - //all of these basically transform the string into year-month-day since that - //is what JS understands when creating a Date object - if (c.dateFormat.indexOf("dd/MM/yyyy") == 0 || c.dateFormat.indexOf("dd-MM-yyyy") == 0 || c.dateFormat.indexOf("dd.MM.yyyy") == 0) { - s = s.replace(/(\d{1,2})[\/\-\.](\d{1,2})[\/\-\.](\d{4})/, "$3-$2-$1"); - } - else if (c.dateFormat.indexOf("dd/MM/yy") == 0 || c.dateFormat.indexOf("dd-MM-yy") == 0 || c.dateFormat.indexOf("dd.MM.yy") == 0) { - s = s.replace(/(\d{1,2})[\/\-\.](\d{1,2})[\/\-\.](\d{2})/, "$3-$2-$1"); - } - else if (c.dateFormat.indexOf("MM/dd/yyyy") == 0 || c.dateFormat.indexOf("MM-dd-yyyy") == 0) { - s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3-$1-$2"); - } - else if (c.dateFormat.indexOf("MM/dd/yy") == 0 || c.dateFormat.indexOf("MM-dd-yy") == 0) { - s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$3-$1-$2"); - } - return $.tablesorter.formatFloat(new Date(s).getTime()); - }, - // set the type to either numeric or text (text uses a natural sort function - // so it will work for everything, but numeric is faster for numbers - type: 'numeric' - }); - }, - - _saveSort: function() { - var rows = $('#sortableNodes tbody tr'); - var sortOrder = ""; - - $.each(rows, function () { - sortOrder += $(this).attr("id").replace("node_", "") + ","; - }); - - $("#sortingDone").hide(); - $("#sortArea").hide(); - $("#loading").show(); - - var self = this; - - $.ajax({ - type: "POST", - url: self._opts.serviceUrl, - data: '{ "ParentId": "' + self._opts.currentId + '", "SortOrder": "' + sortOrder + '"}', - contentType: "application/json; charset=utf-8", - dataType: "json", - success: function(msg) { - self._showConfirm(); - } - }); - }, - - _showConfirm: function () { - $(".umb-dialog-footer").hide(); - $("#loading").hide(); - $("#sortingDone").show(); - UmbClientMgr.mainTree().reloadActionNode(); - }, - - // Constructor - constructor: function (opts) { - // Merge options with default - this._opts = $.extend({ - // Default options go here - }, opts); - - this._setupTableSorter(); - }, - - //public methods/variables - - init: function () { - var self = this; - - //create the sorter - $("#sortableNodes").tablesorter({ - dateFormat: self._opts.dateTimeFormat, - headers: { - 0: { sorter: "text" }, - 1: { sorter: "cultureDateParser" }, //ensure to set our custom parser here - 2: { sorter: "numeric" } - } - }); - - //setup the drag/drop sorting - $("#sortableNodes").tableDnD({ containment: $("#sortableFrame") }); - - //wire up the submit button - self._opts.submitButton.click(function() { - this.disabled = true; - self._saveSort(); - }); - - //wire up the close button - self._opts.closeWindowButton.click(function () { - UmbClientMgr.closeModalWindow(); - }); - }, - - }); - - - -})(jQuery); diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index 427c7fdd66..b1d950cc1f 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1130,9 +1130,6 @@ ASPXCodeBehind - - ASPXCodeBehind - ASPXCodeBehind diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs deleted file mode 100644 index f85114aaec..0000000000 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sort.aspx.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using System.Linq; -using Umbraco.Core; -using Umbraco.Core.Services; -using Umbraco.Web; -using System.Web.UI; -using System.Collections.Generic; -using Umbraco.Web.Composing; -using Umbraco.Web.UI.Pages; -using Umbraco.Core.Exceptions; -using Umbraco.Core.Models; -using Umbraco.Web._Legacy.Actions; - -namespace umbraco.cms.presentation -{ - /// - /// Summary description for sort. - /// - public partial class sort : UmbracoEnsuredPage - { - /// - /// The Parent Id being sorted - /// - protected int? ParentIdAsInt { get; private set; } - protected string ParentIdAsString { get; private set; } - - private readonly List _nodes = new List(); - - protected bool HideDateColumn - { - set { ViewState["HideDateColumn"] = value; } - get { return ViewState["HideDateColumn"] == null ? false : (bool) ViewState["HideDateColumn"]; } - } - - protected override void OnInit(EventArgs e) - { - CurrentApp = Request.GetItemAsString("app"); - - ParentIdAsString = Request.GetItemAsString("ID"); - int parentId; - if (int.TryParse(ParentIdAsString, out parentId)) - { - ParentIdAsInt = parentId; - - if (CurrentApp == Constants.Applications.Content || CurrentApp == Constants.Applications.Media) - { - CheckPathAndPermissions( - ParentIdAsInt.Value, - CurrentApp == Constants.Applications.Content ? UmbracoObjectTypes.Document : UmbracoObjectTypes.Media, - ActionSort.Instance); - } - } - - base.OnInit(e); - } - - protected void Page_Load(object sender, EventArgs e) - { - sortDone.Text = Services.TextService.Localize("sort/sortDone"); - } - protected override void OnPreRender(EventArgs e) - { - base.OnPreRender(e); - - ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/nodesorter.asmx")); - ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference("../webservices/legacyAjaxCalls.asmx")); - - var app = Request.GetItemAsString("app"); - - var icon = "../images/umbraco/doc.gif"; - - if (ParentIdAsInt.HasValue) - { - if (app == Constants.Applications.Media) - { - icon = "../images/umbraco/mediaPhoto.gif"; - var mediaService = Current.Services.MediaService; - - if (ParentIdAsInt.Value == -1) - { - foreach (var child in mediaService.GetRootMedia().ToList().OrderBy(x => x.SortOrder)) - _nodes.Add(CreateNode(child.Id.ToInvariantString(), child.SortOrder, child.Name, child.CreateDate, icon)); - } - else - { - var children = mediaService.GetChildren(ParentIdAsInt.Value); - foreach (var child in children.OrderBy(x => x.SortOrder)) - _nodes.Add(CreateNode(child.Id.ToInvariantString(), child.SortOrder, child.Name, child.CreateDate, icon)); - } - } - - if (app == Constants.Applications.Content) - { - var contentService = Current.Services.ContentService; - - if (ParentIdAsInt.Value == -1) - { - foreach (var child in contentService.GetRootContent().ToList().OrderBy(x => x.SortOrder)) - _nodes.Add(CreateNode(child.Id.ToInvariantString(), child.SortOrder, child.Name, child.CreateDate, icon)); - } - else - { - var children = contentService.GetChildren(ParentIdAsInt.Value); - foreach (var child in children) - _nodes.Add(CreateNode(child.Id.ToInvariantString(), child.SortOrder, child.Name, child.CreateDate, icon)); - } - } - - bindNodesToList(string.Empty); - } - else - { - // hack for stylesheet, used to sort stylesheet properties - if (app == Constants.Applications.Settings) - { - icon = "../images/umbraco/settingCss.gif"; - - HideDateColumn = true; - - var stylesheetName = ParentIdAsString; - if (stylesheetName.IsNullOrWhiteSpace())throw new NullReferenceException("No Id passed in to editor"); - var stylesheet = Services.FileService.GetStylesheetByName(stylesheetName.EnsureEndsWith(".css")); - if (stylesheet == null) throw new InvalidOperationException("No stylesheet found by name " + stylesheetName); - - var sort = 0; - foreach (var child in stylesheet.Properties) - { - _nodes.Add(CreateNode(child.Name, sort, child.Name, DateTime.Now, icon)); - sort++; - } - - bindNodesToList(string.Empty); - } - } - } - - public void bindNodesToList(string sortBy) - { - if (string.IsNullOrEmpty(sortBy) == false) - { - switch (sortBy) - { - case "nodeName": - _nodes.Sort(new nodeNameCompare()); - break; - case "createDate": - _nodes.Sort(new createDateCompare()); - break; - } - } - - foreach (var n in _nodes) - lt_nodes.Text += string.Format( - "{1}{2} {3}{4}", - n.id, n.Name, n.createDate.ToShortDateString(), n.createDate.ToShortTimeString(), n.sortOrder, HideDateColumn ? "none" : "table-cell"); - } - - private static SortableNode CreateNode(string id, int sortOrder, string name, DateTime createDateTime, string icon) - { - var node = new SortableNode - { - id = id, - sortOrder = sortOrder, - Name = name, - icon = icon, - createDate = createDateTime - }; - return node; - } - - public class SortableNode - { - public string id; - public int sortOrder; - public string Name; - public string icon; - public DateTime createDate; - } - - /// - /// JsInclude1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude1; - - /// - /// JsInclude2 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::ClientDependency.Core.Controls.JsInclude JsInclude2; - - /// - /// prog1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::Umbraco.Web._Legacy.Controls.ProgressBar prog1; - - /// - /// sortDone control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal sortDone; - - /// - /// sortPane control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::Umbraco.Web._Legacy.Controls.Pane sortPane; - - /// - /// lt_nodes control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.WebControls.Literal lt_nodes; - - } - - public class nodeNameCompare : IComparer - { - - #region IComparer Members - - public int Compare(sort.SortableNode x, sort.SortableNode y) - { - var returnValue = String.Compare(x.Name, y.Name, StringComparison.Ordinal); - - return returnValue; - } - - #endregion - } - - public class createDateCompare : IComparer - { - - #region IComparer Members - - public int Compare(sort.SortableNode x, sort.SortableNode y) - { - var returnValue = x.createDate.CompareTo(y.createDate); - - return returnValue; - } - - #endregion - } -} From 2b25de4ae63ec6a6b9573f9d0862a7ddc6d70a15 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 Aug 2018 16:17:53 +0200 Subject: [PATCH 095/275] save sort order --- .../src/views/content/content.sort.controller.js | 16 +++++++--------- .../src/views/content/sort.html | 11 ++++++----- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index 03921a263e..d92cb22d19 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -21,27 +21,25 @@ vm.save = save; function onInit() { - vm.loading = true; - contentResource.getChildren(parentId) .then(function(data){ vm.children = data.items; vm.loading = false; - console.log(vm.children); }); } function save() { - - console.log(vm.nodes); vm.saveButtonState = "busy"; + + var args = { + parentId: parentId, + sortedIds: _.map(vm.children, function(child){ return child.id; }) + }; - // fake loading - $timeout(function () { + contentResource.sort(args).then(function(){ vm.saveButtonState = "success"; - }, 1000); - + }); } function fixSortableHelper(e, ui) { diff --git a/src/Umbraco.Web.UI.Client/src/views/content/sort.html b/src/Umbraco.Web.UI.Client/src/views/content/sort.html index 8a13a5463b..244f9851a6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/sort.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/sort.html @@ -36,10 +36,12 @@
    From 3dff904264a4cf684415cf3ecc8403fa18008d50 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 Aug 2018 17:15:26 +0200 Subject: [PATCH 096/275] get children from the current node id and not the parent --- .../src/views/content/content.sort.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index d92cb22d19..6858d16859 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -4,7 +4,7 @@ function ContentSortController($scope, $timeout, contentResource) { var vm = this; - var parentId = $scope.currentNode.parentId; + var id = $scope.currentNode.id; vm.loading = false; vm.children = []; @@ -22,7 +22,7 @@ function onInit() { vm.loading = true; - contentResource.getChildren(parentId) + contentResource.getChildren(id) .then(function(data){ vm.children = data.items; vm.loading = false; From 23c86ecc4a9dae5e448e4b6dc5a1287897080ff9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 Aug 2018 17:37:29 +0200 Subject: [PATCH 097/275] forgot the parentId was still in use --- .../src/views/content/content.sort.controller.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index 6858d16859..39b8d43e39 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -4,6 +4,7 @@ function ContentSortController($scope, $timeout, contentResource) { var vm = this; + var parentId = $scope.currentNode.parentId; var id = $scope.currentNode.id; vm.loading = false; From 1e5db346797a4b937341d6f761776ac155f4f999 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 2 Aug 2018 19:22:17 +0200 Subject: [PATCH 098/275] add empty state and error handling for save --- .../views/content/content.sort.controller.js | 13 ++++++++---- .../src/views/content/sort.html | 20 ++++++++++++++----- .../Umbraco/config/lang/en_us.xml | 1 + 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index 39b8d43e39..a6cc09c16e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function ContentSortController($scope, $timeout, contentResource) { + function ContentSortController($scope, $timeout, contentResource, navigationService) { var vm = this; var parentId = $scope.currentNode.parentId; @@ -38,9 +38,14 @@ sortedIds: _.map(vm.children, function(child){ return child.id; }) }; - contentResource.sort(args).then(function(){ - vm.saveButtonState = "success"; - }); + contentResource.sort(args) + .then(function(){ + navigationService.syncTree({ tree: "content", path: $scope.currentNode.path, forceReload: true, activate: false }); + vm.saveButtonState = "success"; + }).catch(function(error) { + vm.error = error; + vm.saveButtonState = "error"; + }); } function fixSortableHelper(e, ui) { diff --git a/src/Umbraco.Web.UI.Client/src/views/content/sort.html b/src/Umbraco.Web.UI.Client/src/views/content/sort.html index 244f9851a6..e189c2646a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/sort.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/sort.html @@ -3,16 +3,20 @@ + + + + + + From 237fcbead69f93ef22a142bf2bae9ff5597d2573 Mon Sep 17 00:00:00 2001 From: Warren Date: Fri, 3 Aug 2018 09:25:33 +0100 Subject: [PATCH 106/275] Last of the umbraco_client files removed --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 3 - .../Application/NamespaceManager.js | 17 - .../Application/UmbracoApplicationActions.js | 366 ------------------ .../Application/UmbracoUtils.js | 11 - .../UI/Bundles/JsApplicationLib.cs | 18 - .../UI/Bundles/JsUmbracoApplicationCore.cs | 13 - src/Umbraco.Web/Umbraco.Web.csproj | 2 - .../_Legacy/Controls/BaseTreePicker.cs | 14 +- .../controls/Tree/CustomTreeControl.cs | 3 - 9 files changed, 1 insertion(+), 446 deletions(-) delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/NamespaceManager.js delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js delete mode 100644 src/Umbraco.Web.UI/umbraco_client/Application/UmbracoUtils.js delete mode 100644 src/Umbraco.Web/UI/Bundles/JsApplicationLib.cs delete mode 100644 src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index 5c3403d0c0..e72fa9874f 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -357,9 +357,6 @@ - - - diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/NamespaceManager.js b/src/Umbraco.Web.UI/umbraco_client/Application/NamespaceManager.js deleted file mode 100644 index 9d4b86b2ba..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/NamespaceManager.js +++ /dev/null @@ -1,17 +0,0 @@ -if (typeof Umbraco == 'undefined') var Umbraco = {}; -if (!Umbraco.Sys) Umbraco.Sys = {}; - -Umbraco.Sys.registerNamespace = function(namespace) { - /// - /// Used to easily register namespaces for classes without doing the syntax listed on line 1/2 for each class. - /// Pretty much the same as ASP.NET's Type.registerNamespace, except in order to use it, you must register - /// all of your scripts with ScriptManager, this class doesn't require this. - /// - namespace = namespace.split('.'); - if (!window[namespace[0]]) window[namespace[0]] = {}; - var strFullNamespace = namespace[0]; - for (var i = 1; i < namespace.length; i++) { - strFullNamespace += "." + namespace[i]; - eval("if(!window." + strFullNamespace + ")window." + strFullNamespace + "={};"); - } -}; \ No newline at end of file diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js deleted file mode 100644 index 6280b19554..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoApplicationActions.js +++ /dev/null @@ -1,366 +0,0 @@ -Umbraco.Sys.registerNamespace("Umbraco.Application"); - -Umbraco.Application.Actions = function() { - /// - /// Application actions actions for the context menu, help dialogs, logout, etc... - /// This class supports an event listener model. Currently the available events are: - /// "nodeDeleting","nodeDeleted","nodeRefresh" - /// - - return { - _utils: Umbraco.Utils, //alias to Umbraco Utils - _dialogWindow: null, - /// A reference to a dialog window to open, any action that doesn't open in an overlay, opens in a dialog - _isDebug: false, //set to true to enable alert debugging - _windowTitle: " - Umbraco CMS - ", - _currApp: "", - _isSaving: "", - - addEventHandler: function(fnName, fn) { - /// Adds an event listener to the event name event - if (typeof(jQuery) != "undefined") jQuery(window.top).bind(fnName, fn); //if there's no jQuery, there is no events - }, - - removeEventHandler: function(fnName, fn) { - /// Removes an event listener to the event name event - if (typeof(jQuery) != "undefined") jQuery(window.top).unbind(fnName, fn); //if there's no jQuery, there is no events - }, - - showSpeachBubble: function(ico, hdr, msg) { - if (typeof(UmbClientMgr.mainWindow().UmbSpeechBubble) != "undefined") { - UmbClientMgr.mainWindow().UmbSpeechBubble.ShowMessage(ico, hdr, msg); - } - else alert(msg); - }, - - launchCreateWizard: function() { - /// Launches the create content wizard - - if (this._currApp == 'media' || this._currApp == 'content' || this._currApp == '') { - if (this._currApp == '') { - this._currApp = 'content'; - } - - UmbClientMgr.openModalWindow("dialogs/create.aspx?nodeType=" + this._currApp + "&app=" + this._currApp + "&rnd=" + this._utils.generateRandom(), UmbClientMgr.uiKeys()['actions_create'] + " " + this._currApp, true, 620, 470); - return false; - - } - else - alert('Not supported - please create by right clicking the parentnode and choose new...'); - }, - - logout: function(t) { - - if (!t) { - throw "The security token must be set in order to log a user out using this method"; - } - - if (confirm(UmbClientMgr.uiKeys()["defaultdialogs_confirmlogout"])) { - //raise beforeLogout event - jQuery(window.top).trigger("beforeLogout", []); - - document.location.href = 'logout.aspx?t=' + t; - } - return false; - }, - - submitDefaultWindow: function() { - - if (!this._isSaving) { - this._isSaving = true; - - //v6 way - var link = jQuery(".btn[id*=save]:first, .editorIcon[id*=save]:first, .editorIcon:input:image[id*=Save]:first"); - - //this is made of bad, to work around webforms horrible wiring - if(!link.hasClass("client-side") && link.attr("href").indexOf("javascript:") == 0){ - eval(link.attr('href').replace('javascript:','')); - }else{ - link.click(); - } - } - this._isSaving = false; - return false; - }, - - bindSaveShortCut: function () { - - var keys = "ctrl+s"; - if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { - keys = "meta+s"; - } - - jQuery(document).bind('keydown', keys, function (evt) { UmbClientMgr.appActions().submitDefaultWindow(); return false; }); - jQuery(":input").bind('keydown', keys, function (evt) { UmbClientMgr.appActions().submitDefaultWindow(); return false; }); - }, - - shiftApp: function (whichApp, appName) { - /// Changes the application - - this._debug("shiftApp: " + whichApp + ", " + appName); - - UmbClientMgr.mainTree().saveTreeState(this._currApp == "" ? "content" : this._currApp); - - this._currApp = whichApp.toLowerCase(); - - if (this._currApp != 'media' && this._currApp != 'content' && this._currApp != 'member') { - jQuery("#buttonCreate").attr("disabled", "true").fadeOut(400); - jQuery("#FindDocuments .umbracoSearchHolder").fadeOut(400); - } - else { - // create button should still remain disabled for the memebers section - if (this._currApp == 'member') { - jQuery("#buttonCreate").attr("disabled", "true").css("display", "inline-block").css("visibility", "hidden"); - } - else { - jQuery("#buttonCreate").removeAttr("disabled").fadeIn(500).css("visibility", "visible"); - } - jQuery("#FindDocuments .umbracoSearchHolder").fadeIn(500); - //need to set the recycle bin node id based on app - switch (this._currApp) { - case ("media"): - UmbClientMgr.mainTree().setRecycleBinNodeId(-21); - break; - case ("content"): - UmbClientMgr.mainTree().setRecycleBinNodeId(-20); - break; - } - } - - UmbClientMgr.mainTree().rebuildTree(whichApp, function(args) { - //the callback will fire when the tree rebuilding is done, we - //need to check the args to see if the tree was rebuild from cache - //and if it had a previously selected node, if it didn't then load the dashboard. - if (!args) { - UmbClientMgr.contentFrame('dashboard.aspx?app=' + whichApp); - } - }); - - jQuery("#treeWindowLabel").html(appName); - - UmbClientMgr.mainWindow().document.title = appName + this._windowTitle + window.location.hostname.toLowerCase().replace('www', ''); - }, - - getCurrApp: function() { - return this._currApp; - }, - - - //TODO: Move this into a window manager class - openDialog: function(diaTitle, diaDoc, dwidth, dheight, optionalParams) { - /// Opens the dialog window - - if (this._dialogWindow != null && !this._dialogWindow.closed) { - this._dialogWindow.close(); - } - this._dialogWindow = UmbClientMgr.mainWindow().open(diaDoc, 'dialogpage', "width=" + dwidth + "px,height=" + dheight + "px" + optionalParams); - }, - - openDashboard: function(whichApp) { - UmbClientMgr.contentFrame('dashboard.aspx?app=' + whichApp); - }, - - actionTreeEditMode: function() { - /// - UmbClientMgr.mainTree().toggleEditMode(true); - }, - - actionSort: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '0' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/sort.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&app=' + this._currApp + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_sort'], true, 600, 450); - } - - }, - - actionChangeDocType: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '0' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/changeDocType.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&app=' + this._currApp + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_changeDocType'], true, 600, 600); - } - - }, - - actionProtect: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/protectPage.aspx?mode=cut&nodeId=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_protect'], true, 535, 480); - } - }, - - actionRollback: function() { - /// - - UmbClientMgr.openModalWindow('dialogs/rollback.aspx?nodeId=' + UmbClientMgr.mainTree().getActionNode().nodeId + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_rollback'], true, 600, 550); - }, - - actionRefresh: function() { - /// - - //raise nodeRefresh event - jQuery(window.top).trigger("nodeRefresh", []); - }, - - actionNotify: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/notifications.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_notify'], true, 300, 480); - } - }, - - actionUpdate: function() { - /// - }, - - actionPublish: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '' != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/publish.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId, uiKeys['actions_publish'], true, 540, 280); - } - }, - - actionToPublish: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - if (confirm(uiKeys['defaultdialogs_confirmSure'] + '\n\n')) { - UmbClientMgr.openModalWindow('dialogs/SendPublish.aspx?id=' + UmbClientMgr.mainTree().getActionNode().nodeId + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_sendtopublish'], true, 300, 200); - } - } - }, - - actionQuit: function(t) { - - if (!t) { - throw "The security token must be set in order to log a user out using this method"; - } - - if (confirm(uiKeys['defaultdialogs_confirmlogout'] + '\n\n')) - document.location.href = 'logout.aspx?t=' + t; - }, - - actionRePublish: function() { - /// - - UmbClientMgr.openModalWindow('dialogs/republish.aspx?rnd=' + this._utils.generateRandom(), uiKeys['actions_republish'], true, 450, 210); - }, - - actionAssignDomain: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/assignDomain2.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId, uiKeys['actions_assignDomain'], true, 500, 620); - } - }, - - actionNew: function() { - /// Show the create new modal overlay - var actionNode = UmbClientMgr.mainTree().getActionNode(); - if (actionNode.nodeType != '') { - if (actionNode.nodeType == "content") { - UmbClientMgr.openModalWindow("create.aspx?nodeId=" + actionNode.nodeId + "&nodeType=" + actionNode.nodeType + "&nodeName=" + actionNode.nodeName + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_create'], true, 600, 425); - } - else if (actionNode.nodeType == "initmember") { - UmbClientMgr.openModalWindow("create.aspx?nodeId=" + actionNode.nodeId + "&nodeType=" + actionNode.nodeType + "&nodeName=" + actionNode.nodeName + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_create'], true, 480, 380); - } - else if (actionNode.nodeType == "users") { - UmbClientMgr.openModalWindow("create.aspx?nodeId=" + actionNode.nodeId + "&nodeType=" + actionNode.nodeType + "&nodeName=" + actionNode.nodeName + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_create'], true, 480, 380); - } - else { - UmbClientMgr.openModalWindow("create.aspx?nodeId=" + actionNode.nodeId + "&nodeType=" + actionNode.nodeType + "&nodeName=" + actionNode.nodeName + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_create'], true, 420, 270); - } - } - }, - - actionNewFolder: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeType != '') { - this.openDialog("Opret", "createFolder.aspx?nodeId=" + UmbClientMgr.mainTree().getActionNode().nodeId + "&nodeType=" + UmbClientMgr.mainTree().getActionNode().nodeType + "&nodeName=" + nodeName + '&rnd=' + this._utils.generateRandom(), 320, 225); - } - }, - - actionSendToTranslate: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeId != '-1' && UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/sendToTranslation.aspx?id=" + UmbClientMgr.mainTree().getActionNode().nodeId + '&rnd=' + this._utils.generateRandom(), uiKeys['actions_sendToTranslate'], true, 500, 470); - } - }, - - - actionImport: function() { - /// - - if (UmbClientMgr.mainTree().getActionNode().nodeType != '') { - UmbClientMgr.openModalWindow("dialogs/importDocumentType.aspx?rnd=" + this._utils.generateRandom(), uiKeys['actions_importDocumentType'], true, 460, 400); - } - }, - - actionPackage: function() { - /// - }, - - actionDelete: function() { - /// - - var actionNode = UmbClientMgr.mainTree().getActionNode(); - if (UmbClientMgr.mainTree().getActionNode().nodeType == "content" && UmbClientMgr.mainTree().getActionNode().nodeId == '-1') - return; - - this._debug("actionDelete"); - - // tg: quick workaround for the are you sure you want to delete 'null' confirm message happening when deleting xslt files - currrentNodeName = UmbClientMgr.mainTree().getActionNode().nodeName; - if (currrentNodeName == null || currrentNodeName == "null") { - currrentNodeName = UmbClientMgr.mainTree().getActionNode().nodeId; - } - - if (confirm(uiKeys['defaultdialogs_confirmdelete'] + ' "' + currrentNodeName + '"?\n\n')) { - //raise nodeDeleting event - jQuery(window.top).trigger("nodeDeleting", []); - var _this = this; - - //check if it's in the recycle bin - if (actionNode.jsNode.closest("li[id='-20']").length == 1 || actionNode.jsNode.closest("li[id='-21']").length == 1) { - umbraco.presentation.webservices.legacyAjaxCalls.DeleteContentPermanently( - UmbClientMgr.mainTree().getActionNode().nodeId, - UmbClientMgr.mainTree().getActionNode().nodeType, - function() { - _this._debug("actionDelete: Raising event"); - //raise nodeDeleted event - jQuery(window.top).trigger("nodeDeleted", []); - }); - } - else { - umbraco.presentation.webservices.legacyAjaxCalls.Delete( - UmbClientMgr.mainTree().getActionNode().nodeId, - UmbClientMgr.mainTree().getActionNode().nodeName, - UmbClientMgr.mainTree().getActionNode().nodeType, - function() { - _this._debug("actionDelete: Raising event"); - //raise nodeDeleted event - jQuery(window.top).trigger("nodeDeleted", []); - }, - function(error) { - _this._debug("actionDelete: Raising public error event"); - //raise public error event - jQuery(window.top).trigger("publicError", [error]); - }); - } - } - - }, - - _debug: function(strMsg) { - if (this._isDebug) { - Sys.Debug.trace("AppActions: " + strMsg); - } - } - }; -}; diff --git a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoUtils.js b/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoUtils.js deleted file mode 100644 index 1435f27cce..0000000000 --- a/src/Umbraco.Web.UI/umbraco_client/Application/UmbracoUtils.js +++ /dev/null @@ -1,11 +0,0 @@ -/// - -Umbraco.Sys.registerNamespace("Umbraco.Utils"); - -Umbraco.Utils.generateRandom = function() { - /// Returns a random integer for use with URLs - var day = new Date(); - var z = day.getTime(); - var y = (z - (parseInt(z / 1000, 10) * 1000)) / 10; - return y; -} diff --git a/src/Umbraco.Web/UI/Bundles/JsApplicationLib.cs b/src/Umbraco.Web/UI/Bundles/JsApplicationLib.cs deleted file mode 100644 index 7ba6e14567..0000000000 --- a/src/Umbraco.Web/UI/Bundles/JsApplicationLib.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Web.UI; -using ClientDependency.Core; - -namespace Umbraco.Web.UI.Bundles -{ - /// - /// The core libs that have no dependencies - /// - [ClientDependency(ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient", Priority = 0, Group = 0)] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient", Priority = 1, Group = 0)] - public class JsApplicationLib : Control - { - } -} diff --git a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs b/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs deleted file mode 100644 index 712f6e6a1d..0000000000 --- a/src/Umbraco.Web/UI/Bundles/JsUmbracoApplicationCore.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Web.UI; -using ClientDependency.Core; - -namespace Umbraco.Web.UI.Bundles -{ - /// - /// The core libs that require JQuery to be loaded - /// - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient", Priority = 1, Group = 2)] - public class JsUmbracoApplicationCore : Control - { - } -} diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index b1d950cc1f..e981d5aa25 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -959,9 +959,7 @@ - - diff --git a/src/Umbraco.Web/_Legacy/Controls/BaseTreePicker.cs b/src/Umbraco.Web/_Legacy/Controls/BaseTreePicker.cs index 7de4b9d4e0..d0ff91dc8c 100644 --- a/src/Umbraco.Web/_Legacy/Controls/BaseTreePicker.cs +++ b/src/Umbraco.Web/_Legacy/Controls/BaseTreePicker.cs @@ -1,24 +1,12 @@ using System; -using System.Web.UI; -using ClientDependency.Core; -using ClientDependency.Core.Controls; +using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; -using umbraco.cms.businesslogic; -using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Services; namespace Umbraco.Web._Legacy.Controls { - - /* - [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Css, "modal/style.css", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "modal/modal.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoClientManager.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient")]*/ - [ValidationProperty("Value")] public abstract class BaseTreePicker : Control, INamingContainer { diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs index 783044ac75..12b056fedd 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/CustomTreeControl.cs @@ -17,9 +17,6 @@ namespace umbraco.controls.Tree /// Since we're inheriting from a UserControl and all of the ClientDependency registrations are done inline, we need /// to re-register the ClientDependencies. /// - [ClientDependency(0, ClientDependencyType.Javascript, "Application/NamespaceManager.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoApplicationActions.js", "UmbracoClient")] - [ClientDependency(ClientDependencyType.Javascript, "Application/UmbracoUtils.js", "UmbracoClient")] [ClientDependency(11, ClientDependencyType.Javascript, "Tree/jquery.tree.js", "UmbracoClient")] [ClientDependency(12, ClientDependencyType.Javascript, "Tree/UmbracoContext.js", "UmbracoClient")] [ClientDependency(12, ClientDependencyType.Javascript, "Tree/jquery.tree.contextmenu.js", "UmbracoClient")] From 85938e5432160b87821626477c1113cd046b2fe9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 3 Aug 2018 10:52:09 +0200 Subject: [PATCH 107/275] fix sorting of root nodes --- .../src/views/content/content.sort.controller.js | 4 ++-- .../src/views/media/media.sort.controller.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index 0f4d73cbdb..d28ba32686 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -47,9 +47,9 @@ contentResource.sort(args) .then(function(){ - navigationService.syncTree({ tree: "content", path: $scope.currentNode.path, forceReload: true, activate: false }); + // navigationService.syncTree({ tree: "content", path: $scope.currentNode.path, forceReload: true, activate: false }); vm.saveButtonState = "success"; - }).catch(function(error) { + }, function(error) { vm.error = error; vm.saveButtonState = "error"; }); diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js index 7b2598c9b4..00758ca0f1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js @@ -47,9 +47,9 @@ mediaResource.sort(args) .then(function(){ - navigationService.syncTree({ tree: "media", path: $scope.currentNode.path, forceReload: true, activate: false }); + // navigationService.syncTree({ tree: "media", path: $scope.currentNode.path, forceReload: true, activate: false }); vm.saveButtonState = "success"; - }).catch(function(error) { + }, function(error) { vm.error = error; vm.saveButtonState = "error"; }); From 41f5d7d113833a122a524c545669b6a5404fcfcf Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 3 Aug 2018 11:17:48 +0200 Subject: [PATCH 108/275] This treeSync code doesn't work and I don't know why --- .../src/views/content/content.sort.controller.js | 2 +- .../src/views/media/media.sort.controller.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js index d28ba32686..4581b78c8c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js @@ -47,7 +47,7 @@ contentResource.sort(args) .then(function(){ - // navigationService.syncTree({ tree: "content", path: $scope.currentNode.path, forceReload: true, activate: false }); + navigationService.syncTree({ tree: "content", path: $scope.currentNode.path, forceReload: true, activate: false }); vm.saveButtonState = "success"; }, function(error) { vm.error = error; diff --git a/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js index 00758ca0f1..e7d3cc2dfb 100644 --- a/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/media/media.sort.controller.js @@ -47,7 +47,7 @@ mediaResource.sort(args) .then(function(){ - // navigationService.syncTree({ tree: "media", path: $scope.currentNode.path, forceReload: true, activate: false }); + navigationService.syncTree({ tree: "media", path: $scope.currentNode.path, forceReload: true, activate: false }); vm.saveButtonState = "success"; }, function(error) { vm.error = error; From 7aaf0243977adc63846362f7f70e3b31c0d3f664 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 6 Aug 2018 16:50:40 +1000 Subject: [PATCH 109/275] more work on validation, saving and publishing --- src/Umbraco.Core/Models/Property.cs | 3 ++ src/Umbraco.Core/Models/PropertyType.cs | 4 +- .../components/content/edit.controller.js | 49 ++++++++++++++----- .../content/tabbedcontent.directive.js | 6 +++ .../validation/valregex.directive.js | 2 +- .../services/contenteditinghelper.service.js | 23 +++++++++ .../overlays/publish/publish.controller.js | 18 +++++-- .../common/overlays/publish/publish.html | 2 +- .../components/content/tabbed-content.html | 28 ++++++----- .../components/editor/umb-editor-header.html | 4 +- .../Umbraco/config/lang/en_us.xml | 2 +- src/Umbraco.Web/Editors/ContentController.cs | 49 +++++++++++++++++-- .../Editors/ContentControllerBase.cs | 2 +- 13 files changed, 150 insertions(+), 42 deletions(-) diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index c0dd97ff87..bb922a740b 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -343,6 +343,8 @@ namespace Umbraco.Core.Models /// internal bool IsValid(string culture = "*", string segment = "*") { + //fixme - validating values shouldn't be done here, this calls in to IsValidValue + culture = culture.NullOrWhiteSpaceAsNull(); segment = segment.NullOrWhiteSpaceAsNull(); @@ -382,6 +384,7 @@ namespace Umbraco.Core.Models /// True is property value is valid, otherwise false private bool IsValidValue(object value) { + //fixme this shouldn't exist here, the model itself shouldn't be responsible for it's own validation and this requires singleton access return PropertyType.IsPropertyValueValid(value); } diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index 3d5fac2077..a34fdb04ed 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -378,11 +378,11 @@ namespace Umbraco.Core.Models } - //fixme - perhaps this and other validation methods should be a service level (not a model) thing? + //fixme - this and other value validation methods should be a service level (not a model) thing. Changing this to internal for now /// /// Determines whether a value is valid for this property type. /// - public bool IsPropertyValueValid(object value) + internal bool IsPropertyValueValid(object value) { var editor = Current.PropertyEditors[_propertyEditorAlias]; // fixme inject? var configuration = Current.Services.DataTypeService.GetDataType(_dataTypeId).Configuration; // fixme inject? diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 90d9bc278f..cf1485be34 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -96,6 +96,18 @@ else { //this will mean there is only one $scope.editors[0].content = activeVariant; + + if ($scope.editors.length > 1) { + //now re-sync any other editor content (i.e. if split view is open) + for (var s = 1; s < $scope.editors.length; s++) { + //get the variant from the scope model + var variant = _.find($scope.content.variants, function (v) { + return v.language.culture === $scope.editors[s].content.language.culture; + }); + $scope.editors[s].content = initVariant(variant); + } + } + } } @@ -115,21 +127,31 @@ if (variant.language) { //if the variant list that defines the header drop down isn't assigned to the variant then assign it now if (!variant.variants) { - variant.variants = _.map($scope.content.variants, function (v) { - return _.pick(v, "active", "language", "validationError", "isEdited", "state"); - }); + variant.variants = _.map($scope.content.variants, + function(v) { + return _.pick(v, "active", "language", "isEdited", "state"); + }); } - //ensure the current culture is set as the active one - for (var i = 0; i < variant.variants.length; i++) { - if (variant.variants[i].language.culture === variant.language.culture) { - variant.variants[i].active = true; - } - else { - variant.variants[i].active = false; - } + else { + //merge the scope variants on top of the header variants collection (handy when needing to refresh) + angular.extend(variant.variants, + _.map($scope.content.variants, + function(v) { + return _.pick(v, "active", "language", "isEdited", "state"); + })); } } - + + //ensure the current culture is set as the active one + for (var i = 0; i < variant.variants.length; i++) { + if (variant.variants[i].language.culture === variant.language.culture) { + variant.variants[i].active = true; + } + else { + variant.variants[i].active = false; + } + } + //then assign the variant to a view model to the content app var contentApp = _.find(variant.apps, function (a) { return a.alias === "content"; @@ -281,7 +303,7 @@ $scope.page.buttonGroupState = "success"; eventsService.emit("content.saved", { content: $scope.content, action: args.action }); - + return $q.when(data); }, function (err) { @@ -291,6 +313,7 @@ } $scope.page.buttonGroupState = "error"; + return $q.reject(err); }); } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/tabbedcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/tabbedcontent.directive.js index ba68cb4e10..3b4dabda5f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/tabbedcontent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/tabbedcontent.directive.js @@ -12,6 +12,12 @@ //expose the property/methods for other directives to use this.content = $scope.content; + $scope.$watch("tabbedContentForm.$dirty", + function (newValue, oldValue) { + if (newValue === true) { + $scope.content.isDirty = true; + } + }); }, link: function(scope) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valregex.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valregex.directive.js index 5d3c7431a2..123962c32c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valregex.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valregex.directive.js @@ -41,7 +41,7 @@ function valRegex() { //An ngModel is supplied, assign a render function which is called when the model is changed var oldRender = ctrl.$render; ctrl.$render = function () { - patternValidator(newValue); + patternValidator(ctrl.$viewValue); //call any previously set render method if (oldRender) { oldRender(); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index 2c227bcd13..fe2a539019 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -422,6 +422,8 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica */ reBindChangedProperties: function (origContent, savedContent) { + //TODO: We should probably split out this logic to deal with media/members seperately to content + //a method to ignore built-in prop changes var shouldIgnore = function(propName) { return _.some([ @@ -489,6 +491,27 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica var origVariant = origVariants[j]; var savedVariant = savedVariants[j]; + //if it's content (not media/members), then we need to sync the variant specific data + if (origContent.variants) { + + //the variant property names we want to sync + var variantPropertiesSync = ["active", "language", "isEdited", "state"]; + + for (var b in origVariant) { + + var shouldCompare = _.some(variantPropertiesSync, function(e) { + return e === b; + }); + + //only compare the explicit ones or ones we don't ignore + if (shouldCompare || !shouldIgnore(b)) { + if (!_.isEqual(origVariant[b], savedVariant[b])) { + origVariant[b] = savedVariant[b]; + } + } + } + } + //get a list of properties since they are contained in tabs var allOrigProps = this.getAllProps(origVariant); var allNewProps = this.getAllProps(savedVariant); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js index ba8d4f1712..d4ee67ea55 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js @@ -12,9 +12,7 @@ vm.hasPristineVariants = false; //watch this model, if it's reset, then re init - $scope.$watch(function () { - return $scope.model.variants; - }, + $scope.$watch("model.variants", function (newVal, oldVal) { vm.variants = newVal; if (oldVal && oldVal.length) { @@ -39,7 +37,12 @@ } function dirtyVariantFilter(variant) { - return (variant.current || variant.isEdited === true || (variant.isEdited === false && variant.state === "Unpublished")); + //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's + // * the active one + // * it's editor is in a $dirty state + // * it has pending saves + // * it is unpublished + return (variant.active || variant.isDirty || variant.isEdited === true || (variant.isEdited === false && variant.state === "Unpublished")); } function pristineVariantFilter(variant) { @@ -72,8 +75,13 @@ vm.variants = _.sortBy(vm.variants, function (v) { return v.current ? 0 : 1; }); + + var active = _.find(vm.variants, function (v) { + return v.active; + }); //ensure that the current one is selected - vm.variants[0].publish = true; + active.publish = true; + } else { //disable Publish button if we have nothing to publish $scope.model.disableSubmitButton = true; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html index 9e95efe2cf..943e9d9477 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html @@ -49,7 +49,7 @@
    {{ variant.language.name }}
    -
    {{ variant.state }}
    +
    {{ variant.state }}
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/tabbed-content.html b/src/Umbraco.Web.UI.Client/src/views/components/content/tabbed-content.html index eb7a541a42..80f1a35021 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/tabbed-content.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/tabbed-content.html @@ -1,17 +1,19 @@ 
    -
    + +
    + +
    +
    {{ group.label }}
    +   +
    + +
    + + + + +
    -
    -
    {{ group.label }}
    -  
    - -
    - - - - -
    - -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html index 6a545dad5e..b50762317e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-header.html @@ -63,8 +63,8 @@ {{variant.language.name}} - - + + {{variant.state}} diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index 98ad4ea404..776d8d8ea6 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -1458,7 +1458,7 @@ To manage your website, simply open the Umbraco back office and start adding con Invite user Invitation has been re-sent to %0% Cannot publish the document since the required '%0%' is not published - Unexpected validation failed for language '%0%' + Validation failed for language '%0%' Document type was exported to file An error occurred while exporting the document type diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 64e8ec1975..822b375217 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -771,7 +771,7 @@ namespace Umbraco.Web.Editors foreach (var lang in mandatoryLangs) { //Check if a mandatory language is missing from being published - //TODO: This logic is wrong, we need to also check if this language doesn't already have a published version + //fixme: This logic is wrong, we need to also check if this language doesn't already have a published version if (cultureVariants.Any(x => x.Culture == lang.IsoCode && !x.Publish)) { //cannot continue publishing since a required language that is not currently being published isn't published @@ -821,8 +821,7 @@ namespace Umbraco.Web.Editors var valid = persistentContent.PublishCulture(variant.Culture); if (!valid) { - var errMsg = Services.TextService.Localize("speechBubbles/contentCultureUnexpectedValidationError", new[] { allLangs[variant.Culture].CultureName }); - ModelState.AddModelError("publish_variant_" + variant.Culture + "_", errMsg); + AddCultureValidationError(variant.Culture, allLangs); return false; } } @@ -830,6 +829,19 @@ namespace Umbraco.Web.Editors return true; } + /// + /// Adds a generic culture error for use in displaying the culture validation error in the save/publish dialogs + /// + /// + /// + private void AddCultureValidationError(string culture, IDictionary allLangs) + { + var key = "publish_variant_" + culture + "_"; + if (ModelState.ContainsKey(key)) return; + var errMsg = Services.TextService.Localize("speechBubbles/contentCultureValidationError", new[] { allLangs[culture].CultureName }); + ModelState.AddModelError(key, errMsg); + } + /// /// Publishes a document with a given ID /// @@ -1191,6 +1203,37 @@ namespace Umbraco.Web.Editors return model; } + /// + /// Override to ensure there is culture specific errors in the result if any errors are for culture properties + /// + /// + /// + /// This is required to wire up the validation in the save/publish dialog + /// + protected override void HandleInvalidModelState(IErrorModel display) + { + if (!ModelState.IsValid) + { + //Add any culture specific errors here + var cultureErrors = ModelState.Keys + .Select(x => x.Split('.')) //split into parts + .Where(x => x.Length >= 3 && x[0] == "_Properties") //only choose _Properties errors + .Select(x => x[2]) //select the culture part + .Where(x => !x.IsNullOrWhiteSpace()) //if it has a value + .Distinct() + .ToList(); + + var allLangs = Services.LocalizationService.GetAllLanguages().ToDictionary(x => x.IsoCode, x => x, StringComparer.InvariantCultureIgnoreCase); + + foreach (var cultureError in cultureErrors) + { + AddCultureValidationError(cultureError, allLangs); + } + } + + base.HandleInvalidModelState(display); + } + /// /// Maps the dto property values to the persisted model /// diff --git a/src/Umbraco.Web/Editors/ContentControllerBase.cs b/src/Umbraco.Web/Editors/ContentControllerBase.cs index 9291b2267a..164e1cfc62 100644 --- a/src/Umbraco.Web/Editors/ContentControllerBase.cs +++ b/src/Umbraco.Web/Editors/ContentControllerBase.cs @@ -102,7 +102,7 @@ namespace Umbraco.Web.Editors } } - protected void HandleInvalidModelState(IErrorModel display) + protected virtual void HandleInvalidModelState(IErrorModel display) { //lasty, if it is not valid, add the modelstate to the outgoing object and throw a 403 if (!ModelState.IsValid) From a0f7dbbc607c56fa497dbd595497948f1c01b005 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 6 Aug 2018 18:05:04 +1000 Subject: [PATCH 110/275] Only update variant info if it is dirty --- .../directives/components/content/edit.controller.js | 9 +++++++++ .../common/services/contenteditinghelper.service.js | 5 +++-- .../src/common/services/umbdataformatter.service.js | 3 ++- src/Umbraco.Web/Editors/ContentController.cs | 3 +++ .../Models/ContentEditing/ContentVariantSave.cs | 12 ++++++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index cf1485be34..8af09e3c00 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -283,6 +283,15 @@ // This is a helper method to reduce the amount of code repitition for actions: Save, Publish, SendToPublish function performSave(args) { + //update the 'save' boolean of each variant if they are flagged as being dirty + //TODO: This is also where we'd set this flag when we have the save dialog + for (var i = 0; i < $scope.content.variants.length; i++) { + var v = $scope.content.variants[i]; + if (v.isDirty) { + v.save = true; + } + } + $scope.page.buttonGroupState = "busy"; eventsService.emit("content.saving", { content: $scope.content, action: args.action }); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index fe2a539019..42190535b4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -518,8 +518,9 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica //check for changed properties of the content for (var p in allOrigProps) { - var newProp = getNewProp(allOrigProps[p].alias, allOrigProps); - if (newProp && !_.isEqual(allOrigProps[p].value, newProp.value)) { + var alias = allOrigProps[p].alias; + var newProp = getNewProp(alias, allNewProps); + if (newProp && !_.isEqual(alias, newProp.value)) { //they have changed so set the origContent prop to the new one var origVal = allOrigProps[p].value; diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js index a93cdf93d8..09b17b273f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js @@ -368,7 +368,8 @@ name: v.name, properties: getContentProperties(v.tabs), culture: v.language.culture, - publish: v.publish + publish: v.publish, + save: v.save }; }) }; diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 822b375217..ae33e3c261 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -1246,6 +1246,9 @@ namespace Umbraco.Web.Editors //loop through each variant, set the correct name and property values foreach (var variant in contentSave.Variants) { + //Don't update anything for this variant if Save is not true + if (!variant.Save) continue; + //Don't update the name if it is empty if (!variant.Name.IsNullOrWhiteSpace()) { diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs index dc50129b37..18d1e037b6 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs @@ -26,9 +26,21 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "culture")] public string Culture { get; set; } + /// + /// Indicates if the variant should be updated + /// + /// + /// If this is false, this variant data will not be updated at all + /// + [DataMember(Name = "save")] + public bool Save { get; set; } + /// /// Indicates if the variant should be published or unpublished /// + /// + /// This option will have no affect if is false + /// [DataMember(Name = "publish")] public bool Publish { get; set; } From fc7db11c6c0ce9b4468d07188427a65fdba6a98b Mon Sep 17 00:00:00 2001 From: elitsa Date: Mon, 6 Aug 2018 10:45:51 +0200 Subject: [PATCH 111/275] Changed the Danish language file - added the Dictionary title --- src/Umbraco.Web.UI/umbraco/config/lang/da.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml index fb5dc26a1a..0bec7b968d 100644 --- a/src/Umbraco.Web.UI/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/umbraco/config/lang/da.xml @@ -422,6 +422,7 @@ Navnet '%0%' eksisterer allerede. ]]> + Ordbog Indtast dit brugernavn From 85b18eec05f975611a6f8395e021c8bab54c5848 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 6 Aug 2018 10:47:20 +0200 Subject: [PATCH 112/275] only allow to open template if user has access to settings section --- .../components/content/umbcontentnodeinfo.directive.js | 2 ++ .../src/views/components/content/umb-content-node-info.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js index 78d6eda0f2..5f9f1f4a36 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbcontentnodeinfo.directive.js @@ -12,6 +12,7 @@ scope.disableTemplates = Umbraco.Sys.ServerVariables.features.disabledFeatures.disableTemplates; scope.allowChangeDocumentType = false; + scope.allowChangeTemplate = false; function onInit() { @@ -20,6 +21,7 @@ angular.forEach(user.sections, function(section){ if(section.alias === "settings") { scope.allowChangeDocumentType = true; + scope.allowChangeTemplate = true; } }); }); diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html index ac38761010..498134d6e0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html @@ -197,7 +197,7 @@ ng-change="updateTemplate(node.template)"> - + Open
    From 4730ee317bfdbf38ddb0f265b65990645494af83 Mon Sep 17 00:00:00 2001 From: Warren Date: Mon, 6 Aug 2018 11:52:12 +0100 Subject: [PATCH 113/275] Removes some unused .aspx files for dictionary editing - no longer needed as we now have this in Angular --- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 - .../Umbraco/settings/DictionaryItemList.aspx | 16 -- .../Umbraco/settings/EditDictionaryItem.aspx | 14 -- src/Umbraco.Web/UI/Bundles/JsJQueryCore.cs | 1 + src/Umbraco.Web/Umbraco.Web.csproj | 23 +-- .../umbraco/settings/DictionaryItemList.aspx | 16 -- .../settings/DictionaryItemList.aspx.cs | 64 ------- .../DictionaryItemList.aspx.designer.cs | 42 ----- .../umbraco/settings/EditDictionaryItem.aspx | 15 -- .../settings/EditDictionaryItem.aspx.cs | 175 ------------------ .../EditDictionaryItem.aspx.designer.cs | 24 --- 11 files changed, 4 insertions(+), 388 deletions(-) delete mode 100644 src/Umbraco.Web.UI/Umbraco/settings/DictionaryItemList.aspx delete mode 100644 src/Umbraco.Web.UI/Umbraco/settings/EditDictionaryItem.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/DictionaryItemList.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/DictionaryItemList.aspx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/DictionaryItemList.aspx.designer.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditDictionaryItem.aspx delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditDictionaryItem.aspx.cs delete mode 100644 src/Umbraco.Web/umbraco.presentation/umbraco/settings/EditDictionaryItem.aspx.designer.cs diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e72fa9874f..c90722c08c 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -457,7 +457,6 @@ - @@ -469,7 +468,6 @@ Form - diff --git a/src/Umbraco.Web.UI/Umbraco/settings/DictionaryItemList.aspx b/src/Umbraco.Web.UI/Umbraco/settings/DictionaryItemList.aspx deleted file mode 100644 index 80b505f382..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/settings/DictionaryItemList.aspx +++ /dev/null @@ -1,16 +0,0 @@ -<%@ Page Language="C#" AutoEventWireup="true" Codebehind="DictionaryItemList.aspx.cs" - Inherits="umbraco.presentation.settings.DictionaryItemList" MasterPageFile="../masterpages/umbracoPage.Master" %> -<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %> - - - - - - - - -
    -
    -
    - -
    \ No newline at end of file diff --git a/src/Umbraco.Web.UI/Umbraco/settings/EditDictionaryItem.aspx b/src/Umbraco.Web.UI/Umbraco/settings/EditDictionaryItem.aspx deleted file mode 100644 index ffb5ae035d..0000000000 --- a/src/Umbraco.Web.UI/Umbraco/settings/EditDictionaryItem.aspx +++ /dev/null @@ -1,14 +0,0 @@ -<%@ Register TagPrefix="cc1" Namespace="Umbraco.Web._Legacy.Controls" Assembly="Umbraco.Web" %> - -<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoPage.Master" ValidateRequest="false" - CodeBehind="EditDictionaryItem.aspx.cs" AutoEventWireup="True" Inherits="umbraco.settings.EditDictionaryItem" %> - - - - - - diff --git a/src/Umbraco.Web/UI/Bundles/JsJQueryCore.cs b/src/Umbraco.Web/UI/Bundles/JsJQueryCore.cs index bb8c8be773..570551c0bf 100644 --- a/src/Umbraco.Web/UI/Bundles/JsJQueryCore.cs +++ b/src/Umbraco.Web/UI/Bundles/JsJQueryCore.cs @@ -6,6 +6,7 @@ namespace Umbraco.Web.UI.Bundles /// /// The core Jquery libs /// + [ClientDependency(ClientDependencyType.Javascript, "lib/jquery/jquery.min.js", "UmbracoRoot", Priority = 1, Group = 1)] [ClientDependency(ClientDependencyType.Javascript, "lib/jquery-migrate/jquery-migrate.min.js", "UmbracoRoot", Priority = 2, Group = 1)] public class JsJQueryCore : Control { diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e981d5aa25..6cc212bfef 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -1304,20 +1304,6 @@ sendToTranslation.aspx - - DictionaryItemList.aspx - ASPXCodeBehind - - - DictionaryItemList.aspx - - - EditDictionaryItem.aspx - ASPXCodeBehind - - - EditDictionaryItem.aspx - Code @@ -1421,17 +1407,11 @@ - - ASPXCodeBehind - ASPXCodeBehind - - ASPXCodeBehind - @@ -1522,6 +1502,9 @@ umbraco_org_umbraco_update_CheckForUpgrade + + + -
    -
    - -
    -
    - - - Drop to upload - -
    - - or click here to choose files -
    -
    -
    -
    -
    - > - cancel - - -
    - - Name: - - {{vm.model.name}} -
    - - Alias: - - {{vm.model.alias}} -
    -
    - -
    -
    - {{vm.model.name}} has been imported! -
    - - - - diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/importdocumenttype.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/importdocumenttype.html new file mode 100644 index 0000000000..db6c19da98 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/importdocumenttype.html @@ -0,0 +1,53 @@ +
    +
    +

    + + To import a document type, find the '.udt' file on your computer by clicking the 'Browse' button and click 'Import' (you'll be asked for confirmation on the next screen) + +

    + +
    + + + + + or + + + Cancel + +
    + +
    Please choose a .udt file to import
    + + + +
    +
    + + Name: + + {{vm.model.name}} +
    + + Alias: + + {{vm.model.alias}} +
    +
    + +
    +
    + {{vm.model.name}} has been imported! +
    +
    From 1842c78c5d9d00a136eba5a25811fe1a14aaa969 Mon Sep 17 00:00:00 2001 From: Warren Date: Wed, 8 Aug 2018 15:26:25 +0100 Subject: [PATCH 158/275] Fix for navigation service for hideDialog(true) which is used to hide the current dialog & show the right click context/more options menu which was failing --- .../src/common/services/navigation.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js index 74e8f7d1a5..5872649770 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js @@ -623,7 +623,7 @@ function navigationService($rootScope, $route, $routeParams, $log, $location, $q setMode("default"); if(showMenu){ - this.showMenu(undefined, { skipDefault: true, node: appState.getMenuState("currentNode") }); + this.showMenu({ skipDefault: true, node: appState.getMenuState("currentNode") }); } }, /** From c73860d144f5287b8ff10f53206a6cdcdba34a35 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 8 Aug 2018 19:52:00 +0200 Subject: [PATCH 159/275] start eslint from scratch so we slowly can add more rules for easier merging to v8 --- src/Umbraco.Web.UI.Client/.eslintrc | 31 +- src/Umbraco.Web.UI.Client/gulpfile.js | 8 + src/Umbraco.Web.UI.Client/package-lock.json | 10487 ++++++++++++++++++ src/Umbraco.Web.UI.Client/package.json | 1 + 4 files changed, 10497 insertions(+), 30 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/package-lock.json diff --git a/src/Umbraco.Web.UI.Client/.eslintrc b/src/Umbraco.Web.UI.Client/.eslintrc index 205d8dcf50..1b39098cfc 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc +++ b/src/Umbraco.Web.UI.Client/.eslintrc @@ -3,37 +3,8 @@ "browser": true }, - "plugins": [ - "angular" - ], - "rules": { - "eqeqeq": 2, - "curly": 2, - - "no-unused-vars": 1, - "no-eval": 1, - "no-delete-var": 1, - "quotes": 1, - "dot-notation": 1, - - "no-use-before-define": 0, - "angular/ng_controller_as": 1, - "angular/ng_controller_as_vm": 1, - - - "strict": 0, - "no-irregular-whitespace": 0, - "no-mixed-spaces-and-tabs": 0, - "no-multi-spaces": 0, - "key-spacing": 0, - "semi-spacing": 0, - "space-infix-ops": 0, - "comma-spacing": 0, - "no-trailing-spaces": 0, - "eol-last": 0, - "no-underscore-dangle": 0, - "camelcase": 0 + "comma-dangle": ["error", "never"] }, "globals": { diff --git a/src/Umbraco.Web.UI.Client/gulpfile.js b/src/Umbraco.Web.UI.Client/gulpfile.js index 86db319aec..5c24a22150 100644 --- a/src/Umbraco.Web.UI.Client/gulpfile.js +++ b/src/Umbraco.Web.UI.Client/gulpfile.js @@ -12,6 +12,9 @@ const imagemin = require('gulp-imagemin'); var _ = require('lodash'); var MergeStream = require('merge-stream'); +// js +const eslint = require('gulp-eslint'); + //Less + css var postcss = require('gulp-postcss'); var less = require('gulp-less'); @@ -30,6 +33,11 @@ Helper functions function processJs(files, out) { return gulp.src(files) + // check for js errors + .pipe(eslint()) + // outputs the lint results to the console + .pipe(eslint.format()) + // sort files in stream by path or any custom sort comparator .pipe(sort()) .pipe(concat(out)) .pipe(wrap('(function(){\n%= body %\n})();')) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json new file mode 100644 index 0000000000..b11de54152 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -0,0 +1,10487 @@ +{ + "name": "umbraco", + "version": "7.1.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", + "dev": true + }, + "accepts": { + "version": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "dev": true, + "requires": { + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + } + }, + "accord": { + "version": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", + "integrity": "sha1-vsUWovci59UPX59C+Bt387lUSLo=", + "dev": true, + "requires": { + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "indx": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "lodash.clone": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "lodash.flatten": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "lodash.merge": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "lodash.partialright": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "lodash.pick": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "when": "https://registry.npmjs.org/when/-/when-3.7.8.tgz" + }, + "dependencies": { + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true + } + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", + "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", + "dev": true, + "requires": { + "acorn": "5.7.1" + } + }, + "after": { + "version": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "align-text": { + "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "alphanum-sort": { + "version": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "amdefine": { + "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "angular": { + "version": "https://registry.npmjs.org/angular/-/angular-1.3.20.tgz", + "integrity": "sha1-sjo9fF5/mffZW5tNSbmsNVJpuu4=", + "dev": true + }, + "angular-animate": { + "version": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.3.20.tgz", + "integrity": "sha1-0XB8cn+K0N8hxKLewgzX/ElFtSo=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + } + }, + "ansi-cyan": { + "version": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + } + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-gray": { + "version": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + } + }, + "ansi-red": { + "version": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + } + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "ansi-wrap": { + "version": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "dev": true, + "requires": { + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + }, + "dependencies": { + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + } + } + } + }, + "archive-type": { + "version": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", + "dev": true, + "requires": { + "file-type": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" + }, + "dependencies": { + "file-type": { + "version": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + } + } + }, + "archy": { + "version": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + } + }, + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-slice": { + "version": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "dev": true + }, + "array-union": { + "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + } + }, + "array-uniq": { + "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "dev": true, + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" + } + }, + "async-each": { + "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-each-series": { + "version": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "autoprefixer": { + "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", + "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "aws-sign2": { + "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "js-tokens": "3.0.2" + } + }, + "backo2": { + "version": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "class-utils": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "mixin-deep": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "pascalcase": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + } + }, + "is-accessor-descriptor": { + "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-data-descriptor": { + "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-descriptor": { + "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + } + } + }, + "base64-arraybuffer": { + "version": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-url": { + "version": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=", + "dev": true + }, + "base64id": { + "version": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "basic-auth": { + "version": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", + "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=", + "dev": true + }, + "basic-auth-connect": { + "version": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=", + "dev": true + }, + "batch": { + "version": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + } + }, + "beeper": { + "version": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "better-assert": { + "version": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" + } + }, + "bin-build": { + "version": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", + "dev": true, + "optional": true, + "requires": { + "archive-type": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "decompress": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "download": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "exec-series": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "tempfile": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "url-regex": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz" + }, + "dependencies": { + "tempfile": { + "version": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "optional": true, + "requires": { + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "uuid": "2.0.3" + } + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true, + "optional": true + } + } + }, + "bin-check": { + "version": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", + "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", + "dev": true, + "optional": true, + "requires": { + "executable": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz" + } + }, + "bin-version": { + "version": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", + "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", + "dev": true, + "optional": true, + "requires": { + "find-versions": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz" + } + }, + "bin-version-check": { + "version": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", + "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", + "dev": true, + "optional": true, + "requires": { + "bin-version": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", + "minimist": "1.2.0", + "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "semver-truncate": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "bin-wrapper": { + "version": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", + "dev": true, + "optional": true, + "requires": { + "bin-check": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", + "bin-version-check": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", + "download": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "each-async": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "lazy-req": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "os-filter-obj": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz" + } + }, + "binary-extensions": { + "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bl": { + "version": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha1-oWCRFxcQPAdBDO9j71Gzl8Alr5w=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "blob": { + "version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "body-parser": { + "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "dev": true, + "requires": { + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "boolbase": { + "version": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "bower": { + "version": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz", + "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=", + "dev": true + }, + "bower-installer": { + "version": "https://registry.npmjs.org/bower-installer/-/bower-installer-1.3.6.tgz", + "integrity": "sha1-z3g5tlQh0rJwqyLHT8hYpV46E3A=", + "dev": true, + "requires": { + "async": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "bower": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz", + "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "node-fs": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "nopt": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + } + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "snapdragon-node": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "split-string": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + }, + "dependencies": { + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "browserslist": { + "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", + "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz" + } + }, + "buffer-alloc": { + "version": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "buffer-fill": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" + } + }, + "buffer-alloc-unsafe": { + "version": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", + "dev": true + }, + "buffer-fill": { + "version": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", + "integrity": "sha1-FfS5vO8BIETfMRQsFDM8r24CYNA=", + "dev": true, + "optional": true + }, + "buffer-to-vinyl": { + "version": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", + "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", + "dev": true, + "requires": { + "file-type": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz" + }, + "dependencies": { + "file-type": { + "version": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + } + } + }, + "bufferstreams": { + "version": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", + "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + } + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", + "dev": true + }, + "cache-base": { + "version": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "has-value": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "set-value": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "to-object-path": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "union-value": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "unset-value": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsite": { + "version": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", + "lodash.memoize": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + } + }, + "caniuse-db": { + "version": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", + "integrity": "sha1-eItsj28CmRdDsYzbvVT5bQW0uVo=", + "dev": true + }, + "canonical-path": { + "version": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", + "integrity": "sha1-4x65N6jJPuKgHfGDl5RyGQKHRXQ=", + "dev": true + }, + "capture-stack-trace": { + "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "caw": { + "version": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", + "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", + "dev": true, + "requires": { + "get-proxy": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", + "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" + }, + "dependencies": { + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "tunnel-agent": { + "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "center-align": { + "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "dependencies": { + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" + }, + "dependencies": { + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + } + }, + "class-utils": { + "version": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "static-extend": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + } + }, + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + } + }, + "collection-visit": { + "version": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "object-visit": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + } + }, + "color": { + "version": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "color-string": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" + } + }, + "color-convert": { + "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "dev": true, + "requires": { + "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + } + }, + "color-name": { + "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + } + }, + "color-support": { + "version": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "colormin": { + "version": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "css-color-names": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } + }, + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "integrity": "sha1-4MtB0+SyCAazv8J/RVnwG5S8L3w=", + "dev": true + }, + "combine-lists": { + "version": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" + } + }, + "combined-stream": { + "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + } + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + } + }, + "component-bind": { + "version": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + } + }, + "compression": { + "version": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "dev": true, + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "compressible": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "vary": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "concat-with-sourcemaps": { + "version": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha1-1OqT8FriV5CVG5nns7CeOQikCC4=", + "dev": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + }, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + } + } + }, + "connect": { + "version": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "dev": true, + "requires": { + "basic-auth-connect": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "compression": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "connect-timeout": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "cookie-parser": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "csurf": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "errorhandler": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "express-session": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "method-override": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "morgan": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "multiparty": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "pause": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "response-time": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "serve-favicon": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "serve-index": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", + "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "vhost": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "connect-livereload": { + "version": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", + "dev": true + }, + "connect-timeout": { + "version": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "console-stream": { + "version": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, + "consolidate": { + "version": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz" + } + }, + "content-type": { + "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=", + "dev": true + }, + "cookie-parser": { + "version": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", + "dev": true, + "requires": { + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + } + }, + "cookie-signature": { + "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha1-D+bUW/PKw6w2Sp1y3nV29OsiG50=", + "dev": true + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "dev": true, + "requires": { + "is-directory": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "require-from-string": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "crc": { + "version": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=", + "dev": true + }, + "create-error-class": { + "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" + } + }, + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + }, + "dependencies": { + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + } + } + }, + "cryptiles": { + "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" + } + }, + "csrf": { + "version": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", + "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=", + "dev": true, + "requires": { + "rndm": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "tsscmp": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "uid-safe": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz" + } + }, + "css-color-names": { + "version": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-select": { + "version": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", + "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=", + "dev": true, + "optional": true, + "requires": { + "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "css-what": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "nth-check": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz" + } + }, + "css-select-base-adapter": { + "version": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", + "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=", + "dev": true, + "optional": true + }, + "css-tree": { + "version": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", + "integrity": "sha1-G7+r+/bu708B2RCP8u3Qvi/jVZc=", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + }, + "css-url-regex": { + "version": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true, + "optional": true + }, + "css-what": { + "version": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true, + "optional": true + }, + "cssnano": { + "version": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-calc": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "postcss-colormin": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "postcss-convert-values": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "postcss-discard-comments": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "postcss-discard-duplicates": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "postcss-discard-empty": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "postcss-discard-overridden": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "postcss-discard-unused": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "postcss-filter-plugins": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "postcss-merge-idents": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "postcss-merge-longhand": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "postcss-merge-rules": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "postcss-minify-font-values": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "postcss-minify-gradients": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "postcss-minify-params": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "postcss-minify-selectors": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "postcss-normalize-charset": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "postcss-normalize-url": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "postcss-ordered-values": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "postcss-reduce-idents": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "postcss-reduce-initial": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "postcss-reduce-transforms": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "postcss-svgo": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "postcss-unique-selectors": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "postcss-zindex": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" + } + }, + "csso": { + "version": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + }, + "csurf": { + "version": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", + "dev": true, + "requires": { + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "csrf": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" + } + }, + "currently-unhandled": { + "version": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + } + }, + "custom-event": { + "version": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dashdash": { + "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "dateformat": { + "version": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", + "dev": true, + "requires": { + "buffer-to-vinyl": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", + "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "decompress-tar": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", + "decompress-tarbz2": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", + "decompress-targz": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", + "decompress-unzip": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", + "stream-combiner2": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "vinyl-assign": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", + "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz" + }, + "dependencies": { + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-stream": { + "version": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "ordered-read-streams": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "through2": "0.6.5", + "to-absolute-glob": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "unique-stream": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + } + }, + "ordered-read-streams": { + "version": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "readable-stream": "2.3.6" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "strip-bom-stream": { + "version": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "unique-stream": { + "version": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + }, + "vinyl-fs": { + "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "gulp-sourcemaps": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "is-valid-glob": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "lazystream": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "readable-stream": "2.3.6", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "strip-bom-stream": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "vali-date": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "vinyl": "1.2.0" + } + } + } + }, + "decompress-tar": { + "version": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", + "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "dev": true, + "requires": { + "is-tar": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + }, + "dependencies": { + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + }, + "decompress-tarbz2": { + "version": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", + "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", + "dev": true, + "requires": { + "is-bzip2": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", + "object-assign": "2.1.1", + "seek-bzip": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "through2": "0.6.5", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + }, + "decompress-targz": { + "version": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", + "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", + "dev": true, + "requires": { + "is-gzip": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "object-assign": "2.1.1", + "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "through2": "0.6.5", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + }, + "decompress-unzip": { + "version": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", + "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", + "dev": true, + "requires": { + "is-zip": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", + "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "stat-mode": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl": "1.2.0", + "yauzl": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz" + }, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + } + } + }, + "deep-extend": { + "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "dev": true + }, + "deep-is": { + "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + } + }, + "define-properties": { + "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz" + } + }, + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-data-descriptor": { + "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-descriptor": { + "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + } + } + }, + "defined": { + "version": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "arrify": "1.0.1", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "delayed-stream": { + "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", + "dev": true + }, + "deprecated": { + "version": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "destroy": { + "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "di": { + "version": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + } + }, + "dom-serialize": { + "version": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "ent": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "void-elements": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + } + }, + "dom-serializer": { + "version": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "optional": true, + "requires": { + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" + }, + "dependencies": { + "domelementtype": { + "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true, + "optional": true + } + } + }, + "domelementtype": { + "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true, + "optional": true + }, + "domutils": { + "version": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "optional": true, + "requires": { + "dom-serializer": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" + } + }, + "download": { + "version": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", + "dev": true, + "requires": { + "caw": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", + "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "each-async": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "filenamify": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "got": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "gulp-decompress": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", + "gulp-rename": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "is-url": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "readable-stream": "2.3.6", + "stream-combiner2": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "vinyl": "1.2.0", + "vinyl-fs": "2.4.4", + "ware": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "glob": "5.0.15", + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "unique-stream": "2.2.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "readable-stream": "2.3.6" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "strip-bom": "2.0.0" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "is-valid-glob": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "lazystream": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "readable-stream": "2.3.6", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "vali-date": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "vinyl": "1.2.0" + } + } + } + }, + "duplexer": { + "version": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + } + }, + "duplexify": { + "version": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "readable-stream": "2.3.6", + "stream-shift": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "each-async": { + "version": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + } + }, + "ecc-jsbn": { + "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + } + }, + "ee-first": { + "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", + "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=", + "dev": true + }, + "encodeurl": { + "version": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + }, + "dependencies": { + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + } + } + }, + "engine.io": { + "version": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "base64id": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "ws": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz" + }, + "dependencies": { + "accepts": { + "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + } + }, + "cookie": { + "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "negotiator": { + "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "component-inherit": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "parsejson": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "parseqs": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "ws": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "xmlhttprequest-ssl": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "yeast": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "arraybuffer.slice": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "base64-arraybuffer": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "blob": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "wtf-8": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz" + } + }, + "ent": { + "version": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true, + "optional": true + }, + "errno": { + "version": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", + "dev": true, + "optional": true, + "requires": { + "prr": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + } + }, + "error-ex": { + "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + } + }, + "errorhandler": { + "version": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "dev": true, + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + }, + "dependencies": { + "accepts": { + "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + } + }, + "negotiator": { + "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + } + } + }, + "es-abstract": { + "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=", + "dev": true, + "requires": { + "es-to-primitive": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "is-regex": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" + } + }, + "es-to-primitive": { + "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "is-date-object": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "is-symbol": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" + } + }, + "es6-promise": { + "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", + "dev": true + }, + "escape-html": { + "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha1-264X75bI5L7bE1b0UE+kzC98t+I=", + "dev": true, + "requires": { + "esprima": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + }, + "dependencies": { + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.3.0.tgz", + "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", + "dev": true, + "requires": { + "ajv": "6.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "4.0.0", + "eslint-utils": "1.3.1", + "eslint-visitor-keys": "1.0.0", + "espree": "4.0.0", + "esquery": "1.0.1", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "globals": "11.7.0", + "ignore": "4.0.3", + "imurmurhash": "0.1.4", + "inquirer": "5.2.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "natural-compare": "1.4.0", + "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "regexpp": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "string.prototype.matchall": "2.0.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "table": "4.0.3", + "text-table": "0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "5.4.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "semver": "5.5.0", + "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "esprima": "4.0.1" + } + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "eslint-utils": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", + "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", + "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "dev": true, + "requires": { + "acorn": "5.7.1", + "acorn-jsx": "4.1.1" + } + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "estemplate": { + "version": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", + "integrity": "sha1-FxSp1GGQc4rJWLyv1J4CnNpWo54=", + "dev": true, + "requires": { + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + } + }, + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", + "dev": true + }, + "event-stream": { + "version": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "from": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "map-stream": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "pause-stream": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "split": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "stream-combiner": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + }, + "eventemitter3": { + "version": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=", + "dev": true + }, + "exec-buffer": { + "version": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", + "dev": true, + "optional": true, + "requires": { + "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "pify": "3.0.0", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "tempfile": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "optional": true + } + } + }, + "exec-series": { + "version": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", + "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", + "dev": true, + "optional": true, + "requires": { + "async-each-series": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "execa": { + "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + } + }, + "executable": { + "version": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", + "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", + "dev": true, + "optional": true, + "requires": { + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + } + }, + "expand-braces": { + "version": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz" + }, + "dependencies": { + "array-slice": { + "version": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz" + } + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz" + } + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "posix-character-classes": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + } + }, + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" + }, + "dependencies": { + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "expand-tilde": { + "version": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz" + } + }, + "express-session": { + "version": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", + "dev": true, + "requires": { + "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "crc": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "uid-safe": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "uid-safe": { + "version": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=", + "dev": true, + "requires": { + "base64-url": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz" + } + } + } + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + }, + "dependencies": { + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } + } + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", + "dev": true, + "requires": { + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + } + }, + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + }, + "is-accessor-descriptor": { + "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-data-descriptor": { + "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-descriptor": { + "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + } + } + }, + "extract-zip": { + "version": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "yauzl": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz" + }, + "dependencies": { + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + } + } + }, + "extsprintf": { + "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "time-stamp": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "faye-websocket": { + "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz" + } + }, + "fd-slicer": { + "version": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + } + }, + "figures": { + "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "file-type": { + "version": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + }, + "filename-regex": { + "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filename-reserved-regex": { + "version": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", + "dev": true + }, + "filenamify": { + "version": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "dev": true, + "requires": { + "filename-reserved-regex": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "strip-outer": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "trim-repeated": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" + } + }, + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "to-regex-range": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + }, + "dependencies": { + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "finalhandler": { + "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "escape-html": { + "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=", + "dev": true + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "find-index": { + "version": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "find-versions": { + "version": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", + "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", + "dev": true, + "optional": true, + "requires": { + "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "semver-regex": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz" + } + }, + "findup-sync": { + "version": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "resolve-dir": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + } + }, + "fined": { + "version": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "object.defaults": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "parse-filepath": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" + } + }, + "first-chunk-stream": { + "version": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "flatten": { + "version": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "follow-redirects": { + "version": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha1-2BIPRRgZD1Wqxlu2/HuF/NZm1qo=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + } + } + }, + "for-in": { + "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + } + }, + "foreach": { + "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + } + }, + "fragment-cache": { + "version": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + } + }, + "fresh": { + "version": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "dev": true + }, + "from": { + "version": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-constants": { + "version": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=", + "dev": true + }, + "fs-extra": { + "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "fs-readfile-promise": { + "version": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", + "integrity": "sha1-gAI4I5gfn//+AWCei+Zo9prknnA=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gaze": { + "version": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz" + } + }, + "get-proxy": { + "version": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", + "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", + "dev": true, + "requires": { + "rc": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + } + }, + "get-stdin": { + "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "optional": true + }, + "get-value": { + "version": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "gifsicle": { + "version": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", + "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-base": { + "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + }, + "dependencies": { + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + } + }, + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "path-dirname": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" + } + }, + "glob-stream": { + "version": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "glob2base": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "ordered-read-streams": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "unique-stream": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + } + } + }, + "glob-watcher": { + "version": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz" + } + }, + "glob2base": { + "version": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz" + } + }, + "global-modules": { + "version": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", + "dev": true, + "requires": { + "global-prefix": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "resolve-dir": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + } + }, + "global-prefix": { + "version": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "homedir-polyfill": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "ini": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + }, + "globby": { + "version": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "globule": { + "version": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "dependencies": { + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "sigmund": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + } + } + } + }, + "glogg": { + "version": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", + "dev": true, + "requires": { + "sparkles": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" + } + }, + "got": { + "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "dev": true, + "requires": { + "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "duplexer2": "0.1.4", + "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "node-status-codes": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "readable-stream": "2.3.6", + "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz" + } + }, + "graceful-readlink": { + "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "gulp": { + "version": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "deprecated": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "liftoff": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "orchestrator": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "pretty-hrtime": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "tildify": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "v8flags": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "gulp-concat": { + "version": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz" + }, + "dependencies": { + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "clone-buffer": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "cloneable-readable": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz" + } + } + } + }, + "gulp-connect": { + "version": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.0.0.tgz", + "integrity": "sha1-8v3zBq6RFGg2jCKF8teC8T7dr04=", + "dev": true, + "requires": { + "connect": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "connect-livereload": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "event-stream": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "tiny-lr": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz" + } + }, + "gulp-decompress": { + "version": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", + "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", + "dev": true, + "requires": { + "archive-type": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "decompress": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "gulp-eslint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-5.0.0.tgz", + "integrity": "sha512-9GUqCqh85C7rP9120cpxXuZz2ayq3BZc85pCTuPJS03VQYxne0aWPIXWx6LSvsGPa3uRqtSO537vaugOh+5cXg==", + "dev": true, + "requires": { + "eslint": "5.3.0", + "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "plugin-error": "1.0.1" + }, + "dependencies": { + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + } + } + } + }, + "gulp-imagemin": { + "version": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz", + "integrity": "sha1-XONH8dFwb+08yPF3fKkJSlg7ULc=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "imagemin": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", + "imagemin-gifsicle": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", + "imagemin-jpegtran": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz", + "imagemin-optipng": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "imagemin-svgo": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", + "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "plur": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "pretty-bytes": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "through2-concurrent": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-1.1.1.tgz" + }, + "dependencies": { + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", + "dev": true, + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "dev": true, + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + } + } + } + }, + "gulp-less": { + "version": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.5.0.tgz", + "integrity": "sha1-gBT0ad38ZUTX3aUAmN7wNxu7T3g=", + "dev": true, + "requires": { + "accord": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", + "less": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" + }, + "dependencies": { + "replace-ext": { + "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + } + } + }, + "gulp-ngdocs": { + "version": "https://registry.npmjs.org/gulp-ngdocs/-/gulp-ngdocs-0.3.0.tgz", + "integrity": "sha1-J7Z6Ql6zh1ImNFq4lgTXN/Y1fCE=", + "dev": true, + "requires": { + "angular": "https://registry.npmjs.org/angular/-/angular-1.3.20.tgz", + "angular-animate": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.3.20.tgz", + "canonical-path": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "marked": "https://registry.npmjs.org/marked/-/marked-0.3.2.tgz", + "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.5.tgz", + "path": "https://registry.npmjs.org/path/-/path-0.4.9.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", + "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.7.tgz" + }, + "dependencies": { + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + } + }, + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "dateformat": { + "version": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + } + }, + "extend": { + "version": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", + "integrity": "sha1-0VFvsP9WJNLr+RI+odrFoZlABPg=", + "dev": true + }, + "gulp-util": { + "version": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.0.tgz", + "integrity": "sha1-b+7cR9aXKCO6zplH/F9GvYo0Zuc=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "multipipe": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz" + }, + "dependencies": { + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + } + } + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.defaults": { + "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + } + }, + "lodash.escape": { + "version": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "lodash._reunescapedhtml": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + } + }, + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + } + }, + "lodash.template": { + "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "lodash.values": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + } + }, + "lodash.templatesettings": { + "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz" + } + }, + "merge-stream": { + "version": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.5.tgz", + "integrity": "sha1-5oIPet267gA/SMpKWMfFolPV4Fw=", + "dev": true, + "requires": { + "through2": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz" + }, + "dependencies": { + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + } + } + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + }, + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", + "integrity": "sha1-90KzKJPovSYUbnieT9LMssB6cX4=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "dependencies": { + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + }, + "vinyl-fs": { + "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.7.tgz", + "integrity": "sha1-LiXP5t9cgIGPl/9Be/XCGkHkpJs=", + "dev": true, + "requires": { + "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "glob-watcher": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + }, + "dependencies": { + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-open": { + "version": "https://registry.npmjs.org/gulp-open/-/gulp-open-2.1.0.tgz", + "integrity": "sha1-rAHu6JjXenrAgS+tTz1T0IaH1Bw=", + "dev": true, + "requires": { + "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "open": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "plugin-log": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + } + }, + "gulp-postcss": { + "version": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-6.4.0.tgz", + "integrity": "sha1-eKMuPIeqbNzsWuHJBeGW1HjoxdU=", + "dev": true, + "requires": { + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-load-config": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" + } + }, + "gulp-rename": { + "version": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", + "dev": true + }, + "gulp-sort": { + "version": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz", + "integrity": "sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=", + "dev": true, + "requires": { + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + } + }, + "gulp-sourcemaps": { + "version": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + } + } + }, + "gulp-util": { + "version": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "beeper": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "gulplog": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "has-gulplog": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "lodash._reescape": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "lodash._reevaluate": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "multipipe": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-watch": { + "version": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", + "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", + "dev": true, + "requires": { + "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "vinyl-file": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + } + } + }, + "gulp-wrap": { + "version": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.13.0.tgz", + "integrity": "sha1-kPsLSieiZkM4Mv98YSLbXB7olMY=", + "dev": true, + "requires": { + "consolidate": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "fs-readfile-promise": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "node.extend": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "vinyl-bufferstream": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz" + } + }, + "gulp-wrap-js": { + "version": "https://registry.npmjs.org/gulp-wrap-js/-/gulp-wrap-js-0.4.1.tgz", + "integrity": "sha1-3uYqpISqupVHqT0f9c0MPQvtwDE=", + "dev": true, + "requires": { + "escodegen": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "estemplate": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", + "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz" + }, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + } + }, + "vinyl-sourcemaps-apply": { + "version": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", + "integrity": "sha1-xfy9Q+LyOEI8LcmL3db3m3K8NFs=", + "dev": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + } + } + } + }, + "gulplog": { + "version": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz" + } + }, + "har-schema": { + "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "har-schema": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" + } + }, + "has": { + "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "has-binary": { + "version": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + } + }, + "has-cors": { + "version": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "has-values": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + } + }, + "has-values": { + "version": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "hasha": { + "version": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "hawk": { + "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + } + }, + "hoek": { + "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + } + }, + "hosted-git-info": { + "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=", + "dev": true + }, + "html-comment-regex": { + "version": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "dev": true + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + } + }, + "http-parser-js": { + "version": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", + "dev": true + }, + "http-proxy": { + "version": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", + "dev": true, + "requires": { + "eventemitter3": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "follow-redirects": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + } + }, + "http-signature": { + "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz" + } + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=", + "dev": true + }, + "ignore": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.3.tgz", + "integrity": "sha512-Z/vAH2GGIEATQnBVXMclE2IGV6i0GyVngKThcGZ5kHgHMxLo9Ow2+XHRq1aEKEej5vOF1TPJNbvX6J/anT0M7A==", + "dev": true + }, + "image-size": { + "version": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "imagemin": { + "version": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", + "integrity": "sha1-8Zwu7h5xumxlWMUV+fyWaAGJptQ=", + "dev": true, + "requires": { + "file-type": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "globby": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "make-dir": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "p-pipe": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz" + }, + "dependencies": { + "replace-ext": { + "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + } + } + }, + "imagemin-gifsicle": { + "version": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", + "integrity": "sha1-N4FSTEV2Eu8EkWrzQkGitCv8tAo=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "gifsicle": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", + "is-gif": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz" + } + }, + "imagemin-jpegtran": { + "version": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz", + "integrity": "sha1-5ogiY7j3kW/duABkDPddLpcNKtY=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "is-jpg": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", + "jpegtran-bin": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz" + } + }, + "imagemin-optipng": { + "version": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "integrity": "sha1-0i2kEsCfX/AKQzmWC5ioix2+hpU=", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "is-png": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "optipng-bin": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz" + } + }, + "imagemin-svgo": { + "version": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", + "integrity": "sha1-LdjIKUa+Qqjiy8rjxb8Ae8K4ueg=", + "dev": true, + "optional": true, + "requires": { + "buffer-from": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", + "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "svgo": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz" + }, + "dependencies": { + "coa": { + "version": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", + "integrity": "sha1-8/iwsVBz411wJj+xBCyywCPbOK8=", + "dev": true, + "optional": true, + "requires": { + "q": "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + } + }, + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true, + "optional": true + }, + "csso": { + "version": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=", + "dev": true, + "optional": true, + "requires": { + "css-tree": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz" + }, + "dependencies": { + "css-tree": { + "version": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + } + } + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "dev": true, + "optional": true, + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + } + }, + "svgo": { + "version": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz", + "integrity": "sha1-cEA2TAYqBTirrP9EAc6momp6OJo=", + "dev": true, + "optional": true, + "requires": { + "coa": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", + "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "css-select": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", + "css-select-base-adapter": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", + "css-tree": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", + "css-url-regex": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "csso": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "object.values": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "stable": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "unquote": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "util.promisify": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + } + }, + "indexes-of": { + "version": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "indx": { + "version": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", + "dev": true + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "5.5.11", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "5.4.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "interpret": { + "version": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "ip-regex": { + "version": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", + "dev": true, + "optional": true + }, + "irregular-plurals": { + "version": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is": { + "version": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", + "dev": true, + "requires": { + "is-relative": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + } + }, + "is-absolute-url": { + "version": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "is-arrayish": { + "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz" + } + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "dev": true + }, + "is-builtin-module": { + "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + } + }, + "is-bzip2": { + "version": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", + "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", + "dev": true + }, + "is-callable": { + "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", + "dev": true + }, + "is-data-descriptor": { + "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "is-date-object": { + "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", + "dev": true, + "requires": { + "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", + "dev": true + } + } + }, + "is-directory": { + "version": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-gif": { + "version": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", + "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + } + }, + "is-gzip": { + "version": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", + "dev": true + }, + "is-jpg": { + "version": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", + "integrity": "sha1-KW1X/dmc4BBDSnKD40armhA16XU=", + "dev": true, + "optional": true + }, + "is-natural-number": { + "version": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", + "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", + "dev": true + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "is-obj": { + "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" + }, + "dependencies": { + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "requires": { + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + } + }, + "is-png": { + "version": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", + "dev": true, + "optional": true + }, + "is-posix-bracket": { + "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } + }, + "is-relative": { + "version": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", + "dev": true, + "requires": { + "is-unc-path": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" + } + }, + "is-symbol": { + "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-tar": { + "version": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", + "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", + "dev": true + }, + "is-typedarray": { + "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", + "dev": true, + "requires": { + "unc-path-regex": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" + } + }, + "is-url": { + "version": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=", + "dev": true + }, + "is-utf8": { + "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", + "dev": true + }, + "is-zip": { + "version": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", + "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jasmine-core": { + "version": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", + "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=", + "dev": true + }, + "jpegtran-bin": { + "version": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", + "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + } + }, + "js-base64": { + "version": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha1-LlRewrDylX9BNWUQIFIU6Y+tZYI=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + } + }, + "jsbn": { + "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonfile": { + "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "jsonify": { + "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsprim": { + "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "verror": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "karma": { + "version": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", + "dev": true, + "requires": { + "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "combine-lists": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "connect": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "di": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "dom-serialize": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "expand-braces": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "http-proxy": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "isbinaryfile": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "log4js": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "qjobs": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "socket.io": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "useragent": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz" + }, + "dependencies": { + "body-parser": { + "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + } + }, + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "connect": { + "version": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + } + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "finalhandler": { + "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "dependencies": { + "statuses": { + "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + } + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", + "dev": true + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "dev": true + }, + "range-parser": { + "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "dependencies": { + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + } + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "utils-merge": { + "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-phantomjs-launcher": { + "version": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "dev": true, + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "phantomjs-prebuilt": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz" + } + }, + "kew": { + "version": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", + "dev": true + }, + "klaw": { + "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "lazy-cache": { + "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazy-req": { + "version": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "less": { + "version": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", + "dev": true, + "requires": { + "errno": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "image-size": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "levn": { + "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + } + }, + "liftoff": { + "version": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "findup-sync": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "fined": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "flagged-respawn": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "object.map": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz" + } + }, + "livereload-js": { + "version": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "integrity": "sha1-w6si6Kr1vzUF2A0JjLrWdyZUjJo=", + "dev": true + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + } + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=", + "dev": true + }, + "lodash._basecopy": { + "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + } + }, + "lodash._escapestringchar": { + "version": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", + "dev": true + }, + "lodash._objecttypes": { + "version": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", + "dev": true + }, + "lodash._reescape": { + "version": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + }, + "dependencies": { + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + } + } + } + }, + "lodash._root": { + "version": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + }, + "lodash.clone": { + "version": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.defaults": { + "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.escape": { + "version": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" + } + }, + "lodash.flatten": { + "version": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isarguments": { + "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isobject": { + "version": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "dev": true, + "requires": { + "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + } + }, + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + } + }, + "lodash.memoize": { + "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha1-rcJdnLmbk5HFliTzefu6YNcRHVQ=", + "dev": true + }, + "lodash.partialright": { + "version": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.pick": { + "version": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.restparam": { + "version": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "lodash._basetostring": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "lodash._basevalues": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "lodash.restparam": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz" + } + }, + "lodash.templatesettings": { + "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz" + } + }, + "lodash.uniq": { + "version": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.values": { + "version": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + }, + "dependencies": { + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + } + } + } + }, + "log4js": { + "version": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + }, + "dependencies": { + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + } + } + }, + "logalot": { + "version": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "optional": true, + "requires": { + "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "squeak": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz" + } + }, + "longest": { + "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + } + }, + "lowercase-keys": { + "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "dev": true + }, + "lpad-align": { + "version": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + } + }, + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "macaddress": { + "version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", + "dev": true + }, + "make-dir": { + "version": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "dev": true, + "requires": { + "pify": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + }, + "dependencies": { + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "make-iterator": { + "version": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "map-cache": { + "version": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "map-visit": { + "version": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + } + }, + "marked": { + "version": "https://registry.npmjs.org/marked/-/marked-0.3.2.tgz", + "integrity": "sha1-AV2xWIZEOPJKZL3WGgQotBhwbQk=", + "dev": true + }, + "math-expression-evaluator": { + "version": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, + "math-random": { + "version": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "mdn-data": { + "version": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha1-ULXU/8RXUnZXPE7tuHgIEqhBnwE=", + "dev": true + }, + "media-typer": { + "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "loud-rejection": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "redent": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "trim-newlines": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + }, + "dependencies": { + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-stream": { + "version": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "method-override": { + "version": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "vary": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + }, + "dependencies": { + "vary": { + "version": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + } + } + }, + "methods": { + "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "nanomatch": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + } + }, + "mime": { + "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "mime-db": { + "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=", + "dev": true + }, + "mime-types": { + "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", + "dev": true, + "requires": { + "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + } + }, + "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==", + "dev": true + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mixin-deep": { + "version": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", + "dev": true, + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + }, + "dependencies": { + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", + "dev": true, + "requires": { + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + } + } + } + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + }, + "morgan": { + "version": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "dev": true, + "requires": { + "basic-auth": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multiparty": { + "version": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "stream-counter": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" + } + }, + "multipipe": { + "version": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nanomatch": { + "version": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "is-odd": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + } + }, + "natives": { + "version": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", + "integrity": "sha1-RKV5vmRQfqLW7RygSpQVkVz3VVg=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-fs": { + "version": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", + "dev": true + }, + "node-status-codes": { + "version": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "dev": true + }, + "node.extend": { + "version": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "https://registry.npmjs.org/is/-/is-3.2.1.tgz" + } + }, + "nopt": { + "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + } + }, + "normalize-package-data": { + "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz" + } + }, + "normalize-path": { + "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + } + }, + "normalize-range": { + "version": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "query-string": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "sort-keys": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + } + }, + "npm-run-path": { + "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "optional": true, + "requires": { + "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + } + }, + "nth-check": { + "version": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "optional": true, + "requires": { + "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + } + }, + "num2fraction": { + "version": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "object-keys": { + "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", + "dev": true + }, + "object-visit": { + "version": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + } + }, + "object.defaults": { + "version": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "for-own": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + } + }, + "object.getownpropertydescriptors": { + "version": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "optional": true, + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz" + } + }, + "object.map": { + "version": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "make-iterator": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" + } + }, + "object.omit": { + "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + }, + "dependencies": { + "for-own": { + "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + } + } + } + }, + "object.pick": { + "version": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + } + }, + "object.values": { + "version": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "optional": true, + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + } + }, + "on-finished": { + "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + } + }, + "on-headers": { + "version": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "onetime": { + "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "open": { + "version": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true + }, + "optimist": { + "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + } + }, + "optionator": { + "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + }, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "options": { + "version": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "optipng-bin": { + "version": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", + "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", + "dev": true, + "optional": true, + "requires": { + "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + } + }, + "orchestrator": { + "version": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "sequencify": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "stream-consume": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz" + } + }, + "ordered-read-streams": { + "version": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-filter-obj": { + "version": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", + "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", + "dev": true, + "optional": true + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-tmpdir": { + "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-pipe": { + "version": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", + "dev": true + }, + "parse-filepath": { + "version": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "path-root": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + } + }, + "parse-glob": { + "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + }, + "dependencies": { + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + } + }, + "parse-json": { + "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + } + }, + "parse-passwd": { + "version": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" + } + }, + "parseqs": { + "version": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" + } + }, + "parseuri": { + "version": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" + } + }, + "parseurl": { + "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path": { + "version": "https://registry.npmjs.org/path/-/path-0.4.9.tgz", + "integrity": "sha1-OAxo0BJz5D+TaNetUP7l4+jUd/A=", + "dev": true + }, + "path-dirname": { + "version": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + } + }, + "path-root-regex": { + "version": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "pause": { + "version": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=", + "dev": true + }, + "pause-stream": { + "version": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + }, + "pend": { + "version": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "dev": true, + "requires": { + "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "extract-zip": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "hasha": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "kew": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "request-progress": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + }, + "dependencies": { + "es6-promise": { + "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=", + "dev": true + } + } + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + }, + "plugin-error": { + "version": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "ansi-red": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz" + }, + "dependencies": { + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz" + } + }, + "arr-union": { + "version": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz" + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "plugin-log": { + "version": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" + }, + "dependencies": { + "dateformat": { + "version": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + } + } + } + }, + "plur": { + "version": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "posix-character-classes": { + "version": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + }, + "postcss-calc": { + "version": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-message-helpers": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "reduce-css-calc": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + } + }, + "postcss-colormin": { + "version": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-convert-values": { + "version": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-discard-comments": { + "version": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-discard-duplicates": { + "version": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-discard-empty": { + "version": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-discard-overridden": { + "version": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-discard-unused": { + "version": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + } + }, + "postcss-filter-plugins": { + "version": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "uniqid": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" + } + }, + "postcss-load-config": { + "version": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss-load-options": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "postcss-load-plugins": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz" + } + }, + "postcss-load-options": { + "version": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "postcss-load-plugins": { + "version": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + } + }, + "postcss-merge-idents": { + "version": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-merge-longhand": { + "version": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-merge-rules": { + "version": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "caniuse-api": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "vendors": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz" + } + }, + "postcss-message-helpers": { + "version": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-minify-gradients": { + "version": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-minify-params": { + "version": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + } + }, + "postcss-minify-selectors": { + "version": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" + } + }, + "postcss-normalize-charset": { + "version": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-normalize-url": { + "version": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "normalize-url": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-ordered-values": { + "version": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-reduce-idents": { + "version": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-reduce-initial": { + "version": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + } + }, + "postcss-reduce-transforms": { + "version": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + } + }, + "postcss-selector-parser": { + "version": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "indexes-of": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "uniq": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + } + }, + "postcss-svgo": { + "version": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "svgo": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" + } + }, + "postcss-unique-selectors": { + "version": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + } + }, + "postcss-value-parser": { + "version": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "postcss-zindex": { + "version": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + } + }, + "prelude-ls": { + "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-bytes": { + "version": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "pretty-hrtime": { + "version": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "dev": true + }, + "progress": { + "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise": { + "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", + "dev": true, + "optional": true, + "requires": { + "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + } + }, + "prr": { + "version": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qjobs": { + "version": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "dev": true + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=", + "dev": true + }, + "query-string": { + "version": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "strict-uri-encode": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + } + }, + "random-bytes": { + "version": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "dev": true + }, + "randomatic": { + "version": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha1-01SQAw6091eN4pLObfsEqRoSiSM=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "math-random": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz" + }, + "dependencies": { + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", + "dev": true + } + } + }, + "range-parser": { + "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", + "dev": true + }, + "raw-body": { + "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dev": true, + "requires": { + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "dependencies": { + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "rc": { + "version": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "dev": true, + "requires": { + "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "ini": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "minimist": "1.2.0", + "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-all-stream": { + "version": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dev": true, + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + } + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + } + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "readdirp": { + "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "rechoir": { + "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz" + } + }, + "redent": { + "version": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "strip-indent": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + } + }, + "reduce-css-calc": { + "version": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "math-expression-evaluator": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "reduce-function-call": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz" + }, + "dependencies": { + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "dev": true, + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "dependencies": { + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + } + }, + "regex-not": { + "version": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "safe-regex": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + } + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz" + } + }, + "regexpp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz", + "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==", + "dev": true + }, + "remove-trailing-separator": { + "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + } + }, + "replace-ext": { + "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" + }, + "dependencies": { + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + } + } + }, + "request-progress": { + "version": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" + } + }, + "require-from-string": { + "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha1-qt1lY3T9KYruiVvAJrgpdBhnf9M=", + "dev": true, + "requires": { + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" + } + }, + "resolve-dir": { + "version": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "global-modules": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "response-time": { + "version": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "integrity": "sha1-/6cbq5UtYvfB1Jt0NDVfvGjf/Fo=", + "dev": true, + "requires": { + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + }, + "dependencies": { + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + } + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + }, + "dependencies": { + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + } + } + }, + "ret": { + "version": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", + "dev": true + }, + "right-align": { + "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + } + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + } + }, + "rndm": { + "version": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "run-sequence": { + "version": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", + "integrity": "sha1-HOZD2jb9jH6n4akynaM/wriJhJU=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz" + } + }, + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safe-regex": { + "version": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "seek-bzip": { + "version": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", + "dev": true, + "requires": { + "commander": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "semver-regex": { + "version": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", + "dev": true, + "optional": true + }, + "semver-truncate": { + "version": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "optional": true, + "requires": { + "semver": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz" + }, + "dependencies": { + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true, + "optional": true + } + } + }, + "send": { + "version": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "etag": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "statuses": { + "version": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", + "dev": true + } + } + }, + "sequencify": { + "version": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "serve-favicon": { + "version": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", + "dev": true, + "requires": { + "etag": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" + }, + "dependencies": { + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "serve-index": { + "version": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "dev": true, + "requires": { + "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "batch": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "serve-static": { + "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", + "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", + "dev": true, + "requires": { + "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "send": "https://registry.npmjs.org/send/-/send-0.13.2.tgz" + } + }, + "set-immediate-shim": { + "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "split-string": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + }, + "dependencies": { + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "setprototypeof": { + "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "dev": true + }, + "shebang-command": { + "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + } + }, + "shebang-regex": { + "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "sigmund": { + "version": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "snapdragon": { + "version": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", + "dev": true, + "requires": { + "base": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "source-map-resolve": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "use": "https://registry.npmjs.org/use/-/use-3.1.0.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + } + }, + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "snapdragon-node": { + "version": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", + "dev": true, + "requires": { + "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "snapdragon-util": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + } + }, + "is-accessor-descriptor": { + "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-data-descriptor": { + "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "is-descriptor": { + "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + } + } + }, + "snapdragon-util": { + "version": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "sntp": { + "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + } + }, + "socket.io": { + "version": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "engine.io": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "socket.io-adapter": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "socket.io-client": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "component-bind": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "engine.io-client": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "object-component": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "to-array": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" + }, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz" + }, + "dependencies": { + "component-emitter": { + "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sort-keys": { + "version": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + } + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", + "dev": true, + "requires": { + "atob": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "decode-uri-component": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "resolve-url": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "source-map-url": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "urix": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + } + }, + "source-map-url": { + "version": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "dev": true, + "requires": { + "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz" + } + }, + "spdx-exceptions": { + "version": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "dev": true + }, + "spdx-expression-parse": { + "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz" + } + }, + "spdx-license-ids": { + "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "dev": true + }, + "split": { + "version": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + } + }, + "split-string": { + "version": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + } + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "squeak": { + "version": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "optional": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "console-stream": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "lpad-align": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz" + } + }, + "sshpk": { + "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stable": { + "version": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", + "dev": true, + "optional": true + }, + "stat-mode": { + "version": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "static-extend": { + "version": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "object-copy": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + }, + "dependencies": { + "define-property": { + "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + } + } + } + }, + "statuses": { + "version": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-combiner": { + "version": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + } + }, + "stream-combiner2": { + "version": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "requires": { + "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "readable-stream": "2.3.6" + }, + "dependencies": { + "duplexer2": { + "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "stream-consume": { + "version": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", + "dev": true + }, + "stream-counter": { + "version": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + } + }, + "stream-shift": { + "version": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "strict-uri-encode": { + "version": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", + "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", + "dev": true, + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "has-symbols": "1.0.0", + "regexp.prototype.flags": "1.2.0" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "stringstream": { + "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "strip-bom-stream": { + "version": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + }, + "dependencies": { + "first-chunk-stream": { + "version": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + } + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + } + } + }, + "strip-dirs": { + "version": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "is-absolute": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "is-natural-number": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "sum-up": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz" + }, + "dependencies": { + "is-absolute": { + "version": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "dev": true, + "requires": { + "is-relative": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz" + } + }, + "is-relative": { + "version": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", + "dev": true + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "strip-eof": { + "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "optional": true + }, + "strip-indent": { + "version": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + } + }, + "strip-json-comments": { + "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "strip-outer": { + "version": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", + "dev": true, + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + } + }, + "sum-up": { + "version": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + } + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + }, + "svgo": { + "version": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "csso": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "whet.extend": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + }, + "dependencies": { + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "chalk": "2.4.1", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "supports-color": "5.4.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "tar-stream": { + "version": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha1-+E7xaWJp1iI8pI9uHu7eP36B85U=", + "dev": true, + "requires": { + "bl": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "buffer-alloc": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "fs-constants": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "readable-stream": "2.3.6", + "to-buffer": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "dependencies": { + "end-of-stream": { + "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "temp-dir": { + "version": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true, + "optional": true + }, + "tempfile": { + "version": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "optional": true, + "requires": { + "temp-dir": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "dependencies": { + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "through2-concurrent": { + "version": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-1.1.1.tgz", + "integrity": "sha1-EctOpMnjG8puTB5tukjRxyjDUks=", + "dev": true, + "requires": { + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + } + }, + "through2-filter": { + "version": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "tildify": { + "version": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + } + }, + "time-stamp": { + "version": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timed-out": { + "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "dev": true + }, + "tiny-lr": { + "version": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", + "dev": true, + "requires": { + "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "livereload-js": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + }, + "dependencies": { + "body-parser": { + "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "dev": true, + "requires": { + "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "qs": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + }, + "dependencies": { + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + } + } + }, + "bytes": { + "version": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + } + }, + "depd": { + "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "iconv-lite": { + "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", + "dev": true + } + } + }, + "tmp": { + "version": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + } + }, + "to-absolute-glob": { + "version": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + }, + "dependencies": { + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + } + } + }, + "to-array": { + "version": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-buffer": { + "version": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=", + "dev": true + }, + "to-object-path": { + "version": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + } + } + } + }, + "to-regex": { + "version": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", + "dev": true, + "requires": { + "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "safe-regex": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + } + }, + "to-regex-range": { + "version": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "tough-cookie": { + "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", + "dev": true, + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + } + }, + "trim-newlines": { + "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-repeated": { + "version": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + } + }, + "tryit": { + "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tsscmp": { + "version": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "dev": true + }, + "tunnel-agent": { + "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + }, + "tweetnacl": { + "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + } + }, + "type-is": { + "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", + "dev": true, + "requires": { + "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + } + }, + "typedarray": { + "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + } + }, + "uglify-to-browserify": { + "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uid-safe": { + "version": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", + "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=", + "dev": true, + "requires": { + "random-bytes": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + } + }, + "ultron": { + "version": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "unc-path-regex": { + "version": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "set-value": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz" + }, + "dependencies": { + "extend-shallow": { + "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + }, + "set-value": { + "version": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "to-object-path": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + } + } + } + }, + "uniq": { + "version": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqid": { + "version": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", + "dev": true, + "requires": { + "macaddress": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" + } + }, + "uniqs": { + "version": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-stream": { + "version": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unpipe": { + "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true, + "optional": true + }, + "unset-value": { + "version": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + }, + "dependencies": { + "has-value": { + "version": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "has-values": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + }, + "dependencies": { + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } + } + }, + "has-values": { + "version": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "urix": { + "version": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + } + }, + "url-regex": { + "version": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz" + } + }, + "use": { + "version": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + } + }, + "user-home": { + "version": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "useragent": { + "version": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz" + }, + "dependencies": { + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", + "dev": true, + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + } + } + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", + "dev": true, + "optional": true, + "requires": { + "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "object.getownpropertydescriptors": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz" + } + }, + "utils-merge": { + "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + }, + "uuid": { + "version": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "dev": true + }, + "v8flags": { + "version": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" + } + }, + "vali-date": { + "version": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "validate-npm-package-license": { + "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", + "dev": true, + "requires": { + "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz" + } + }, + "vary": { + "version": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=", + "dev": true + }, + "vendors": { + "version": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha1-f8te759WI7FWvOqJ7DfWNnbyGAE=", + "dev": true + }, + "verror": { + "version": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + }, + "dependencies": { + "assert-plus": { + "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vhost": { + "version": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", + "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=", + "dev": true + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + }, + "vinyl-assign": { + "version": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", + "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", + "dev": true, + "requires": { + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "readable-stream": "2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "string_decoder": "1.1.1", + "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + } + } + } + }, + "vinyl-bufferstream": { + "version": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", + "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", + "dev": true, + "requires": { + "bufferstreams": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz" + } + }, + "vinyl-file": { + "version": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "strip-bom-stream": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz" + }, + "dependencies": { + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + } + } + } + }, + "vinyl-fs": { + "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "glob-watcher": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + }, + "dependencies": { + "clone": { + "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + }, + "through2": { + "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + } + }, + "vinyl": { + "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + }, + "void-elements": { + "version": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "ware": { + "version": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", + "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", + "dev": true, + "requires": { + "wrap-fn": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz" + } + }, + "websocket-driver": { + "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz" + } + }, + "websocket-extensions": { + "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", + "dev": true + }, + "when": { + "version": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "whet.extend": { + "version": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + } + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-fn": { + "version": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", + "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", + "dev": true, + "requires": { + "co": "https://registry.npmjs.org/co/-/co-3.1.0.tgz" + }, + "dependencies": { + "co": { + "version": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", + "dev": true + } + } + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + } + }, + "ws": { + "version": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" + } + }, + "wtf-8": { + "version": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + } + }, + "yauzl": { + "version": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" + } + }, + "yeast": { + "version": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 6e390b8b24..017eb5dce2 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -27,6 +27,7 @@ "gulp": "^3.9.1", "gulp-concat": "^2.6.0", "gulp-connect": "5.0.0", + "gulp-eslint": "^5.0.0", "gulp-imagemin": "^4.1.0", "gulp-less": "^3.5.0", "gulp-ngdocs": "^0.3.0", From f35110309a96633674f758fa73c632bf1d2cdbb4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 8 Aug 2018 19:52:31 +0200 Subject: [PATCH 160/275] fix comma-dangle error --- .../config/canvasdesigner.config.js | 26 +++++++++---------- .../src/canvasdesigner/editors/border.js | 2 +- .../editors/googlefontpicker.js | 10 +++---- .../src/canvasdesigner/editors/margin.js | 4 +-- .../src/canvasdesigner/editors/padding.js | 4 +-- .../src/canvasdesigner/editors/radius.js | 4 +-- .../canvasdesigner/lib/spectrum.directive.js | 2 +- .../application/umbbackdrop.directive.js | 2 +- .../imaging/umbimagecrop.directive.js | 2 +- .../components/umbdropdownitem.directive.js | 2 +- .../components/umbgroupsbuilder.directive.js | 2 +- .../umblaunchminieditor.directive.js | 2 +- .../resources/nestedcontent.resource.js | 2 +- .../src/common/services/appstate.service.js | 2 +- .../common/services/listviewhelper.service.js | 2 +- .../src/common/services/navigation.service.js | 2 +- .../common/dialogs/legacydelete.controller.js | 2 +- .../common/dialogs/linkpicker.controller.js | 2 +- .../views/common/dialogs/login.controller.js | 2 +- .../template/querybuilder.controller.js | 2 +- .../common/dialogs/treepicker.controller.js | 2 +- .../mediaPicker/mediapicker.controller.js | 2 +- .../querybuilder/querybuilder.controller.js | 2 +- .../datatypes/datatype.edit.controller.js | 2 +- .../src/views/partialviews/edit.controller.js | 2 +- .../grid/grid.prevalues.controller.js | 4 +-- .../listview/listview.controller.js | 10 +++---- .../propertyeditors/tags/tags.controller.js | 2 +- .../src/views/scripts/edit.controller.js | 2 +- .../src/views/templates/edit.controller.js | 2 +- 30 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/config/canvasdesigner.config.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/config/canvasdesigner.config.js index 54a27cc415..f49e6520db 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/config/canvasdesigner.config.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/config/canvasdesigner.config.js @@ -12,7 +12,7 @@ var canvasdesignerConfig = { { type: "background", category: "Color", - name: "Background", + name: "Background" }, { type: "color", @@ -45,12 +45,12 @@ var canvasdesignerConfig = { { type: "background", category: "Color", - name: "Background", + name: "Background" }, { type: "border", category: "Color", - name: "Border", + name: "Border" }, { type: "color", @@ -83,7 +83,7 @@ var canvasdesignerConfig = { { type: "googlefontpicker", category: "Font", - name: "Font familly", + name: "Font familly" } ] }, @@ -105,7 +105,7 @@ var canvasdesignerConfig = { name: "Margin", enable: ["top", "bottom"], schema: "#header" - }, + } ] }, { @@ -124,7 +124,7 @@ var canvasdesignerConfig = { type: "color", category: "Font", name: "Font color", - css: "color", + css: "color" } ] }, @@ -137,7 +137,7 @@ var canvasdesignerConfig = { type: "color", category: "Font", name: "Font color", - css: "color", + css: "color" } ] }, @@ -150,7 +150,7 @@ var canvasdesignerConfig = { type: "color", category: "Font", name: "Font color", - css: "color", + css: "color" }, { type: "slider", @@ -163,7 +163,7 @@ var canvasdesignerConfig = { { type: "margin", category: "Position", - name: "Margin", + name: "Margin" } ] @@ -177,7 +177,7 @@ var canvasdesignerConfig = { type: "color", category: "Font", name: "Font color", - css: "color", + css: "color" }, { type: "slider", @@ -190,7 +190,7 @@ var canvasdesignerConfig = { { type: "margin", category: "Position", - name: "Margin", + name: "Margin" } ] @@ -216,7 +216,7 @@ var canvasdesignerConfig = { { type: "background", category: "Color", - name: "Background", + name: "Background" }, { type: "padding", @@ -305,7 +305,7 @@ var canvasdesignerConfig = { name: "Background Hover", css: "background", schema: ".button-alt:hover" - }, + } ] } ] diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/border.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/border.js index bf64ad3fa0..37a284df92 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/border.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/border.js @@ -73,7 +73,7 @@ angular.module("Umbraco.canvasdesigner") topbordertype: 'solid', bottombordersize: '', bottombordercolor: '', - bottombordertype: 'solid', + bottombordertype: 'solid' }; } diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/googlefontpicker.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/googlefontpicker.js index ce6bf2c9f7..e89fc4db2c 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/googlefontpicker.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/googlefontpicker.js @@ -12,7 +12,7 @@ angular.module("Umbraco.canvasdesigner") fontFamily: '', fontType: '', fontWeight: '', - fontStyle: '', + fontStyle: '' } } @@ -74,7 +74,7 @@ angular.module("Umbraco.canvasdesigner") fontType: "safe", fontFamily: value, fontWeight: "normal", - fontStyle: "normal", + fontStyle: "normal" }); }); @@ -121,7 +121,7 @@ angular.module("Umbraco.canvasdesigner") fontFamily: $scope.selectedFont.fontFamily, fontType: $scope.selectedFont.fontType, fontWeight: $scope.selectedFont.fontWeight, - fontStyle: $scope.selectedFont.fontStyle, + fontStyle: $scope.selectedFont.fontStyle }); } }); @@ -161,7 +161,7 @@ angular.module("Umbraco.canvasdesigner") fontFamily: $scope.selectedFont.fontFamily, fontType: $scope.selectedFont.fontType, fontWeight: $scope.selectedFont.fontWeight, - fontStyle: $scope.selectedFont.fontStyle, + fontStyle: $scope.selectedFont.fontStyle }); } @@ -178,7 +178,7 @@ angular.module("Umbraco.canvasdesigner") fontFamily: $scope.selectedFont.fontFamily, fontType: $scope.selectedFont.fontType, fontWeight: $scope.selectedFont.fontWeight, - fontStyle: $scope.selectedFont.fontStyle, + fontStyle: $scope.selectedFont.fontStyle }); }; diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/margin.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/margin.js index 617421f702..f1d2032e16 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/margin.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/margin.js @@ -12,7 +12,7 @@ angular.module("Umbraco.canvasdesigner") $scope.selectedmargin = { name: "", - value: 0, + value: 0 }; $scope.setSelectedmargin = function (margintype) { @@ -50,7 +50,7 @@ angular.module("Umbraco.canvasdesigner") leftmarginvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 1 ? $scope.item.defaultValue[1] : '', rightmarginvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 2 ? $scope.item.defaultValue[2] : '', topmarginvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 3 ? $scope.item.defaultValue[3] : '', - bottommarginvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '', + bottommarginvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '' }; } diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/padding.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/padding.js index 81690cd7e4..b0f311872e 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/padding.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/padding.js @@ -12,7 +12,7 @@ angular.module("Umbraco.canvasdesigner") $scope.selectedpadding = { name: "", - value: 0, + value: 0 }; $scope.setSelectedpadding = function (paddingtype) { @@ -50,7 +50,7 @@ angular.module("Umbraco.canvasdesigner") leftpaddingvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 1 ? $scope.item.defaultValue[1] : '', rightpaddingvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 2 ? $scope.item.defaultValue[2] : '', toppaddingvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 3 ? $scope.item.defaultValue[3] : '', - bottompaddingvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '', + bottompaddingvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '' }; } diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/radius.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/radius.js index 7305591a83..85edb849bc 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/radius.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/editors/radius.js @@ -12,7 +12,7 @@ angular.module("Umbraco.canvasdesigner") $scope.selectedradius = { name: "", - value: 0, + value: 0 }; $scope.setSelectedradius = function (radiustype) { @@ -50,7 +50,7 @@ angular.module("Umbraco.canvasdesigner") topleftradiusvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 1 ? $scope.item.defaultValue[1] : '', toprightradiusvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 2 ? $scope.item.defaultValue[2] : '', bottomleftradiusvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 3 ? $scope.item.defaultValue[3] : '', - bottomrightradiusvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '', + bottomrightradiusvalue: $scope.item.defaultValue && $scope.item.defaultValue.length > 4 ? $scope.item.defaultValue[4] : '' }; } diff --git a/src/Umbraco.Web.UI.Client/src/canvasdesigner/lib/spectrum.directive.js b/src/Umbraco.Web.UI.Client/src/canvasdesigner/lib/spectrum.directive.js index 214190a9b9..eb23549bd0 100644 --- a/src/Umbraco.Web.UI.Client/src/canvasdesigner/lib/spectrum.directive.js +++ b/src/Umbraco.Web.UI.Client/src/canvasdesigner/lib/spectrum.directive.js @@ -48,7 +48,7 @@ angular.module('spectrumcolorpicker', []) scope.colorselected = initColor; scope.$apply(); }); - }, + } }); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbbackdrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbbackdrop.directive.js index ced59653dd..39e4f10666 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbbackdrop.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbbackdrop.directive.js @@ -103,7 +103,7 @@ backdropOpacity: "=?", highlightElement: "=?", highlightPreventClick: "=?", - disableEventsOnClick: "=?", + disableEventsOnClick: "=?" } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js index 135d806aa4..a287ec0476 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js @@ -53,7 +53,7 @@ angular.module("umbraco.directives") var $container = element.find(".crop-container"); //default constraints for drag n drop - var constraints = {left: {max: scope.dimensions.margin, min: scope.dimensions.margin}, top: {max: scope.dimensions.margin, min: scope.dimensions.margin}, }; + var constraints = {left: {max: scope.dimensions.margin, min: scope.dimensions.margin}, top: {max: scope.dimensions.margin, min: scope.dimensions.margin} }; scope.constraints = constraints; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdropdownitem.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdropdownitem.directive.js index 59b2b827eb..1c302ca90f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdropdownitem.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdropdownitem.directive.js @@ -17,7 +17,7 @@ restrict: 'E', replace: true, transclude: true, - templateUrl: 'views/components/umb-dropdown-item.html', + templateUrl: 'views/components/umb-dropdown-item.html' }; return directive; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js index 63cddbf1bf..db0bc9a1d8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js @@ -57,7 +57,7 @@ }, stop: function(e, ui) { updateTabsSortOrder(); - }, + } }; scope.sortableOptionsProperty = { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umblaunchminieditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umblaunchminieditor.directive.js index 11b934ce96..0f0ca9dd1b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umblaunchminieditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umblaunchminieditor.directive.js @@ -12,7 +12,7 @@ angular.module("umbraco.directives") restrict: 'A', replace: false, scope: { - node: '=umbLaunchMiniEditor', + node: '=umbLaunchMiniEditor' }, link: function(scope, element, attrs) { diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/nestedcontent.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/nestedcontent.resource.js index b3488fdff4..4f71c1d1b4 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/nestedcontent.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/nestedcontent.resource.js @@ -7,6 +7,6 @@ $http.get(url), 'Failed to retrieve content types' ); - }, + } }; }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/common/services/appstate.service.js b/src/Umbraco.Web.UI.Client/src/common/services/appstate.service.js index 2369af54b5..085ba52b7e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/appstate.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/appstate.service.js @@ -329,7 +329,7 @@ angular.module('umbraco.services').factory("editorState", function() { }, set: function (value) { throw "Use editorState.set to set the value of the current entity"; - }, + } }); return state; diff --git a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js index 1dda682f87..7c7e07db9a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/listviewhelper.service.js @@ -504,7 +504,7 @@ canDelete: _.contains(intersectPermissions, 'D'), //Magic Char = D canMove: _.contains(intersectPermissions, 'M'), //Magic Char = M canPublish: _.contains(intersectPermissions, 'U'), //Magic Char = U - canUnpublish: _.contains(intersectPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish) + canUnpublish: _.contains(intersectPermissions, 'U') //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish) }; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js index f775e35934..840066adef 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js @@ -641,7 +641,7 @@ function navigationService($rootScope, $routeParams, $log, $location, $q, $timeo //These will show up on the dialog controller's $scope under dialogOptions currentNode: args.node, - currentAction: args.action, + currentAction: args.action }); //save the currently assigned dialog so it can be removed before a new one is created diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.controller.js index 81b86fc969..9cfd4845b6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/legacydelete.controller.js @@ -16,7 +16,7 @@ function LegacyDeleteController($scope, legacyResource, treeService, navigationS legacyResource.deleteItem({ nodeId: $scope.currentNode.id, nodeType: $scope.currentNode.nodeType, - alias: $scope.currentNode.name, + alias: $scope.currentNode.name }).then(function () { $scope.currentNode.loading = false; //TODO: Need to sync tree, etc... diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js index 73f6003bb9..dee9a4409a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/linkpicker.controller.js @@ -106,7 +106,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.LinkPickerController", hasChildren: false, name: searchText, metaData: { - listViewNode: child, + listViewNode: child }, cssClass: "icon umb-tree-icon sprTree icon-search", cssClasses: ["not-published"] diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js index 063c36b393..3f50926b47 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/login.controller.js @@ -181,7 +181,7 @@ modalClass: "login-overlay", animation: "slide", show: true, - callback: callback, + callback: callback }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.controller.js index 6dae664a3d..9397a63448 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/template/querybuilder.controller.js @@ -31,7 +31,7 @@ angular.module("umbraco").controller('Umbraco.Dialogs.Template.QueryBuilderContr sort:{ property:{ alias: "", - name: "", + name: "" }, direction: "ascending" } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js index 740791abf9..b0521dc930 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/treepicker.controller.js @@ -93,7 +93,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.TreePickerController", }, name: searchText, metaData: { - listViewNode: child, + listViewNode: child }, cssClass: "icon-search", cssClasses: ["not-published"] diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js index e90afce7bb..345b9dec5b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediaPicker/mediapicker.controller.js @@ -47,7 +47,7 @@ angular.module("umbraco") pageSize: 100, totalItems: 0, totalPages: 0, - filter: '', + filter: '' }; //preload selected item diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js index ea9ad6ca97..c474c7fc25 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/querybuilder/querybuilder.controller.js @@ -50,7 +50,7 @@ sort: { property: { alias: "", - name: "", + name: "" }, direction: "ascending", //This is the value for sorting sent to server translation: { diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js index ad15167d18..1755799e42 100644 --- a/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/datatype.edit.controller.js @@ -28,7 +28,7 @@ function DataTypeEditController($scope, $routeParams, $location, appState, navig label: preVals[i].label, view: preVals[i].view, value: preVals[i].value, - config: preVals[i].config, + config: preVals[i].config }); } } diff --git a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js index 960549aabf..93c9e162c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/partialviews/edit.controller.js @@ -350,7 +350,7 @@ }); }, readOnly: true - }, + } ]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.prevalues.controller.js index 5403ce4aad..7978ca3150 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.prevalues.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.prevalues.controller.js @@ -28,7 +28,7 @@ angular.module("umbraco") name: "1 column layout", sections: [ { - grid: 12, + grid: 12 } ] }, @@ -36,7 +36,7 @@ angular.module("umbraco") name: "2 column layout", sections: [ { - grid: 4, + grid: 4 }, { grid: 8 diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js index 03b95b6883..62da8f268a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js @@ -57,10 +57,10 @@ function listViewController($rootScope, $scope, $routeParams, $injector, $cookie totalPages: 0, items: [] }; - + //when this is null, we don't check permissions - $scope.currentNodePermissions = null; - + $scope.currentNodePermissions = null; + if ($scope.entityType === "content") { //Just ensure we do have an editorState if (editorState.current) { @@ -75,9 +75,9 @@ function listViewController($rootScope, $scope, $routeParams, $injector, $cookie "canDelete": _.contains(currentUserPermissions, 'D'), //Magic Char = D "canMove": _.contains(currentUserPermissions, 'M'), //Magic Char = M "canPublish": _.contains(currentUserPermissions, 'U'), //Magic Char = U - "canUnpublish": _.contains(currentUserPermissions, 'U'), //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish) + "canUnpublish": _.contains(currentUserPermissions, 'U') //Magic Char = Z (however UI says it can't be set, so if we can publish 'U' we can unpublish) }; - } + } } //when this is null, we don't check permissions diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js index d55a2bf65a..05d36efbb7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/tags/tags.controller.js @@ -183,7 +183,7 @@ angular.module("umbraco") tagsHound.get(query, function (suggestions) { cb(removeCurrentTagsFromSuggestions(suggestions)); }); - }, + } }).bind("typeahead:selected", function (obj, datum, name) { angularHelper.safeApply($scope, function () { addTag(datum["value"]); diff --git a/src/Umbraco.Web.UI.Client/src/views/scripts/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/scripts/edit.controller.js index 68fd2d0107..edc7f52ae2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/scripts/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/scripts/edit.controller.js @@ -156,7 +156,7 @@ }); }, readOnly: true - }, + } ]); // initial cursor placement diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 1e2934028b..b23d11dea1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -266,7 +266,7 @@ }); }, readOnly: true - }, + } ]); From 9d7519d591056967386ce2a6a5314c703723c6f2 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 9 Aug 2018 15:10:27 +1000 Subject: [PATCH 161/275] manually merges noscript update --- .../Umbraco/Views/Default.cshtml | 84 +++++++++---------- 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml b/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml index cd2e64cb44..1f26d628e4 100644 --- a/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml +++ b/src/Umbraco.Web.UI/Umbraco/Views/Default.cshtml @@ -1,19 +1,11 @@ -@using System.Collections -@using System.Net.Http -@using System.Web.Mvc.Html -@using Umbraco.Core +@using Umbraco.Core @using ClientDependency.Core @using ClientDependency.Core.Mvc -@using Microsoft.Owin.Security -@using Newtonsoft.Json -@using Newtonsoft.Json.Linq @using Umbraco.Core.IO @using Umbraco.Web -@using Umbraco.Web.Editors -@using umbraco @using Umbraco.Core.Configuration -@inherits System.Web.Mvc.WebViewPage +@inherits WebViewPage @{ var isDebug = false; @@ -51,18 +43,25 @@ new BasicPath("Umbraco", IOHelper.ResolveUrl(SystemDirectories.Umbraco)), new BasicPath("UmbracoClient", IOHelper.ResolveUrl(SystemDirectories.UmbracoClient))) - + +
    - -
    + + - + @@ -90,45 +87,42 @@ - +
    - + - + - + @Html.BareMinimumServerVariablesScript(Url, Url.Action("ExternalLogin", "BackOffice", new { area = ViewBag.UmbracoPath }), Model.Features, UmbracoConfig.For.GlobalSettings()) - - - @*And finally we can load in our angular app*@ - - + + @if (isDebug) { From 1ffcc853e11ee0cc51eb17e517d4d026c5e101fd Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 9 Aug 2018 15:23:46 +1000 Subject: [PATCH 162/275] updates package-lock --- src/Umbraco.Web.UI.Client/package-lock.json | 12353 +++++++++++------- 1 file changed, 7504 insertions(+), 4849 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index b11de54152..626e1e3d51 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1,46 +1,50 @@ { "name": "umbraco", - "version": "7.1.2", + "version": "0.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { "abbrev": { - "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", "dev": true }, "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", "dev": true, "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz" + "mime-types": "~2.1.6", + "negotiator": "0.5.3" } }, "accord": { - "version": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", "integrity": "sha1-vsUWovci59UPX59C+Bt387lUSLo=", "dev": true, "requires": { - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "indx": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", - "lodash.clone": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "lodash.flatten": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "lodash.merge": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", - "lodash.partialright": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", - "lodash.pick": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "when": "https://registry.npmjs.org/when/-/when-3.7.8.tgz" + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.5.0", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" }, "dependencies": { "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", "dev": true } @@ -58,21 +62,39 @@ "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", "dev": true, "requires": { - "acorn": "5.7.1" + "acorn": "^5.0.3" } }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true + }, "after": { - "version": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { @@ -82,42 +104,62 @@ "dev": true }, "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "alphanum-sort": { - "version": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "dev": true, + "optional": true, + "requires": { + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" + } + }, "angular": { - "version": "https://registry.npmjs.org/angular/-/angular-1.3.20.tgz", + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.3.20.tgz", "integrity": "sha1-sjo9fF5/mffZW5tNSbmsNVJpuu4=", "dev": true }, "angular-animate": { - "version": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.3.20.tgz", + "version": "1.3.20", + "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.3.20.tgz", "integrity": "sha1-0XB8cn+K0N8hxKLewgzX/ElFtSo=", "dev": true }, @@ -127,15 +169,16 @@ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { - "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + "ansi-wrap": "^0.1.0" } }, "ansi-cyan": { - "version": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", "dev": true, "requires": { - "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + "ansi-wrap": "0.1.0" } }, "ansi-escapes": { @@ -145,2310 +188,49 @@ "dev": true }, "ansi-gray": { - "version": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", "dev": true, "requires": { - "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + "ansi-wrap": "0.1.0" } }, "ansi-red": { - "version": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", "dev": true, "requires": { - "ansi-wrap": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz" + "ansi-wrap": "0.1.0" } }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "ansi-wrap": { - "version": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", "dev": true }, "anymatch": { - "version": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" - }, - "dependencies": { - "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - } - }, - "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" - } - }, - "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" - } - }, - "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - } - }, - "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" - } - } - } - }, - "archive-type": { - "version": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "requires": { - "file-type": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz" - }, - "dependencies": { - "file-type": { - "version": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - } - } - }, - "archy": { - "version": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "argparse": { - "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - } - }, - "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-differ": { - "version": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-slice": { - "version": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", - "dev": true - }, - "array-union": { - "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - } - }, - "array-uniq": { - "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "assign-symbols": { - "version": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", - "dev": true, - "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" - } - }, - "async-each": { - "version": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "async-each-series": { - "version": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true - }, - "autoprefixer": { - "version": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", - "normalize-range": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "num2fraction": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" - } - }, - "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "3.0.2" - } - }, - "backo2": { - "version": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "class-utils": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "mixin-deep": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "pascalcase": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" - }, - "dependencies": { - "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" - } - }, - "is-accessor-descriptor": { - "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - }, - "is-data-descriptor": { - "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - }, - "is-descriptor": { - "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - } - } - }, - "base64-arraybuffer": { - "version": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-url": { - "version": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", - "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=", - "dev": true - }, - "base64id": { - "version": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "basic-auth": { - "version": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", - "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=", - "dev": true - }, - "basic-auth-connect": { - "version": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", - "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=", - "dev": true - }, - "batch": { - "version": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", - "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - } - }, - "beeper": { - "version": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, - "better-assert": { - "version": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" - } - }, - "bin-build": { - "version": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "optional": true, - "requires": { - "archive-type": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "decompress": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "download": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "exec-series": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "tempfile": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "url-regex": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz" - }, - "dependencies": { - "tempfile": { - "version": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "optional": true, - "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "uuid": "2.0.3" - } - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true, - "optional": true - } - } - }, - "bin-check": { - "version": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "optional": true, - "requires": { - "executable": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz" - } - }, - "bin-version": { - "version": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "optional": true, - "requires": { - "find-versions": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz" - } - }, - "bin-version-check": { - "version": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "optional": true, - "requires": { - "bin-version": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "minimist": "1.2.0", - "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "semver-truncate": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "bin-wrapper": { - "version": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "optional": true, - "requires": { - "bin-check": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "bin-version-check": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "download": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "each-async": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "lazy-req": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "os-filter-obj": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz" - } - }, - "binary-extensions": { - "version": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true - }, - "bl": { - "version": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha1-oWCRFxcQPAdBDO9j71Gzl8Alr5w=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - } - } - } - }, - "blob": { - "version": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, - "bluebird": { - "version": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", - "dev": true - }, - "body-parser": { - "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", - "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", - "dev": true, - "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "boolbase": { - "version": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" - } - }, - "bower": { - "version": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz", - "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=", - "dev": true - }, - "bower-installer": { - "version": "https://registry.npmjs.org/bower-installer/-/bower-installer-1.3.6.tgz", - "integrity": "sha1-z3g5tlQh0rJwqyLHT8hYpV46E3A=", - "dev": true, - "requires": { - "async": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "bower": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "node-fs": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", - "nopt": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" - } - }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - }, - "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "snapdragon-node": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "split-string": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" - }, - "dependencies": { - "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - } - } - } - }, - "browserslist": { - "version": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", - "electron-to-chromium": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz" - } - }, - "buffer-alloc": { - "version": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "buffer-fill": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz" - } - }, - "buffer-alloc-unsafe": { - "version": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", - "dev": true - }, - "buffer-fill": { - "version": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha1-FfS5vO8BIETfMRQsFDM8r24CYNA=", - "dev": true, - "optional": true - }, - "buffer-to-vinyl": { - "version": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "dev": true, - "requires": { - "file-type": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz" - }, - "dependencies": { - "file-type": { - "version": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - } - }, - "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" - } - } - } - }, - "bufferstreams": { - "version": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", - "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" - } - }, - "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", - "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", - "dev": true - }, - "cache-base": { - "version": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "has-value": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "set-value": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "to-object-path": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "union-value": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "unset-value": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "0.2.0" - } - }, - "callsite": { - "version": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "camelcase-keys": { - "version": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - }, - "dependencies": { - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-api": { - "version": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "dev": true, - "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-db": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", - "lodash.memoize": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "lodash.uniq": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - } - }, - "caniuse-db": { - "version": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", - "integrity": "sha1-eItsj28CmRdDsYzbvVT5bQW0uVo=", - "dev": true - }, - "canonical-path": { - "version": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", - "integrity": "sha1-4x65N6jJPuKgHfGDl5RyGQKHRXQ=", - "dev": true - }, - "capture-stack-trace": { - "version": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "caw": { - "version": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "requires": { - "get-proxy": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "is-obj": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" - }, - "dependencies": { - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - }, - "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true - } - } - }, - "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" - } - }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, - "dependencies": { - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "chokidar": { - "version": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "async-each": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "is-binary-path": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" - }, - "dependencies": { - "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - } - }, - "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - } - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - } - }, - "class-utils": { - "version": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "static-extend": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" - }, - "dependencies": { - "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - } - }, - "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-buffer": { - "version": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - } - } - } - }, - "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coa": { - "version": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "requires": { - "q": "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - } - }, - "collection-visit": { - "version": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "object-visit": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" - } - }, - "color": { - "version": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "color-string": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" - } - }, - "color-convert": { - "version": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", - "dev": true, - "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - } - }, - "color-name": { - "version": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - } - }, - "color-support": { - "version": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", - "dev": true - }, - "colormin": { - "version": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "dev": true, - "requires": { - "color": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "css-color-names": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" - } - }, - "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "integrity": "sha1-4MtB0+SyCAazv8J/RVnwG5S8L3w=", - "dev": true - }, - "combine-lists": { - "version": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" - } - }, - "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - } - }, - "commander": { - "version": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - } - }, - "component-bind": { - "version": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, - "compressible": { - "version": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", - "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", - "dev": true, - "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" - } - }, - "compression": { - "version": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", - "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", - "dev": true, - "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", - "compressible": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "vary": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "typedarray": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - } - } - } - }, - "concat-with-sourcemaps": { - "version": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha1-1OqT8FriV5CVG5nns7CeOQikCC4=", - "dev": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - }, - "dependencies": { - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "connect": { - "version": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", - "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", - "dev": true, - "requires": { - "basic-auth-connect": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", - "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", - "compression": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", - "connect-timeout": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "cookie-parser": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "csurf": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "errorhandler": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", - "express-session": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", - "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "method-override": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", - "morgan": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", - "multiparty": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "pause": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", - "response-time": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", - "serve-favicon": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", - "serve-index": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", - "serve-static": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "vhost": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "connect-livereload": { - "version": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", - "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", - "dev": true - }, - "connect-timeout": { - "version": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", - "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", - "dev": true, - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "console-stream": { - "version": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", - "dev": true, - "optional": true - }, - "consolidate": { - "version": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", - "dev": true, - "requires": { - "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz" - } - }, - "content-type": { - "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true - }, - "convert-source-map": { - "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=", - "dev": true - }, - "cookie-parser": { - "version": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", - "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", - "dev": true, - "requires": { - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - } - }, - "cookie-signature": { - "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-descriptor": { - "version": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha1-D+bUW/PKw6w2Sp1y3nV29OsiG50=", - "dev": true - }, - "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", - "dev": true, - "requires": { - "is-directory": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "require-from-string": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" - }, - "dependencies": { - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "crc": { - "version": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", - "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=", - "dev": true - }, - "create-error-class": { - "version": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz" - } - }, - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" - }, - "dependencies": { - "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", - "dev": true, - "optional": true, - "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - } - } - } - }, - "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" - } - }, - "csrf": { - "version": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", - "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=", - "dev": true, - "requires": { - "rndm": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", - "tsscmp": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", - "uid-safe": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz" - } - }, - "css-color-names": { - "version": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-select": { - "version": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", - "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=", - "dev": true, - "optional": true, - "requires": { - "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "css-what": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "domutils": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "nth-check": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz" - } - }, - "css-select-base-adapter": { - "version": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", - "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=", - "dev": true, - "optional": true - }, - "css-tree": { - "version": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", - "integrity": "sha1-G7+r+/bu708B2RCP8u3Qvi/jVZc=", - "dev": true, - "optional": true, - "requires": { - "mdn-data": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - } - }, - "css-url-regex": { - "version": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", - "dev": true, - "optional": true - }, - "css-what": { - "version": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true, - "optional": true - }, - "cssnano": { - "version": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "defined": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-calc": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "postcss-colormin": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "postcss-convert-values": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "postcss-discard-comments": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "postcss-discard-duplicates": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "postcss-discard-empty": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "postcss-discard-overridden": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "postcss-discard-unused": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "postcss-filter-plugins": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "postcss-merge-idents": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "postcss-merge-longhand": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "postcss-merge-rules": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "postcss-minify-font-values": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "postcss-minify-gradients": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "postcss-minify-params": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "postcss-minify-selectors": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "postcss-normalize-charset": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "postcss-normalize-url": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "postcss-ordered-values": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "postcss-reduce-idents": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "postcss-reduce-initial": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "postcss-reduce-transforms": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "postcss-svgo": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "postcss-unique-selectors": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "postcss-zindex": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" - } - }, - "csso": { - "version": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - } - }, - "csurf": { - "version": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", - "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", - "dev": true, - "requires": { - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "csrf": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz" - } - }, - "currently-unhandled": { - "version": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" - } - }, - "custom-event": { - "version": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - }, - "dependencies": { - "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - } - } - }, - "dateformat": { - "version": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - }, - "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress": { - "version": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "requires": { - "buffer-to-vinyl": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "decompress-tar": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "decompress-tarbz2": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "decompress-targz": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "decompress-unzip": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "stream-combiner2": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "vinyl-assign": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz" - }, - "dependencies": { - "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - } - }, - "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" - } - }, - "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" - } - }, - "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - }, - "glob-stream": { - "version": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "ordered-read-streams": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "through2": "0.6.5", - "to-absolute-glob": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "unique-stream": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz" - }, - "dependencies": { - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - } - } - }, - "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - } - }, - "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" - } - }, - "ordered-read-streams": { - "version": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "readable-stream": "2.3.6" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - } - }, - "strip-bom-stream": { - "version": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "unique-stream": { - "version": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" - } - }, - "vinyl-fs": { - "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "gulp-sourcemaps": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "is-valid-glob": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "lazystream": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "readable-stream": "2.3.6", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "strip-bom-stream": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "vali-date": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "vinyl": "1.2.0" - } - } - } - }, - "decompress-tar": { - "version": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "requires": { - "is-tar": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" - }, - "dependencies": { - "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" - } - } - } - }, - "decompress-tarbz2": { - "version": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "requires": { - "is-bzip2": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "object-assign": "2.1.1", - "seek-bzip": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "through2": "0.6.5", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" - } - } - } - }, - "decompress-targz": { - "version": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "requires": { - "is-gzip": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "object-assign": "2.1.1", - "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "tar-stream": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "through2": "0.6.5", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" - } - }, - "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "0.2.0", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" - } - } - } - }, - "decompress-unzip": { - "version": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "requires": { - "is-zip": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "stat-mode": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "strip-dirs": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl": "1.2.0", - "yauzl": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz" - }, - "dependencies": { - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" - } - } - } - }, - "deep-extend": { - "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", - "dev": true - }, - "deep-is": { - "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defaults": { - "version": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - } - }, - "define-properties": { - "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "object-keys": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz" - } - }, - "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - }, - "is-data-descriptor": { - "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - }, - "is-descriptor": { - "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" - } - } - } - }, - "defined": { - "version": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz" - }, - "dependencies": { - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "arrify": "1.0.1", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - } - } - }, - "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", - "dev": true - }, - "deprecated": { - "version": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", - "dev": true - }, - "destroy": { - "version": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "di": { - "version": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" - } - }, - "dom-serialize": { - "version": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "ent": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "void-elements": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" - } - }, - "dom-serializer": { - "version": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "optional": true, - "requires": { - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "entities": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz" - }, - "dependencies": { - "domelementtype": { - "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true, - "optional": true - } - } - }, - "domelementtype": { - "version": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true, - "optional": true - }, - "domutils": { - "version": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "optional": true, - "requires": { - "dom-serializer": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "domelementtype": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz" - } - }, - "download": { - "version": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "requires": { - "caw": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "each-async": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "filenamify": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "got": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "gulp-decompress": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "gulp-rename": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "is-url": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "readable-stream": "2.3.6", - "stream-combiner2": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "vinyl": "1.2.0", - "vinyl-fs": "2.4.4", - "ware": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" }, "dependencies": { "arr-diff": { @@ -2457,7 +239,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -2472,9 +254,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -2483,7 +265,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -2492,7 +274,1894 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "archive-type": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", + "dev": true, + "requires": { + "file-type": "^3.1.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + } + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha1-42jqFfibxwaff/uJrsOmx9SsItQ=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.5.tgz", + "integrity": "sha512-oJjo+5e7/vEc2FBK8gUalV0pba4L3VdBIs2EKhOLHLcOd2FgQIVQN9xb0eZ9IjEWyAL7vq6fGJxOvVvdCHNyMw==", + "dev": true, + "optional": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-each-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", + "dev": true, + "optional": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok=", + "dev": true + }, + "axios": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "1.0.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0" + } + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "basic-auth": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", + "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=", + "dev": true + }, + "basic-auth-connect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=", + "dev": true + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "bin-build": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", + "dev": true, + "optional": true, + "requires": { + "archive-type": "^3.0.1", + "decompress": "^3.0.0", + "download": "^4.1.2", + "exec-series": "^1.0.0", + "rimraf": "^2.2.6", + "tempfile": "^1.0.0", + "url-regex": "^3.0.0" + }, + "dependencies": { + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "optional": true, + "requires": { + "os-tmpdir": "^1.0.0", + "uuid": "^2.0.1" + } + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true, + "optional": true + } + } + }, + "bin-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", + "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", + "dev": true, + "optional": true, + "requires": { + "executable": "^1.0.0" + } + }, + "bin-version": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", + "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", + "dev": true, + "optional": true, + "requires": { + "find-versions": "^1.0.0" + } + }, + "bin-version-check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", + "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", + "dev": true, + "optional": true, + "requires": { + "bin-version": "^1.0.0", + "minimist": "^1.1.0", + "semver": "^4.0.3", + "semver-truncate": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "bin-wrapper": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", + "dev": true, + "optional": true, + "requires": { + "bin-check": "^2.0.0", + "bin-version-check": "^2.1.0", + "download": "^4.0.0", + "each-async": "^1.1.1", + "lazy-req": "^1.0.0", + "os-filter-obj": "^1.0.0" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "dev": true, + "optional": true, + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha1-oWCRFxcQPAdBDO9j71Gzl8Alr5w=", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "body-parser": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "dev": true, + "requires": { + "bytes": "2.1.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.0.1", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.11", + "on-finished": "~2.3.0", + "qs": "4.0.0", + "raw-body": "~2.1.2", + "type-is": "~1.6.6" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "bower": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz", + "integrity": "sha1-54dqB23rgTf30GUl3F6MZtuC8oo=", + "dev": true + }, + "bower-installer": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/bower-installer/-/bower-installer-1.3.6.tgz", + "integrity": "sha1-z3g5tlQh0rJwqyLHT8hYpV46E3A=", + "dev": true, + "requires": { + "async": "^2.1.4", + "bower": "^1.8.0", + "colors": "^1.1.2", + "glob": "^7.1.1", + "lodash": "^4.17.2", + "mkdirp": "^0.5.1", + "node-fs": "~0.1.7", + "nopt": "^3.0.6" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + }, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + } + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", + "integrity": "sha1-FfS5vO8BIETfMRQsFDM8r24CYNA=", + "dev": true, + "optional": true + }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "dev": true + }, + "buffer-to-vinyl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", + "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", + "dev": true, + "requires": { + "file-type": "^3.1.0", + "readable-stream": "^2.0.2", + "uuid": "^2.0.1", + "vinyl": "^1.0.0" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "bufferstreams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", + "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", + "dev": true, + "requires": { + "readable-stream": "^1.0.33" + } + }, + "buildmail": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", + "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "3.0.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0", + "punycode": "1.4.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30000836", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000836.tgz", + "integrity": "sha1-eItsj28CmRdDsYzbvVT5bQW0uVo=", + "dev": true + }, + "canonical-path": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", + "integrity": "sha1-4x65N6jJPuKgHfGDl5RyGQKHRXQ=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "caw": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", + "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", + "dev": true, + "requires": { + "get-proxy": "^1.0.1", + "is-obj": "^1.0.0", + "object-assign": "^3.0.0", + "tunnel-agent": "^0.4.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha1-TzZ0WzIAhJJVf0ZBLWbVDLmbzlE=", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha1-1ZHe5Kj4vBXaQ86X3O66E9Q+KmU=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "dev": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha1-k4NDeaHMmgxh+C9S8NBDIiUb1aI=", + "dev": true + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", + "integrity": "sha1-4MtB0+SyCAazv8J/RVnwG5S8L3w=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": ">= 1.33.0 < 2" + } + }, + "compression": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "dev": true, + "requires": { + "accepts": "~1.2.12", + "bytes": "2.1.0", + "compressible": "~2.0.5", + "debug": "~2.2.0", + "on-headers": "~1.0.0", + "vary": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha1-1OqT8FriV5CVG5nns7CeOQikCC4=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + } + } + }, + "connect": { + "version": "2.30.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "dev": true, + "requires": { + "basic-auth-connect": "1.0.0", + "body-parser": "~1.13.3", + "bytes": "2.1.0", + "compression": "~1.5.2", + "connect-timeout": "~1.6.2", + "content-type": "~1.0.1", + "cookie": "0.1.3", + "cookie-parser": "~1.3.5", + "cookie-signature": "1.0.6", + "csurf": "~1.8.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "errorhandler": "~1.4.2", + "express-session": "~1.11.3", + "finalhandler": "0.4.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "method-override": "~2.3.5", + "morgan": "~1.6.1", + "multiparty": "3.3.2", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "pause": "0.1.0", + "qs": "4.0.0", + "response-time": "~2.3.1", + "serve-favicon": "~2.3.0", + "serve-index": "~1.7.2", + "serve-static": "~1.10.0", + "type-is": "~1.6.6", + "utils-merge": "1.0.0", + "vhost": "~3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "connect-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", + "dev": true + }, + "connect-timeout": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", + "dev": true, + "requires": { + "debug": "~2.2.0", + "http-errors": "~1.3.1", + "ms": "0.7.1", + "on-headers": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=", + "dev": true + }, + "cookie-parser": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", + "dev": true, + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "crc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "csrf": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.6.tgz", + "integrity": "sha1-thEg3c7q/JHnbtUxO7XAsmZ7cQo=", + "dev": true, + "requires": { + "rndm": "1.2.0", + "tsscmp": "1.0.5", + "uid-safe": "2.1.4" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-select": { + "version": "1.3.0-rc0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", + "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=", + "dev": true, + "optional": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "^1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", + "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=", + "dev": true, + "optional": true + }, + "css-tree": { + "version": "1.0.0-alpha25", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", + "integrity": "sha1-G7+r+/bu708B2RCP8u3Qvi/jVZc=", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "^1.0.0", + "source-map": "^0.5.3" + } + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true, + "optional": true + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true, + "optional": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "csurf": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", + "dev": true, + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "csrf": "~3.0.0", + "http-errors": "~1.3.1" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", + "dev": true, + "requires": { + "buffer-to-vinyl": "^1.0.0", + "concat-stream": "^1.4.6", + "decompress-tar": "^3.0.0", + "decompress-tarbz2": "^3.0.0", + "decompress-targz": "^3.0.0", + "decompress-unzip": "^3.0.0", + "stream-combiner2": "^1.1.1", + "vinyl-assign": "^1.0.1", + "vinyl-fs": "^2.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" } }, "glob": { @@ -2501,11 +2170,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-stream": { @@ -2514,14 +2183,14 @@ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "dev": true, "requires": { - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "glob": "5.0.15", - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "micromatch": "2.3.11", - "ordered-read-streams": "0.3.0", - "through2": "0.6.5", - "to-absolute-glob": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "unique-stream": "2.2.1" + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -2536,10 +2205,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -2554,8 +2223,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } @@ -2578,7 +2247,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "isarray": { @@ -2593,7 +2262,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -2602,19 +2271,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "ordered-read-streams": { @@ -2623,8 +2292,8 @@ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "dev": true, "requires": { - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "readable-stream": "2.3.6" + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" } }, "readable-stream": { @@ -2633,13 +2302,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -2648,7 +2317,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } }, "strip-bom": { @@ -2657,7 +2326,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "^0.2.0" } }, "strip-bom-stream": { @@ -2666,8 +2335,8 @@ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", "dev": true, "requires": { - "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "strip-bom": "2.0.0" + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" } }, "unique-stream": { @@ -2676,8 +2345,8 @@ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", "dev": true, "requires": { - "json-stable-stringify": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz" + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" } }, "vinyl": { @@ -2686,9 +2355,9 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } }, "vinyl-fs": { @@ -2697,49 +2366,783 @@ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, "requires": { - "duplexify": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "glob-stream": "5.3.5", - "graceful-fs": "4.1.11", - "gulp-sourcemaps": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "is-valid-glob": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "lazystream": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "lodash.isequal": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "readable-stream": "2.3.6", - "strip-bom": "2.0.0", - "strip-bom-stream": "1.0.0", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "through2-filter": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "vali-date": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "vinyl": "1.2.0" + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + } + } + } + }, + "decompress-tar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", + "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "dev": true, + "requires": { + "is-tar": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-tarbz2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", + "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", + "dev": true, + "requires": { + "is-bzip2": "^1.0.0", + "object-assign": "^2.0.0", + "seek-bzip": "^1.0.3", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-targz": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", + "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", + "dev": true, + "requires": { + "is-gzip": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-unzip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", + "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", + "dev": true, + "requires": { + "is-zip": "^1.0.0", + "read-all-stream": "^3.0.0", + "stat-mode": "^0.2.0", + "strip-dirs": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0", + "yauzl": "^2.2.1" + }, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "optional": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "optional": true + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "optional": true, + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true, + "optional": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true, + "optional": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "optional": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, + "download": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", + "dev": true, + "requires": { + "caw": "^1.0.1", + "concat-stream": "^1.4.7", + "each-async": "^1.0.0", + "filenamify": "^1.0.1", + "got": "^5.0.0", + "gulp-decompress": "^1.2.0", + "gulp-rename": "^1.2.0", + "is-url": "^1.2.0", + "object-assign": "^4.0.1", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.2", + "stream-combiner2": "^1.1.1", + "vinyl": "^1.0.0", + "vinyl-fs": "^2.2.0", + "ware": "^1.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" } } } }, "duplexer": { - "version": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, "duplexer2": { - "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + "readable-stream": "~1.1.9" } }, "duplexify": { - "version": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", "integrity": "sha1-WSkD9dgLONA3IgVBJk1poZj7NBA=", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readable-stream": "2.3.6", - "stream-shift": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { "end-of-stream": { @@ -2748,7 +3151,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "once": "1.4.0" } }, "isarray": { @@ -2763,13 +3166,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -2778,265 +3181,301 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "each-async": { - "version": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", "dev": true, "requires": { - "onetime": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" } }, "ecc-jsbn": { - "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, "optional": true, "requires": { - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + "jsbn": "~0.1.0" } }, "ee-first": { - "version": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, "electron-to-chromium": { - "version": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", + "version": "1.3.45", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=", "dev": true }, "encodeurl": { - "version": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, "end-of-stream": { - "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + "once": "~1.3.0" }, "dependencies": { "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1" } } } }, "engine.io": { - "version": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", "dev": true, "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "base64id": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "ws": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz" + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "uws": "~9.14.0", + "ws": "~3.3.1" }, "dependencies": { "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + "mime-types": "~2.1.18", + "negotiator": "0.6.1" } }, "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + "ms": "2.0.0" } }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true } } }, "engine.io-client": { - "version": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", "dev": true, "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "component-inherit": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "engine.io-parser": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "has-cors": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "parsejson": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "parseqs": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "ws": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "xmlhttprequest-ssl": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "yeast": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" + "ms": "2.0.0" } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true } } }, "engine.io-parser": { - "version": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", "dev": true, "requires": { - "after": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "arraybuffer.slice": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "base64-arraybuffer": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "blob": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "wtf-8": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz" + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" } }, "ent": { - "version": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, "entities": { - "version": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", "dev": true, "optional": true }, "errno": { - "version": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "dev": true, "optional": true, "requires": { - "prr": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + "prr": "~1.0.1" } }, "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "is-arrayish": "^0.2.1" } }, "errorhandler": { - "version": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", "dev": true, "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + "accepts": "~1.3.0", + "escape-html": "~1.0.3" }, "dependencies": { "accepts": { - "version": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "negotiator": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + "mime-types": "~2.1.18", + "negotiator": "0.6.1" } }, "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true } } }, "es-abstract": { - "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", "integrity": "sha1-nbvdJ8aFbwABQhyhh4LXhr+KYWU=", "dev": true, "requires": { - "es-to-primitive": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "is-regex": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { - "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "is-date-object": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "is-symbol": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es6-promise": { - "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + } + } + }, "escape-html": { - "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "escodegen": { - "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha1-264X75bI5L7bE1b0UE+kzC98t+I=", "dev": true, "requires": { - "esprima": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true, "optional": true @@ -3049,45 +3488,45 @@ "integrity": "sha512-N/tCqlMKkyNvAvLu+zI9AqDasnSLt00K+Hu8kdsERliC9jYEc8ck12XtjvOXrBKu8fK6RrBcN9bat6Xk++9jAg==", "dev": true, "requires": { - "ajv": "6.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "4.0.0", - "eslint-utils": "1.3.1", - "eslint-visitor-keys": "1.0.0", - "espree": "4.0.0", - "esquery": "1.0.1", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "globals": "11.7.0", - "ignore": "4.0.3", - "imurmurhash": "0.1.4", - "inquirer": "5.2.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "natural-compare": "1.4.0", - "optionator": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "string.prototype.matchall": "2.0.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "table": "4.0.3", - "text-table": "0.2.0" + "ajv": "^6.5.0", + "babel-code-frame": "^6.26.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^4.0.0", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.7.0", + "ignore": "^4.0.2", + "imurmurhash": "^0.1.4", + "inquirer": "^5.2.0", + "is-resolvable": "^1.1.0", + "js-yaml": "^3.11.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.5", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.5.0", + "string.prototype.matchall": "^2.0.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^4.0.3", + "text-table": "^0.2.0" }, "dependencies": { "ajv": { @@ -3096,10 +3535,10 @@ "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ansi-regex": { @@ -3114,7 +3553,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3123,9 +3562,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cross-spawn": { @@ -3134,11 +3573,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.4", - "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "semver": "5.5.0", - "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "debug": { @@ -3147,7 +3586,7 @@ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "ms": "2.0.0" } }, "esprima": { @@ -3168,8 +3607,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "progress": { @@ -3190,7 +3629,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -3199,7 +3638,7 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3210,8 +3649,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-utils": { @@ -3232,12 +3671,13 @@ "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", "dev": true, "requires": { - "acorn": "5.7.1", - "acorn-jsx": "4.1.1" + "acorn": "^5.6.0", + "acorn-jsx": "^4.1.1" } }, "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, @@ -3247,7 +3687,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -3256,63 +3696,70 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "estraverse": "^4.1.0" } }, "estemplate": { - "version": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", "integrity": "sha1-FxSp1GGQc4rJWLyv1J4CnNpWo54=", "dev": true, "requires": { - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "estraverse": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" + "esprima": "^2.7.2", + "estraverse": "^4.1.1" } }, "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "etag": { - "version": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=", "dev": true }, "event-stream": { - "version": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "from": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "map-stream": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "pause-stream": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "split": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "stream-combiner": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, "eventemitter3": { - "version": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha1-CQtNbNvWRe0Qv3UNS1QHlC17oWM=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "exec-buffer": { - "version": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", "integrity": "sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=", "dev": true, "optional": true, "requires": { - "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "pify": "3.0.0", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "tempfile": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz" + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" }, "dependencies": { "pify": { @@ -3325,238 +3772,265 @@ } }, "exec-series": { - "version": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", "dev": true, "optional": true, "requires": { - "async-each-series": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "async-each-series": "^1.1.0", + "object-assign": "^4.1.0" } }, "execa": { - "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "optional": true, "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "executable": { - "version": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", "dev": true, "optional": true, "requires": { - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "meow": "^3.1.0" } }, "expand-braces": { - "version": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz" + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" }, "dependencies": { "array-slice": { - "version": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz" + "expand-range": "^0.1.0" } }, "expand-range": { - "version": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" } }, "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", "dev": true }, "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", "dev": true } } }, "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "posix-character-classes": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } } } }, "expand-range": { - "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { - "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.0.2" } }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "isarray": "1.0.0" } }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "expand-tilde": { - "version": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz" + "homedir-polyfill": "^1.0.1" } }, "express-session": { - "version": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", "dev": true, "requires": { - "cookie": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", - "cookie-signature": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "crc": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "uid-safe": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "crc": "3.3.0", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "uid-safe": "~2.0.0", + "utils-merge": "1.0.0" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, "uid-safe": { - "version": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=", "dev": true, "requires": { - "base64-url": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz" + "base64-url": "1.2.1" } } } }, "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + "is-plain-object": "^2.0.4" } } } @@ -3567,9 +4041,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" }, "dependencies": { "iconv-lite": { @@ -3578,7 +4052,7 @@ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "tmp": { @@ -3587,104 +4061,114 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "os-tmpdir": "~1.0.2" } } } }, "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { - "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { - "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.0" } }, "is-descriptor": { - "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, "extract-zip": { - "version": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", "dev": true, "requires": { - "concat-stream": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "yauzl": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz" + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" }, "dependencies": { "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", "dev": true, "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } } } }, "extsprintf": { - "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fancy-log": { - "version": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", "dev": true, "requires": { - "ansi-gray": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "color-support": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "time-stamp": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz" + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "time-stamp": "^1.0.0" } }, "fast-deep-equal": { @@ -3700,34 +4184,38 @@ "dev": true }, "fast-levenshtein": { - "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "faye-websocket": { - "version": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz" + "websocket-driver": ">=0.5.1" } }, "fd-slicer": { - "version": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + "pend": "~1.2.0" } }, "figures": { - "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "optional": true, "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -3736,143 +4224,167 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-type": { - "version": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", "dev": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-regex": { - "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "filename-reserved-regex": { - "version": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", "dev": true }, "filenamify": { - "version": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", "dev": true, "requires": { - "filename-reserved-regex": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "strip-outer": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "trim-repeated": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" } }, "fill-range": { - "version": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "to-regex-range": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } } } }, "finalhandler": { - "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "debug": "~2.2.0", + "escape-html": "1.0.2", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "escape-html": { - "version": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "find-index": { - "version": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", "dev": true }, "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "find-versions": { - "version": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", "dev": true, "optional": true, "requires": { - "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "semver-regex": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz" + "array-uniq": "^1.0.0", + "get-stdin": "^4.0.1", + "meow": "^3.5.0", + "semver-regex": "^1.0.0" } }, "findup-sync": { - "version": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "resolve-dir": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, "fined": { - "version": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "object.defaults": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "parse-filepath": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" } }, "first-chunk-stream": { - "version": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", "dev": true }, "flagged-respawn": { - "version": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", "dev": true }, @@ -3882,10 +4394,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" }, "dependencies": { "graceful-fs": { @@ -3897,123 +4409,681 @@ } }, "flatten": { - "version": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, "follow-redirects": { - "version": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "integrity": "sha1-2BIPRRgZD1Wqxlu2/HuF/NZm1qo=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.2.tgz", + "integrity": "sha512-kssLorP/9acIdpQ2udQVTiCS5LQmdEz9mvdIfDcl1gYX2tPKFADHSyFdvJS040XdFsPzemWtgI3q8mFVCxtX8A==", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + "debug": "^3.1.0" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "ms": "2.0.0" } } } }, "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { - "version": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "for-in": "^1.0.1" } }, "foreach": { - "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { - "asynckit": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fragment-cache": { - "version": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + "map-cache": "^0.2.2" } }, "fresh": { - "version": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", "dev": true }, "from": { - "version": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, "fs-constants": { - "version": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=", "dev": true }, "fs-extra": { - "version": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "jsonfile": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "klaw": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true } } }, "fs-readfile-promise": { - "version": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", "integrity": "sha1-gAI4I5gfn//+AWCei+Zo9prknnA=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "^4.1.2" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true } } }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + } + }, "function-bind": { - "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, @@ -4024,207 +5094,297 @@ "dev": true }, "gaze": { - "version": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, "requires": { - "globule": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz" + "globule": "~0.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "^1.0.0" } }, "get-proxy": { - "version": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", "dev": true, "requires": { - "rc": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + "rc": "^1.1.2" } }, "get-stdin": { - "version": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", "dev": true }, "get-stream": { - "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "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 }, + "get-uri": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", + "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", + "dev": true, + "optional": true, + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "3", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "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" + } + } + } + }, "get-value": { - "version": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "gifsicle": { - "version": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", "dev": true, "optional": true, "requires": { - "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" } }, "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { - "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "is-glob": "^2.0.0" } }, "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "is-extglob": "^1.0.0" } } } }, "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "path-dirname": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" } }, "glob-stream": { - "version": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", - "glob2base": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "ordered-read-streams": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "unique-stream": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz" + "glob": "^4.3.1", + "glob2base": "^0.0.12", + "minimatch": "^2.0.1", + "ordered-read-streams": "^0.1.0", + "through2": "^0.6.1", + "unique-stream": "^1.0.0" }, "dependencies": { "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" } }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "brace-expansion": "^1.0.0" } }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, "glob-watcher": { - "version": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "gaze": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz" + "gaze": "^0.5.1" } }, "glob2base": { - "version": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz" + "find-index": "^0.1.1" } }, "global-modules": { - "version": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { - "global-prefix": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "resolve-dir": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { - "version": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "homedir-polyfill": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -4234,91 +5394,100 @@ "dev": true }, "globby": { - "version": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "globule": { - "version": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + "glob": "~3.1.21", + "lodash": "~1.0.1", + "minimatch": "~0.2.11" }, "dependencies": { "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" } }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", "dev": true }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", "dev": true }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", "dev": true }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "sigmund": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + "lru-cache": "2", + "sigmund": "~1.0.0" } } } }, "glogg": { - "version": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", "integrity": "sha1-3PdY5EeJzD89MsHzVio2duajSBA=", "dev": true, "requires": { - "sparkles": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" + "sparkles": "^1.0.0" } }, "got": { - "version": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "dev": true, "requires": { - "create-error-class": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "duplexer2": "0.1.4", - "is-redirect": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "is-retry-allowed": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "lowercase-keys": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "node-status-codes": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "read-all-stream": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "readable-stream": "2.3.6", - "timed-out": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "unzip-response": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "url-parse-lax": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz" + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", + "url-parse-lax": "^1.0.0" }, "dependencies": { "duplexer2": { @@ -4327,7 +5496,7 @@ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "isarray": { @@ -4342,13 +5511,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -4357,112 +5526,123 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, "requires": { - "natives": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz" + "natives": "^1.1.0" } }, "graceful-readlink": { - "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, "gulp": { - "version": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "deprecated": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "interpret": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "liftoff": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "orchestrator": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", - "pretty-hrtime": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "tildify": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", - "v8flags": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz" + "archy": "^1.0.0", + "chalk": "^1.0.0", + "deprecated": "^0.0.1", + "gulp-util": "^3.0.0", + "interpret": "^1.0.0", + "liftoff": "^2.1.0", + "minimist": "^1.1.0", + "orchestrator": "^0.3.0", + "pretty-hrtime": "^1.0.0", + "semver": "^4.1.0", + "tildify": "^1.0.0", + "v8flags": "^2.0.2", + "vinyl-fs": "^0.3.0" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "gulp-concat": { - "version": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", "dev": true, "requires": { - "concat-with-sourcemaps": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz" + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" }, "dependencies": { "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", "dev": true }, "clone-stats": { - "version": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, "replace-ext": { - "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "clone-buffer": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "cloneable-readable": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } }, "gulp-connect": { - "version": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.0.0.tgz", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-connect/-/gulp-connect-5.0.0.tgz", "integrity": "sha1-8v3zBq6RFGg2jCKF8teC8T7dr04=", "dev": true, "requires": { - "connect": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", - "connect-livereload": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", - "event-stream": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "tiny-lr": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz" + "connect": "^2.30.0", + "connect-livereload": "^0.5.4", + "event-stream": "^3.3.2", + "gulp-util": "^3.0.6", + "tiny-lr": "^0.2.1" } }, "gulp-decompress": { - "version": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", "dev": true, "requires": { - "archive-type": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "decompress": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "readable-stream": "2.3.6" + "archive-type": "^3.0.0", + "decompress": "^3.0.0", + "gulp-util": "^3.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "isarray": { @@ -4477,13 +5657,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -4492,7 +5672,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } @@ -4503,9 +5683,9 @@ "integrity": "sha512-9GUqCqh85C7rP9120cpxXuZz2ayq3BZc85pCTuPJS03VQYxne0aWPIXWx6LSvsGPa3uRqtSO537vaugOh+5cXg==", "dev": true, "requires": { - "eslint": "5.3.0", - "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "plugin-error": "1.0.1" + "eslint": "^5.0.1", + "fancy-log": "^1.3.2", + "plugin-error": "^1.0.1" }, "dependencies": { "plugin-error": { @@ -4514,393 +5694,434 @@ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "ansi-colors": "1.1.0", - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } } } }, "gulp-imagemin": { - "version": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-4.1.0.tgz", "integrity": "sha1-XONH8dFwb+08yPF3fKkJSlg7ULc=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "imagemin": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", - "imagemin-gifsicle": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", - "imagemin-jpegtran": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz", - "imagemin-optipng": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", - "imagemin-svgo": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", - "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "plur": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "pretty-bytes": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", - "through2-concurrent": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-1.1.1.tgz" + "chalk": "^2.1.0", + "fancy-log": "^1.3.2", + "imagemin": "^5.3.1", + "imagemin-gifsicle": "^5.2.0", + "imagemin-jpegtran": "^5.0.2", + "imagemin-optipng": "^5.2.1", + "imagemin-svgo": "^6.0.0", + "plugin-error": "^0.1.2", + "plur": "^2.1.2", + "pretty-bytes": "^4.0.2", + "through2-concurrent": "^1.1.1" }, "dependencies": { "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", "dev": true, "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", "dev": true, "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "has-flag": "^3.0.0" } } } }, "gulp-less": { - "version": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.5.0.tgz", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.5.0.tgz", "integrity": "sha1-gBT0ad38ZUTX3aUAmN7wNxu7T3g=", "dev": true, "requires": { - "accord": "https://registry.npmjs.org/accord/-/accord-0.28.0.tgz", - "less": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" + "accord": "^0.28.0", + "less": "2.6.x || ^2.7.1", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "replace-ext": "^1.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" }, "dependencies": { "replace-ext": { - "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true } } }, "gulp-ngdocs": { - "version": "https://registry.npmjs.org/gulp-ngdocs/-/gulp-ngdocs-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gulp-ngdocs/-/gulp-ngdocs-0.3.0.tgz", "integrity": "sha1-J7Z6Ql6zh1ImNFq4lgTXN/Y1fCE=", "dev": true, "requires": { - "angular": "https://registry.npmjs.org/angular/-/angular-1.3.20.tgz", - "angular-animate": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.3.20.tgz", - "canonical-path": "https://registry.npmjs.org/canonical-path/-/canonical-path-0.0.2.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "marked": "https://registry.npmjs.org/marked/-/marked-0.3.2.tgz", - "merge-stream": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.5.tgz", - "path": "https://registry.npmjs.org/path/-/path-0.4.9.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", - "vinyl-fs": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.7.tgz" + "angular": "~1.3.1", + "angular-animate": "~1.3.1", + "canonical-path": "0.0.2", + "extend": "1.3.0", + "gulp-util": "3.0.0", + "lodash": "2.4.1", + "marked": "0.3.2", + "merge-stream": "0.1.5", + "path": "0.4.9", + "string_decoder": "0.10.31", + "through2": "0.6.1", + "vinyl-fs": "0.3.7" }, "dependencies": { "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", "dev": true }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", "dev": true }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" } }, "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", "dev": true }, "dateformat": { - "version": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-1.3.0.tgz", "integrity": "sha1-0VFvsP9WJNLr+RI+odrFoZlABPg=", "dev": true }, "gulp-util": { - "version": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.0.tgz", "integrity": "sha1-b+7cR9aXKCO6zplH/F9GvYo0Zuc=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "multipipe": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz" + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash": "^2.4.1", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" }, "dependencies": { "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" } } } }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "ansi-regex": "^0.2.0" } }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", "dev": true }, "lodash._reinterpolate": { - "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", "dev": true }, "lodash.defaults": { - "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", "dev": true, "requires": { - "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" } }, "lodash.escape": { - "version": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", "dev": true, "requires": { - "lodash._escapehtmlchar": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", - "lodash._reunescapedhtml": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" } }, "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } }, "lodash.template": { - "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", "dev": true, "requires": { - "lodash._escapestringchar": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "lodash.defaults": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", - "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", - "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", - "lodash.values": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz" + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" } }, "lodash.templatesettings": { - "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", "dev": true, "requires": { - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", - "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz" + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" } }, "merge-stream": { - "version": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-0.1.5.tgz", "integrity": "sha1-5oIPet267gA/SMpKWMfFolPV4Fw=", "dev": true, "requires": { - "through2": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz" + "through2": "^0.5.1" }, "dependencies": { "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz" + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" } } } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", "dev": true, "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "ansi-regex": "^0.2.1" } }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", "dev": true }, "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", "integrity": "sha1-90KzKJPovSYUbnieT9LMssB6cX4=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "readable-stream": ">=1.0.27-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" }, "dependencies": { "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true } } }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", "dev": true, "requires": { - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "clone-stats": "~0.0.1" } }, "vinyl-fs": { - "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.7.tgz", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.7.tgz", "integrity": "sha1-LiXP5t9cgIGPl/9Be/XCGkHkpJs=", "dev": true, "requires": { - "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "glob-watcher": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.6.1.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "lodash": "^2.4.1", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", "dev": true } } }, "gulp-open": { - "version": "https://registry.npmjs.org/gulp-open/-/gulp-open-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-open/-/gulp-open-2.1.0.tgz", "integrity": "sha1-rAHu6JjXenrAgS+tTz1T0IaH1Bw=", "dev": true, "requires": { - "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "open": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "plugin-log": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + "colors": "^1.1.2", + "open": "0.0.5", + "plugin-log": "^0.1.0", + "through2": "^2.0.1" } }, "gulp-postcss": { - "version": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-6.4.0.tgz", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/gulp-postcss/-/gulp-postcss-6.4.0.tgz", "integrity": "sha1-eKMuPIeqbNzsWuHJBeGW1HjoxdU=", "dev": true, "requires": { - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-load-config": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" + "gulp-util": "^3.0.8", + "postcss": "^5.2.12", + "postcss-load-config": "^1.2.0", + "vinyl-sourcemaps-apply": "^0.2.1" } }, "gulp-rename": { - "version": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", "dev": true }, "gulp-sort": { - "version": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz", "integrity": "sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=", "dev": true, "requires": { - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + "through2": "^2.0.1" } }, "gulp-sourcemaps": { - "version": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", "dev": true, "requires": { - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "graceful-fs": "4.1.11", - "strip-bom": "2.0.0", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl": "1.2.0" + "convert-source-map": "^1.1.1", + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0" }, "dependencies": { "graceful-fs": { @@ -4915,7 +6136,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "^0.2.0" } }, "vinyl": { @@ -4924,216 +6145,245 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } } } }, "gulp-util": { - "version": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "array-uniq": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "beeper": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "gulplog": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "has-gulplog": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "lodash._reescape": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "lodash._reevaluate": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "lodash.template": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "multipipe": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz" + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", "dev": true } } }, "gulp-watch": { - "version": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", "dev": true, "requires": { - "anymatch": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "slash": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "vinyl-file": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz" + "anymatch": "^1.3.0", + "chokidar": "^1.6.1", + "glob-parent": "^3.0.1", + "gulp-util": "^3.0.7", + "object-assign": "^4.1.0", + "path-is-absolute": "^1.0.1", + "readable-stream": "^2.2.2", + "slash": "^1.0.0", + "vinyl": "^1.2.0", + "vinyl-file": "^2.0.0" }, "dependencies": { "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "~5.1.0" } }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } } } }, "gulp-wrap": { - "version": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.13.0.tgz", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/gulp-wrap/-/gulp-wrap-0.13.0.tgz", "integrity": "sha1-kPsLSieiZkM4Mv98YSLbXB7olMY=", "dev": true, "requires": { - "consolidate": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", - "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "fs-readfile-promise": "https://registry.npmjs.org/fs-readfile-promise/-/fs-readfile-promise-2.0.1.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "node.extend": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "tryit": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", - "vinyl-bufferstream": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz" + "consolidate": "^0.14.1", + "es6-promise": "^3.1.2", + "fs-readfile-promise": "^2.0.1", + "gulp-util": "^3.0.3", + "js-yaml": "^3.2.6", + "lodash": "^4.11.1", + "node.extend": "^1.1.2", + "through2": "^2.0.1", + "tryit": "^1.0.1", + "vinyl-bufferstream": "^1.0.1" } }, "gulp-wrap-js": { - "version": "https://registry.npmjs.org/gulp-wrap-js/-/gulp-wrap-js-0.4.1.tgz", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/gulp-wrap-js/-/gulp-wrap-js-0.4.1.tgz", "integrity": "sha1-3uYqpISqupVHqT0f9c0MPQvtwDE=", "dev": true, "requires": { - "escodegen": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "estemplate": "https://registry.npmjs.org/estemplate/-/estemplate-0.5.1.tgz", - "gulp-util": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "vinyl-sourcemaps-apply": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz" + "escodegen": "^1.6.1", + "esprima": "^2.3.0", + "estemplate": "*", + "gulp-util": "~3.0.5", + "through2": "*", + "vinyl-sourcemaps-apply": "^0.1.4" }, "dependencies": { "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + "amdefine": ">=0.0.4" } }, "vinyl-sourcemaps-apply": { - "version": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", "integrity": "sha1-xfy9Q+LyOEI8LcmL3db3m3K8NFs=", "dev": true, "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + "source-map": "^0.1.39" } } } }, "gulplog": { - "version": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz" + "glogg": "^1.0.0" } }, "har-schema": { - "version": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "dev": true }, "har-validator": { - "version": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, "requires": { - "ajv": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "har-schema": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has": { - "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "function-bind": "^1.0.2" } }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + "ansi-regex": "^2.0.0" } }, - "has-binary": { - "version": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } } }, "has-cors": { - "version": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "has-gulplog": { - "version": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { - "sparkles": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz" + "sparkles": "^1.0.0" } }, "has-symbols": { @@ -5143,113 +6393,196 @@ "dev": true }, "has-value": { - "version": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "has-values": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { - "version": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "hasha": { - "version": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", "dev": true, "requires": { - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" } }, "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "cryptiles": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "sntp": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hipchat-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", + "dev": true, + "optional": true, + "requires": { + "lodash": "^4.0.0", + "request": "^2.0.0" } }, "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, "homedir-polyfill": { - "version": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", "integrity": "sha1-IyNbKasjDFdqqw1PE/wEawsDgiI=", "dev": true }, "html-comment-regex": { - "version": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", "dev": true }, "http-errors": { - "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", "dev": true, "requires": { - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + "inherits": "~2.0.1", + "statuses": "1" } }, "http-parser-js": { - "version": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", "dev": true }, "http-proxy": { - "version": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha1-etOElGWPhGBeL220Q230EPTlvpo=", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "eventemitter3": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "follow-redirects": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", - "requires-port": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "jsprim": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "sshpk": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=", "dev": true }, @@ -5260,147 +6593,161 @@ "dev": true }, "image-size": { - "version": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "dev": true, "optional": true }, "imagemin": { - "version": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-5.3.1.tgz", "integrity": "sha1-8Zwu7h5xumxlWMUV+fyWaAGJptQ=", "dev": true, "requires": { - "file-type": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "globby": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "make-dir": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "p-pipe": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz" + "file-type": "^4.1.0", + "globby": "^6.1.0", + "make-dir": "^1.0.0", + "p-pipe": "^1.1.0", + "pify": "^2.3.0", + "replace-ext": "^1.0.0" }, "dependencies": { "replace-ext": { - "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true } } }, "imagemin-gifsicle": { - "version": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz", "integrity": "sha1-N4FSTEV2Eu8EkWrzQkGitCv8tAo=", "dev": true, "optional": true, "requires": { - "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "gifsicle": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", - "is-gif": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz" + "exec-buffer": "^3.0.0", + "gifsicle": "^3.0.0", + "is-gif": "^1.0.0" } }, "imagemin-jpegtran": { - "version": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-5.0.2.tgz", "integrity": "sha1-5ogiY7j3kW/duABkDPddLpcNKtY=", "dev": true, "optional": true, "requires": { - "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "is-jpg": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", - "jpegtran-bin": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz" + "exec-buffer": "^3.0.0", + "is-jpg": "^1.0.0", + "jpegtran-bin": "^3.0.0" } }, "imagemin-optipng": { - "version": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", "integrity": "sha1-0i2kEsCfX/AKQzmWC5ioix2+hpU=", "dev": true, "optional": true, "requires": { - "exec-buffer": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", - "is-png": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", - "optipng-bin": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz" + "exec-buffer": "^3.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^3.0.0" } }, "imagemin-svgo": { - "version": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-6.0.0.tgz", "integrity": "sha1-LdjIKUa+Qqjiy8rjxb8Ae8K4ueg=", "dev": true, "optional": true, "requires": { - "buffer-from": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "svgo": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz" + "buffer-from": "^0.1.1", + "is-svg": "^2.0.0", + "svgo": "^1.0.0" }, "dependencies": { "coa": { - "version": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", "integrity": "sha1-8/iwsVBz411wJj+xBCyywCPbOK8=", "dev": true, "optional": true, "requires": { - "q": "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + "q": "^1.1.2" } }, "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true, "optional": true }, "csso": { - "version": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=", "dev": true, "optional": true, "requires": { - "css-tree": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz" + "css-tree": "1.0.0-alpha.29" }, "dependencies": { "css-tree": { - "version": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", "integrity": "sha1-P6nU7zFCy9HDAedmTB81K9gvWjk=", "dev": true, "optional": true, "requires": { - "mdn-data": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" } } } }, "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true, "optional": true }, "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", "dev": true, "optional": true, "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "svgo": { - "version": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.0.5.tgz", "integrity": "sha1-cEA2TAYqBTirrP9EAc6momp6OJo=", "dev": true, "optional": true, "requires": { - "coa": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "css-select": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", - "css-select-base-adapter": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", - "css-tree": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", - "css-url-regex": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", - "csso": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "object.values": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "stable": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "unquote": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "util.promisify": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" + "coa": "~2.0.1", + "colors": "~1.1.2", + "css-select": "~1.3.0-rc0", + "css-select-base-adapter": "~0.1.0", + "css-tree": "1.0.0-alpha25", + "css-url-regex": "^1.1.0", + "csso": "^3.5.0", + "js-yaml": "~3.10.0", + "mkdirp": "~0.5.1", + "object.values": "^1.0.4", + "sax": "~1.2.4", + "stable": "~0.1.6", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" } } } @@ -5412,44 +6759,58 @@ "dev": true }, "indent-string": { - "version": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + "repeating": "^2.0.0" } }, "indexes-of": { - "version": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, "indexof": { - "version": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, "indx": { - "version": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", "dev": true }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true, + "optional": true + }, "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "ini": { - "version": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", "dev": true }, @@ -5459,19 +6820,19 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.11", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -5486,7 +6847,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5495,9 +6856,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "figures": { @@ -5506,7 +6867,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "escape-string-regexp": "^1.0.5" } }, "has-flag": { @@ -5521,7 +6882,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -5530,174 +6891,205 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, "interpret": { - "version": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, "ip-regex": { - "version": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", "dev": true, "optional": true }, "irregular-plurals": { - "version": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", "dev": true }, "is": { - "version": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", "dev": true }, "is-absolute": { - "version": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", "dev": true, "requires": { - "is-relative": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, "is-absolute-url": { - "version": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true }, "is-accessor-descriptor": { - "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-binary-path": { - "version": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz" + "binary-extensions": "^1.0.0" } }, "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", "dev": true }, "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + "builtin-modules": "^1.0.0" } }, "is-bzip2": { - "version": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", "dev": true }, "is-callable": { - "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha1-HhrfIZ4e62hNaR+dagX/DTCiTXU=", "dev": true }, "is-data-descriptor": { - "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "is-date-object": { - "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-descriptor": { - "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { - "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } }, "is-directory": { - "version": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, "is-dotfile": { - "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "dev": true }, "is-equal-shallow": { - "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + "is-primitive": "^2.0.0" } }, "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -5707,68 +7099,99 @@ "dev": true }, "is-gif": { - "version": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", "dev": true, "optional": true }, "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "is-extglob": "^2.1.0" } }, "is-gzip": { - "version": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", "dev": true }, "is-jpg": { - "version": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", "integrity": "sha1-KW1X/dmc4BBDSnKD40armhA16XU=", "dev": true, "optional": true }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, "is-natural-number": { - "version": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", "dev": true }, "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "is-obj": { - "version": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-odd": { - "version": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", "dev": true } @@ -5786,7 +7209,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -5795,35 +7218,40 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-obj": { - "version": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, "is-plain-object": { - "version": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "isobject": "^3.0.1" } }, "is-png": { - "version": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", "dev": true, "optional": true }, "is-posix-bracket": { - "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, "is-primitive": { - "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, @@ -5833,25 +7261,35 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "optional": true + }, "is-redirect": { - "version": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, "is-regex": { - "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + "has": "^1.0.1" } }, "is-relative": { - "version": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", "dev": true, "requires": { - "is-unc-path": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" + "is-unc-path": "^1.0.0" } }, "is-resolvable": { @@ -5861,114 +7299,137 @@ "dev": true }, "is-retry-allowed": { - "version": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", "dev": true }, "is-stream": { - "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-svg": { - "version": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "html-comment-regex": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { - "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, "is-tar": { - "version": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", "dev": true }, "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-unc-path": { - "version": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", "dev": true, "requires": { - "unc-path-regex": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" + "unc-path-regex": "^0.1.2" } }, "is-url": { - "version": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "integrity": "sha1-BKTfRtKMTP89c9Af8Gq+sxihqlI=", "dev": true }, "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, "is-valid-glob": { - "version": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", "dev": true }, "is-windows": { - "version": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", "dev": true }, "is-zip": { - "version": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", "dev": true }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isbinaryfile": { - "version": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } }, "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "jasmine-core": { - "version": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.5.2.tgz", - "integrity": "sha1-b2G9eQYeJ/Q+b5NV5Es8bKtv8pc=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.1.0.tgz", + "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=", "dev": true }, "jpegtran-bin": { - "version": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", "dev": true, "optional": true, "requires": { - "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" } }, "js-base64": { - "version": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", "integrity": "sha1-LlRewrDylX9BNWUQIFIU6Y+tZYI=", "dev": true }, @@ -5979,22 +7440,25 @@ "dev": true }, "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "argparse": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "esprima": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { - "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, @@ -6005,11 +7469,12 @@ "dev": true }, "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -6019,25 +7484,23 @@ "dev": true }, "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, "jsonfile": { - "version": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "^4.1.6" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true, "optional": true @@ -6045,232 +7508,283 @@ } }, "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true + }, "jsprim": { - "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "json-schema": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "verror": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" }, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "karma": { - "version": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", - "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.5.tgz", + "integrity": "sha512-rECezBeY7mjzGUWhFlB7CvPHgkHJLXyUmWg+6vHCEsdWNUTnmiS6jRrIMcJEWgU2DUGZzGWG0bTRVky8fsDTOA==", "dev": true, "requires": { - "bluebird": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "chokidar": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "combine-lists": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "connect": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "di": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "dom-serialize": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "expand-braces": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "http-proxy": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "isbinaryfile": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "log4js": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "qjobs": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "socket.io": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "useragent": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz" + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^2.5.3", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.0.4", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" }, "dependencies": { - "body-parser": { - "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" } }, "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, "connect": { - "version": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "finalhandler": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "utils-merge": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" } }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "finalhandler": { - "version": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "encodeurl": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" }, "dependencies": { "statuses": { - "version": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true } } }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "http-errors": { - "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", - "dev": true + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, - "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "range-parser": { - "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", "dev": true }, "raw-body": { - "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - }, - "dependencies": { - "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true - }, - "http-errors": { - "version": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "setprototypeof": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - } - }, - "setprototypeof": { - "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "utils-merge": { - "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true } } }, "karma-jasmine": { - "version": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", "dev": true }, "karma-phantomjs-launcher": { - "version": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", "dev": true, "requires": { - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "phantomjs-prebuilt": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz" + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" } }, "kew": { - "version": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", "dev": true }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "klaw": { - "version": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + "graceful-fs": "^4.1.9" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true, "optional": true @@ -6278,22 +7792,25 @@ } }, "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true }, "lazy-req": { - "version": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", "dev": true, "optional": true }, "lazystream": { - "version": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.5" }, "dependencies": { "isarray": { @@ -6308,13 +7825,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -6323,28 +7840,30 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "less": { - "version": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", "dev": true, "requires": { - "errno": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "image-size": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "promise": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true, "optional": true @@ -6352,563 +7871,893 @@ } }, "levn": { - "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", + "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + } + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true + }, "liftoff": { - "version": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "findup-sync": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "fined": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "flagged-respawn": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "object.map": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "rechoir": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz" + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, "livereload-js": { - "version": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", "integrity": "sha1-w6si6Kr1vzUF2A0JjLrWdyZUjJo=", "dev": true }, "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "^0.2.0" } } } }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha1-G3eTz3JZ6jj7NmHU04syYK+K5Oc=", "dev": true }, "lodash._basecopy": { - "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", "dev": true }, "lodash._basetostring": { - "version": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", "dev": true }, "lodash._basevalues": { - "version": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", "dev": true }, "lodash._escapehtmlchar": { - "version": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", "dev": true, "requires": { - "lodash._htmlescapes": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz" + "lodash._htmlescapes": "~2.4.1" } }, "lodash._escapestringchar": { - "version": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", "dev": true }, "lodash._getnative": { - "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, "lodash._htmlescapes": { - "version": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", "dev": true }, "lodash._isiterateecall": { - "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "dev": true }, "lodash._isnative": { - "version": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=", "dev": true }, "lodash._objecttypes": { - "version": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=", "dev": true }, "lodash._reescape": { - "version": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", "dev": true }, "lodash._reevaluate": { - "version": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", "dev": true }, "lodash._reinterpolate": { - "version": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, "lodash._reunescapedhtml": { - "version": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", "dev": true, "requires": { - "lodash._htmlescapes": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" }, "dependencies": { "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } } } }, "lodash._root": { - "version": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, "lodash._shimkeys": { - "version": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", "dev": true, "requires": { - "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "lodash._objecttypes": "~2.4.1" } }, "lodash.clone": { - "version": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", "dev": true }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, "lodash.defaults": { - "version": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", "dev": true }, "lodash.escape": { - "version": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" + "lodash._root": "^3.0.0" } }, "lodash.flatten": { - "version": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, "lodash.isarguments": { - "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", "dev": true }, "lodash.isarray": { - "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, "lodash.isequal": { - "version": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", "dev": true }, "lodash.isobject": { - "version": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", "dev": true, "requires": { - "lodash._objecttypes": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "lodash._objecttypes": "~2.4.1" } }, "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "lodash.isarguments": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "lodash.isarray": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.memoize": { - "version": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, "lodash.merge": { - "version": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", "integrity": "sha1-rcJdnLmbk5HFliTzefu6YNcRHVQ=", "dev": true }, "lodash.partialright": { - "version": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", "dev": true }, "lodash.pick": { - "version": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", "dev": true }, "lodash.restparam": { - "version": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, "lodash.template": { - "version": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "lodash._basetostring": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "lodash._basevalues": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "lodash._isiterateecall": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "lodash.restparam": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "lodash.templatesettings": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz" + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" } }, "lodash.templatesettings": { - "version": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "lodash.escape": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz" + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" } }, "lodash.uniq": { - "version": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, "lodash.values": { - "version": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", "dev": true, "requires": { - "lodash.keys": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz" + "lodash.keys": "~2.4.1" }, "dependencies": { "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", - "lodash._shimkeys": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", - "lodash.isobject": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" } } } }, "log4js": { - "version": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.11.0.tgz", + "integrity": "sha512-z1XdwyGFg8/WGkOyF6DPJjivCWNLKrklGdViywdYnSKOvgtEBo2UyEMZS5sD2mZrQlU3TvO8wDWLc8mzE1ncBQ==", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + "amqplib": "^0.5.2", + "axios": "^0.15.3", + "circular-json": "^0.5.4", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "hipchat-notifier": "^1.1.0", + "loggly": "^1.1.0", + "mailgun-js": "^0.18.0", + "nodemailer": "^2.5.0", + "redis": "^2.7.1", + "semver": "^5.5.0", + "slack-node": "~0.2.0", + "streamroller": "0.7.0" }, "dependencies": { - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "circular-json": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.5.tgz", + "integrity": "sha512-13YaR6kiz0kBNmIVM87Io8Hp7bWOo4r61vkEANy8iH9R9bc6avud/1FT0SBpqR1RpIQADOh/Q+yHZDA1iL6ysA==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "ms": "2.0.0" } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true } } }, "logalot": { - "version": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", "dev": true, "optional": true, "requires": { - "figures": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "squeak": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz" + "figures": "^1.3.5", + "squeak": "^1.0.0" + } + }, + "loggly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", + "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", + "dev": true, + "optional": true, + "requires": { + "json-stringify-safe": "5.0.x", + "request": "2.75.x", + "timespan": "2.3.x" + }, + "dependencies": { + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.0.5" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } } }, "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "loud-rejection": { - "version": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { - "version": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", "dev": true }, "lpad-align": { - "version": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", "dev": true, "optional": true, "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" } }, "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, "macaddress": { - "version": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "dev": true }, + "mailcomposer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", + "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, + "requires": { + "buildmail": "4.0.1", + "libmime": "3.0.0" + } + }, + "mailgun-js": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.1.tgz", + "integrity": "sha512-lvuMP14u24HS2uBsJEnzSyPMxzU2b99tQsIx1o6QNjqxjk8b3WvR+vq5oG1mjqz/IBYo+5gF+uSoDS0RkMVHmg==", + "dev": true, + "optional": true, + "requires": { + "async": "~2.6.0", + "debug": "~3.1.0", + "form-data": "~2.3.0", + "inflection": "~1.12.0", + "is-stream": "^1.1.0", + "path-proxy": "~1.0.0", + "promisify-call": "^2.0.2", + "proxy-agent": "~3.0.0", + "tsscmp": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, "make-dir": { - "version": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", "dev": true, "requires": { - "pify": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + "pify": "^3.0.0" }, "dependencies": { "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, "make-iterator": { - "version": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.2" } }, "map-cache": { - "version": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "map-obj": { - "version": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, "map-stream": { - "version": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, "map-visit": { - "version": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + "object-visit": "^1.0.0" } }, "marked": { - "version": "https://registry.npmjs.org/marked/-/marked-0.3.2.tgz", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.2.tgz", "integrity": "sha1-AV2xWIZEOPJKZL3WGgQotBhwbQk=", "dev": true }, "math-expression-evaluator": { - "version": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", "dev": true }, "math-random": { - "version": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", "dev": true }, "mdn-data": { - "version": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", "integrity": "sha1-ULXU/8RXUnZXPE7tuHgIEqhBnwE=", "dev": true }, "media-typer": { - "version": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "meow": { - "version": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "loud-rejection": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "map-obj": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "redent": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "trim-newlines": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "merge-stream": { - "version": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + "readable-stream": "^2.0.1" }, "dependencies": { "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "~5.1.0" } } } }, "method-override": { - "version": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.10.tgz", "integrity": "sha1-49r41d7hDdLc59SuiNYrvud0drQ=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "methods": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "vary": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + "debug": "2.6.9", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" }, "dependencies": { "vary": { - "version": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true } } }, "methods": { - "version": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "dev": true, "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "nanomatch": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "mime": { - "version": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", "dev": true }, "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=", "dev": true }, "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", "dev": true, "requires": { - "mime-db": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -6918,92 +8767,103 @@ "dev": true }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mixin-deep": { - "version": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "dev": true, "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + "is-plain-object": "^2.0.4" } } } }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "minimist": "0.0.8" } }, "morgan": { - "version": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", "dev": true, "requires": { - "basic-auth": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.0" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "multiparty": { - "version": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "stream-counter": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz" + "readable-stream": "~1.1.9", + "stream-counter": "~0.2.0" } }, "multipipe": { - "version": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", "dev": true, "requires": { - "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" + "duplexer2": "0.0.2" } }, "mute-stream": { @@ -7012,27 +8872,36 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, "nanomatch": { - "version": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", "dev": true, "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "fragment-cache": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "is-odd": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "is-windows": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "object.pick": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "snapdragon": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "to-regex": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "natives": { - "version": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", "integrity": "sha1-RKV5vmRQfqLW7RygSpQVkVz3VVg=", "dev": true }, @@ -7043,10 +8912,18 @@ "dev": true }, "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=", "dev": true }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "optional": true + }, "nice-try": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", @@ -7054,439 +8931,672 @@ "dev": true }, "node-fs": { - "version": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", "integrity": "sha1-MjI8zLRsn78PwRgS1FAhzDHTJbs=", "dev": true }, "node-status-codes": { - "version": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", "dev": true }, "node.extend": { - "version": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", "dev": true, "requires": { - "is": "https://registry.npmjs.org/is/-/is-3.2.1.tgz" + "is": "^3.1.0" } }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + }, + "dependencies": { + "socks": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.2", + "smart-buffer": "^1.0.4" + } + } + } + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true + }, "nopt": { - "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "abbrev": "1" } }, "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "dev": true, "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { - "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { - "version": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, "normalize-url": { - "version": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "query-string": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "sort-keys": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-run-path": { - "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "version": "2.0.2", + "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": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + "path-key": "^2.0.0" } }, "nth-check": { - "version": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "dev": true, "optional": true, "requires": { - "boolbase": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + "boolbase": "~1.0.0" } }, "num2fraction": { - "version": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "dev": true }, "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-component": { - "version": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, "object-copy": { - "version": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + "is-descriptor": "^0.1.0" } }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "object-keys": { - "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", "integrity": "sha1-CcU4VTd1dTEMymL1W7M0q/97PtI=", "dev": true }, "object-visit": { - "version": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "isobject": "^3.0.0" } }, "object.defaults": { - "version": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "for-own": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, "object.getownpropertydescriptors": { - "version": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "optional": true, "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.map": { - "version": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "for-own": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "make-iterator": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, "object.omit": { - "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" }, "dependencies": { "for-own": { - "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "for-in": "^1.0.1" } } } }, "object.pick": { - "version": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "isobject": "^3.0.1" } }, "object.values": { - "version": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, "optional": true, "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" } }, "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "ee-first": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + "ee-first": "1.1.1" } }, "on-headers": { - "version": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", "dev": true }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "wrappy": "1" } }, "onetime": { - "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, "open": { - "version": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", "dev": true }, "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "optionator": { - "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "fast-levenshtein": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "levn": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "type-check": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true } } }, - "options": { - "version": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, "optipng-bin": { - "version": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", "dev": true, "optional": true, "requires": { - "bin-build": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "bin-wrapper": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "logalot": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz" + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" } }, "orchestrator": { - "version": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", - "sequencify": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "stream-consume": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz" + "end-of-stream": "~0.1.5", + "sequencify": "~0.0.7", + "stream-consume": "~0.1.0" } }, "ordered-read-streams": { - "version": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", "dev": true }, "os-filter-obj": { - "version": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", "dev": true, "optional": true }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { - "version": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "p-finally": { - "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-pipe": { - "version": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=", "dev": true }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^3.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "optional": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "optional": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "optional": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "dev": true, + "optional": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, "parse-filepath": { - "version": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "is-absolute": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "path-root": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, "parse-glob": { - "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "is-extglob": "^1.0.0" } } } }, "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + "error-ex": "^1.2.0" } }, "parse-passwd": { - "version": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, - "parsejson": { - "version": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" - } - }, "parseqs": { - "version": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" + "better-assert": "~1.0.0" } }, "parseuri": { - "version": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" + "better-assert": "~1.0.0" } }, "parseurl": { - "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, "pascalcase": { - "version": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, "path": { - "version": "https://registry.npmjs.org/path/-/path-0.4.9.tgz", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/path/-/path-0.4.9.tgz", "integrity": "sha1-OAxo0BJz5D+TaNetUP7l4+jUd/A=", "dev": true }, "path-dirname": { - "version": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, @@ -7497,181 +9607,224 @@ "dev": true }, "path-key": { - "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { - "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", + "dev": true, + "optional": true, + "requires": { + "inflection": "~1.3.0" + }, + "dependencies": { + "inflection": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", + "dev": true, + "optional": true + } + } + }, "path-root": { - "version": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + "path-root-regex": "^0.1.0" } }, "path-root-regex": { - "version": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true } } }, "pause": { - "version": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=", "dev": true }, "pause-stream": { - "version": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "through": "~2.3" } }, "pend": { - "version": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, "performance-now": { - "version": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "dev": true }, "phantomjs-prebuilt": { - "version": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", "dev": true, "requires": { - "es6-promise": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "extract-zip": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", - "fs-extra": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "hasha": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "kew": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "progress": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "request": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "request-progress": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" }, "dependencies": { "es6-promise": { - "version": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=", "dev": true } } }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "pinkie": "^2.0.0" } }, "plugin-error": { - "version": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, "requires": { - "ansi-cyan": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "ansi-red": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz" + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" }, "dependencies": { "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", "dev": true, "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "array-slice": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz" + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" } }, "arr-union": { - "version": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", "dev": true }, "array-slice": { - "version": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", "dev": true }, "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz" + "kind-of": "^1.1.0" } }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", "dev": true } } }, "plugin-log": { - "version": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "dateformat": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz" + "chalk": "^1.1.1", + "dateformat": "^1.0.11" }, "dependencies": { "dateformat": { - "version": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "meow": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } } } }, "plur": { - "version": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", "dev": true, "requires": { - "irregular-plurals": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz" + "irregular-plurals": "^1.0.0" } }, "pluralize": { @@ -7681,448 +9834,562 @@ "dev": true }, "posix-character-classes": { - "version": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, "postcss": { - "version": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha1-ut+hSX1GJE9jkPWLMZgw2RB4U8U=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "js-base64": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "postcss-calc": { - "version": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-message-helpers": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "reduce-css-calc": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" } }, "postcss-colormin": { - "version": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "dev": true, "requires": { - "colormin": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" } }, "postcss-convert-values": { - "version": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" } }, "postcss-discard-comments": { - "version": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.14" } }, "postcss-discard-duplicates": { - "version": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.4" } }, "postcss-discard-empty": { - "version": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.14" } }, "postcss-discard-overridden": { - "version": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.16" } }, "postcss-discard-unused": { - "version": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" } }, "postcss-filter-plugins": { - "version": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "uniqid": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" + "postcss": "^5.0.4", + "uniqid": "^4.0.0" } }, "postcss-load-config": { - "version": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "dev": true, "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss-load-options": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "postcss-load-plugins": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" } }, "postcss-load-options": { - "version": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "dev": true, "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" } }, "postcss-load-plugins": { - "version": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "dev": true, "requires": { - "cosmiconfig": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" } }, "postcss-merge-idents": { - "version": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "dev": true, "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" } }, "postcss-merge-longhand": { - "version": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.4" } }, "postcss-merge-rules": { - "version": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "dev": true, "requires": { - "browserslist": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "caniuse-api": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "vendors": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" } }, "postcss-message-helpers": { - "version": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", "dev": true }, "postcss-minify-font-values": { - "version": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "dev": true, "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-minify-gradients": { - "version": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" } }, "postcss-minify-params": { - "version": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "dev": true, "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { - "version": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "dev": true, "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-selector-parser": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" } }, "postcss-normalize-charset": { - "version": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.5" } }, "postcss-normalize-url": { - "version": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "dev": true, "requires": { - "is-absolute-url": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "normalize-url": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" } }, "postcss-ordered-values": { - "version": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" } }, "postcss-reduce-idents": { - "version": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-reduce-initial": { - "version": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + "postcss": "^5.0.4" } }, "postcss-reduce-transforms": { - "version": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "dev": true, "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" } }, "postcss-selector-parser": { - "version": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "dev": true, "requires": { - "flatten": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "indexes-of": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "uniq": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { - "version": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "dev": true, "requires": { - "is-svg": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "postcss-value-parser": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "svgo": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" } }, "postcss-unique-selectors": { - "version": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "dev": true, "requires": { - "alphanum-sort": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "postcss-value-parser": { - "version": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", "dev": true }, "postcss-zindex": { - "version": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "dev": true, "requires": { - "has": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "postcss": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "uniqs": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "prelude-ls": { - "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "prepend-http": { - "version": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, "preserve": { - "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, "pretty-bytes": { - "version": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", "dev": true }, "pretty-hrtime": { - "version": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", "dev": true }, "progress": { - "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, "promise": { - "version": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", "dev": true, "optional": true, "requires": { - "asap": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + "asap": "~2.0.3" } }, + "promisify-call": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", + "dev": true, + "optional": true, + "requires": { + "with-callback": "^1.0.2" + } + }, + "proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.1.tgz", + "integrity": "sha512-mAZexaz9ZxQhYPWfAjzlrloEjW+JHiBFryE4AJXFDTnaXfmH/FKqC1swTRKuEPbHWz02flQNXFOyDUF7zfEG6A==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "pac-proxy-agent": "^2.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^4.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "optional": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true, + "optional": true + }, "prr": { - "version": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true, "optional": true }, "pseudomap": { - "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "dev": true, + "optional": true }, "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "q": { - "version": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qjobs": { - "version": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha1-xF6cYYAL0IfviNfiVkI73Unl0HE=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=", "dev": true }, "query-string": { - "version": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "strict-uri-encode": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "random-bytes": { - "version": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", "dev": true }, "randomatic": { - "version": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha1-01SQAw6091eN4pLObfsEqRoSiSM=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "math-random": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", "dev": true } } }, "range-parser": { - "version": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", "dev": true }, "raw-body": { - "version": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", "dev": true, "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "unpipe": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" }, "dependencies": { "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", "dev": true }, "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", "dev": true } } }, "rc": { - "version": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", "dev": true, "requires": { - "deep-extend": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "ini": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "minimist": "1.2.0", - "strip-json-comments": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -8134,12 +10401,13 @@ } }, "read-all-stream": { - "version": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", "dev": true, "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "readable-stream": "2.3.6" + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" }, "dependencies": { "isarray": { @@ -8154,13 +10422,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -8169,150 +10437,192 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "readdirp": { - "version": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "~5.1.0" } } } }, "rechoir": { - "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz" + "resolve": "^1.1.6" } }, "redent": { - "version": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "strip-indent": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "dev": true, + "optional": true, + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", + "dev": true, + "optional": true + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "dev": true, + "optional": true + }, "reduce-css-calc": { - "version": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "math-expression-evaluator": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "reduce-function-call": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true } } }, "reduce-function-call": { - "version": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + "balanced-match": "^0.4.2" }, "dependencies": { "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true } } }, "regex-cache": { - "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { - "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { - "version": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "safe-regex": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexp.prototype.flags": { @@ -8321,7 +10631,7 @@ "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", "dev": true, "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz" + "define-properties": "^1.1.2" } }, "regexpp": { @@ -8331,79 +10641,101 @@ "dev": true }, "remove-trailing-separator": { - "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { - "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", "dev": true }, "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "repeating": { - "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + "is-finite": "^1.0.0" } }, "replace-ext": { - "version": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", "dev": true }, "request": { - "version": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, "requires": { - "aws-sign2": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "aws4": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "caseless": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "combined-stream": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "extend": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "forever-agent": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "form-data": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "har-validator": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "hawk": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "http-signature": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "is-typedarray": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "isstream": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "json-stringify-safe": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "oauth-sign": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "performance-now": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "stringstream": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "tough-cookie": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "tunnel-agent": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" }, "dependencies": { "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "dev": true } } }, "request-progress": { - "version": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", "dev": true, "requires": { - "throttleit": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" + "throttleit": "^1.0.0" + } + }, + "requestretry": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz", + "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==", + "dev": true, + "optional": true, + "requires": { + "extend": "^3.0.0", + "lodash": "^4.15.0", + "request": "^2.74.0", + "when": "^3.7.7" } }, "require-from-string": { - "version": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", "dev": true }, @@ -8413,30 +10745,33 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { - "version": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha1-qt1lY3T9KYruiVvAJrgpdBhnf9M=", "dev": true, "requires": { - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" + "path-parse": "^1.0.5" } }, "resolve-dir": { - "version": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "global-modules": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -8446,21 +10781,24 @@ "dev": true }, "resolve-url": { - "version": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "response-time": { - "version": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.2.tgz", "integrity": "sha1-/6cbq5UtYvfB1Jt0NDVfvGjf/Fo=", "dev": true, "requires": { - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "on-headers": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + "depd": "~1.1.0", + "on-headers": "~1.0.1" }, "dependencies": { "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true } @@ -8472,8 +10810,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" }, "dependencies": { "onetime": { @@ -8482,34 +10820,38 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } } } }, "ret": { - "version": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", "dev": true }, "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + "align-text": "^0.1.1" } }, "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "dev": true, "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + "glob": "^7.0.5" } }, "rndm": { - "version": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=", "dev": true }, @@ -8519,17 +10861,18 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-sequence": { - "version": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", "integrity": "sha1-HOZD2jb9jH6n4akynaM/wriJhJU=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "fancy-log": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "plugin-error": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz" + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2" } }, "rxjs": { @@ -8542,16 +10885,18 @@ } }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", "dev": true }, "safe-regex": { - "version": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -8561,40 +10906,46 @@ "dev": true }, "sax": { - "version": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "dev": true }, "seek-bzip": { - "version": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", "dev": true, "requires": { - "commander": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz" + "commander": "~2.8.1" } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", "dev": true }, "semver-regex": { - "version": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", "dev": true, "optional": true }, "semver-truncate": { - "version": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", "dev": true, "optional": true, "requires": { - "semver": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz" + "semver": "^5.3.0" }, "dependencies": { "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", "dev": true, "optional": true @@ -8602,167 +10953,198 @@ } }, "send": { - "version": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.2.tgz", "integrity": "sha1-dl52B8gFVFK7pvCwUllTUJhgNt4=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "destroy": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "etag": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "mime": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "range-parser": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", - "statuses": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz" + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, "statuses": { - "version": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=", "dev": true } } }, "sequencify": { - "version": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", "dev": true }, "serve-favicon": { - "version": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", "dev": true, "requires": { - "etag": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", - "fresh": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" + "etag": "~1.7.0", + "fresh": "0.3.0", + "ms": "0.7.2", + "parseurl": "~1.3.1" }, "dependencies": { "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } } }, "serve-index": { - "version": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", "dev": true, "requires": { - "accepts": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", - "batch": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" + "accepts": "~1.2.13", + "batch": "0.5.3", + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "http-errors": "~1.3.1", + "mime-types": "~2.1.9", + "parseurl": "~1.3.1" }, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "serve-static": { - "version": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.3.tgz", "integrity": "sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU=", "dev": true, "requires": { - "escape-html": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "send": "https://registry.npmjs.org/send/-/send-0.13.2.tgz" + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.2" } }, "set-immediate-shim": { - "version": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", "dev": true }, "set-value": { - "version": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "split-string": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } } } }, "setprototypeof": { - "version": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "shebang-command": { - "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { - "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "sigmund": { - "version": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", "dev": true }, "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slack-node": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", + "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", + "dev": true, + "optional": true, + "requires": { + "requestretry": "^1.2.2" + } + }, "slash": { - "version": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, @@ -8772,411 +11154,451 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" + } + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true, + "optional": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "dev": true, + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" } }, "snapdragon": { - "version": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "dev": true, "requires": { - "base": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "map-cache": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "source-map-resolve": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "use": "https://registry.npmjs.org/use/-/use-3.1.0.tgz" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } } } }, "snapdragon-node": { - "version": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { - "define-property": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "snapdragon-util": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { - "version": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { - "version": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.0" } }, "is-descriptor": { - "version": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "is-data-descriptor": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, "snapdragon-util": { - "version": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" + "hoek": "2.x.x" } }, "socket.io": { - "version": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", "dev": true, "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "engine.io": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "socket.io-adapter": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "socket.io-client": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } + "debug": "~2.6.6", + "engine.io": "~3.1.0", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.0.4", + "socket.io-parser": "~3.1.1" } }, "socket.io-adapter": { - "version": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true }, "socket.io-client": { - "version": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", "dev": true, "requires": { - "backo2": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "component-bind": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "engine.io-client": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "has-binary": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "indexof": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "object-component": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "parseuri": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "socket.io-parser": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "to-array": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" - }, - "dependencies": { - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~2.6.4", + "engine.io-client": "~3.1.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.1.1", + "to-array": "0.1.4" } }, "socket.io-parser": { - "version": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", "dev": true, "requires": { - "component-emitter": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "json3": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz" + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "has-binary2": "~1.0.2", + "isarray": "2.0.1" }, "dependencies": { - "component-emitter": { - "version": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "2.0.0" } }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true } } }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + }, + "dependencies": { + "smart-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", + "dev": true, + "optional": true + }, + "socks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", + "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + } + } + }, "sort-keys": { - "version": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + "is-plain-obj": "^1.0.0" } }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { - "version": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", "dev": true, "requires": { - "atob": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "decode-uri-component": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "resolve-url": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "source-map-url": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "urix": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { - "version": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, "sparkles": { - "version": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", "dev": true }, "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", "dev": true, "requires": { - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", "dev": true }, "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", "dev": true, "requires": { - "spdx-exceptions": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", "dev": true }, "split": { - "version": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "through": "2" } }, "split-string": { - "version": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "squeak": { - "version": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", "dev": true, "optional": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "console-stream": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "lpad-align": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz" + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" } }, "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "bcrypt-pbkdf": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "dashdash": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "ecc-jsbn": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "getpass": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "jsbn": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "tweetnacl": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "stable": { - "version": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", "dev": true, "optional": true }, "stat-mode": { - "version": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", "dev": true }, "static-extend": { - "version": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "object-copy": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { - "version": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + "is-descriptor": "^0.1.0" } } } }, "statuses": { - "version": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, "stream-combiner": { - "version": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz" + "duplexer": "~0.1.1" } }, "stream-combiner2": { - "version": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { - "duplexer2": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "readable-stream": "2.3.6" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" }, "dependencies": { "duplexer2": { - "version": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.2" } }, "isarray": { @@ -9191,13 +11613,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -9206,31 +11628,88 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "stream-consume": { - "version": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", "integrity": "sha1-0721mMK9CugrjKx6xQsRB6eZbEg=", "dev": true }, "stream-counter": { - "version": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + "readable-stream": "~1.1.8" } }, "stream-shift": { - "version": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "strict-uri-encode": { - "version": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, @@ -9240,8 +11719,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -9256,7 +11735,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -9267,186 +11746,208 @@ "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", "dev": true, "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "es-abstract": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "function-bind": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "has-symbols": "1.0.0", - "regexp.prototype.flags": "1.2.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "dev": true }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + "ansi-regex": "^2.0.0" } }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "first-chunk-stream": "^1.0.0", + "is-utf8": "^0.2.0" } }, "strip-bom-stream": { - "version": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", "dev": true, "requires": { - "first-chunk-stream": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { "first-chunk-stream": { - "version": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + "readable-stream": "^2.0.2" } }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "~5.1.0" } }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "^0.2.0" } } } }, "strip-dirs": { - "version": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "is-absolute": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "is-natural-number": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "sum-up": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz" + "chalk": "^1.0.0", + "get-stdin": "^4.0.1", + "is-absolute": "^0.1.5", + "is-natural-number": "^2.0.0", + "minimist": "^1.1.0", + "sum-up": "^1.0.1" }, "dependencies": { "is-absolute": { - "version": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", "dev": true, "requires": { - "is-relative": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz" + "is-relative": "^0.1.0" } }, "is-relative": { - "version": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", "dev": true }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } } }, "strip-eof": { - "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "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 }, "strip-indent": { - "version": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "strip-outer": { - "version": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha1-sv0qv2YEudHmATBXGV34Nrip1jE=", "dev": true, "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "escape-string-regexp": "^1.0.2" } }, "sum-up": { - "version": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", "dev": true, "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + "chalk": "^1.0.0" } }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + "has-flag": "^1.0.0" } }, "svgo": { - "version": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, "requires": { - "coa": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "colors": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "csso": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "js-yaml": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "sax": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "whet.extend": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" }, "dependencies": { "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true } @@ -9464,12 +11965,12 @@ "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "dev": true, "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ajv": { @@ -9478,10 +11979,10 @@ "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "ansi-styles": { @@ -9490,7 +11991,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz" + "color-convert": "^1.9.0" } }, "chalk": { @@ -9499,9 +12000,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -9516,31 +12017,33 @@ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, "tar-stream": { - "version": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", "integrity": "sha1-+E7xaWJp1iI8pI9uHu7eP36B85U=", "dev": true, "requires": { - "bl": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "buffer-alloc": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "end-of-stream": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "fs-constants": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "readable-stream": "2.3.6", - "to-buffer": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" }, "dependencies": { "end-of-stream": { - "version": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", "dev": true, "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "once": "^1.4.0" } }, "isarray": { @@ -9555,13 +12058,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -9570,25 +12073,27 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "temp-dir": { - "version": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "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 }, "tempfile": { - "version": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "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": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "uuid": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz" + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" } }, "text-table": { @@ -9598,454 +12103,539 @@ "dev": true }, "throttleit": { - "version": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", "dev": true }, "through": { - "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" }, "dependencies": { "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "~5.1.0" } } } }, "through2-concurrent": { - "version": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-1.1.1.tgz", "integrity": "sha1-EctOpMnjG8puTB5tukjRxyjDUks=", "dev": true, "requires": { - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz" + "through2": "^2.0.0" } }, "through2-filter": { - "version": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, "requires": { - "through2": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "through2": "~2.0.0", + "xtend": "~4.0.0" } }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true, + "optional": true + }, "tildify": { - "version": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + "os-homedir": "^1.0.0" } }, "time-stamp": { - "version": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, "timed-out": { - "version": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", "dev": true }, + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true, + "optional": true + }, "tiny-lr": { - "version": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", "dev": true, "requires": { - "body-parser": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "faye-websocket": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "livereload-js": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "parseurl": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz" + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" }, "dependencies": { "body-parser": { - "version": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", "dev": true, "requires": { - "bytes": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "content-type": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "depd": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "http-errors": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "iconv-lite": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "on-finished": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "qs": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "raw-body": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "type-is": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" }, "dependencies": { "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", "dev": true } } }, "bytes": { - "version": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", "dev": true }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" + "ms": "0.7.1" } }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "iconv-lite": { - "version": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", "dev": true } } }, "tmp": { - "version": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "os-tmpdir": "~1.0.2" } }, "to-absolute-glob": { - "version": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + "extend-shallow": "^2.0.1" }, "dependencies": { "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } } } }, "to-array": { - "version": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, "to-buffer": { - "version": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=", "dev": true }, "to-object-path": { - "version": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "is-buffer": "^1.1.5" } } } }, "to-regex": { - "version": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "dev": true, "requires": { - "define-property": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "regex-not": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "safe-regex": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { - "version": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", "dev": true, "requires": { - "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "punycode": "^1.4.1" } }, "trim-newlines": { - "version": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", "dev": true }, "trim-repeated": { - "version": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", "dev": true, "requires": { - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "escape-string-regexp": "^1.0.2" } }, "tryit": { - "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, "tsscmp": { - "version": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", "dev": true }, "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { - "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "type-check": { - "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + "prelude-ls": "~1.1.2" } }, "type-is": { - "version": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", "dev": true, "requires": { - "media-typer": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "mime-types": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + "media-typer": "0.3.0", + "mime-types": "~2.1.18" } }, "typedarray": { - "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" } }, "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, "uid-safe": { - "version": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.4.tgz", "integrity": "sha1-Otbzg2jG1MjHXsF2I/t5qh0HHYE=", "dev": true, "requires": { - "random-bytes": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + "random-bytes": "~1.0.0" } }, "ultron": { - "version": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, "unc-path-regex": { - "version": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, "union-value": { - "version": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "set-value": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { - "version": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "is-extendable": "^0.1.0" } }, "set-value": { - "version": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "is-plain-object": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "to-object-path": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, "uniq": { - "version": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, "uniqid": { - "version": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "dev": true, "requires": { - "macaddress": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" + "macaddress": "^0.2.8" } }, "uniqs": { - "version": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, "unique-stream": { - "version": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", "dev": true }, "unpipe": { - "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "unquote": { - "version": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true, "optional": true }, "unset-value": { - "version": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { - "version": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "has-values": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "isarray": "1.0.0" } } } }, "has-values": { - "version": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true } } }, "unzip-response": { - "version": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", "dev": true }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -10057,156 +12647,180 @@ } }, "urix": { - "version": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "url-parse-lax": { - "version": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + "prepend-http": "^1.0.1" } }, "url-regex": { - "version": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", "dev": true, "optional": true, "requires": { - "ip-regex": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz" + "ip-regex": "^1.0.1" } }, "use": { - "version": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", "dev": true, "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz" + "kind-of": "^6.0.2" } }, "user-home": { - "version": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, "useragent": { - "version": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", "dev": true, "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "tmp": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz" + "lru-cache": "2.2.x", + "tmp": "0.0.x" }, "dependencies": { "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", - "dev": true, - "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - } + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true } } }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "util.promisify": { - "version": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", "dev": true, "optional": true, "requires": { - "define-properties": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "object.getownpropertydescriptors": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "utils-merge": { - "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", "dev": true }, "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", "dev": true }, + "uws": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", + "dev": true, + "optional": true + }, "v8flags": { - "version": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" + "user-home": "^1.1.1" } }, "vali-date": { - "version": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", "dev": true }, "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", "dev": true, "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vary": { - "version": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=", "dev": true }, "vendors": { - "version": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", "integrity": "sha1-f8te759WI7FWvOqJ7DfWNnbyGAE=", "dev": true }, "verror": { - "version": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "extsprintf": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, "vhost": { - "version": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=", "dev": true }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } }, "vinyl-assign": { - "version": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", "dev": true, "requires": { - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "readable-stream": "2.3.6" + "object-assign": "^4.0.1", + "readable-stream": "^2.0.0" }, "dependencies": { "isarray": { @@ -10221,13 +12835,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "1.0.0", - "process-nextick-args": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", "string_decoder": "1.1.1", - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -10236,188 +12850,218 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "safe-buffer": "5.1.2" } } } }, "vinyl-bufferstream": { - "version": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", "dev": true, "requires": { - "bufferstreams": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz" + "bufferstreams": "1.0.1" } }, "vinyl-file": { - "version": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", "dev": true, "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "strip-bom-stream": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz" + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" }, "dependencies": { "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "is-utf8": "^0.2.0" } }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "replace-ext": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } } } }, "vinyl-fs": { - "version": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "glob-stream": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", - "glob-watcher": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", - "through2": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "vinyl": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz" + "defaults": "^1.0.0", + "glob-stream": "^3.1.5", + "glob-watcher": "^0.0.6", + "graceful-fs": "^3.0.0", + "mkdirp": "^0.5.0", + "strip-bom": "^1.0.0", + "through2": "^0.6.1", + "vinyl": "^0.4.0" }, "dependencies": { "clone": { - "version": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", "dev": true }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "isarray": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "through2": { - "version": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } }, "vinyl": { - "version": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "clone-stats": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" + "clone": "^0.2.0", + "clone-stats": "^0.0.1" } } } }, "vinyl-sourcemaps-apply": { - "version": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "dev": true, "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "source-map": "^0.5.1" } }, "void-elements": { - "version": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, "ware": { - "version": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", "dev": true, "requires": { - "wrap-fn": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz" + "wrap-fn": "^0.1.0" } }, "websocket-driver": { - "version": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", - "websocket-extensions": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", "dev": true }, "when": { - "version": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", "dev": true }, "whet.extend": { - "version": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", "dev": true }, "which": { - "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "dev": true, "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "isexe": "^2.0.0" } }, "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, + "with-callback": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", + "dev": true, + "optional": true + }, "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true }, "wrap-fn": { - "version": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", "dev": true, "requires": { - "co": "https://registry.npmjs.org/co/-/co-3.1.0.tgz" + "co": "3.1.0" }, "dependencies": { "co": { - "version": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", "dev": true } } }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -10427,59 +13071,70 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "mkdirp": "^0.5.1" } }, "ws": { - "version": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "options": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "ultron": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "wtf-8": { - "version": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, - "xmlhttprequest-ssl": { - "version": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "optional": true }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "yallist": { - "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "dev": true, + "optional": true }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" } }, "yauzl": { - "version": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "dev": true, "requires": { - "fd-slicer": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" + "fd-slicer": "~1.0.1" } }, "yeast": { - "version": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true } From e8181973658b2e69e405c4c76e836ac072f50032 Mon Sep 17 00:00:00 2001 From: Warren Date: Thu, 9 Aug 2018 09:00:34 +0100 Subject: [PATCH 163/275] Fix comma dangle ESLint errors --- .../src/common/resources/contenttype.resource.js | 2 +- .../src/common/services/contenteditinghelper.service.js | 2 +- .../infiniteeditors/mediapicker/mediapicker.controller.js | 2 +- .../src/views/languages/overview.controller.js | 2 +- .../views/propertyeditors/fileupload/fileupload.controller.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 890b5b273c..56dff12985 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -344,7 +344,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Import", { file: file })), "Failed to import document type " + file ); - }, + } }; } angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index 112c1df8fd..245a96483c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -443,7 +443,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica "removeDateMonth", "removeDateDayNumber", "removeDateDay", - "removeDateTime", + "removeDateTime" ], function (i) { return i === propName; }); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 1d34482358..6549df10c8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -50,7 +50,7 @@ angular.module("umbraco") pageSize: 100, totalItems: 0, totalPages: 0, - filter: '', + filter: '' }; //preload selected item diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index c81f93c7d6..3911d6e893 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -21,7 +21,7 @@ var labelKeys = [ "treeHeaders_languages", "general_mandatory", - "general_default", + "general_default" ]; localizationService.localizeMany(labelKeys).then(function (values) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js index 1c2ef37e0f..72ef7422c9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js @@ -143,7 +143,7 @@ templateUrl: 'views/propertyeditors/fileupload/fileupload.directive.html', controller: 'Umbraco.PropertyEditors.FileUploadController', scope: { - model: "=", + model: "=" }, link: function (scope, element, attrs, ctrl) { From 601c30c39aa6b01ac02106af24b7256c4e134887 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 9 Aug 2018 19:34:32 +1000 Subject: [PATCH 164/275] Fixes js tests --- src/Umbraco.Web.UI.Client/package-lock.json | 10 +++---- .../common/resources/contenttype.resource.js | 2 +- .../services/contenteditinghelper.service.js | 25 ++++++++++------ .../src/common/services/formhelper.service.js | 12 ++++++-- .../services/servervalidationmgr.service.js | 30 ++++++++++++++++--- .../mediapicker/mediapicker.controller.js | 4 +-- .../views/languages/overview.controller.js | 2 +- .../services/content-editing-helper.spec.js | 7 +++-- .../unit/common/services/file-manager.spec.js | 27 +++++++++++++---- 9 files changed, 87 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 626e1e3d51..2497bdc592 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -955,12 +955,12 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" - }, - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + "is-extendable": "^0.1.0" + } } } }, @@ -1670,9 +1670,9 @@ "dependencies": { "source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "dev": true } } }, diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 890b5b273c..56dff12985 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -344,7 +344,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Import", { file: file })), "Failed to import document type " + file ); - }, + } }; } angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index 112c1df8fd..e70f030557 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -443,7 +443,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica "removeDateMonth", "removeDateDayNumber", "removeDateDay", - "removeDateTime", + "removeDateTime" ], function (i) { return i === propName; }); @@ -519,25 +519,32 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica var allNewProps = this.getAllProps(savedVariant); //check for changed properties of the content - for (var p in allOrigProps) { - var alias = allOrigProps[p].alias; + for (var k = 0; k < allOrigProps.length; k++) { + + var origProp = allOrigProps[k]; + var alias = origProp.alias; var newProp = getNewProp(alias, allNewProps); - if (newProp && !_.isEqual(alias, newProp.value)) { + if (newProp && !_.isEqual(origProp.value, newProp.value)) { //they have changed so set the origContent prop to the new one - var origVal = allOrigProps[p].value; - allOrigProps[p].value = newProp.value; + var origVal = origProp.value; + + origProp.value = newProp.value; //instead of having a property editor $watch their expression to check if it has // been updated, instead we'll check for the existence of a special method on their model // and just call it. - if (angular.isFunction(allOrigProps[p].onValueChanged)) { + if (angular.isFunction(origProp.onValueChanged)) { //send the newVal + oldVal - allOrigProps[p].onValueChanged(allOrigProps[p].value, origVal); + origProp.onValueChanged(origProp.value, origVal); } - changed.push(allOrigProps[p]); + changed.push(origProp); } + + } + for (var p in allOrigProps) { + } } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js index 745e1c2099..3a5dfe28de 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js @@ -159,10 +159,18 @@ function formHelper(angularHelper, serverValidationManager, $timeout, notificati //Check if this is for content properties - specific to content/media/member editors because those are special // user defined properties with custom controls. - if (parts.length > 2 && parts[0] === "_Properties") { + if (parts.length > 1 && parts[0] === "_Properties") { var propertyAlias = parts[1]; - var culture = parts[2]; + + var culture = null; + if (parts.length > 2) { + culture = parts[2]; + //special check in case the string is formatted this way + if (culture === "null") { + culture = null; + } + } //if it contains 3 '.' then we will wire it up to a property's html field if (parts.length > 3) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js index a67f54c69c..26317490a0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js @@ -140,8 +140,9 @@ function serverValidationManager($timeout) { } } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //don't add it if it already exists var exists2 = _.find(callbacks, function (item) { @@ -165,8 +166,9 @@ function serverValidationManager($timeout) { } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //remove all callbacks for the content property @@ -192,8 +194,9 @@ function serverValidationManager($timeout) { */ getPropertyCallbacks: function (propertyAlias, culture, fieldName) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } var found = _.filter(callbacks, function (item) { @@ -268,8 +271,9 @@ function serverValidationManager($timeout) { return; } + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //only add the item if it doesn't exist @@ -306,6 +310,12 @@ function serverValidationManager($timeout) { if (!propertyAlias) { return; } + + //normalize culture to null + if (!culture) { + culture = null; + } + //remove the item this.items = _.reject(this.items, function (item) { return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -354,6 +364,12 @@ function serverValidationManager($timeout) { * Gets the error message for the content property */ getPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -388,6 +404,12 @@ function serverValidationManager($timeout) { * Checks if the content property + culture + field name combo has an error */ hasPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 1d34482358..4de506ce50 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -50,7 +50,7 @@ angular.module("umbraco") pageSize: 100, totalItems: 0, totalPages: 0, - filter: '', + filter: '' }; //preload selected item @@ -435,4 +435,4 @@ angular.module("umbraco") onInit(); - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index c81f93c7d6..3911d6e893 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -21,7 +21,7 @@ var labelKeys = [ "treeHeaders_languages", "general_mandatory", - "general_default", + "general_default" ]; localizationService.localizeMany(labelKeys).then(function (values) { diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js index 5937b7f2fb..64b272dd3f 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js @@ -123,7 +123,8 @@ describe('contentEditingHelper tests', function () { var allProps = contentEditingHelper.getAllProps(content); //act - formHelper.handleServerValidation({ "_Properties.bodyText.value": ["Required"] }); + //note the null, that's because culture is null + formHelper.handleServerValidation({ "_Properties.bodyText.null.value": ["Required"] }); //assert expect(serverValidationManager.items.length).toBe(1); @@ -143,7 +144,8 @@ describe('contentEditingHelper tests', function () { { "Name": ["Required"], "UpdateDate": ["Invalid date"], - "_Properties.bodyText.value": ["Required field"], + //note the null, that's because culture is null + "_Properties.bodyText.null.value": ["Required field"], "_Properties.textarea": ["Invalid format"] }); @@ -226,6 +228,7 @@ describe('contentEditingHelper tests', function () { //act var changed = contentEditingHelper.reBindChangedProperties(origContent, newContent); + //assert expect(changed.length).toBe(2); expect(changed[0].alias).toBe("grid"); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js index e86119cf5f..e5751341bc 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js @@ -10,24 +10,39 @@ describe('file manager tests', function () { describe('file management', function () { it('adding a file adds to the collection', function () { - fileManager.setFiles('testProp', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(1); }); it('adding a file with the same property id replaces the existing one', function () { - fileManager.setFiles('testProp', ["testFile"]); - fileManager.setFiles('testProp', ["testFile2"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile2"] + }); expect(fileManager.getFiles().length).toBe(1); expect(fileManager.getFiles()[0].file).toBe("testFile2"); }); it('clears all files', function () { - fileManager.setFiles('testProp1', ["testFile"]); - fileManager.setFiles('testProp2', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp2', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(2); fileManager.clearFiles(); expect(fileManager.getFiles().length).toBe(0); }); }); -}); \ No newline at end of file +}); From f738e6d7c7c5ac557871d04dd233ff6bbe698a02 Mon Sep 17 00:00:00 2001 From: Shannon Date: Thu, 9 Aug 2018 19:38:20 +1000 Subject: [PATCH 165/275] Fixes js tests --- src/Umbraco.Web.UI.Client/package-lock.json | 10 +++---- .../common/resources/contenttype.resource.js | 2 +- .../services/contenteditinghelper.service.js | 25 ++++++++++------ .../src/common/services/formhelper.service.js | 12 ++++++-- .../services/servervalidationmgr.service.js | 30 ++++++++++++++++--- .../mediapicker/mediapicker.controller.js | 4 +-- .../views/languages/overview.controller.js | 2 +- .../fileupload/fileupload.controller.js | 2 +- .../services/content-editing-helper.spec.js | 7 +++-- .../unit/common/services/file-manager.spec.js | 27 +++++++++++++---- 10 files changed, 88 insertions(+), 33 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 626e1e3d51..2497bdc592 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -955,12 +955,12 @@ "dependencies": { "extend-shallow": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" - }, - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + "is-extendable": "^0.1.0" + } } } }, @@ -1670,9 +1670,9 @@ "dependencies": { "source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "dev": true } } }, diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js index 890b5b273c..56dff12985 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/contenttype.resource.js @@ -344,7 +344,7 @@ function contentTypeResource($q, $http, umbRequestHelper, umbDataFormatter, loca $http.post(umbRequestHelper.getApiUrl("contentTypeApiBaseUrl", "Import", { file: file })), "Failed to import document type " + file ); - }, + } }; } angular.module('umbraco.resources').factory('contentTypeResource', contentTypeResource); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index 112c1df8fd..e70f030557 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -443,7 +443,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica "removeDateMonth", "removeDateDayNumber", "removeDateDay", - "removeDateTime", + "removeDateTime" ], function (i) { return i === propName; }); @@ -519,25 +519,32 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica var allNewProps = this.getAllProps(savedVariant); //check for changed properties of the content - for (var p in allOrigProps) { - var alias = allOrigProps[p].alias; + for (var k = 0; k < allOrigProps.length; k++) { + + var origProp = allOrigProps[k]; + var alias = origProp.alias; var newProp = getNewProp(alias, allNewProps); - if (newProp && !_.isEqual(alias, newProp.value)) { + if (newProp && !_.isEqual(origProp.value, newProp.value)) { //they have changed so set the origContent prop to the new one - var origVal = allOrigProps[p].value; - allOrigProps[p].value = newProp.value; + var origVal = origProp.value; + + origProp.value = newProp.value; //instead of having a property editor $watch their expression to check if it has // been updated, instead we'll check for the existence of a special method on their model // and just call it. - if (angular.isFunction(allOrigProps[p].onValueChanged)) { + if (angular.isFunction(origProp.onValueChanged)) { //send the newVal + oldVal - allOrigProps[p].onValueChanged(allOrigProps[p].value, origVal); + origProp.onValueChanged(origProp.value, origVal); } - changed.push(allOrigProps[p]); + changed.push(origProp); } + + } + for (var p in allOrigProps) { + } } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js index 745e1c2099..3a5dfe28de 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js @@ -159,10 +159,18 @@ function formHelper(angularHelper, serverValidationManager, $timeout, notificati //Check if this is for content properties - specific to content/media/member editors because those are special // user defined properties with custom controls. - if (parts.length > 2 && parts[0] === "_Properties") { + if (parts.length > 1 && parts[0] === "_Properties") { var propertyAlias = parts[1]; - var culture = parts[2]; + + var culture = null; + if (parts.length > 2) { + culture = parts[2]; + //special check in case the string is formatted this way + if (culture === "null") { + culture = null; + } + } //if it contains 3 '.' then we will wire it up to a property's html field if (parts.length > 3) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js index a67f54c69c..26317490a0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js @@ -140,8 +140,9 @@ function serverValidationManager($timeout) { } } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //don't add it if it already exists var exists2 = _.find(callbacks, function (item) { @@ -165,8 +166,9 @@ function serverValidationManager($timeout) { } else if (propertyAlias !== undefined) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //remove all callbacks for the content property @@ -192,8 +194,9 @@ function serverValidationManager($timeout) { */ getPropertyCallbacks: function (propertyAlias, culture, fieldName) { + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } var found = _.filter(callbacks, function (item) { @@ -268,8 +271,9 @@ function serverValidationManager($timeout) { return; } + //normalize culture to null if (!culture) { - culture = null; // if empty or null, always make null + culture = null; } //only add the item if it doesn't exist @@ -306,6 +310,12 @@ function serverValidationManager($timeout) { if (!propertyAlias) { return; } + + //normalize culture to null + if (!culture) { + culture = null; + } + //remove the item this.items = _.reject(this.items, function (item) { return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -354,6 +364,12 @@ function serverValidationManager($timeout) { * Gets the error message for the content property */ getPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); @@ -388,6 +404,12 @@ function serverValidationManager($timeout) { * Checks if the content property + culture + field name combo has an error */ hasPropertyError: function (propertyAlias, culture, fieldName) { + + //normalize culture to null + if (!culture) { + culture = null; + } + var err = _.find(this.items, function (item) { //return true if the property alias matches and if an empty field name is specified or the field name matches return (item.propertyAlias === propertyAlias && item.culture === culture && (item.fieldName === fieldName || (fieldName === undefined || fieldName === ""))); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js index 1d34482358..4de506ce50 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js @@ -50,7 +50,7 @@ angular.module("umbraco") pageSize: 100, totalItems: 0, totalPages: 0, - filter: '', + filter: '' }; //preload selected item @@ -435,4 +435,4 @@ angular.module("umbraco") onInit(); - }); \ No newline at end of file + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js index c81f93c7d6..3911d6e893 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overview.controller.js @@ -21,7 +21,7 @@ var labelKeys = [ "treeHeaders_languages", "general_mandatory", - "general_default", + "general_default" ]; localizationService.localizeMany(labelKeys).then(function (values) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js index 1c2ef37e0f..72ef7422c9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js @@ -143,7 +143,7 @@ templateUrl: 'views/propertyeditors/fileupload/fileupload.directive.html', controller: 'Umbraco.PropertyEditors.FileUploadController', scope: { - model: "=", + model: "=" }, link: function (scope, element, attrs, ctrl) { diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js index 5937b7f2fb..64b272dd3f 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/content-editing-helper.spec.js @@ -123,7 +123,8 @@ describe('contentEditingHelper tests', function () { var allProps = contentEditingHelper.getAllProps(content); //act - formHelper.handleServerValidation({ "_Properties.bodyText.value": ["Required"] }); + //note the null, that's because culture is null + formHelper.handleServerValidation({ "_Properties.bodyText.null.value": ["Required"] }); //assert expect(serverValidationManager.items.length).toBe(1); @@ -143,7 +144,8 @@ describe('contentEditingHelper tests', function () { { "Name": ["Required"], "UpdateDate": ["Invalid date"], - "_Properties.bodyText.value": ["Required field"], + //note the null, that's because culture is null + "_Properties.bodyText.null.value": ["Required field"], "_Properties.textarea": ["Invalid format"] }); @@ -226,6 +228,7 @@ describe('contentEditingHelper tests', function () { //act var changed = contentEditingHelper.reBindChangedProperties(origContent, newContent); + //assert expect(changed.length).toBe(2); expect(changed[0].alias).toBe("grid"); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js index e86119cf5f..e5751341bc 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/file-manager.spec.js @@ -10,24 +10,39 @@ describe('file manager tests', function () { describe('file management', function () { it('adding a file adds to the collection', function () { - fileManager.setFiles('testProp', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(1); }); it('adding a file with the same property id replaces the existing one', function () { - fileManager.setFiles('testProp', ["testFile"]); - fileManager.setFiles('testProp', ["testFile2"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile2"] + }); expect(fileManager.getFiles().length).toBe(1); expect(fileManager.getFiles()[0].file).toBe("testFile2"); }); it('clears all files', function () { - fileManager.setFiles('testProp1', ["testFile"]); - fileManager.setFiles('testProp2', ["testFile"]); + fileManager.setFiles({ + propertyAlias: 'testProp', + files: ["testFile"] + }); + fileManager.setFiles({ + propertyAlias: 'testProp2', + files: ["testFile"] + }); expect(fileManager.getFiles().length).toBe(2); fileManager.clearFiles(); expect(fileManager.getFiles().length).toBe(0); }); }); -}); \ No newline at end of file +}); From fd888cab4b033a3d58f95607bec2b25c80067807 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 9 Aug 2018 14:36:08 +0200 Subject: [PATCH 166/275] Fixes U4-9095 - the textService.Localize always returns some string, either the translation or [alias] - so we need to make sure it actually translated something --- .../Trees/ApplicationTreeExtensions.cs | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs b/src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs index e2dceef47d..b49d3d2586 100644 --- a/src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs +++ b/src/Umbraco.Web/Trees/ApplicationTreeExtensions.cs @@ -51,17 +51,24 @@ namespace Umbraco.Web.Trees internal static string GetRootNodeDisplayName(this TreeAttribute attribute, ILocalizedTextService textService) { + var label = $"[{attribute.Alias}]"; + // try to look up a the localized tree header matching the tree alias var localizedLabel = textService.Localize("treeHeaders/" + attribute.Alias); - if (string.IsNullOrEmpty(localizedLabel) == false) - return localizedLabel; - - // otherwise return the header if it's defined - if (string.IsNullOrEmpty(attribute.Title) == false) - return attribute.Title; - // if all fails, return this to signal that a label was not found - return "[" + attribute.Alias + "]"; + // if the localizedLabel returns [alias] then return the title attribute from the trees.config file, if it's defined + if (localizedLabel != null && localizedLabel.Equals(label, StringComparison.InvariantCultureIgnoreCase)) + { + if (string.IsNullOrEmpty(attribute.Title) == false) + label = attribute.Title; + } + else + { + // the localizedLabel translated into something that's not just [alias], so use the translation + label = localizedLabel; + } + + return label; } internal static Attempt TryGetControllerTree(this ApplicationTree appTree) From 2f0f43e60560ffe948d00d2119dbd596e4e718ae Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 00:39:20 +1000 Subject: [PATCH 167/275] Gets image cropper working between variants, even with invariant properties, adds unit test to ensure invariant properties in the model are the same reference --- .../upload/umbpropertyfileupload.directive.js | 26 +++++- .../src/common/resources/content.resource.js | 15 ++-- .../services/umbdataformatter.service.js | 46 ++++++++++ .../upload/umb-property-file-upload.html | 4 +- .../fileupload/fileupload.controller.js | 4 +- .../imagecropper/imagecropper.controller.js | 22 +++-- .../imagecropper/imagecropper.html | 1 + .../umb-data-formatter-service.spec.js | 88 +++++++++++++++++++ 8 files changed, 185 insertions(+), 21 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/test/unit/common/services/umb-data-formatter-service.spec.js diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js index 52983efd87..b8afc4b35e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js @@ -51,6 +51,19 @@ vm.fileUploadForm.$setDirty(); } + function notifyInit(val, files) { + if (!val) { + val = null; + } + if (!files) { + files = null; + } + + if (vm.onInit) { + vm.onInit({ value: val, files: files }); + } + } + /** Called when the component initializes */ function onInit() { $scope.$on("filesSelected", onFilesSelected); @@ -85,7 +98,7 @@ if (existingClientFiles.length > 0) { updateModelFromSelectedFiles(existingClientFiles).then(function(newVal) { //notify the callback - vm.onValueChanged({ value: newVal, files: vm.files }); + notifyInit(newVal, vm.files); }); } else if (vm.value) { @@ -101,12 +114,16 @@ f.fileSrc = getThumbnail(f); return f; }); + + //notify the callback + notifyInit(); } else { vm.files = []; - } - //vm.clearFiles = false; + //notify the callback + notifyInit(); + } } ///** Method required by the valPropertyValidator directive (returns true if the property editor has at least one file selected) */ @@ -250,8 +267,9 @@ culture: "@?", propertyAlias: "@", value: "<", + hideSelection: "<", onValueChanged: "&", - hideSelection: "<" + onInit: "&" }, transclude: true, controllerAs: 'vm', diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index 206ca08dac..33840e87d9 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -332,12 +332,15 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { */ getById: function (id) { return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetById", - { id: id })), - 'Failed to retrieve data for content id ' + id); + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetById", + { id: id })), + 'Failed to retrieve data for content id ' + id) + .then(function(result) { + return $q.when(umbDataFormatter.formatContentGetData(result)); + }); }, getBlueprintById: function (id) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js index 38c02338ee..77ca2b6157 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbdataformatter.service.js @@ -383,6 +383,52 @@ saveModel.templateAlias = propTemplate ? propTemplate : null; return saveModel; + }, + + /** + * This formats the server GET response for a content display item + * @param {} displayModel + * @returns {} + */ + formatContentGetData: function(displayModel) { + + //We need to check for invariant properties among the variant variants. + //When we detect this, we want to make sure that the property object instance is the + //same reference object between all variants instead of a copy (which it will be when + //return from the JSON structure). + + if (displayModel.variants && displayModel.variants.length > 1) { + + var invariantProperties = []; + + //collect all invariant properties on the first first variant + var firstVariant = displayModel.variants[0]; + _.each(firstVariant.tabs, function(tab, tabIndex) { + _.each(tab.properties, function (property, propIndex) { + //in theory if there's more than 1 variant, that means they would all have a language + //but we'll do our safety checks anyways here + if (firstVariant.language && !property.culture) { + invariantProperties.push({ + tabIndex: tabIndex, + propIndex: propIndex, + property: property + }); + } + }); + }); + + + //now assign this same invariant property instance to the same index of the other variants property array + for (var j = 1; j < displayModel.variants.length; j++) { + var variant = displayModel.variants[j]; + + _.each(invariantProperties, function (invProp) { + variant.tabs[invProp.tabIndex].properties[invProp.propIndex] = invProp.property; + }); + } + } + + return displayModel; } }; } diff --git a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html index 5729bf0908..f205dffa57 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-property-file-upload.html @@ -8,9 +8,7 @@

    Click to upload

    - -
    {{vm.files.length}}
    - +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js index d005cbedad..a5ebc92c5f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js @@ -12,7 +12,7 @@ */ function fileUploadController($scope) { - $scope.fileChanged = fileChanged; + $scope.fileChanged = onFileChanged; //declare a special method which will be called whenever the value has changed from the server $scope.model.onValueChanged = onValueChanged; @@ -20,7 +20,7 @@ * Called when the file selection value changes * @param {any} value */ - function fileChanged(value) { + function onFileChanged(value) { $scope.model.value = value; //if the value is empty, then tell the server to clear the files diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js index d4b68d98e3..1c9f835142 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js @@ -4,7 +4,8 @@ angular.module('umbraco') var config = angular.copy($scope.model.config); - $scope.fileChanged = fileChanged; + $scope.fileChanged = onFileChanged; + $scope.fileUploaderInit = onFileUploaderInit; $scope.crop = crop; $scope.done = done; $scope.clear = clear; @@ -40,7 +41,7 @@ angular.module('umbraco') * Called when the file selection value changes * @param {any} value */ - function fileChanged(value, files) { + function onFileChanged(value, files) { setModelValueWithSrc(value); if (files && files[0]) { @@ -50,7 +51,11 @@ angular.module('umbraco') } } - function onInit() { + /** + * Called when the file uploader initializes + * @param {any} value + */ + function onFileUploaderInit(value, files) { //move previously saved value to the editor if ($scope.model.value) { //backwards compat with the old file upload (incase some-one swaps them..) @@ -74,7 +79,14 @@ angular.module('umbraco') } } - $scope.imageSrc = $scope.model.value.src; + //if there are already files in the client assigned then set the src + if (files && files[0]) { + $scope.imageSrc = files[0].fileSrc; + } + else { + $scope.imageSrc = $scope.model.value.src; + } + } } @@ -120,8 +132,6 @@ angular.module('umbraco') //set form to dirty to track changes $scope.imageCropperForm.$setDirty(); }; - - onInit(); var unsubscribe = $scope.$on("formSubmitting", function () { $scope.currentCrop = null; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html index a4c06b40c4..bc41218592 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html @@ -7,6 +7,7 @@ property-alias="{{model.alias}}" value="model.value.src" on-value-changed="fileChanged(value, files)" + on-init="fileUploaderInit(value, files)" hide-selection="true">
    diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-data-formatter-service.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-data-formatter-service.spec.js new file mode 100644 index 0000000000..7c307a96e1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/umb-data-formatter-service.spec.js @@ -0,0 +1,88 @@ +describe('umbDataFormatter service tests', function () { + var umbDataFormatter; + + beforeEach(module('umbraco.services')); + + beforeEach(inject(function ($injector) { + umbDataFormatter = $injector.get('umbDataFormatter'); + })); + + describe('formatting GET content data', function () { + + it('will set the same invariant property instance reference between all variants', function () { + + var model = { + variants: [ + { + language: { culture: "en-US" }, + tabs: [ + { + properties: [ + { alias: "test1", culture: null, value: "test1" }, + { alias: "test2", culture: "en-US", value: "test2" } + ] + }, + { + properties: [ + { alias: "test3", culture: "en-US", value: "test3" }, + { alias: "test4", culture: null, value: "test4" } + ] + } + ] + + }, + { + language: { culture: "es-ES" }, + tabs: [ + { + properties: [ + { alias: "test1", culture: null, value: "test5" }, + { alias: "test2", culture: "en-US", value: "test6" } + ] + }, + { + properties: [ + { alias: "test3", culture: "en-US", value: "test7" }, + { alias: "test4", culture: null, value: "test8" } + ] + } + ] + }, + { + language: { culture: "fr-FR" }, + tabs: [ + { + properties: [ + { alias: "test1", culture: null, value: "test9" }, + { alias: "test2", culture: "en-US", value: "test10" } + ] + }, + { + properties: [ + { alias: "test3", culture: "en-US", value: "test11" }, + { alias: "test4", culture: null, value: "test12" } + ] + } + ] + } + ] + }; + var result = umbDataFormatter.formatContentGetData(model); + + //make sure the same property reference exists for property 0 and 3 for each variant + for (var i = 1; i < result.variants.length; i++) { + expect(result.variants[0].tabs[0].properties[0]).toBe(result.variants[i].tabs[0].properties[0]); + expect(result.variants[0].tabs[1].properties[3]).toBe(result.variants[i].tabs[1].properties[3]); + } + + //test that changing a property value in one variant is definitely updating the same object reference and therefor + //is done on all variants. + result.variants[0].tabs[0].properties[0].value = "hello"; + for (var i = 1; i < result.variants.length; i++) { + expect(result.variants[0].tabs[0].properties[0].value).toBe("hello"); + } + + }); + + }); +}); From 404055917f67ce24d267ecdcb9d0721cd63c28c4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:22:11 +0200 Subject: [PATCH 168/275] remove umb-upload-dropzone --- .../_obsolete/umbuploaddropzone.directive.js | 17 ---------------- .../src/less/property-editors.less | 20 ------------------- .../_obsolete/umb-upload-dropzone.html | 8 -------- 3 files changed, 45 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbuploaddropzone.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-upload-dropzone.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbuploaddropzone.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbuploaddropzone.directive.js deleted file mode 100644 index 64ca76a6ec..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbuploaddropzone.directive.js +++ /dev/null @@ -1,17 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbUploadDropzone -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* -* @restrict E -**/ - -angular.module("umbraco.directives.html") - .directive('umbUploadDropzone', function(){ - return { - restrict: 'E', - replace: true, - templateUrl: 'views/directives/_obsolete/umb-upload-dropzone.html' - }; - }); diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 9b21a1667c..a9f6d3fbd4 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -657,28 +657,8 @@ ul.color-picker li { line-height: 120px } -.umb-upload-drop-zone{ - margin-bottom:5px; -} - -.umb-upload-drop-zone .info, .umb-upload-button-big{ - display: block; - padding: 20px; - opacity: 1; - border: 1px dashed @gray-8; - background: none; - text-align: center; - font-size: 14px; - color: @gray-8; -} - .umb-upload-button-big:hover{color: @gray-8;} -.umb-upload-drop-zone .info i.icon, .umb-upload-button-big i.icon{ - font-size: 55px; - line-height: 70px -} - .umb-upload-button-big {display: block} .umb-upload-button-big input { left: 0; diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-upload-dropzone.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-upload-dropzone.html deleted file mode 100644 index 20a8f9d741..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-upload-dropzone.html +++ /dev/null @@ -1,8 +0,0 @@ -
    -
    - -

    - Drop your files here... -

    -
    -
    \ No newline at end of file From 16ceca15986773a6173bef97a11714dd8327e49e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:23:20 +0200 Subject: [PATCH 169/275] remove umb-tab-view --- .../_obsolete/umbtabview.directive.js | 18 ------------------ .../directives/_obsolete/umb-tab-view.html | 5 ----- 2 files changed, 23 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbtabview.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-tab-view.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbtabview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbtabview.directive.js deleted file mode 100644 index 5fe813509e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbtabview.directive.js +++ /dev/null @@ -1,18 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbTabView -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* -* @restrict E -**/ - -angular.module("umbraco.directives") -.directive('umbTabView', function($timeout, $log){ - return { - restrict: 'E', - replace: true, - transclude: 'true', - templateUrl: 'views/directives/_obsolete/umb-tab-view.html' - }; -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-tab-view.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-tab-view.html deleted file mode 100644 index 93b520cb79..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-tab-view.html +++ /dev/null @@ -1,5 +0,0 @@ -
    -
    - -
    -
    From 5ab978ecf51b2ae2e3dbb4c96a8187adcaceb40d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:29:17 +0200 Subject: [PATCH 170/275] remove umb-photo-folder --- .../_obsolete/umbphotofolder.directive.js | 70 ----------- .../src/less/property-editors.less | 117 ------------------ .../_obsolete/umb-photo-folder.html | 28 ----- 3 files changed, 215 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbphotofolder.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-photo-folder.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbphotofolder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbphotofolder.directive.js deleted file mode 100644 index c6c628741f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbphotofolder.directive.js +++ /dev/null @@ -1,70 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbPhotoFolder -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @restrict E -**/ - -angular.module("umbraco.directives.html") - .directive('umbPhotoFolder', function($compile, $log, $timeout, $filter, umbPhotoFolderHelper) { - - return { - restrict: 'E', - replace: true, - require: '?ngModel', - terminate: true, - templateUrl: 'views/directives/_obsolete/umb-photo-folder.html', - link: function(scope, element, attrs, ngModel) { - - var lastWatch = null; - - ngModel.$render = function() { - if (ngModel.$modelValue) { - - $timeout(function() { - var photos = ngModel.$modelValue; - - scope.clickHandler = scope.$eval(element.attr('on-click')); - - - var imagesOnly = element.attr('images-only') === "true"; - - - var margin = element.attr('border') ? parseInt(element.attr('border'), 10) : 5; - var startingIndex = element.attr('baseline') ? parseInt(element.attr('baseline'), 10) : 0; - var minWidth = element.attr('min-width') ? parseInt(element.attr('min-width'), 10) : 420; - var minHeight = element.attr('min-height') ? parseInt(element.attr('min-height'), 10) : 100; - var maxHeight = element.attr('max-height') ? parseInt(element.attr('max-height'), 10) : 300; - var idealImgPerRow = element.attr('ideal-items-per-row') ? parseInt(element.attr('ideal-items-per-row'), 10) : 5; - var fixedRowWidth = Math.max(element.width(), minWidth); - - scope.containerStyle = { width: fixedRowWidth + "px" }; - scope.rows = umbPhotoFolderHelper.buildGrid(photos, fixedRowWidth, maxHeight, startingIndex, minHeight, idealImgPerRow, margin, imagesOnly); - - if (attrs.filterBy) { - - //we track the watches that we create, we don't want to create multiple, so clear it - // if it already exists before creating another. - if (lastWatch) { - lastWatch(); - } - - //TODO: Need to debounce this so it doesn't filter too often! - lastWatch = scope.$watch(attrs.filterBy, function (newVal, oldVal) { - if (newVal && newVal !== oldVal) { - var p = $filter('filter')(photos, newVal, false); - scope.baseline = 0; - var m = umbPhotoFolderHelper.buildGrid(p, fixedRowWidth, maxHeight, startingIndex, minHeight, idealImgPerRow, margin, imagesOnly); - scope.rows = m; - } - }); - } - - }, 500); //end timeout - } //end if modelValue - - }; //end $render - } - }; - }); diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index a9f6d3fbd4..d6cf651c48 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -668,123 +668,6 @@ ul.color-picker li { } - -// -// Photo folder styling -// -------------------------------------------------- - -.umb-photo-folder .picrow{ - overflow-y: hidden; - position: relative; -} - - - -.umb-photo-folder .picrow div, .umb-photo-preview{ - margin: 0px; - padding: 0px; - border: none; - display: inline-block; - vertical-align: top; - position: relative; -} - - - -.umb-photo-folder .picrow div a:first-child { - width:100%; - height:100%; -} - -.umb-photo-folder .picrow div.umb-photo { - width:100%; - height:100%; - background-color: @gray-10; -} - -.umb-photo-folder a:hover{text-decoration: none} -.umb-photo-folder .umb-non-thumbnail{ - text-align: center; - vertical-align: middle; - font-size: 12px; - background: @gray-10; - color: @black; - text-decoration: none; -} - -.umb-photo-folder .selector-overlay{ - display: none; -} - -//this is a temp hack, to provide selectors in the dialog: -.umb-photo-folder .pic:hover .selector-overlay { - position: absolute; - bottom: 0px; - left: 0px; - right: 0px; - padding: 5px; - background: @black; - z-index: 100; - display: block; - text-align: center; - color: @white; - opacity: 0.4; - text-decoration:none; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.umb-photo-folder .umb-non-thumbnail i{ - color: @gray-8; - font-size: 50px; - line-height: 60px; - display: block; - margin: auto; - /*vertically aligns */ - position: relative; - top: 50%; - transform: translateY(-50%); -} - -.umb-photo-folder .umb-non-thumbnail span{ - position: absolute; - display: block; - margin: auto; - width: 100%; - top: 20px; -} - -.umb-photo-folder .selected{ - position: relative; -} - -.umb-photo-folder .selected:before{ - content: "\e165"; - font-family: Icomoon; - - position: absolute; - bottom: 10px; - right: 10px; - - font-size: 24px; - color: @black; - opacity: 0.5; - background: @white; - - line-height: 36px; - text-align: center; - -moz-border-radius: 15px; - border-radius: 15px; - - height: 32px; - width: 32px; - overflow: hidden; - display: block; - z-index: 100; -} - - // // File upload // -------------------------------------------------- diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-photo-folder.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-photo-folder.html deleted file mode 100644 index 67e0ecbf66..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-photo-folder.html +++ /dev/null @@ -1,28 +0,0 @@ - From c50f7a1284b1c23e510ff054dbcaf912b9077405 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:33:48 +0200 Subject: [PATCH 171/275] remove umb-sort --- .../directives/_obsolete/umbsort.directive.js | 172 ------------------ .../src/less/dragdrop.less | 37 ---- 2 files changed, 209 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbsort.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/less/dragdrop.less diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbsort.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbsort.directive.js deleted file mode 100644 index aab837f916..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbsort.directive.js +++ /dev/null @@ -1,172 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbSort -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* -* @element div -* @function -* -* @description -* Resize div's automatically to fit to the bottom of the screen, as an optional parameter an y-axis offset can be set -* So if you only want to scale the div to 70 pixels from the bottom you pass "70" -* -* @example -* -* -*
    -*
    -*
    -**/ - -angular.module("umbraco.directives") - .value('umbSortContextInternal',{}) - .directive('umbSort', function($log,umbSortContextInternal) { - return { - require: '?ngModel', - link: function(scope, element, attrs, ngModel) { - var adjustment; - - var cfg = scope.$eval(element.attr('umb-sort')) || {}; - - scope.model = ngModel; - - scope.opts = cfg; - scope.opts.containerSelector= cfg.containerSelector || ".umb-" + cfg.group + "-container", - scope.opts.nested= cfg.nested || true, - scope.opts.drop= cfg.drop || true, - scope.opts.drag= cfg.drag || true, - scope.opts.clone = cfg.clone || "
  • "; - scope.opts.mode = cfg.mode || "list"; - - scope.opts.itemSelectorFull = $.trim(scope.opts.itemPath + " " + scope.opts.itemSelector); - - /* - scope.opts.isValidTarget = function(item, container) { - if(container.el.is(".umb-" + scope.opts.group + "-container")){ - return true; - } - return false; - }; - */ - - element.addClass("umb-sort"); - element.addClass("umb-" + cfg.group + "-container"); - - scope.opts.onDrag = function (item, position) { - if(scope.opts.mode === "list"){ - item.css({ - left: position.left - adjustment.left, - top: position.top - adjustment.top - }); - } - }; - - - scope.opts.onDrop = function (item, targetContainer, _super) { - - if(scope.opts.mode === "list"){ - //list mode - var clonedItem = $(scope.opts.clone).css({height: 0}); - item.after(clonedItem); - clonedItem.animate({'height': item.height()}); - - item.animate(clonedItem.position(), function () { - clonedItem.detach(); - _super(item); - }); - } - - var children = $(scope.opts.itemSelectorFull, targetContainer.el); - var targetIndex = children.index(item); - var targetScope = $(targetContainer.el[0]).scope(); - - - if(targetScope === umbSortContextInternal.sourceScope){ - if(umbSortContextInternal.sourceScope.opts.onSortHandler){ - var _largs = { - oldIndex: umbSortContextInternal.sourceIndex, - newIndex: targetIndex, - scope: umbSortContextInternal.sourceScope - }; - - umbSortContextInternal.sourceScope.opts.onSortHandler.call(this, item, _largs); - } - }else{ - - - if(targetScope.opts.onDropHandler){ - var args = { - sourceScope: umbSortContextInternal.sourceScope, - sourceIndex: umbSortContextInternal.sourceIndex, - sourceContainer: umbSortContextInternal.sourceContainer, - - targetScope: targetScope, - targetIndex: targetIndex, - targetContainer: targetContainer - }; - - targetScope.opts.onDropHandler.call(this, item, args); - } - - if(umbSortContextInternal.sourceScope.opts.onReleaseHandler){ - var _args = { - sourceScope: umbSortContextInternal.sourceScope, - sourceIndex: umbSortContextInternal.sourceIndex, - sourceContainer: umbSortContextInternal.sourceContainer, - - targetScope: targetScope, - targetIndex: targetIndex, - targetContainer: targetContainer - }; - - umbSortContextInternal.sourceScope.opts.onReleaseHandler.call(this, item, _args); - } - } - }; - - scope.changeIndex = function(from, to){ - scope.$apply(function(){ - var i = ngModel.$modelValue.splice(from, 1)[0]; - ngModel.$modelValue.splice(to, 0, i); - }); - }; - - scope.move = function(args){ - var from = args.sourceIndex; - var to = args.targetIndex; - - if(args.sourceContainer === args.targetContainer){ - scope.changeIndex(from, to); - }else{ - scope.$apply(function(){ - var i = args.sourceScope.model.$modelValue.splice(from, 1)[0]; - args.targetScope.model.$modelvalue.splice(to,0, i); - }); - } - }; - - scope.opts.onDragStart = function (item, container, _super) { - var children = $(scope.opts.itemSelectorFull, container.el); - var offset = item.offset(); - - umbSortContextInternal.sourceIndex = children.index(item); - umbSortContextInternal.sourceScope = $(container.el[0]).scope(); - umbSortContextInternal.sourceContainer = container; - - //current.item = ngModel.$modelValue.splice(current.index, 1)[0]; - - var pointer = container.rootGroup.pointer; - adjustment = { - left: pointer.left - offset.left, - top: pointer.top - offset.top - }; - - _super(item, container); - }; - - element.sortable( scope.opts ); - } - }; - - }); \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/less/dragdrop.less b/src/Umbraco.Web.UI.Client/src/less/dragdrop.less deleted file mode 100644 index 328ab27e5b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/less/dragdrop.less +++ /dev/null @@ -1,37 +0,0 @@ -body.dragging, body.dragging * { - cursor: move !important; -} - -li.dragged { - position: absolute; - opacity: 0.5; - z-index: 2000; -} - -.umb-sort li{ - display: block; - margin: 5px; - padding: 5px; - border: 1px solid @gray-7; - background: @gray-10; -} - -.umb-sort .placeholder { - position: relative; - margin: 0; - padding: 0; - border: none; -} - -.umb-sort .placeholder:before { - position: absolute; - content: ""; - width: 0; - height: 0; - margin-top: -5px; - left: -5px; - top: -4px; - border: 5px solid transparent; - border-left-color: @red; - border-right: none; -} \ No newline at end of file From 67e0b68b7b545d39934c90d2e1463a5d9a418684 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:39:50 +0200 Subject: [PATCH 172/275] remove umb-optionsmenu --- .../_obsolete/umboptionsmenu.directive.js | 49 ------------------- .../directives/_obsolete/umb-optionsmenu.html | 22 --------- 2 files changed, 71 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umboptionsmenu.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-optionsmenu.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umboptionsmenu.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umboptionsmenu.directive.js deleted file mode 100644 index d51fe73448..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umboptionsmenu.directive.js +++ /dev/null @@ -1,49 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbOptionsMenu -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @function -* @element ANY -* @restrict E -**/ - -angular.module("umbraco.directives") -.directive('umbOptionsMenu', function ($injector, treeService, navigationService, umbModelMapper, appState) { - return { - scope: { - currentSection: "@", - currentNode: "=" - }, - restrict: 'E', - replace: true, - templateUrl: 'views/directives/_obsolete/umb-optionsmenu.html', - link: function (scope, element, attrs, ctrl) { - - //adds a handler to the context menu item click, we need to handle this differently - //depending on what the menu item is supposed to do. - scope.executeMenuItem = function (action) { - navigationService.executeMenuAction(action, scope.currentNode, scope.currentSection); - }; - - //callback method to go and get the options async - scope.getOptions = function () { - - if (!scope.currentNode) { - return; - } - - //when the options item is selected, we need to set the current menu item in appState (since this is synonymous with a menu) - appState.setMenuState("currentNode", scope.currentNode); - - if (!scope.actions) { - treeService.getMenu({ treeNode: scope.currentNode }) - .then(function (data) { - scope.actions = data.menuItems; - }); - } - }; - - } - }; -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-optionsmenu.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-optionsmenu.html deleted file mode 100644 index f834dfb93b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-optionsmenu.html +++ /dev/null @@ -1,22 +0,0 @@ -
    - - - - Actions - - - - - -
    From ab90690e179f4333629370a58fa72a49bb4322d2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:41:26 +0200 Subject: [PATCH 173/275] remove umb-login --- .../_obsolete/umblogin.directive.js | 19 ------------------- .../views/directives/_obsolete/umb-login.html | 12 ------------ 2 files changed, 31 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umblogin.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-login.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umblogin.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umblogin.directive.js deleted file mode 100644 index 775c20181c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umblogin.directive.js +++ /dev/null @@ -1,19 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbLogin -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @function -* @element ANY -* @restrict E -**/ - -function loginDirective() { - return { - restrict: "E", // restrict to an element - replace: true, // replace the html element with the template - templateUrl: 'views/directives/_obsolete/umb-login.html' - }; -} - -angular.module('umbraco.directives').directive("umbLogin", loginDirective); diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-login.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-login.html deleted file mode 100644 index 3bf8332ad3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-login.html +++ /dev/null @@ -1,12 +0,0 @@ -
    -
    -

    Happy {{today}}!, log in below

    -
    - -
    -
    - -
    - -
    -
    From 933bb8ad44794ce346470bd428b218c5a0c93310 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:50:30 +0200 Subject: [PATCH 174/275] remove drag and drop less import --- src/Umbraco.Web.UI.Client/src/less/belle.less | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index b6fbba6949..b2f2f99dd5 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -75,7 +75,6 @@ @import "listview.less"; @import "gridview.less"; @import "footer.less"; -@import "dragdrop.less"; @import "dashboards.less"; @import "forms/umb-validation-label.less"; From 48c5e61d881fb3a18492ddb29b3f955a9cb0a7b7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:50:52 +0200 Subject: [PATCH 175/275] remove item sorter --- .../_obsolete/umbItemSorter.directive.js | 69 ------------------- .../directives/_obsolete/umb-item-sorter.html | 38 ---------- 2 files changed, 107 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbItemSorter.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-item-sorter.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbItemSorter.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbItemSorter.directive.js deleted file mode 100644 index 30a01e43c1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbItemSorter.directive.js +++ /dev/null @@ -1,69 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbItemSorter -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @function -* @element ANY -* @restrict E -* @description A re-usable directive for sorting items -**/ - -function umbItemSorter(angularHelper) { - return { - scope: { - model: "=" - }, - restrict: "E", // restrict to an element - replace: true, // replace the html element with the template - templateUrl: 'views/directives/_obsolete/umb-item-sorter.html', - link: function(scope, element, attrs, ctrl) { - var defaultModel = { - okButton: "Ok", - successMsg: "Sorting successful", - complete: false - }; - //assign user vals to default - angular.extend(defaultModel, scope.model); - //re-assign merged to user - scope.model = defaultModel; - - scope.performSort = function() { - scope.$emit("umbItemSorter.sorting", { - sortedItems: scope.model.itemsToSort - }); - }; - - scope.handleCancel = function () { - scope.$emit("umbItemSorter.cancel"); - }; - - scope.handleOk = function() { - scope.$emit("umbItemSorter.ok"); - }; - - //defines the options for the jquery sortable - scope.sortableOptions = { - axis: 'y', - cursor: "move", - placeholder: "ui-sortable-placeholder", - update: function (ev, ui) { - //highlight the item when the position is changed - $(ui.item).effect("highlight", { color: "#049cdb" }, 500); - }, - stop: function (ev, ui) { - //the ui-sortable directive already ensures that our list is re-sorted, so now we just - // need to update the sortOrder to the index of each item - angularHelper.safeApply(scope, function () { - angular.forEach(scope.itemsToSort, function (val, index) { - val.sortOrder = index + 1; - }); - - }); - } - }; - } - }; -} - -angular.module('umbraco.directives').directive("umbItemSorter", umbItemSorter); diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-item-sorter.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-item-sorter.html deleted file mode 100644 index 569a678dfb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-item-sorter.html +++ /dev/null @@ -1,38 +0,0 @@ -
    - -
    -
    -

    Sort children of {{viewModel.name}}

    - - - - - - - - - - - - - - - -
    NameLast UpdateIndex
    {{item.column1}}{{item.column2}}{{item.column3}}
    - -
    -
    - - -
    -
    -
    -
    - {{model.successMsg}} -
    - -
    - -
    -
    -
    From ca85b0e45c702d3ce754e6d0a114d58ab809dc4d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:53:44 +0200 Subject: [PATCH 176/275] remove umb-header --- .../_obsolete/umbheader.directive.js | 64 ------------------- .../directives/_obsolete/umb-header.html | 14 ---- 2 files changed, 78 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbheader.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-header.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbheader.directive.js deleted file mode 100644 index ccf37b14a2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbheader.directive.js +++ /dev/null @@ -1,64 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbHeader -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @restrict E -* @function -* @description -* The header on an editor that contains tabs using bootstrap tabs - THIS IS OBSOLETE, use umbTabHeader instead -**/ - -angular.module("umbraco.directives") -.directive('umbHeader', function ($parse, $timeout) { - return { - restrict: 'E', - replace: true, - transclude: 'true', - templateUrl: 'views/directives/_obsolete/umb-header.html', - //create a new isolated scope assigning a tabs property from the attribute 'tabs' - //which is bound to the parent scope property passed in - scope: { - tabs: "=" - }, - link: function (scope, iElement, iAttrs) { - - scope.showTabs = iAttrs.tabs ? true : false; - scope.visibleTabs = []; - - //since tabs are loaded async, we need to put a watch on them to determine - // when they are loaded, then we can close the watch - var tabWatch = scope.$watch("tabs", function (newValue, oldValue) { - - angular.forEach(newValue, function(val, index){ - var tab = {id: val.id, label: val.label}; - scope.visibleTabs.push(tab); - }); - - //don't process if we cannot or have already done so - if (!newValue) {return;} - if (!newValue.length || newValue.length === 0){return;} - - //we need to do a timeout here so that the current sync operation can complete - // and update the UI, then this will fire and the UI elements will be available. - $timeout(function () { - - //use bootstrap tabs API to show the first one - iElement.find(".nav-tabs a:first").tab('show'); - - //enable the tab drop - iElement.find('.nav-pills, .nav-tabs').tabdrop(); - - //ensure to destroy tabdrop (unbinds window resize listeners) - scope.$on('$destroy', function () { - iElement.find('.nav-pills, .nav-tabs').tabdrop("destroy"); - }); - - //stop watching now - tabWatch(); - }, 200); - - }); - } - }; -}); diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-header.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-header.html deleted file mode 100644 index c65b373795..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-header.html +++ /dev/null @@ -1,14 +0,0 @@ -
    -
    - -
    - - -
    -
    From a1c4bd6b7a3aadc7ee8e64240c1a4a8940a95d65 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 20:59:10 +0200 Subject: [PATCH 177/275] remove umb-content-name --- .../_obsolete/umbcontentname.directive.js | 92 ------------------- src/Umbraco.Web.UI.Client/src/less/forms.less | 15 --- src/Umbraco.Web.UI.Client/src/less/panel.less | 42 --------- .../_obsolete/umb-content-name.html | 19 ---- 4 files changed, 168 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbcontentname.directive.js delete mode 100644 src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-content-name.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbcontentname.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbcontentname.directive.js deleted file mode 100644 index fd7145ff80..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/umbcontentname.directive.js +++ /dev/null @@ -1,92 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbContentName -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @restrict E -* @function -* @description -* Used by editors that require naming an entity. Shows a textbox/headline with a required validator within it's own form. -**/ - -angular.module("umbraco.directives") - .directive('umbContentName', function ($timeout, localizationService) { - return { - require: "ngModel", - restrict: 'E', - replace: true, - templateUrl: 'views/directives/_obsolete/umb-content-name.html', - - scope: { - placeholder: '@placeholder', - model: '=ngModel', - ngDisabled: '=' - }, - link: function(scope, element, attrs, ngModel) { - - var inputElement = element.find("input"); - if(scope.placeholder && scope.placeholder[0] === "@"){ - localizationService.localize(scope.placeholder.substring(1)) - .then(function(value){ - scope.placeholder = value; - }); - } - - var mX, mY, distance; - - function calculateDistance(elem, mouseX, mouseY) { - - var cx = Math.max(Math.min(mouseX, elem.offset().left + elem.width()), elem.offset().left); - var cy = Math.max(Math.min(mouseY, elem.offset().top + elem.height()), elem.offset().top); - return Math.sqrt((mouseX - cx) * (mouseX - cx) + (mouseY - cy) * (mouseY - cy)); - } - - var mouseMoveDebounce = _.throttle(function (e) { - mX = e.pageX; - mY = e.pageY; - // not focused and not over element - if (!inputElement.is(":focus") && !inputElement.hasClass("ng-invalid")) { - // on page - if (mX >= inputElement.offset().left) { - distance = calculateDistance(inputElement, mX, mY); - if (distance <= 155) { - - distance = 1 - (100 / 150 * distance / 100); - inputElement.css("border", "1px solid rgba(175,175,175, " + distance + ")"); - inputElement.css("background-color", "rgba(255,255,255, " + distance + ")"); - } - } - - } - - }, 15); - - $(document).bind("mousemove", mouseMoveDebounce); - - $timeout(function(){ - if(!scope.model){ - scope.goEdit(); - } - }, 100, false); - - scope.goEdit = function(){ - scope.editMode = true; - - $timeout(function () { - inputElement.focus(); - }, 100, false); - }; - - scope.exitEdit = function(){ - if(scope.model && scope.model !== ""){ - scope.editMode = false; - } - }; - - //unbind doc event! - scope.$on('$destroy', function () { - $(document).unbind("mousemove", mouseMoveDebounce); - }); - } - }; - }); diff --git a/src/Umbraco.Web.UI.Client/src/less/forms.less b/src/Umbraco.Web.UI.Client/src/less/forms.less index 4df1bd9b8d..6940987290 100644 --- a/src/Umbraco.Web.UI.Client/src/less/forms.less +++ b/src/Umbraco.Web.UI.Client/src/less/forms.less @@ -496,21 +496,6 @@ input[type="checkbox"][readonly] { border-color: @red-l1 !important; } -//disable the glowing border for the umb-content-name -.show-validation .umb-headline-editor-wrapper input:focus:invalid, -.show-validation .umb-headline-editor-wrapper textarea:focus:invalid, -.show-validation .umb-headline-editor-wrapper select:focus:invalid { - border:none; - color:inherit; - border-color:inherit; - @shadow:inherit; - .box-shadow(@shadow); -} - -.ng-invalid > .umb-headline-editor-wrapper h1{ - border-bottom: 1px dashed @red; color: @red; cursor: pointer; -}; - // FORM ACTIONS // ------------ diff --git a/src/Umbraco.Web.UI.Client/src/less/panel.less b/src/Umbraco.Web.UI.Client/src/less/panel.less index 68a703201a..def6d114ff 100644 --- a/src/Umbraco.Web.UI.Client/src/less/panel.less +++ b/src/Umbraco.Web.UI.Client/src/less/panel.less @@ -80,18 +80,6 @@ background-color: @white; } -.umb-headline-editor-wrapper { - position: relative; -} - -.umb-headline-editor-wrapper .help-inline { - right: 0px; - top: 25px; - position: absolute; - font-size: 10px; - color: @red; -} - .umb-panel-header p { margin: 0px 20px; } @@ -100,36 +88,6 @@ opacity: 0.6; } -.umb-headline-editor-wrapper input { - background: none; - border: none; - margin: -6px 0 0 0; - padding: 0 0 2px 0; - border-radius: 0; - line-height: normal; - border: 1px solid transparent; - color: @black; - letter-spacing: -0.01em; -} - -.umb-headline-editor-wrapper input.ng-invalid { - color: @red; -} - -.umb-headline-editor-wrapper input.ng-invalid::-moz-placeholder, -.umb-headline-editor-wrapper input.ng-invalid:-ms-input-placeholder, -.umb-headline-editor-wrapper input.ng-invalid::-webkit-input-placeholder { - color: @red; - line-height: 22px; -} - -/* -.umb-panel-header i { - font-size: 13px; - vertical-align: middle; -} -*/ - .umb-panel-header-meta { height: 50px; } diff --git a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-content-name.html b/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-content-name.html deleted file mode 100644 index 46ad6e5eff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/directives/_obsolete/umb-content-name.html +++ /dev/null @@ -1,19 +0,0 @@ - -
    - - - - Required - {{contentNameForm.name.errorMsg}} - -
    -
    \ No newline at end of file From cd6585c9b9c344e3850ca7d717b8924810f2a4ee Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 9 Aug 2018 21:12:45 +0200 Subject: [PATCH 178/275] remove detect-fold --- .../_obsolete/detectfold.directive.js | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/detectfold.directive.js diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/detectfold.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/detectfold.directive.js deleted file mode 100644 index ac2b86582e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/detectfold.directive.js +++ /dev/null @@ -1,83 +0,0 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:detectFold -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. -* @description This is used for the editor buttons to ensure they are displayed correctly if the horizontal overflow of the editor -* exceeds the height of the window -**/ - -angular.module("umbraco.directives.html") - .directive('detectFold', function ($timeout, $log, windowResizeListener) { - return { - require: "^?umbTabs", - restrict: 'A', - link: function (scope, el, attrs, tabsCtrl) { - - var firstRun = false; - var parent = $(".umb-panel-body"); - var winHeight = $(window).height(); - var calculate = function () { - if (el && el.is(":visible") && !el.hasClass("umb-bottom-bar")) { - - //now that the element is visible, set the flag in a couple of seconds, - // this will ensure that loading time of a current tab get's completed and that - // we eventually stop watching to save on CPU time - $timeout(function() { - firstRun = true; - }, 4000); - - //var parent = el.parent(); - var hasOverflow = parent.innerHeight() < parent[0].scrollHeight; - //var belowFold = (el.offset().top + el.height()) > winHeight; - if (hasOverflow) { - el.addClass("umb-bottom-bar"); - - //I wish we didn't have to put this logic here but unfortunately we - // do. This needs to calculate the left offest to place the bottom bar - // depending on if the left column splitter has been moved by the user - // (based on the nav-resize directive) - var wrapper = $("#mainwrapper"); - var contentPanel = $("#leftcolumn").next(); - var contentPanelLeftPx = contentPanel.css("left"); - - el.css({ left: contentPanelLeftPx }); - } - } - return firstRun; - }; - - var resizeCallback = function(size) { - winHeight = size.height; - el.removeClass("umb-bottom-bar"); - calculate(); - }; - - windowResizeListener.register(resizeCallback); - - //Only execute the watcher if this tab is the active (first) tab on load, otherwise there's no reason to execute - // the watcher since it will be recalculated when the tab changes! - if (el.closest(".umb-tab-pane").index() === 0) { - //run a watcher to ensure that the calculation occurs until it's firstRun but ensure - // the calculations are throttled to save a bit of CPU - var listener = scope.$watch(_.throttle(calculate, 1000), function (newVal, oldVal) { - if (newVal !== oldVal) { - listener(); - } - }); - } - - //listen for tab changes - if (tabsCtrl != null) { - tabsCtrl.onTabShown(function (args) { - calculate(); - }); - } - - //ensure to unregister - scope.$on('$destroy', function() { - windowResizeListener.unregister(resizeCallback); - }); - } - }; - }); \ No newline at end of file From 3395e4c1507cc892af491702f909477f454e7928 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 10:31:04 +1000 Subject: [PATCH 179/275] Fixes allowedFileType JS problem with unit test --- .../common/services/mediahelper.service.js | 128 +++++++++--------- .../unit/common/services/media-helper.spec.js | 39 ++++++ 2 files changed, 105 insertions(+), 62 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/test/unit/common/services/media-helper.spec.js diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js index 9cdd4eeb03..5db9e9c77e 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js @@ -4,7 +4,7 @@ * @description A helper object used for dealing with media items **/ function mediaHelper(umbRequestHelper) { - + //container of fileresolvers var _mediaFileResolvers = {}; @@ -45,7 +45,7 @@ function mediaHelper(umbRequestHelper) { //this performs a simple check to see if we have a media file as value //it doesnt catch everything, but better then nothing - if (angular.isString(item.value) && item.value.indexOf(mediaRoot) === 0) { + if (angular.isString(item.value) && item.value.indexOf(mediaRoot) === 0) { return true; } @@ -75,7 +75,7 @@ function mediaHelper(umbRequestHelper) { return ""; }, - + /** * @ngdoc function * @name umbraco.services.mediaHelper#getImagePropertyValue @@ -125,7 +125,7 @@ function mediaHelper(umbRequestHelper) { return ""; }, - registerFileResolver: function(propertyEditorAlias, func){ + registerFileResolver: function (propertyEditorAlias, func) { _mediaFileResolvers[propertyEditorAlias] = func; }, @@ -141,8 +141,8 @@ function mediaHelper(umbRequestHelper) { * @param {object} mediaEntity A media Entity returned from the entityResource * @param {boolean} thumbnail Whether to return the thumbnail url or normal url */ - resolveFileFromEntity : function(mediaEntity, thumbnail) { - + resolveFileFromEntity: function (mediaEntity, thumbnail) { + if (!angular.isObject(mediaEntity.metaData)) { throw "Cannot resolve the file url from the mediaEntity, it does not contain the required metaData"; } @@ -179,67 +179,67 @@ function mediaHelper(umbRequestHelper) { * @param {boolean} thumbnail Whether to return the thumbnail url or normal url */ /*jshint loopfunc: true */ - resolveFile : function(mediaItem, thumbnail){ - - function iterateProps(props){ + resolveFile: function (mediaItem, thumbnail) { + + function iterateProps(props) { var res = null; - for(var resolver in _mediaFileResolvers) { - var property = _.find(props, function(prop){ return prop.editor === resolver; }); - if(property){ + for (var resolver in _mediaFileResolvers) { + var property = _.find(props, function (prop) { return prop.editor === resolver; }); + if (property) { res = _mediaFileResolvers[resolver](property, mediaItem, thumbnail); break; } } - return res; + return res; } //we either have properties raw on the object, or spread out on tabs var result = ""; - if(mediaItem.properties){ + if (mediaItem.properties) { result = iterateProps(mediaItem.properties); - }else if(mediaItem.tabs){ - for(var tab in mediaItem.tabs) { - if(mediaItem.tabs[tab].properties){ + } else if (mediaItem.tabs) { + for (var tab in mediaItem.tabs) { + if (mediaItem.tabs[tab].properties) { result = iterateProps(mediaItem.tabs[tab].properties); - if(result){ + if (result) { break; } } } } - return result; + return result; }, /*jshint loopfunc: true */ - hasFilePropertyType : function(mediaItem){ - function iterateProps(props){ - var res = false; - for(var resolver in _mediaFileResolvers) { - var property = _.find(props, function(prop){ return prop.editor === resolver; }); - if(property){ - res = true; - break; - } - } - return res; - } + hasFilePropertyType: function (mediaItem) { + function iterateProps(props) { + var res = false; + for (var resolver in _mediaFileResolvers) { + var property = _.find(props, function (prop) { return prop.editor === resolver; }); + if (property) { + res = true; + break; + } + } + return res; + } - //we either have properties raw on the object, or spread out on tabs - var result = false; - if(mediaItem.properties){ - result = iterateProps(mediaItem.properties); - }else if(mediaItem.tabs){ - for(var tab in mediaItem.tabs) { - if(mediaItem.tabs[tab].properties){ - result = iterateProps(mediaItem.tabs[tab].properties); - if(result){ - break; - } - } - } - } - return result; + //we either have properties raw on the object, or spread out on tabs + var result = false; + if (mediaItem.properties) { + result = iterateProps(mediaItem.properties); + } else if (mediaItem.tabs) { + for (var tab in mediaItem.tabs) { + if (mediaItem.tabs[tab].properties) { + result = iterateProps(mediaItem.tabs[tab].properties); + if (result) { + break; + } + } + } + } + return result; }, /** @@ -308,7 +308,7 @@ function mediaHelper(umbRequestHelper) { "imagesApiBaseUrl", "GetBigThumbnail", [{ originalImagePath: imagePath }]) + '&rnd=' + Math.random(); - + return thumbnailUrl; }, @@ -328,7 +328,7 @@ function mediaHelper(umbRequestHelper) { if (!imagePath) { return false; } - + var lowered = imagePath.toLowerCase(); var ext = lowered.substr(lowered.lastIndexOf(".") + 1); return ("," + Umbraco.Sys.ServerVariables.umbracoSettings.imageFileTypes + ",").indexOf("," + ext + ",") !== -1; @@ -345,22 +345,26 @@ function mediaHelper(umbRequestHelper) { * * @param {string} file types, ex: jpg,png,tiff */ - formatFileTypes: function(fileTypes) { + formatFileTypes: function (fileTypes) { - var fileTypesArray = fileTypes.split(','); - var newFileTypesArray = []; + var fileTypesArray = fileTypes.split(','); + var newFileTypesArray = []; - for (var i = 0; i < fileTypesArray.length; i++) { - var fileType = fileTypesArray[i]; + for (var i = 0; i < fileTypesArray.length; i++) { + var fileType = fileTypesArray[i].trim(); - if (fileType.indexOf(".") !== 0) { - fileType = ".".concat(fileType); - } + if (!fileType) { + continue; + } - newFileTypesArray.push(fileType); - } + if (fileType.indexOf(".") !== 0) { + fileType = ".".concat(fileType); + } - return newFileTypesArray.join(","); + newFileTypesArray.push(fileType); + } + + return newFileTypesArray.join(","); }, @@ -375,7 +379,7 @@ function mediaHelper(umbRequestHelper) { * * @param {string} filePath File path, ex /media/1234/my-image.jpg */ - getFileExtension: function(filePath) { + getFileExtension: function (filePath) { if (!filePath) { return false; @@ -385,6 +389,6 @@ function mediaHelper(umbRequestHelper) { var ext = lowered.substr(lowered.lastIndexOf(".") + 1); return ext; } - + }; -}angular.module('umbraco.services').factory('mediaHelper', mediaHelper); +} angular.module('umbraco.services').factory('mediaHelper', mediaHelper); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/media-helper.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/media-helper.spec.js new file mode 100644 index 0000000000..15f8eb87d1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/media-helper.spec.js @@ -0,0 +1,39 @@ +describe('mediaHelper service tests', function () { + var mediaHelper; + + beforeEach(module('umbraco.services')); + + beforeEach(inject(function ($injector) { + mediaHelper = $injector.get('mediaHelper'); + })); + + describe('formatFileTypes', function () { + + it('will ignore any empty strings passed as arguments', function () { + + var result = mediaHelper.formatFileTypes(""); + expect(result.length).toBe(0); + + result = mediaHelper.formatFileTypes(" "); + expect(result.length).toBe(0); + + result = mediaHelper.formatFileTypes(" "); + expect(result.length).toBe(0); + + result = mediaHelper.formatFileTypes(" , "); + expect(result.length).toBe(0); + + result = mediaHelper.formatFileTypes(" , ,,"); + expect(result.length).toBe(0); + + }); + + it('includes prefixed dot when formatting', function () { + + var result = mediaHelper.formatFileTypes(".jpg, .png, gif"); + expect(result).toBe(".jpg,.png,.gif"); + + }); + + }); +}); From 2d1bda54be09472ac422bcb288dd6d7b45c4e91a Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 13:53:19 +1000 Subject: [PATCH 180/275] Fixes: Deal with invariant property value syncing, componentizes umb-image-gravity, gets the image cropper syncing data correctly, ensures resizing for image cropper is done when variants change. --- .../components/content/edit.controller.js | 11 +- .../content/umbvariantcontent.directive.js | 7 +- .../imaging/umbimagecrop.directive.js | 2 +- .../imaging/umbimagegravity.directive.js | 296 +++++++++++------- .../upload/umbpropertyfileupload.directive.js | 2 +- .../src/common/resources/content.resource.js | 64 ++-- .../services/umbrequesthelper.service.js | 2 + .../src/less/property-editors.less | 4 +- .../mediapicker/mediapicker.html | 2 +- .../src/views/components/content/edit.html | 3 +- .../components/imaging/umb-image-gravity.html | 7 +- .../imagecropper/imagecropper.controller.js | 17 + .../imagecropper/imagecropper.html | 4 +- src/Umbraco.Web/UI/JavaScript/JsInitialize.js | 6 +- 14 files changed, 268 insertions(+), 159 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 5de2b1a0d0..6b80ca8a2c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -32,6 +32,9 @@ "rightIsOpen": false }; + $scope.initVariant = initVariant; + $scope.splitViewChanged = splitViewChanged; + function init(content) { if (infiniteMode) { @@ -61,6 +64,12 @@ setActiveCulture(); } + /** This is called when the split view changes based on the umb-variant-content */ + function splitViewChanged() { + //send an event downwards + $scope.$broadcast("editors.content.splitViewChanged", { editors: $scope.editors }); + } + /** * The content item(s) are loaded into an array and this will set the active content item based on the current culture (query string). * If the content item is invariant, then only one item exists in the array. @@ -556,8 +565,6 @@ }); }; - $scope.initVariant = initVariant; - /* publish method used in infinite editing */ $scope.publishAndClose = function (content) { $scope.publishAndCloseButtonState = "busy"; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js index 299c56cc7f..cdc23ee985 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontent.directive.js @@ -53,6 +53,7 @@ $timeout(function () { editor.collapsed = false; editor.loading = false; + scope.onSplitViewChanged(); }, 100); }; @@ -97,6 +98,7 @@ return e === scope.editor; }); scope.editors.splice(index, 1); + scope.onSplitViewChanged(); }, 400); }; @@ -110,13 +112,16 @@ }, scope: { + //TODO: This should be turned into a proper component + page: "=", content: "=", editor: "=", editors: "=", //TODO: I don't like having this callback defined and would like to make this directive a bit less // coupled but right now don't have time - initVariant: "&" + initVariant: "&", + onSplitViewChanged: "&" } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js index a287ec0476..cdcdb7313c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js @@ -264,7 +264,7 @@ angular.module("umbraco.directives") }); //ie hack - if(window.navigator.userAgent.indexOf("MSIE ")){ + if(window.navigator.userAgent.indexOf("MSIE ") >= 0){ var ranger = element.find("input"); ranger.bind("change",function(){ scope.$apply(function(){ diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js index 73f3aba239..2048194f04 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js @@ -1,139 +1,197 @@ -/** -* @ngdoc directive -* @name umbraco.directives.directive:umbImageGravity -* @restrict E -* @function -* @description -**/ -angular.module("umbraco.directives") - .directive('umbImageGravity', function ($timeout, localizationService, $log) { - return { - restrict: 'E', - replace: true, - templateUrl: 'views/components/imaging/umb-image-gravity.html', - scope: { - src: '=', - center: "=", - onImageLoaded: "&?" - }, - link: function(scope, element, attrs) { +(function() { + 'use strict'; - //Internal values for keeping track of the dot and the size of the editor - scope.dimensions = { - width: 0, - height: 0, - left: 0, - top: 0 - }; + function umbImageGravityController($scope, $element, $timeout) { - scope.loaded = false; + var vm = this; - //elements - var $viewport = element.find(".viewport"); - var $image = element.find("img"); - var $overlay = element.find(".overlay"); + //Internal values for keeping track of the dot and the size of the editor + vm.dimensions = { + width: 0, + height: 0, + left: 0, + top: 0 + }; - scope.style = function () { - if(scope.dimensions.width <= 0){ - setDimensions(); - } + var htmlImage = null; //DOM element reference + var htmlOverlay = null; //DOM element reference + var draggable = null; - return { - 'top': scope.dimensions.top + 'px', - 'left': scope.dimensions.left + 'px' - }; - }; + vm.loaded = false; + vm.$onInit = onInit; + vm.$onChanges = onChanges; + vm.$postLink = postLink; + vm.$onDestroy = onDestroy; + vm.style = style; + vm.setFocalPoint = setFocalPoint; - scope.setFocalPoint = function(event) { + /** Sets the css style for the Dot */ + function style() { - scope.$emit("imageFocalPointStart"); + if (vm.dimensions.width <= 0) { + //this initializes the dimensions since when the image element first loads + //there will be zero dimensions + setDimensions(); + } - var offsetX = event.offsetX - 10; - var offsetY = event.offsetY - 10; + return { + 'top': vm.dimensions.top + 'px', + 'left': vm.dimensions.left + 'px' + }; + }; - calculateGravity(offsetX, offsetY); + function setFocalPoint (event) { - lazyEndEvent(); + $scope.$emit("imageFocalPointStart"); - }; + var offsetX = event.offsetX - 10; + var offsetY = event.offsetY - 10; - var setDimensions = function(){ - scope.dimensions.width = $image.width(); - scope.dimensions.height = $image.height(); + calculateGravity(offsetX, offsetY); - if(scope.center){ - scope.dimensions.left = scope.center.left * scope.dimensions.width -10; - scope.dimensions.top = scope.center.top * scope.dimensions.height -10; - }else{ - scope.center = { left: 0.5, top: 0.5 }; - } - }; + lazyEndEvent(); - var calculateGravity = function(offsetX, offsetY){ - scope.dimensions.left = offsetX; - scope.dimensions.top = offsetY; + }; - scope.center.left = (scope.dimensions.left+10) / scope.dimensions.width; - scope.center.top = (scope.dimensions.top+10) / scope.dimensions.height; - }; + /** Initializes the component */ + function onInit() { + if (!vm.center) { + vm.center = { left: 0.5, top: 0.5 }; + } + } - var lazyEndEvent = _.debounce(function(){ - scope.$apply(function(){ - scope.$emit("imageFocalPointStop"); - }); - }, 2000); + /** Called when the component has linked everything and the DOM is available */ + function postLink() { + //elements + htmlImage = $element.find("img"); + htmlOverlay = $element.find(".overlay"); - - //Drag and drop positioning, using jquery ui draggable - //TODO ensure that the point doesnt go outside the box - $overlay.draggable({ - containment: "parent", - start: function(){ - scope.$apply(function(){ - scope.$emit("imageFocalPointStart"); - }); - }, - stop: function() { - scope.$apply(function(){ - var offsetX = $overlay[0].offsetLeft; - var offsetY = $overlay[0].offsetTop; - calculateGravity(offsetX, offsetY); - }); - - lazyEndEvent(); - } - }); - - //// INIT ///// - $image.load(function() { - $timeout(function() { - setDimensions(); - scope.loaded = true; - if (scope.onImageLoaded) { - scope.onImageLoaded(); - } - }); - }); - - $(window).on('resize.umbImageGravity', function(){ - scope.$apply(function(){ - $timeout(function(){ - setDimensions(); - }); - // Make sure we can find the offset values for the overlay(dot) before calculating - // fixes issue with resize event when printing the page (ex. hitting ctrl+p inside the rte) - if($overlay.is(':visible')) { - var offsetX = $overlay[0].offsetLeft; - var offsetY = $overlay[0].offsetTop; - calculateGravity(offsetX, offsetY); - } - }); + //Drag and drop positioning, using jquery ui draggable + draggable = htmlOverlay.draggable({ + containment: "parent", + start: function () { + $scope.$apply(function () { + $scope.$emit("imageFocalPointStart"); + }); + }, + stop: function () { + $scope.$apply(function () { + var offsetX = htmlOverlay[0].offsetLeft; + var offsetY = htmlOverlay[0].offsetTop; + calculateGravity(offsetX, offsetY); }); - scope.$on('$destroy', function() { - $(window).off('.umbImageGravity'); - }); + lazyEndEvent(); + } + }); - } - }; - }); + $(window).on('resize.umbImageGravity', function () { + $scope.$apply(function () { + resized(); + }); + }); + + //if any ancestor directive emits this event, we need to resize + $scope.$on("editors.content.splitViewChanged", function () { + $timeout(resized, 200); + }); + + //listen for the image DOM element loading + htmlImage.on("load", function () { + $timeout(function () { + setDimensions(); + vm.loaded = true; + if (vm.onImageLoaded) { + vm.onImageLoaded(); + } + }, 100); + }); + } + + function onDestroy() { + $(window).off('resize.umbImageGravity'); + if (htmlOverlay) { + //TODO: This should be destroyed but this will throw an exception: + // "cannot call methods on draggable prior to initialization; attempted to call method 'destroy'" + // I've tried lots of things and cannot get this to work, we weren't destroying before so hopefully + // there's no mem leaks? + //htmlOverlay.draggable("destroy"); + } + if (htmlImage) { + htmlImage.off("load"); + } + } + + /** Called when we need to resize based on window or DOM dimensions to re-center the focal point */ + function resized() { + $timeout(function () { + setDimensions(); + }); + // Make sure we can find the offset values for the overlay(dot) before calculating + // fixes issue with resize event when printing the page (ex. hitting ctrl+p inside the rte) + if (htmlOverlay.is(':visible')) { + var offsetX = htmlOverlay[0].offsetLeft; + var offsetY = htmlOverlay[0].offsetTop; + calculateGravity(offsetX, offsetY); + } + } + + /** Watches the one way binding changes */ + function onChanges(changes) { + if (changes.center && !changes.center.isFirstChange() && !angular.equals(changes.center.currentValue, changes.center.previousValue)) { + //when center changes update the dimensions + setDimensions(); + } + } + + /** Sets the width/height/left/top dimentions based on the image size and the "center" value */ + function setDimensions() { + if (htmlImage) { + vm.dimensions.width = htmlImage.width(); + vm.dimensions.height = htmlImage.height(); + vm.dimensions.left = vm.center.left * vm.dimensions.width - 10; + vm.dimensions.top = vm.center.top * vm.dimensions.height - 10; + } + return vm.dimensions.width; + }; + + /** + * based on the offset selected calculates the "center" value and calls the callback + * @param {any} offsetX + * @param {any} offsetY + */ + function calculateGravity(offsetX, offsetY) { + + vm.onValueChanged({ + left: (offsetX + 10) / vm.dimensions.width, + top: (offsetY + 10) / vm.dimensions.height + }); + + //vm.center.left = (offsetX + 10) / scope.dimensions.width; + //vm.center.top = (offsetY + 10) / scope.dimensions.height; + }; + + var lazyEndEvent = _.debounce(function () { + $scope.$apply(function () { + $scope.$emit("imageFocalPointStop"); + }); + }, 2000); + + } + + var umbImageGravityComponent = { + templateUrl: 'views/components/imaging/umb-image-gravity.html', + bindings: { + src: "<", + center: "<", + onImageLoaded: "&?", + onValueChanged: "&" + }, + controllerAs: 'vm', + controller: umbImageGravityController + }; + + angular.module("umbraco.directives") + .component('umbImageGravity', umbImageGravityComponent); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js index b8afc4b35e..4e250d8dee 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js @@ -276,7 +276,7 @@ controller: umbPropertyFileUploadController }; - angular.module("umbraco") + angular.module("umbraco.directives") .component('umbPropertyFileUpload', umbPropertyFileUploadComponent); })(); diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index 33840e87d9..5bd44d6891 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -345,12 +345,15 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { getBlueprintById: function (id) { return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetBlueprintById", - [{ id: id }])), - 'Failed to retrieve data for content id ' + id); + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetBlueprintById", + [{ id: id }])), + 'Failed to retrieve data for content id ' + id) + .then(function(result) { + return $q.when(umbDataFormatter.formatContentGetData(result)); + }); }, getNotifySettingsById: function (id) { @@ -405,12 +408,19 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { }); return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetByIds", - idQuery)), - 'Failed to retrieve data for content with multiple ids'); + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetByIds", + idQuery)), + 'Failed to retrieve data for content with multiple ids') + .then(function (result) { + //each item needs to be re-formatted + _.each(result, function(r) { + umbDataFormatter.formatContentGetData(r) + }); + return $q.when(result); + }); }, @@ -449,23 +459,29 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { getScaffold: function (parentId, alias) { return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetEmpty", - [{ contentTypeAlias: alias }, { parentId: parentId }])), - 'Failed to retrieve data for empty content item type ' + alias); + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetEmpty", + [{ contentTypeAlias: alias }, { parentId: parentId }])), + 'Failed to retrieve data for empty content item type ' + alias) + .then(function(result) { + return $q.when(umbDataFormatter.formatContentGetData(result)); + }); }, getBlueprintScaffold: function (parentId, blueprintId) { return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetEmpty", - [{ blueprintId: blueprintId }, { parentId: parentId }])), - 'Failed to retrieve blueprint for id ' + blueprintId); + $http.get( + umbRequestHelper.getApiUrl( + "contentApiBaseUrl", + "GetEmpty", + [{ blueprintId: blueprintId }, { parentId: parentId }])), + 'Failed to retrieve blueprint for id ' + blueprintId) + .then(function(result) { + return $q.when(umbDataFormatter.formatContentGetData(result)); + }); }, /** diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js index f63dc609c3..24fb11d656 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js @@ -248,6 +248,8 @@ function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogServ formHelper.showNotifications(response.data); + //TODO: We need to pass the result through umbDataFormatter.formatContentGetData! + //the data returned is the up-to-date data so the UI will refresh return $q.resolve(response.data); }, function (response) { diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 9b21a1667c..9ff3ff9733 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -570,7 +570,7 @@ ul.color-picker li { .imagecropper .umb-cropper__container { position: relative; margin-bottom: 10px; - max-width: 100%; + max-width: 100%; border: 1px solid @gray-10; @media (min-width: 769px) { @@ -583,7 +583,7 @@ ul.color-picker li { top: 3px; right: 3px; cursor: pointer; - z-index: 1; + z-index: @zindexCropperOverlay + 1; } .umb-close-cropper:hover { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html index f17a08dd47..d0982fb95f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.html @@ -177,4 +177,4 @@ -
  • \ No newline at end of file +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html index 14bbc8b576..41ddd04584 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/edit.html @@ -13,7 +13,8 @@ content="content" editor="editor" editors="editors" - init-variant="initVariant(variant)"> + init-variant="initVariant(variant)" + on-split-view-changed="splitViewChanged()">
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html b/src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html index 21500e7c84..8ea809ef8b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/imaging/umb-image-gravity.html @@ -1,9 +1,10 @@
    -
    + +
    - + -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js index 1c9f835142..8816893018 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js @@ -9,9 +9,26 @@ angular.module('umbraco') $scope.crop = crop; $scope.done = done; $scope.clear = clear; + $scope.focalPointChanged = focalPointChanged; //declare a special method which will be called whenever the value has changed from the server $scope.model.onValueChanged = onValueChanged; + /** + * Called when the umgImageGravity component updates the focal point value + * @param {any} left + * @param {any} top + */ + function focalPointChanged(left, top) { + //update the model focalpoint value + $scope.model.value.focalPoint = { + left: left, + top: top + }; + + //set form to dirty to track changes + $scope.imageCropperForm.$setDirty(); + } + /** * Used to assign a new model value * @param {any} src diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html index bc41218592..dd74dd9e9f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html @@ -35,8 +35,10 @@
    +
    {{model.value.focalPoint | json}}
    + center="model.value.focalPoint" + on-value-changed="focalPointChanged(left, top)"> Remove file
    diff --git a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js index 5dfa53b9d8..c3f4937927 100644 --- a/src/Umbraco.Web/UI/JavaScript/JsInitialize.js +++ b/src/Umbraco.Web/UI/JavaScript/JsInitialize.js @@ -1,5 +1,8 @@ [ 'lib/jquery/jquery.min.js', + 'lib/jquery-ui/jquery-ui.min.js', + 'lib/jquery-ui-touch-punch/jquery.ui.touch-punch.js', + 'lib/angular/angular.js', 'lib/underscore/underscore-min.js', @@ -7,9 +10,6 @@ 'lib/animejs/anime.min.js', - 'lib/jquery-ui/jquery-ui.min.js', - 'lib/jquery-ui-touch-punch/jquery.ui.touch-punch.js', - 'lib/angular-route/angular-route.js', 'lib/angular-cookies/angular-cookies.js', 'lib/angular-touch/angular-touch.js', From d608daa87bbcd2cd79cb3a4a661be7402f9ad347 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 14:48:58 +1000 Subject: [PATCH 181/275] Gets new images syncing between instances on image cropper --- .../imaging/umbimagegravity.directive.js | 4 +- .../upload/umbpropertyfileupload.directive.js | 75 ++++++++++++++----- .../fileupload/fileupload.html | 2 +- .../imagecropper/imagecropper.controller.js | 16 +++- .../imagecropper/imagecropper.html | 3 +- 5 files changed, 77 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js index 2048194f04..4759b59d45 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js @@ -138,7 +138,9 @@ /** Watches the one way binding changes */ function onChanges(changes) { - if (changes.center && !changes.center.isFirstChange() && !angular.equals(changes.center.currentValue, changes.center.previousValue)) { + if (changes.center && !changes.center.isFirstChange() + && changes.center.currentValue + && !angular.equals(changes.center.currentValue, changes.center.previousValue)) { //when center changes update the dimensions setDimensions(); } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js index 4e250d8dee..0efe303bc5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js @@ -32,10 +32,11 @@ vm.files = []; //notify the callback - notifyValueChanged(null); + notifyFilesSelected(null); + notifyFilesChanged(null); } - function notifyValueChanged(val, files) { + function notifyFilesSelected(val, files) { if (!val) { val = null; @@ -45,12 +46,21 @@ } //notify the callback - vm.onValueChanged({ value: val, files: files }); + vm.onFilesSelected({ value: val, files: files }); //need to explicity setDirty here to track changes vm.fileUploadForm.$setDirty(); } + function notifyFilesChanged(files) { + if (!files) { + files = null; + } + + //notify the callback + vm.onFilesChanged({ files: files }); + } + function notifyInit(val, files) { if (!val) { val = null; @@ -84,19 +94,10 @@ //TODO: need to figure out what we can do for things like Nested Content - //check the file manager to see if there's already local files pending for this editor - var existingClientFiles = _.map( - _.filter(fileManager.getFiles(), - function(f) { - return f.alias === vm.propertyAlias && f.culture === vm.culture; - }), - function(f) { - return f.file; - }); - + var existingClientFiles = checkPendingClientFiles(); //create the property to show the list of files currently saved if (existingClientFiles.length > 0) { - updateModelFromSelectedFiles(existingClientFiles).then(function(newVal) { + updateModelFromSelectedFiles(existingClientFiles).then(function (newVal) { //notify the callback notifyInit(newVal, vm.files); }); @@ -126,6 +127,25 @@ } } + function checkPendingClientFiles() { + + //normalize culture to null if it's not there + if (!vm.culture) { + vm.culture = null; + } + + //check the file manager to see if there's already local files pending for this editor + var existingClientFiles = _.map( + _.filter(fileManager.getFiles(), + function (f) { + return f.alias === vm.propertyAlias && f.culture === vm.culture; + }), + function (f) { + return f.file; + }); + return existingClientFiles; + } + ///** Method required by the valPropertyValidator directive (returns true if the property editor has at least one file selected) */ //function validateMandatory() { // return { @@ -143,10 +163,23 @@ if (changes.value && !changes.value.isFirstChange() && changes.value.currentValue !== changes.value.previousValue) { - //if the value has been cleared, clear the files (ignore if the previous value is also falsy) if (!changes.value.currentValue && changes.value.previousValue) { + //if the value has been cleared, clear the files (ignore if the previous value is also falsy) vm.files = []; } + else if (changes.value.currentValue && !changes.value.previousValue && vm.files.length === 0) { + //if a new value has been added after being cleared + + var existingClientFiles = checkPendingClientFiles(); + //create the property to show the list of files currently saved + if (existingClientFiles.length > 0) { + updateModelFromSelectedFiles(existingClientFiles).then(function () { + //raise this event which means the files have changed but this wasn't the instance that + //added the file + notifyFilesChanged(vm.files); + }); + } + } //// here we need to check if the value change needs to trigger an update in the UI. //// if the value is only changed in the controller and not in the server values, we do not @@ -250,7 +283,8 @@ angularHelper.safeApply($scope, function() { //pass in the file names and the model files - notifyValueChanged(newVal, vm.files); + notifyFilesSelected(newVal, vm.files); + notifyFilesChanged(vm.files); }); }); } @@ -268,7 +302,14 @@ propertyAlias: "@", value: "<", hideSelection: "<", - onValueChanged: "&", + /** + * Called when a file is selected on this instance + */ + onFilesSelected: "&", + /** + * Called when the file collection changes (i.e. a new file has been selected but maybe it wasn't this instance that caused the change) + */ + onFilesChanged: "&", onInit: "&" }, transclude: true, diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html index e5692e3f89..8f97456c60 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.html @@ -2,6 +2,6 @@ + on-files-selected="fileChanged(value)">
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js index 8816893018..04bfe98284 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.controller.js @@ -4,7 +4,8 @@ angular.module('umbraco') var config = angular.copy($scope.model.config); - $scope.fileChanged = onFileChanged; + $scope.filesSelected = onFileSelected; + $scope.filesChanged = onFilesChanged; $scope.fileUploaderInit = onFileUploaderInit; $scope.crop = crop; $scope.done = done; @@ -55,12 +56,21 @@ angular.module('umbraco') } /** - * Called when the file selection value changes + * Called when the a new file is selected * @param {any} value */ - function onFileChanged(value, files) { + function onFileSelected(value, files) { setModelValueWithSrc(value); + //set form to dirty to track changes + $scope.imageCropperForm.$setDirty(); + } + /** + * Called when the file collection changes + * @param {any} value + * @param {any} files + */ + function onFilesChanged(files) { if (files && files[0]) { $scope.imageSrc = files[0].fileSrc; //set form to dirty to track changes diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html index dd74dd9e9f..7b4287ba5a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html @@ -6,7 +6,8 @@ From 3932ec0640b4cef55bec1c7737be0f4c4fbc5469 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 15:39:57 +1000 Subject: [PATCH 182/275] Fixes how invariant property are processed during saving on the server side. --- .../imagecropper/imagecropper.html | 1 - src/Umbraco.Web/Editors/ContentController.cs | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html index 7b4287ba5a..bc84f1b64f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/imagecropper/imagecropper.html @@ -36,7 +36,6 @@
    -
    {{model.value.focalPoint | json}}
    diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 869c12d85b..ac6048bee2 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -1251,6 +1251,8 @@ namespace Umbraco.Web.Editors //inline method to determine if a property type varies bool Varies(Property property) => property.PropertyType.VariesByCulture(); + var variantIndex = 0; + //loop through each variant, set the correct name and property values foreach (var variant in contentSave.Variants) { @@ -1272,12 +1274,24 @@ namespace Umbraco.Web.Editors } } + //This is important! We only want to process invariant properties with the first variant, for any other variant + // we need to exclude invariant properties from being processed, otherwise they will be double processed for the + // same value which can cause some problems with things such as file uploads. + var propertyCollection = variantIndex == 0 + ? variant.PropertyCollectionDto + : new ContentPropertyCollectionDto + { + Properties = variant.PropertyCollectionDto.Properties.Where(x => !x.Culture.IsNullOrWhiteSpace()) + }; + //for each variant, map the property values MapPropertyValuesForPersistence( contentSave, - variant.PropertyCollectionDto, + propertyCollection, (save, property) => Varies(property) ? property.GetValue(variant.Culture) : property.GetValue(), //get prop val (save, property, v) => { if (Varies(property)) property.SetValue(v, variant.Culture); else property.SetValue(v); }); //set prop val + + variantIndex++; } //TODO: We need to support 'send to publish' From e41aad78b001916173a07c6c3e4412e317a75f27 Mon Sep 17 00:00:00 2001 From: Shannon Date: Fri, 10 Aug 2018 16:52:33 +1000 Subject: [PATCH 183/275] Updates the logic for the normal file upload for clearing files to be the same as the image cropper which makes more sense, now the upload editor also syncs properly with invariant propertes. --- .../services/contenteditinghelper.service.js | 3 - .../fileupload/fileupload.controller.js | 7 +- .../FileUploadPropertyValueEditor.cs | 105 ++++++++---------- 3 files changed, 50 insertions(+), 65 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index e70f030557..11bae4e027 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -542,9 +542,6 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, notifica changed.push(origProp); } - } - for (var p in allOrigProps) { - } } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js index a5ebc92c5f..17959b9950 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/fileupload/fileupload.controller.js @@ -10,7 +10,7 @@ * The controller for the file upload property editor. * */ - function fileUploadController($scope) { + function fileUploadController($scope, fileManager) { $scope.fileChanged = onFileChanged; //declare a special method which will be called whenever the value has changed from the server @@ -22,11 +22,6 @@ */ function onFileChanged(value) { $scope.model.value = value; - - //if the value is empty, then tell the server to clear the files - if (!$scope.model.value) { - $scope.model.value = { clearFiles: true }; - } } /** diff --git a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs index b98de3f574..be7b3ff2f8 100644 --- a/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs +++ b/src/Umbraco.Web/PropertyEditors/FileUploadPropertyValueEditor.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using Newtonsoft.Json.Linq; +using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Models.Editors; using Umbraco.Core.PropertyEditors; @@ -42,34 +43,14 @@ namespace Umbraco.Web.PropertyEditors /// public override object FromEditor(ContentPropertyData editorValue, object currentValue) { - currentValue = currentValue ?? string.Empty; + var currentPath = currentValue as string; + if (!currentPath.IsNullOrWhiteSpace()) + currentPath = _mediaFileSystem.GetRelativePath(currentPath); - // at that point, - // currentValue is either empty or "/media/path/to/img.jpg" - // editorValue.Value is { "clearFiles": true } or { "selectedFiles": "img1.jpg,img2.jpg" } - // comparing them makes little sense - - // check the editorValue value to see whether we need to clear files - var editorJsonValue = editorValue.Value as JObject; - var clears = editorJsonValue != null && editorJsonValue["clearFiles"] != null && editorJsonValue["clearFiles"].Value(); - var uploads = editorValue.Files != null && editorValue.Files.Length > 0; - - // nothing = no changes, return what we have already (leave existing files intact) - if (clears == false && uploads == false) - return currentValue; - - // get the current file paths - var currentPaths = currentValue.ToString() - .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) - .Select(x => _mediaFileSystem.GetRelativePath(x)) // get the fs-relative path - .ToArray(); - - // if clearing, remove these files and return - if (clears) + string editorFile = null; + if (editorValue.Value != null) { - foreach (var pathToRemove in currentPaths) - _mediaFileSystem.DeleteFile(pathToRemove); - return string.Empty; // no more files + editorFile = editorValue.Value as string; } // ensure we have the required guids @@ -78,46 +59,58 @@ namespace Umbraco.Web.PropertyEditors var puid = editorValue.PropertyTypeKey; if (puid == Guid.Empty) throw new Exception("Invalid property type key."); - // process the files - var files = editorValue.Files; - if (files == null) throw new Exception("Invalid files."); + var uploads = editorValue.Files; + if (uploads == null) throw new Exception("Invalid files."); + var file = uploads.Length > 0 ? uploads[0] : null; - var newPaths = new List(); - const int maxLength = 1; // we only process ONE file - for (var i = 0; i < maxLength /*files.Length*/; i++) + if (file == null) // not uploading a file { - var file = files[i]; - - // skip invalid files - if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false) - continue; - - // get the filepath - // in case we are using the old path scheme, try to re-use numbers (bah...) - var reuse = i < currentPaths.Length ? currentPaths[i] : null; // this would be WRONG with many files - var filepath = _mediaFileSystem.GetMediaPath(file.FileName, reuse, cuid, puid); // fs-relative path - - using (var filestream = File.OpenRead(file.TempFilePath)) + // if editorFile is empty then either there was nothing to begin with, + // or it has been cleared and we need to remove the file - else the + // value is unchanged. + if (string.IsNullOrWhiteSpace(editorFile) && string.IsNullOrWhiteSpace(currentPath) == false) { - _mediaFileSystem.AddFile(filepath, filestream, true); // must overwrite! - - // all related properties (auto-fill) are managed by FileUploadPropertyEditor - // when the content is saved (through event handlers) - - newPaths.Add(filepath); + _mediaFileSystem.DeleteFile(currentPath); + return null; // clear } + + return currentValue; // unchanged } + // process the file + var filepath = editorFile == null ? null : ProcessFile(editorValue, file, currentPath, cuid, puid); + // remove all temp files - foreach (var file in files) - File.Delete(file.TempFilePath); + foreach (var f in uploads) + File.Delete(f.TempFilePath); - // remove files that are not there anymore - foreach (var pathToRemove in currentPaths.Except(newPaths)) - _mediaFileSystem.DeleteFile(pathToRemove); + // remove current file if replaced + if (currentPath != filepath && string.IsNullOrWhiteSpace(currentPath) == false) + _mediaFileSystem.DeleteFile(currentPath); + // update json and return + if (editorFile == null) return null; + return filepath == null ? string.Empty : _mediaFileSystem.GetUrl(filepath); + + } - return string.Join(",", newPaths.Select(x => _mediaFileSystem.GetUrl(x))); + private string ProcessFile(ContentPropertyData editorValue, ContentPropertyFile file, string currentPath, Guid cuid, Guid puid) + { + // process the file + // no file, invalid file, reject change + if (UploadFileTypeValidator.ValidateFileExtension(file.FileName) == false) + return null; + + // get the filepath + // in case we are using the old path scheme, try to re-use numbers (bah...) + var filepath = _mediaFileSystem.GetMediaPath(file.FileName, currentPath, cuid, puid); // fs-relative path + + using (var filestream = File.OpenRead(file.TempFilePath)) + { + _mediaFileSystem.AddFile(filepath, filestream, true); // must overwrite! + } + + return filepath; } } } From c0ec2a5314fdd3047212f96f363546b0dce23cb3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 10 Aug 2018 14:02:59 +0200 Subject: [PATCH 184/275] move the auto-scale directive from obsolete. It is still pretty usefull for the code editors --- .../src/common/directives/_obsolete/_readme.md | 3 --- .../directives/{_obsolete => util}/autoscale.directive.js | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/_readme.md rename src/Umbraco.Web.UI.Client/src/common/directives/{_obsolete => util}/autoscale.directive.js (99%) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/_readme.md b/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/_readme.md deleted file mode 100644 index 8feb0377db..0000000000 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/_readme.md +++ /dev/null @@ -1,3 +0,0 @@ -#Obsolete directives - -Folder contains directives we plan to remove in the next major version of umbraco (8.0) these are not recommended to use. diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/autoscale.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js similarity index 99% rename from src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/autoscale.directive.js rename to src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js index f9ca4350e2..f52babd3ff 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/_obsolete/autoscale.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js @@ -20,7 +20,7 @@ angular.module("umbraco.directives") .directive('autoScale', function ($window) { return function (scope, el, attrs) { - + var totalOffset = 0; var offsety = parseInt(attrs.autoScale, 10); var window = angular.element($window); From c7a57865218975f0441d58edb528de13be9109f2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 10 Aug 2018 14:03:39 +0200 Subject: [PATCH 185/275] remove the deprecaed note --- .../src/common/directives/util/autoscale.directive.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js index f52babd3ff..8539bded69 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js @@ -2,8 +2,6 @@ * @ngdoc directive * @name umbraco.directives.directive:autoScale * @element div -* @deprecated -* We plan to remove this directive in the next major version of umbraco (8.0). The directive is not recommended to use. * @function * @description * Resize div's automatically to fit to the bottom of the screen, as an optional parameter an y-axis offset can be set From 23e81a67fa64e408888dc1b1ec4e195be8791d8a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 10 Aug 2018 14:05:15 +0200 Subject: [PATCH 186/275] fix indention --- .../directives/util/autoscale.directive.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js index 8539bded69..15e45654a5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js @@ -16,23 +16,23 @@ **/ angular.module("umbraco.directives") - .directive('autoScale', function ($window) { - return function (scope, el, attrs) { - - var totalOffset = 0; - var offsety = parseInt(attrs.autoScale, 10); - var window = angular.element($window); - if (offsety !== undefined){ - totalOffset += offsety; - } + .directive('autoScale', function ($window) { + return function (scope, el, attrs) { - setTimeout(function () { - el.height(window.height() - (el.offset().top + totalOffset)); - }, 500); + var totalOffset = 0; + var offsety = parseInt(attrs.autoScale, 10); + var window = angular.element($window); + if (offsety !== undefined) { + totalOffset += offsety; + } - window.bind("resize", function () { - el.height(window.height() - (el.offset().top + totalOffset)); - }); + setTimeout(function () { + el.height(window.height() - (el.offset().top + totalOffset)); + }, 500); - }; - }); + window.bind("resize", function () { + el.height(window.height() - (el.offset().top + totalOffset)); + }); + + }; + }); From ec139ca16cbafaa026c451d03d4bc9c48461ff5c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 10 Aug 2018 14:17:12 +0200 Subject: [PATCH 187/275] clean up that windows resizer event --- .../directives/util/autoscale.directive.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js index 15e45654a5..029a4e420f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/util/autoscale.directive.js @@ -16,7 +16,7 @@ **/ angular.module("umbraco.directives") - .directive('autoScale', function ($window) { + .directive('autoScale', function ($window, $timeout, windowResizeListener) { return function (scope, el, attrs) { var totalOffset = 0; @@ -26,12 +26,23 @@ angular.module("umbraco.directives") totalOffset += offsety; } - setTimeout(function () { - el.height(window.height() - (el.offset().top + totalOffset)); - }, 500); + $timeout(function () { + setElementSize(); + }); - window.bind("resize", function () { + function setElementSize() { el.height(window.height() - (el.offset().top + totalOffset)); + } + + var resizeCallback = function() { + setElementSize(); + }; + + windowResizeListener.register(resizeCallback); + + //ensure to unregister from all events and kill jquery plugins + scope.$on('$destroy', function () { + windowResizeListener.unregister(resizeCallback); }); }; From 9d5d5160648adcb34f1dd24ce8eb47d38ce67ac8 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 13 Aug 2018 11:25:55 +1000 Subject: [PATCH 188/275] Fixes up invariant property validation since we were only allowing one callback per alias, but we need to allow multiple --- src/Umbraco.Core/Events/EventMessages.cs | 5 +- .../imaging/umbimagegravity.directive.js | 2 +- .../showvalidationonsubmit.directive.js | 1 + .../validation/valpropertymsg.directive.js | 44 ++++++++-------- .../validation/valserver.directive.js | 44 ++++++++-------- .../validation/valserverfield.directive.js | 43 ++++++++-------- .../services/servervalidationmgr.service.js | 50 +++++++++++++------ .../services/umbrequesthelper.service.js | 2 +- 8 files changed, 102 insertions(+), 89 deletions(-) diff --git a/src/Umbraco.Core/Events/EventMessages.cs b/src/Umbraco.Core/Events/EventMessages.cs index 2df1911249..6f2bf5b736 100644 --- a/src/Umbraco.Core/Events/EventMessages.cs +++ b/src/Umbraco.Core/Events/EventMessages.cs @@ -14,10 +14,7 @@ namespace Umbraco.Core.Events _msgs.Add(msg); } - public int Count - { - get { return _msgs.Count; } - } + public int Count => _msgs.Count; public IEnumerable GetAll() { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js index 4759b59d45..4f783ac9a9 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagegravity.directive.js @@ -148,7 +148,7 @@ /** Sets the width/height/left/top dimentions based on the image size and the "center" value */ function setDimensions() { - if (htmlImage) { + if (htmlImage && vm.center) { vm.dimensions.width = htmlImage.width(); vm.dimensions.height = htmlImage.height(); vm.dimensions.left = vm.center.left * vm.dimensions.width - 10; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js index 0b48c4e1b3..c46a3a9f9a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/showvalidationonsubmit.directive.js @@ -27,6 +27,7 @@ element.hide(); })); + //no isolate scope to listen to element destroy element.bind('$destroy', function () { for (var u in unsubscribe) { unsubscribe[u](); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js index e7614d5ea5..5568b4b276 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js @@ -176,35 +176,31 @@ function valPropertyMsg(serverValidationManager) { // the correct field validation in their property editors. if (scope.currentProperty) { //this can be null if no property was assigned - serverValidationManager.subscribe(scope.currentProperty.alias, currentCulture, "", function (isValid, propertyErrors, allErrors) { - hasError = !isValid; - if (hasError) { - //set the error message to the server message - scope.errorMsg = propertyErrors[0].errorMsg; - //flag that the current validator is invalid - formCtrl.$setValidity('valPropertyMsg', false); - startWatch(); - } - else { - scope.errorMsg = ""; - //flag that the current validator is valid - formCtrl.$setValidity('valPropertyMsg', true); - stopWatch(); - } - }); - - //when the element is disposed we need to unsubscribe! - // NOTE: this is very important otherwise when this controller re-binds the previous subscriptsion will remain - // but they are a different callback instance than the above. - element.bind('$destroy', function () { - stopWatch(); - serverValidationManager.unsubscribe(scope.currentProperty.alias, currentCulture, ""); - }); + unsubscribe.push(serverValidationManager.subscribe(scope.currentProperty.alias, + currentCulture, + "", + function(isValid, propertyErrors, allErrors) { + hasError = !isValid; + if (hasError) { + //set the error message to the server message + scope.errorMsg = propertyErrors[0].errorMsg; + //flag that the current validator is invalid + formCtrl.$setValidity('valPropertyMsg', false); + startWatch(); + } + else { + scope.errorMsg = ""; + //flag that the current validator is valid + formCtrl.$setValidity('valPropertyMsg', true); + stopWatch(); + } + })); } //when the scope is disposed we need to unsubscribe scope.$on('$destroy', function () { + stopWatch(); for (var u in unsubscribe) { unsubscribe[u](); } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserver.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserver.directive.js index 2d8734d804..eb522fe783 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserver.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserver.directive.js @@ -9,6 +9,7 @@ function valServer(serverValidationManager) { return { require: ['ngModel', '?^^umbProperty'], restrict: "A", + scope: {}, link: function (scope, element, attr, ctrls) { var modelCtrl = ctrls[0]; @@ -21,6 +22,7 @@ function valServer(serverValidationManager) { var currentProperty = umbPropCtrl.property; var currentCulture = currentProperty.culture; var watcher = null; + var unsubscribe = []; //default to 'value' if nothing is set var fieldName = "value"; @@ -68,27 +70,29 @@ function valServer(serverValidationManager) { } //subscribe to the server validation changes - serverValidationManager.subscribe(currentProperty.alias, currentCulture, fieldName, function (isValid, propertyErrors, allErrors) { - if (!isValid) { - modelCtrl.$setValidity('valServer', false); - //assign an error msg property to the current validator - modelCtrl.errorMsg = propertyErrors[0].errorMsg; - startWatch(); - } - else { - modelCtrl.$setValidity('valServer', true); - //reset the error message - modelCtrl.errorMsg = ""; - stopWatch(); - } - }); - - //when the element is disposed we need to unsubscribe! - // NOTE: this is very important otherwise when this controller re-binds the previous subscriptsion will remain - // but they are a different callback instance than the above. - element.bind('$destroy', function () { + unsubscribe.push(serverValidationManager.subscribe(currentProperty.alias, + currentCulture, + fieldName, + function(isValid, propertyErrors, allErrors) { + if (!isValid) { + modelCtrl.$setValidity('valServer', false); + //assign an error msg property to the current validator + modelCtrl.errorMsg = propertyErrors[0].errorMsg; + startWatch(); + } + else { + modelCtrl.$setValidity('valServer', true); + //reset the error message + modelCtrl.errorMsg = ""; + stopWatch(); + } + })); + + scope.$on('$destroy', function () { stopWatch(); - serverValidationManager.unsubscribe(currentProperty.alias, currentCulture, fieldName); + for (var u in unsubscribe) { + unsubscribe[u](); + } }); } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserverfield.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserverfield.directive.js index d170670d15..7f5427da8b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserverfield.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valserverfield.directive.js @@ -10,10 +10,11 @@ function valServerField(serverValidationManager) { return { require: 'ngModel', restrict: "A", + scope: {}, link: function (scope, element, attr, ngModel) { var fieldName = null; - var eventBindings = []; + var unsubscribe = []; attr.$observe("valServerField", function (newVal) { if (newVal && fieldName === null) { @@ -24,7 +25,7 @@ function valServerField(serverValidationManager) { // resubmitted. So once a field is changed that has a server error assigned to it // we need to re-validate it for the server side validator so the user can resubmit // the form. Of course normal client-side validators will continue to execute. - eventBindings.push(scope.$watch(function() { + unsubscribe.push(scope.$watch(function() { return ngModel.$modelValue; }, function(newValue){ if (ngModel.$invalid) { @@ -33,32 +34,28 @@ function valServerField(serverValidationManager) { })); //subscribe to the server validation changes - serverValidationManager.subscribe(null, null, fieldName, function (isValid, fieldErrors, allErrors) { - if (!isValid) { - ngModel.$setValidity('valServerField', false); - //assign an error msg property to the current validator - ngModel.errorMsg = fieldErrors[0].errorMsg; - } - else { - ngModel.$setValidity('valServerField', true); - //reset the error message - ngModel.errorMsg = ""; - } - }); - - //when the element is disposed we need to unsubscribe! - // NOTE: this is very important otherwise when this controller re-binds the previous subscriptsion will remain - // but they are a different callback instance than the above. - element.bind('$destroy', function () { - serverValidationManager.unsubscribe(null, null, fieldName); - }); + unsubscribe.push(serverValidationManager.subscribe(null, + null, + fieldName, + function(isValid, fieldErrors, allErrors) { + if (!isValid) { + ngModel.$setValidity('valServerField', false); + //assign an error msg property to the current validator + ngModel.errorMsg = fieldErrors[0].errorMsg; + } + else { + ngModel.$setValidity('valServerField', true); + //reset the error message + ngModel.errorMsg = ""; + } + })); } }); scope.$on('$destroy', function(){ // unbind watchers - for(var e in eventBindings) { - eventBindings[e](); + for(var e in unsubscribe) { + unsubscribe[e](); } }); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js index 26317490a0..11e54c0fdb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/servervalidationmgr.service.js @@ -64,7 +64,7 @@ function serverValidationManager($timeout) { } } } - + return { /** @@ -116,7 +116,7 @@ function serverValidationManager($timeout) { * @name subscribe * @methodOf umbraco.services.serverValidationManager * @function - * + * @returns {} a method to unsubscribe this callback * @description * Adds a callback method that is executed whenever validation changes for the field name + property specified. * This is generally used for server side validation in order to match up a server side validation error with @@ -129,31 +129,49 @@ function serverValidationManager($timeout) { if (!callback) { return; } - + + var id = String.CreateGuid(); + if (propertyAlias === null) { - //don't add it if it already exists - var exists1 = _.find(callbacks, function (item) { - return item.propertyAlias === null && item.fieldName === fieldName; + callbacks.push({ + propertyAlias: null, + culture: null, + fieldName: fieldName, + callback: callback, + id: id }); - if (!exists1) { - callbacks.push({ propertyAlias: null, culture: null, fieldName: fieldName, callback: callback }); - } } else if (propertyAlias !== undefined) { //normalize culture to null if (!culture) { culture = null; } - //don't add it if it already exists - var exists2 = _.find(callbacks, function (item) { - return item.propertyAlias === propertyAlias && item.culture === culture && item.fieldName === fieldName; + callbacks.push({ + propertyAlias: propertyAlias, + culture: culture, fieldName: fieldName, + callback: callback, + id: id }); - if (!exists2) { - callbacks.push({ propertyAlias: propertyAlias, culture: culture, fieldName: fieldName, callback: callback }); - } } + + function unsubscribeId() { + //remove all callbacks for the content field + callbacks = _.reject(callbacks, function (item) { + return item.id === id; + }); + } + + //return a function to unsubscribe this subscription by uniqueId + return unsubscribeId; }, - + + /** + * Removes all callbacks registered for the propertyALias, culture and fieldName combination + * @param {} propertyAlias + * @param {} culture + * @param {} fieldName + * @returns {} + */ unsubscribe: function (propertyAlias, culture, fieldName) { if (propertyAlias === null) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js index 24fb11d656..228c885529 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js @@ -248,7 +248,7 @@ function umbRequestHelper($http, $q, umbDataFormatter, angularHelper, dialogServ formHelper.showNotifications(response.data); - //TODO: We need to pass the result through umbDataFormatter.formatContentGetData! + //TODO: Do we need to pass the result through umbDataFormatter.formatContentGetData? Right now things work so not sure but we should check //the data returned is the up-to-date data so the UI will refresh return $q.resolve(response.data); From 5bd74f90aa6622999008ab29b08162368ea3afce Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 13 Aug 2018 11:36:43 +1000 Subject: [PATCH 189/275] cleanup --- .../upload/umbpropertyfileupload.directive.js | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js index 0efe303bc5..cf12585e15 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js @@ -146,15 +146,6 @@ return existingClientFiles; } - ///** Method required by the valPropertyValidator directive (returns true if the property editor has at least one file selected) */ - //function validateMandatory() { - // return { - // isValid: !vm.validation.mandatory || (((vm.persistedFiles != null && vm.persistedFiles.length > 0) || (vm.files != null && vm.files.length > 0)) && !vm.clearFiles), - // errorMsg: "Value cannot be empty", - // errorKey: "required" - // }; - //} - /** * Watch for model changes * @param {any} changes @@ -180,16 +171,7 @@ }); } } - - //// here we need to check if the value change needs to trigger an update in the UI. - //// if the value is only changed in the controller and not in the server values, we do not - //// want to trigger an update yet. - //// we can however no longer rely on checking values in the controller vs. values from the server - //// to determine whether to update or not, since you could potentially be uploading a file with - //// the exact same name - in that case we need to reinitialize to show the newly uploaded file. - //if (changes.value.currentValue.clearFiles !== true && !changes.value.currentValue.selectedFiles) { - // initialize(vm.rebuildInput.index + 1); - //} + } } From e950914fc8561b3c45b9fd1d5a8d2e974ede2a0b Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 13 Aug 2018 12:11:08 +1000 Subject: [PATCH 190/275] Fixes wiring up server validation when creating content --- .../directives/components/content/edit.controller.js | 9 +++------ .../src/views/content/content.delete.controller.js | 1 + 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 6b80ca8a2c..fbe92963ed 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -211,11 +211,6 @@ init($scope.content); - //in one particular special case, after we've created a new item we redirect back to the edit - // route but there might be server validation errors in the collection which we need to display - // after the redirect, so we will bind all subscriptions which will show the server validation errors. - serverValidationManager.notify(); - if (!infiniteMode) { syncTreeNode($scope.content, data.path, true); } @@ -637,7 +632,9 @@ } //since we are not notifying and clearing server validation messages when they are received due to how the variant //switching works, we need to ensure they are cleared when this editor is destroyed - serverValidationManager.clear(); + if (!$scope.page.isNew) { + serverValidationManager.clear(); + } }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js index 6e2865046d..356e056533 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/content.delete.controller.js @@ -38,6 +38,7 @@ function ContentDeleteController($scope, $timeout, contentResource, treeService, //ensure the recycle bin has child nodes now var recycleBin = treeService.getDescendantNode(rootNode, -20); if (recycleBin) { + //TODO: This seems to return a rejection and we end up with "Possibly unhanded rejection" treeService.syncTree({ node: recycleBin, path: treeService.getPath(recycleBin), forceReload: true }); } }, 500); From 30d29d9fcf319dca2d9d33da2372ab8c045fcb3e Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 13 Aug 2018 16:45:05 +1000 Subject: [PATCH 191/275] initial commit for save dialog --- .../components/content/edit.controller.js | 58 +++++++++- .../content/umbvariantlist.directive.js | 22 ++++ .../common/overlays/publish/publish.html | 7 +- .../components/content/umb-variant-state.html | 6 ++ .../views/content/overlays/save.controller.js | 101 ++++++++++++++++++ .../src/views/content/overlays/save.html | 58 ++++++++++ .../Umbraco/config/lang/en_us.xml | 5 +- 7 files changed, 250 insertions(+), 7 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html create mode 100644 src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js create mode 100644 src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index fbe92963ed..3f4ce37f0b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -481,7 +481,63 @@ }; $scope.save = function () { - return performSave({ saveMethod: $scope.saveMethod(), action: "save" }).catch(angular.noop); + + // TODO: Add "..." to save button label if there are more than one variant to publish - currently it just adds the elipses if there's more than 1 variant + if ($scope.content.variants.length > 1) { + //before we launch the dialog we want to execute all client side validations first + if (formHelper.submitForm({ scope: $scope, action: "save" })) { + + var dialog = { + view: "views/content/overlays/save.html", + variants: $scope.content.variants, //set a model property for the dialog + skipFormValidation: true, //when submitting the overlay form, skip any client side validation + submitButtonLabel: "Save", + submit: function (model) { + model.submitButtonState = "busy"; + + //we need to return this promise so that the dialog can handle the result and wire up the validation response + return performSave({ + saveMethod: $scope.saveMethod(), + action: "save" + }).then(function (data) { + overlayService.close(); + return $q.when(data); + }, + function (err) { + model.submitButtonState = "error"; + //re-map the dialog model since we've re-bound the properties + dialog.variants = $scope.content.variants; + + //check the error list for specific variant errors, if none exist that means that only server side validation + //for the current variant's properties failed, in this case we want to close the publish dialog since the user + //will need to fix validation errors on the properties + if (err.data && err.data.ModelState) { + var keys = _.keys(err.data.ModelState); + var foundVariantError = _.find(keys, + function (k) { + return k.startsWith("publish_variant_"); + }); + if (!foundVariantError) { + //no variant errors, close the dialog + overlayService.close(); + } + } + + return $q.reject(err); + }); + }, + close: function (oldModel) { + overlayService.close(); + } + }; + + overlayService.open(dialog); + } + } + else { + return performSave({ saveMethod: $scope.saveMethod(), action: "save" }).catch(angular.noop); + } + }; $scope.preview = function (content) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js new file mode 100644 index 0000000000..1dc2d60450 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js @@ -0,0 +1,22 @@ +(function () { + 'use strict'; + + function umbVariantStateController($scope, $element) { + + var vm = this; + + } + + var umbVariantStateComponent = { + templateUrl: 'views/components/content/umb-variant-state.html', + bindings: { + variant: "<" + }, + controllerAs: 'vm', + controller: umbVariantStateController + }; + + angular.module("umbraco.directives") + .component('umbVariantState', umbVariantStateComponent); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html index c28b22f415..8a3abc3665 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html @@ -26,11 +26,8 @@ {{ variant.language.name }} -
    -
    -
    -
    -
    +
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html new file mode 100644 index 0000000000..94ec40e876 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html @@ -0,0 +1,6 @@ +
    +
    +
    +
    +
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js new file mode 100644 index 0000000000..711630b75a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js @@ -0,0 +1,101 @@ +(function () { + "use strict"; + + function SaveContentController($scope, localizationService) { + + var vm = this; + vm.variants = $scope.model.variants; + vm.changeSelection = changeSelection; + vm.loading = true; + vm.dirtyVariantFilter = dirtyVariantFilter; + vm.pristineVariantFilter = pristineVariantFilter; + vm.hasPristineVariants = false; + + //watch this model, if it's reset, then re init + $scope.$watch("model.variants", + function (newVal, oldVal) { + vm.variants = newVal; + if (oldVal && oldVal.length) { + //re-bind the selections + for (var i = 0; i < oldVal.length; i++) { + var found = _.find(vm.variants, function (v) { + return v.language.id === oldVal[i].language.id; + }); + if (found) { + found.publish = oldVal[i].publish; + } + } + } + onInit(); + }); + + function changeSelection(variant) { + var firstSelected = _.find(vm.variants, function (v) { + return v.publish; + }); + $scope.model.disableSubmitButton = !firstSelected; //disable submit button if there is none selected + } + + function dirtyVariantFilter(variant) { + //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's + // * the active one + // * it's editor is in a $dirty state + // * it has pending saves + // * it is unpublished + // * it is in NotCreated state + return (variant.active || variant.isDirty || variant.state === "Draft" || variant.state === "PublishedPendingChanges" || variant.state === "NotCreated"); + } + + function pristineVariantFilter(variant) { + return !(dirtyVariantFilter(variant)); + } + + function onInit() { + + if(!$scope.model.title) { + localizationService.localize("content_readyToSave").then(function(value){ + $scope.model.title = value; + }); + } + + vm.hasPristineVariants = false; + + _.each(vm.variants, + function (variant) { + variant.compositeId = variant.language.culture + "_" + (variant.segment ? variant.segment : ""); + //TODO: Change this prefix on both this and the publish dialog + variant.htmlId = "publish_variant_" + variant.compositeId; + + //check for pristine variants + if (!vm.hasPristineVariants) { + vm.hasPristineVariants = pristineVariantFilter(variant); + } + }); + + if (vm.variants.length !== 0) { + //now sort it so that the current one is at the top + vm.variants = _.sortBy(vm.variants, function (v) { + return v.active ? 0 : 1; + }); + + var active = _.find(vm.variants, function (v) { + return v.active; + }); + + if (active) { + //ensure that the current one is selected + active.publish = true; + } + + } else { + //disable Publish button if we have nothing to publish + $scope.model.disableSubmitButton = true; + } + + vm.loading = false; + } + } + + angular.module("umbraco").controller("Umbraco.Overlays.SaveContentController", SaveContentController); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html new file mode 100644 index 0000000000..4c3ebca6a6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html @@ -0,0 +1,58 @@ +
    + +
    +

    +
    + +
    + +
    + +
    + +
    + +
    + +
    + + +
    + +
    + +
    +
    {{publishVariantSelectorForm.publishVariantSelector.errorMsg}}
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +

    +
    + +
    +
    +
    {{ variant.language.name }}
    +
    {{ variant.state }}
    +
    +
    +
    + +
    diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index e752e2c859..ca5721057d 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -264,8 +264,11 @@ This value is hidden. If you need access to view this value please contact your website administrator. This value is hidden. What languages would you like to publish? - Published Languages. + What languages would you like to save? + Published Languages + Unmodified Languages Ready to Publish? + Ready to Save? Create a new Content Template from '%0%' From 758d09cd5c557d39d8da8a3f213c7275e6957d79 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 14 Aug 2018 16:29:14 +1000 Subject: [PATCH 192/275] More work on save and publish overlays --- .../components/content/edit.controller.js | 48 +++++++++++++++---- ...ective.js => umbvariantstate.directive.js} | 0 .../components/content/umb-variant-state.html | 2 +- .../overlays}/publish.controller.js | 8 ++-- .../publish => content/overlays}/publish.html | 8 ++-- .../views/content/overlays/save.controller.js | 17 +++---- .../src/views/content/overlays/save.html | 18 +++---- src/Umbraco.Web/Editors/ContentController.cs | 14 +++--- 8 files changed, 71 insertions(+), 44 deletions(-) rename src/Umbraco.Web.UI.Client/src/common/directives/components/content/{umbvariantlist.directive.js => umbvariantstate.directive.js} (100%) rename src/Umbraco.Web.UI.Client/src/views/{common/overlays/publish => content/overlays}/publish.controller.js (93%) rename src/Umbraco.Web.UI.Client/src/views/{common/overlays/publish => content/overlays}/publish.html (85%) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index 3f4ce37f0b..f0936bf7fb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -27,11 +27,6 @@ // add all editors to an editors array to support split view $scope.editors = []; - $scope.splitView = { - "leftIsOpen": true, - "rightIsOpen": false - }; - $scope.initVariant = initVariant; $scope.splitViewChanged = splitViewChanged; @@ -70,6 +65,41 @@ $scope.$broadcast("editors.content.splitViewChanged", { editors: $scope.editors }); } + function countDirtyVariants() { + var count = 0; + for (var i = 0; i < $scope.content.variants.length; i++) { + var v = $scope.content.variants[i]; + if (v.isDirty) { + count++; + } + } + return count; + } + + /** Returns true if the save dialog should be shown when pressing save */ + function showSaveDialog() { + + //show the dialog if split view is open + if ($scope.editors.length > 1) { + return true; + } + + //if there are more than one dirty variants + if (countDirtyVariants() > 1) { + return true; + } + + //if there is a dirty variant that is not the currently selected variant + for (var i = 0; i < $scope.content.variants.length; i++) { + var v = $scope.content.variants[i]; + if (v.isDirty && v.language.culture !== $scope.editors[0].content.language.culture) { + return true; + } + } + + return false; + } + /** * The content item(s) are loaded into an array and this will set the active content item based on the current culture (query string). * If the content item is invariant, then only one item exists in the array. @@ -429,7 +459,7 @@ if (formHelper.submitForm({ scope: $scope, action: "publish" })) { var dialog = { - view: "publish", + view: "views/content/overlays/publish.html", variants: $scope.content.variants, //set a model property for the dialog skipFormValidation: true, //when submitting the overlay form, skip any client side validation submitButtonLabel: "Publish", @@ -456,7 +486,7 @@ var keys = _.keys(err.data.ModelState); var foundVariantError = _.find(keys, function (k) { - return k.startsWith("publish_variant_"); + return k.startsWith("_content_variant_"); }); if (!foundVariantError) { //no variant errors, close the dialog @@ -483,7 +513,7 @@ $scope.save = function () { // TODO: Add "..." to save button label if there are more than one variant to publish - currently it just adds the elipses if there's more than 1 variant - if ($scope.content.variants.length > 1) { + if (showSaveDialog()) { //before we launch the dialog we want to execute all client side validations first if (formHelper.submitForm({ scope: $scope, action: "save" })) { @@ -515,7 +545,7 @@ var keys = _.keys(err.data.ModelState); var foundVariantError = _.find(keys, function (k) { - return k.startsWith("publish_variant_"); + return k.startsWith("_content_variant_"); }); if (!foundVariantError) { //no variant errors, close the dialog diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantstate.directive.js similarity index 100% rename from src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantlist.directive.js rename to src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantstate.directive.js diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html index 94ec40e876..3a41f0623d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-variant-state.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js similarity index 93% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js rename to src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js index 446ed78ec1..6102530619 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js @@ -22,7 +22,7 @@ return v.language.id === oldVal[i].language.id; }); if (found) { - found.publish = oldVal[i].publish; + found.selected = oldVal[i].selected; } } } @@ -31,7 +31,7 @@ function changeSelection(variant) { var firstSelected = _.find(vm.variants, function (v) { - return v.publish; + return v.selected; }); $scope.model.disableSubmitButton = !firstSelected; //disable submit button if there is none selected } @@ -63,7 +63,7 @@ _.each(vm.variants, function (variant) { variant.compositeId = variant.language.culture + "_" + (variant.segment ? variant.segment : ""); - variant.htmlId = "publish_variant_" + variant.compositeId; + variant.htmlId = "_content_variant_" + variant.compositeId; //check for pristine variants if (!vm.hasPristineVariants) { @@ -83,7 +83,7 @@ if (active) { //ensure that the current one is selected - active.publish = true; + active.selected = true; } } else { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html similarity index 85% rename from src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html rename to src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html index 8a3abc3665..324a05fdad 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/publish/publish.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html @@ -16,14 +16,14 @@
    @@ -49,8 +49,8 @@
    -
    {{ variant.language.name }}
    -
    {{ variant.state }}
    +
    {{ variant.language.name }}
    +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js index 711630b75a..0a2bf8621b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js @@ -22,7 +22,7 @@ return v.language.id === oldVal[i].language.id; }); if (found) { - found.publish = oldVal[i].publish; + found.selected = oldVal[i].selected; } } } @@ -31,19 +31,17 @@ function changeSelection(variant) { var firstSelected = _.find(vm.variants, function (v) { - return v.publish; + return v.selected; }); $scope.model.disableSubmitButton = !firstSelected; //disable submit button if there is none selected } function dirtyVariantFilter(variant) { - //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's + //determine a variant is 'dirty' (meaning it will show up as save-able) if it's // * the active one // * it's editor is in a $dirty state - // * it has pending saves - // * it is unpublished // * it is in NotCreated state - return (variant.active || variant.isDirty || variant.state === "Draft" || variant.state === "PublishedPendingChanges" || variant.state === "NotCreated"); + return (variant.active || variant.isDirty || variant.state === "NotCreated"); } function pristineVariantFilter(variant) { @@ -63,8 +61,7 @@ _.each(vm.variants, function (variant) { variant.compositeId = variant.language.culture + "_" + (variant.segment ? variant.segment : ""); - //TODO: Change this prefix on both this and the publish dialog - variant.htmlId = "publish_variant_" + variant.compositeId; + variant.htmlId = "_content_variant_" + variant.compositeId; //check for pristine variants if (!vm.hasPristineVariants) { @@ -84,11 +81,11 @@ if (active) { //ensure that the current one is selected - active.publish = true; + active.selected = true; } } else { - //disable Publish button if we have nothing to publish + //disable save button if we have nothing to save $scope.model.disableSubmitButton = true; } diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html index 4c3ebca6a6..34bd5f294b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html @@ -11,27 +11,27 @@
    - +
    -
    +
    -
    -
    {{publishVariantSelectorForm.publishVariantSelector.errorMsg}}
    +
    +
    {{saveVariantSelectorForm.saveVariantSelector.errorMsg}}
    @@ -49,8 +49,8 @@
    -
    {{ variant.language.name }}
    -
    {{ variant.state }}
    +
    {{ variant.language.name }}
    +
    diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index ac6048bee2..5d1c9e50c9 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -779,8 +779,7 @@ namespace Umbraco.Web.Editors //cannot continue publishing since a required language that is not currently being published isn't published if (!contentItem.PersistedContent.IsCulturePublished(lang.IsoCode)) { - var errMsg = Services.TextService.Localize("speechBubbles/contentReqCulturePublishError", new[] { allLangs[lang.IsoCode].CultureName }); - ModelState.AddModelError("publish_variant_" + lang.IsoCode + "_", errMsg); + AddCultureValidationError(lang.IsoCode, allLangs, "speechBubbles/contentReqCulturePublishError"); canPublish = false; } } @@ -823,7 +822,7 @@ namespace Umbraco.Web.Editors var valid = persistentContent.PublishCulture(variant.Culture); if (!valid) { - AddCultureValidationError(variant.Culture, allLangs); + AddCultureValidationError(variant.Culture, allLangs, "speechBubbles/contentCultureValidationError"); return false; } } @@ -836,11 +835,12 @@ namespace Umbraco.Web.Editors /// /// /// - private void AddCultureValidationError(string culture, IDictionary allLangs) + /// + private void AddCultureValidationError(string culture, IDictionary allLangs, string localizationKey) { - var key = "publish_variant_" + culture + "_"; + var key = "_content_variant_" + culture + "_"; if (ModelState.ContainsKey(key)) return; - var errMsg = Services.TextService.Localize("speechBubbles/contentCultureValidationError", new[] { allLangs[culture].CultureName }); + var errMsg = Services.TextService.Localize(localizationKey, new[] { allLangs[culture].CultureName }); ModelState.AddModelError(key, errMsg); } @@ -1235,7 +1235,7 @@ namespace Umbraco.Web.Editors foreach (var cultureError in cultureErrors) { - AddCultureValidationError(cultureError, allLangs); + AddCultureValidationError(cultureError, allLangs, "speechBubbles/contentCultureValidationError"); } } From 9c84d5e3f90938289960409f1435bba203077ea6 Mon Sep 17 00:00:00 2001 From: Shannon Date: Tue, 14 Aug 2018 20:21:33 +1000 Subject: [PATCH 193/275] more work with variants, saving, publishing and validation. --- .../components/content/edit.controller.js | 42 ++----- .../src/common/resources/content.resource.js | 42 ------- .../common/resources/currentuser.resource.js | 42 +++++++ .../content/overlays/publish.controller.js | 55 +++++++-- .../src/views/content/overlays/publish.html | 14 ++- .../views/content/overlays/save.controller.js | 14 ++- .../src/views/content/overlays/save.html | 8 +- .../listview/listview.controller.js | 4 +- src/Umbraco.Web/Editors/ContentController.cs | 110 +++++++----------- .../Editors/CurrentUserController.cs | 40 +++++++ .../Filters/ContentSaveValidationAttribute.cs | 6 +- .../ContentEditing/ContentVariantSave.cs | 5 +- 12 files changed, 208 insertions(+), 174 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js index f0936bf7fb..24ac3b9cea 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js @@ -53,7 +53,7 @@ bindEvents(); // set first app to active - // TODO: We need to track active + // We need to track active $scope.content.apps[0].active = true; setActiveCulture(); @@ -76,28 +76,9 @@ return count; } - /** Returns true if the save dialog should be shown when pressing save */ - function showSaveDialog() { - - //show the dialog if split view is open - if ($scope.editors.length > 1) { - return true; - } - - //if there are more than one dirty variants - if (countDirtyVariants() > 1) { - return true; - } - - //if there is a dirty variant that is not the currently selected variant - for (var i = 0; i < $scope.content.variants.length; i++) { - var v = $scope.content.variants[i]; - if (v.isDirty && v.language.culture !== $scope.editors[0].content.language.culture) { - return true; - } - } - - return false; + /** Returns true if the save/publish dialog should be shown when pressing the button */ + function showSaveOrPublishDialog() { + return $scope.content.variants.length > 1; } /** @@ -317,15 +298,6 @@ // This is a helper method to reduce the amount of code repitition for actions: Save, Publish, SendToPublish function performSave(args) { - //update the 'save' boolean of each variant if they are flagged as being dirty - //TODO: This is also where we'd set this flag when we have the save dialog - for (var i = 0; i < $scope.content.variants.length; i++) { - var v = $scope.content.variants[i]; - if (v.isDirty) { - v.save = true; - } - } - $scope.page.buttonGroupState = "busy"; eventsService.emit("content.saving", { content: $scope.content, action: args.action }); @@ -369,7 +341,7 @@ $rootScope.lastListViewPageViewed = null; } } - + if ($scope.page.isNew) { $scope.page.loading = true; @@ -454,7 +426,7 @@ $scope.saveAndPublish = function () { // TODO: Add "..." to publish button label if there are more than one variant to publish - currently it just adds the elipses if there's more than 1 variant - if ($scope.content.variants.length > 1) { + if (showSaveOrPublishDialog()) { //before we launch the dialog we want to execute all client side validations first if (formHelper.submitForm({ scope: $scope, action: "publish" })) { @@ -513,7 +485,7 @@ $scope.save = function () { // TODO: Add "..." to save button label if there are more than one variant to publish - currently it just adds the elipses if there's more than 1 variant - if (showSaveDialog()) { + if (showSaveOrPublishDialog()) { //before we launch the dialog we want to execute all client side validations first if (formHelper.submitForm({ scope: $scope, action: "save" })) { diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index 5bd44d6891..5fb6fe1625 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -599,38 +599,6 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to retrieve children for content item ' + parentId); }, - /** - * @ngdoc method - * @name umbraco.resources.contentResource#hasPermission - * @methodOf umbraco.resources.contentResource - * - * @description - * Returns true/false given a permission char to check against a nodeID - * for the current user - * - * ##usage - *
    -          * contentResource.hasPermission('p',1234)
    -          *    .then(function() {
    -          *        alert('You are allowed to publish this item');
    -          *    });
    -          * 
    - * - * @param {String} permission char representing the permission to check - * @param {Int} id id of content item to delete - * @returns {Promise} resourcePromise object. - * - */ - checkPermission: function (permission, id) { - return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "HasPermission", - [{ permissionToCheck: permission }, { nodeId: id }])), - 'Failed to check permission for item ' + id); - }, - getDetailedPermissions: function (contentId) { return umbRequestHelper.resourcePromise( $http.get( @@ -640,16 +608,6 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to retrieve permissions for content item ' + contentId); }, - getPermissions: function (nodeIds) { - return umbRequestHelper.resourcePromise( - $http.post( - umbRequestHelper.getApiUrl( - "contentApiBaseUrl", - "GetPermissions"), - nodeIds), - 'Failed to get permissions'); - }, - /** * @ngdoc method * @name umbraco.resources.contentResource#save diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js index 32e9683dd8..e10837ceca 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js @@ -10,6 +10,48 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { //the factory object returned return { + getPermissions: function (nodeIds) { + return umbRequestHelper.resourcePromise( + $http.post( + umbRequestHelper.getApiUrl( + "currentUserApiBaseUrl", + "GetPermissions"), + nodeIds), + 'Failed to get permissions'); + }, + + /** + * @ngdoc method + * @name umbraco.resources.currentUserResource#hasPermission + * @methodOf umbraco.resources.currentUserResource + * + * @description + * Returns true/false given a permission char to check against a nodeID + * for the current user + * + * ##usage + *
    +          * contentResource.hasPermission('p',1234)
    +          *    .then(function() {
    +          *        alert('You are allowed to publish this item');
    +          *    });
    +          * 
    + * + * @param {String} permission char representing the permission to check + * @param {Int} id id of content item to delete + * @returns {Promise} resourcePromise object. + * + */ + checkPermission: function (permission, id) { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "currentUserApiBaseUrl", + "HasPermission", + [{ permissionToCheck: permission }, { nodeId: id }])), + 'Failed to check permission for item ' + id); + }, + saveTourStatus: function (tourStatus) { if (!tourStatus) { diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js index 6102530619..1667b60d43 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js @@ -1,6 +1,6 @@ (function () { "use strict"; - + function PublishController($scope, localizationService) { var vm = this; @@ -22,18 +22,41 @@ return v.language.id === oldVal[i].language.id; }); if (found) { - found.selected = oldVal[i].selected; + found.publish = oldVal[i].publish; } + } } onInit(); }); + /** Returns true if publishing is possible based on if there are un-published mandatory languages */ + function canPublish() { + var selected = []; + for (var i = 0; i < vm.variants.length; i++) { + var variant = vm.variants[i]; + + //if this variant will show up in the publish-able list + var publishable = dirtyVariantFilter(variant); + + if ((variant.language.isMandatory && (variant.state === "NotCreated" || variant.state === "Draft")) + && (!publishable || !variant.publish)) { + //if a mandatory variant isn't published and it's not publishable or not selected to be published + //then we cannot publish anything + + //TODO: Show a message when this occurs + return false; + } + + if (variant.publish) { + selected.push(variant.publish); + } + } + return selected.length > 0; + } + function changeSelection(variant) { - var firstSelected = _.find(vm.variants, function (v) { - return v.selected; - }); - $scope.model.disableSubmitButton = !firstSelected; //disable submit button if there is none selected + $scope.model.disableSubmitButton = !canPublish(); } function dirtyVariantFilter(variant) { @@ -52,8 +75,8 @@ function onInit() { - if(!$scope.model.title) { - localizationService.localize("content_readyToPublish").then(function(value){ + if (!$scope.model.title) { + localizationService.localize("content_readyToPublish").then(function (value) { $scope.model.title = value; }); } @@ -83,18 +106,28 @@ if (active) { //ensure that the current one is selected - active.selected = true; + active.publish = true; } + $scope.model.disableSubmitButton = !canPublish(); + } else { - //disable Publish button if we have nothing to publish + //disable Publish button if we have nothing to publish, should not happen $scope.model.disableSubmitButton = true; } vm.loading = false; + } + + //when this dialog is closed, reset all 'publish' flags + $scope.$on('$destroy', function () { + for (var i = 0; i < vm.variants.length; i++) { + vm.variants[i].publish = false; + } + }); } angular.module("umbraco").controller("Umbraco.Overlays.PublishController", PublishController); - + })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html index 324a05fdad..46ad4e7299 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html @@ -16,7 +16,7 @@
    @@ -33,13 +34,13 @@
    {{publishVariantSelectorForm.publishVariantSelector.errorMsg}}
    - +
    - +
    -
    +
    @@ -49,7 +50,10 @@
    -
    {{ variant.language.name }}
    +
    + {{ variant.language.name }} + * +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js index 0a2bf8621b..7d610e9254 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.controller.js @@ -22,7 +22,7 @@ return v.language.id === oldVal[i].language.id; }); if (found) { - found.selected = oldVal[i].selected; + found.save = oldVal[i].save; } } } @@ -31,7 +31,7 @@ function changeSelection(variant) { var firstSelected = _.find(vm.variants, function (v) { - return v.selected; + return v.save; }); $scope.model.disableSubmitButton = !firstSelected; //disable submit button if there is none selected } @@ -81,7 +81,7 @@ if (active) { //ensure that the current one is selected - active.selected = true; + active.save = true; } } else { @@ -91,6 +91,14 @@ vm.loading = false; } + + //when this dialog is closed, reset all 'save' flags + $scope.$on('$destroy', function () { + for (var i = 0; i < vm.variants.length; i++) { + vm.variants[i].save = false; + } + }); + } angular.module("umbraco").controller("Umbraco.Overlays.SaveContentController", SaveContentController); diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html index 34bd5f294b..0515bd878e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html +++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/save.html @@ -16,7 +16,7 @@
    @@ -49,7 +50,10 @@
    -
    {{ variant.language.name }}
    +
    + {{ variant.language.name }} + * +
    diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js index ec02995e93..e2d8443548 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js @@ -1,4 +1,4 @@ -function listViewController($rootScope, $scope, $routeParams, $injector, notificationsService, iconHelper, dialogService, editorState, localizationService, $location, appState, $timeout, $q, mediaResource, listViewHelper, userService, navigationService, treeService) { +function listViewController($rootScope, $scope, $routeParams, $injector, currentUserResource, notificationsService, iconHelper, dialogService, editorState, localizationService, $location, appState, $timeout, $q, mediaResource, listViewHelper, userService, navigationService, treeService) { //this is a quick check to see if we're in create mode, if so just exit - we cannot show children for content // that isn't created yet, if we continue this will use the parent id in the route params which isn't what @@ -124,7 +124,7 @@ function listViewController($rootScope, $scope, $routeParams, $injector, notific }); if (missingLookup.length > 0) { - contentResource.getPermissions(missingLookup).then(function (p) { + currentUserResource.getPermissions(missingLookup).then(function (p) { $scope.buttonPermissions = listViewHelper.getButtonPermissions(p, idsWithPermissions); }); } diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index 5d1c9e50c9..cf19f30a46 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -358,13 +358,6 @@ namespace Umbraco.Web.Editors //remove the listview app if it exists mapped.ContentApps = mapped.ContentApps.Where(x => x.Alias != "childItems").ToList(); - //if (contentType.VariesByCulture()) - //{ - // //Remove all variants except for the default since currently the default must be saved before other variants can be edited - // //TODO: Allow for editing all variants at once ... this will be a future task - // mapped.Variants = new[] { mapped.Variants.FirstOrDefault(x => x.IsCurrent) }; - //} - return mapped; } @@ -507,47 +500,6 @@ namespace Umbraco.Web.Editors return pagedResult; } - /// - /// Returns permissions for all nodes passed in for the current user - /// TODO: This should be moved to the CurrentUserController? - /// - /// - /// - [HttpPost] - public Dictionary GetPermissions(int[] nodeIds) - { - var permissions = Services.UserService - .GetPermissions(Security.CurrentUser, nodeIds); - - var permissionsDictionary = new Dictionary(); - foreach (var nodeId in nodeIds) - { - var aggregatePerms = permissions.GetAllPermissions(nodeId).ToArray(); - permissionsDictionary.Add(nodeId, aggregatePerms); - } - - return permissionsDictionary; - } - - /// - /// Checks a nodes permission for the current user - /// TODO: This should be moved to the CurrentUserController? - /// - /// - /// - /// - [HttpGet] - public bool HasPermission(string permissionToCheck, int nodeId) - { - var p = Services.UserService.GetPermissions(Security.CurrentUser, nodeId).GetAllPermissions(); - if (p.Contains(permissionToCheck.ToString(CultureInfo.InvariantCulture))) - { - return true; - } - - return false; - } - /// /// Creates a blueprint from a content item /// @@ -631,7 +583,19 @@ namespace Umbraco.Web.Editors // * any file attachments have been saved to their temporary location for us to use // * we have a reference to the DTO object and the persisted object // * Permissions are valid - MapPropertyValues(contentItem); + MapValuesForPersistence(contentItem); + + //this a custom check for any variants not being flagged for Saving since we'll need to manually + //remove the ModelState validation for the Name + var variantIndex = 0; + foreach (var variant in contentItem.Variants) + { + if (!variant.Save) + { + ModelState.Remove($"Variants[{variantIndex}].Name"); + } + variantIndex++; + } //We need to manually check the validation results here because: // * We still need to save the entity even if there are validation value errors @@ -641,14 +605,20 @@ namespace Umbraco.Web.Editors // a message indicating this if (ModelState.IsValid == false) { - if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) && IsCreatingAction(contentItem.Action)) + if (IsCreatingAction(contentItem.Action)) { - //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! - // add the modelstate to the outgoing object and throw a validation message - var forDisplay = MapToDisplay(contentItem.PersistedContent); - forDisplay.Errors = ModelState.ToErrorDictionary(); - throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); - + if (!RequiredForPersistenceAttribute.HasRequiredValuesForPersistence(contentItem) + || contentItem.Variants + .Where(x => x.Save) + .Select(RequiredForPersistenceAttribute.HasRequiredValuesForPersistence) + .Any(x => x == false)) + { + //ok, so the absolute mandatory data is invalid and it's new, we cannot actually continue! + // add the modelstate to the outgoing object and throw a validation message + var forDisplay = MapToDisplay(contentItem.PersistedContent); + forDisplay.Errors = ModelState.ToErrorDictionary(); + throw new HttpResponseException(Request.CreateValidationErrorResponse(forDisplay)); + } } //if the model state is not valid we cannot publish so change it to save @@ -774,15 +744,15 @@ namespace Umbraco.Web.Editors { //Check if a mandatory language is missing from being published //fixme: This logic is wrong, we need to also check if this language doesn't already have a published version - if (cultureVariants.Any(x => x.Culture == lang.IsoCode && !x.Publish)) - { - //cannot continue publishing since a required language that is not currently being published isn't published - if (!contentItem.PersistedContent.IsCulturePublished(lang.IsoCode)) - { - AddCultureValidationError(lang.IsoCode, allLangs, "speechBubbles/contentReqCulturePublishError"); - canPublish = false; - } - } + //if (cultureVariants.Any(x => x.Culture == lang.IsoCode && x.Publish == false)) + //{ + // //cannot continue publishing since a required language that is not currently being published isn't published + // if (!contentItem.PersistedContent.IsCulturePublished(lang.IsoCode)) + // { + // AddCultureValidationError(lang.IsoCode, allLangs, "speechBubbles/contentReqCulturePublishError"); + // canPublish = false; + // } + //} } if (canPublish) @@ -1038,7 +1008,7 @@ namespace Umbraco.Web.Editors /// Unpublishes a node with a given Id and returns the unpublished entity /// /// The content id to unpublish - /// The culture variant for the content id to unpublish, if none specified will unpublish all variants of the content + /// The culture variant for the content id to unpublish, if none specified will unpublish all variants of the content /// [EnsureUserPermissionForContent("id", 'U')] [OutgoingEditorModelEvent] @@ -1243,10 +1213,10 @@ namespace Umbraco.Web.Editors } /// - /// Maps the dto property values to the persisted model + /// Maps the dto property values and names to the persisted model /// /// - private void MapPropertyValues(ContentItemSave contentSave) + private void MapValuesForPersistence(ContentItemSave contentSave) { //inline method to determine if a property type varies bool Varies(Property property) => property.PropertyType.VariesByCulture(); @@ -1410,7 +1380,7 @@ namespace Umbraco.Web.Editors case PublishResultType.FailedIsTrashed: display.AddWarningNotification( Services.TextService.Localize("publish"), - "publish/contentPublishedFailedIsTrashed"); // fixme properly localize! + "publish/contentPublishedFailedIsTrashed"); // fixme properly localize, these keys are missing from lang files! break; case PublishResultType.FailedContentInvalid: display.AddWarningNotification( @@ -1425,7 +1395,7 @@ namespace Umbraco.Web.Editors case PublishResultType.FailedByCulture: display.AddWarningNotification( Services.TextService.Localize("publish"), - "publish/contentPublishedFailedByCulture"); // fixme properly localize! + "publish/contentPublishedFailedByCulture"); // fixme properly localize, these keys are missing from lang files! break; default: throw new IndexOutOfRangeException($"PublishedResultType \"{status.Result}\" was not expected."); diff --git a/src/Umbraco.Web/Editors/CurrentUserController.cs b/src/Umbraco.Web/Editors/CurrentUserController.cs index a7d858c322..b0f4af0f57 100644 --- a/src/Umbraco.Web/Editors/CurrentUserController.cs +++ b/src/Umbraco.Web/Editors/CurrentUserController.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; @@ -27,6 +28,45 @@ namespace Umbraco.Web.Editors [PluginController("UmbracoApi")] public class CurrentUserController : UmbracoAuthorizedJsonController { + /// + /// Returns permissions for all nodes passed in for the current user + /// + /// + /// + [HttpPost] + public Dictionary GetPermissions(int[] nodeIds) + { + var permissions = Services.UserService + .GetPermissions(Security.CurrentUser, nodeIds); + + var permissionsDictionary = new Dictionary(); + foreach (var nodeId in nodeIds) + { + var aggregatePerms = permissions.GetAllPermissions(nodeId).ToArray(); + permissionsDictionary.Add(nodeId, aggregatePerms); + } + + return permissionsDictionary; + } + + /// + /// Checks a nodes permission for the current user + /// + /// + /// + /// + [HttpGet] + public bool HasPermission(string permissionToCheck, int nodeId) + { + var p = Services.UserService.GetPermissions(Security.CurrentUser, nodeId).GetAllPermissions(); + if (p.Contains(permissionToCheck.ToString(CultureInfo.InvariantCulture))) + { + return true; + } + + return false; + } + /// /// Saves a tour status for the current user /// diff --git a/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs b/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs index 8e9f13b4ef..8c76ceea3d 100644 --- a/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs +++ b/src/Umbraco.Web/Editors/Filters/ContentSaveValidationAttribute.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Web.Http.Controllers; using System.Web.Http.Filters; using Umbraco.Core; @@ -48,8 +49,9 @@ namespace Umbraco.Web.Editors.Filters { //now do each validation step if (contentItemValidator.ValidateExistingContent(model, actionContext) == false) return; - //validate for each variant - foreach (var variant in model.Variants) + + //validate for each variant that is being updated + foreach (var variant in model.Variants.Where(x => x.Save)) { if (contentItemValidator.ValidateProperties(model, variant, actionContext)) contentItemValidator.ValidatePropertyData(model, variant, variant.PropertyCollectionDto, actionContext.ModelState); diff --git a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs index 18d1e037b6..fa00a85904 100644 --- a/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs +++ b/src/Umbraco.Web/Models/ContentEditing/ContentVariantSave.cs @@ -36,10 +36,11 @@ namespace Umbraco.Web.Models.ContentEditing public bool Save { get; set; } /// - /// Indicates if the variant should be published or unpublished + /// Indicates if the variant should be published /// /// - /// This option will have no affect if is false + /// This option will have no affect if is false. + /// This is not used to unpublish. /// [DataMember(Name = "publish")] public bool Publish { get; set; } From 66187bf01a6fb7a60d0151cbdc2536ddbcaa8c03 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 14 Aug 2018 12:32:12 +0200 Subject: [PATCH 194/275] fix issue with property variant state being overwritten if document type wasn't saved --- .../propertysettings/propertysettings.controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js index 1366eb10e4..7239fd22e7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js @@ -35,8 +35,8 @@ vm.showSensitiveData = user.userGroups.indexOf("sensitiveData") != -1; }); - //make the default the same as the content type - if (!$scope.model.property.id) { + //make the default the same as the content type + if (!$scope.model.property.dataTypeId) { $scope.model.property.allowCultureVariant = $scope.model.contentTypeAllowCultureVariant; } From 6c0d14e0f408b37ac3ffd6c7e750799517763996 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 14 Aug 2018 13:14:49 +0200 Subject: [PATCH 195/275] add type="button" to toggle so it doesn't auto-submits a form --- .../src/views/components/buttons/umb-toggle.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html index ba9257bac7..fc62485521 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-toggle.html @@ -1,4 +1,4 @@ -