From e94c0244131cb7b70a917082c721c36990c3c379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Thu, 3 May 2018 14:27:54 +0200 Subject: [PATCH 001/299] Soundcloud-player + soundcloud-search added --- server/handlers/functions.js | 19 + server/handlers/list.js | 4 +- server/handlers/list_change.js | 22 +- server/handlers/search.js | 1 + server/handlers/suggestions.js | 20 +- server/public/assets/css/style.css | 40 +- server/public/assets/js/channel.js | 2 + server/public/assets/js/frontpage.js | 12 +- server/public/assets/js/functions.js | 13 +- server/public/assets/js/hostcontroller.js | 1 + server/public/assets/js/list.js | 98 ++-- server/public/assets/js/listeners.js | 37 +- server/public/assets/js/player.js | 257 ++++++++- server/public/assets/js/playercontrols.js | 78 ++- server/public/assets/js/search.js | 526 +++++++++++------- server/public/assets/js/suggestions.js | 1 + .../partials/channel/players.handlebars | 3 + .../public/partials/channel/search.handlebars | 77 +-- server/routing/client/api.js | 8 +- 19 files changed, 863 insertions(+), 356 deletions(-) diff --git a/server/handlers/functions.js b/server/handlers/functions.js index f988cfb0..f99d9171 100644 --- a/server/handlers/functions.js +++ b/server/handlers/functions.js @@ -19,6 +19,24 @@ function remove_name_from_db(guid, name) { }); } +function isUrl(str) { + var pattern = new RegExp("\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + + "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + + "|mil|biz|info|mobi|name|aero|jobs|museum" + + "|travel|[a-z]{2}))(:[\\d]{1,5})?" + + "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + + "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + + "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + + "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + + "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"); + if(!pattern.test(str)) { + return false; + } else { + return true; + } +} + function getSession(socket) { try { /*var cookieParser = require("cookie-parser"); @@ -273,6 +291,7 @@ function removeSessionAdminPass(id, channel, callback) { }); } +module.exports.isUrl = isUrl; module.exports.removeEmojis = removeEmojis; module.exports.getSessionChatPass = getSessionChatPass; module.exports.setSessionChatPass = setSessionChatPass; diff --git a/server/handlers/list.js b/server/handlers/list.js index a360f3cc..cadf108d 100644 --- a/server/handlers/list.js +++ b/server/handlers/list.js @@ -84,7 +84,9 @@ function list(msg, guid, coll, offline, socket) { db.collection(coll + "_settings").insert(configs, function(err, docs){ socket.join(coll); List.send_list(coll, socket, true, false, true); - db.collection("frontpage_lists").insert({"_id": coll, "count" : 0, "frontpage": true, "accessed": Functions.get_time(), "viewers": 1}); + db.collection("frontpage_lists").insert({"_id": coll, "count" : 0, "frontpage": true, "accessed": Functions.get_time(), "viewers": 1}, function(e,d){ + console.log("added new channel", coll); + }); Functions.check_inlist(coll, guid, socket, offline); }); }); diff --git a/server/handlers/list_change.js b/server/handlers/list_change.js index 831ed281..1bf94646 100644 --- a/server/handlers/list_change.js +++ b/server/handlers/list_change.js @@ -298,7 +298,9 @@ function add_function(arr, coll, guid, offline, socket) { if(typeof(arr.id) != "string" || typeof(arr.start) != "number" || typeof(arr.end) != "number" || typeof(arr.title) != "string" || - typeof(arr.list) != "string" || typeof(arr.duration) != "number") { + typeof(arr.list) != "string" || typeof(arr.duration) != "number" || + typeof(arr.source) != "string" || + (arr.source == "soundcloud" && (!arr.hasOwnProperty("thumbnail") || !Functions.isUrl(arr.thumbnail)))) { var result = { start: { expected: "number or string that can be cast to int", @@ -327,6 +329,14 @@ function add_function(arr, coll, guid, offline, socket) { adminpass: { expected: "string", got: arr.hasOwnProperty("adminpass") ? typeof(arr.adminpass) : undefined + }, + source: { + expected: "string (youtube or soundcloud)", + got: arr.hasOwnProperty("source") ? typeof(arr.source) : undefined + }, + thumbnail: { + expected: "url if source == soundcloud", + got: arr.hasOwnProperty("thumbnail") ? typeof(arr.thumbnail) : undefined } }; socket.emit('update_required', result); @@ -350,6 +360,7 @@ function add_function(arr, coll, guid, offline, socket) { var title = arr.title; var hash = Functions.hash_pass(Functions.hash_pass(Functions.decrypt_string(arr.adminpass), true)); var duration = parseInt(arr.duration); + var source = arr.source; /*db.collection(coll + "_settings").find(function(err, docs) {*/ conf = docs; @@ -366,7 +377,10 @@ function add_function(arr, coll, guid, offline, socket) { } else { np = false; } - var new_song = {"added": added,"guids":guids,"id":id,"now_playing":np,"title":title,"votes":votes, "duration":duration, "start": parseInt(start), "end": parseInt(end), "type": "video"}; + var new_song = {"added": added,"guids":guids,"id":id,"now_playing":np,"title":title,"votes":votes, "duration":duration, "start": parseInt(start), "end": parseInt(end), "type": "video", "source": source}; + if(source == "soundcloud") new_song.thumbnail = arr.thumbnail; + console.log(new_song); + //return; db.collection(coll).update({id: id}, new_song, {upsert: true}, function(err, docs){ new_song._id = "asd"; if(np) { @@ -374,10 +388,10 @@ function add_function(arr, coll, guid, offline, socket) { db.collection(coll + "_settings").update({ id: "config" }, {$set:{startTime: Functions.get_time()}}); List.send_play(coll, undefined); Frontpage.update_frontpage(coll, id, title); - Search.get_correct_info(new_song, coll, false); + if(source != "soundcloud") Search.get_correct_info(new_song, coll, false); } else { io.to(coll).emit("channel", {type: "added", value: new_song}); - Search.get_correct_info(new_song, coll, true); + if(source != "soundcloud") Search.get_correct_info(new_song, coll, true); } db.collection("frontpage_lists").update({_id:coll}, {$inc:{count:1}, $set:{accessed: Functions.get_time()}}, {upsert:true}, function(err, docs){}); List.getNextSong(coll); diff --git a/server/handlers/search.js b/server/handlers/search.js index 9671f399..7961a416 100644 --- a/server/handlers/search.js +++ b/server/handlers/search.js @@ -82,6 +82,7 @@ function check_error_video(msg, channel) { }; return; } + if(msg.source == "soundcloud") return; channel = channel.replace(/ /g,''); request({ type: "GET", diff --git a/server/handlers/suggestions.js b/server/handlers/suggestions.js index ba87ef96..1851aaf5 100644 --- a/server/handlers/suggestions.js +++ b/server/handlers/suggestions.js @@ -1,23 +1,7 @@ -function isUrl(str) { - var pattern = new RegExp("\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + - "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + - "|mil|biz|info|mobi|name|aero|jobs|museum" + - "|travel|[a-z]{2}))(:[\\d]{1,5})?" + - "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + - "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + - "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + - "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + - "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + - "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b"); - if(!pattern.test(str)) { - return false; - } else { - return true; - } -} + function thumbnail(msg, coll, guid, offline, socket) { - if(msg.thumbnail != undefined && msg.channel && msg.channel != undefined && isUrl(msg.thumbnail)){ + if(msg.thumbnail != undefined && msg.channel && msg.channel != undefined && Functions.isUrl(msg.thumbnail)){ if(typeof(msg.channel) != "string" || typeof(msg.thumbnail) != "string") { var result = { diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 267ee457..7b31106a 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -1480,7 +1480,7 @@ margin:-1px; } #inner-results { - height: calc(100vh - 64px - 76px); + height: calc(100vh - 64px - 76px - 64px); overflow-y: scroll; overflow-x: hidden; } @@ -1602,6 +1602,38 @@ ul #chat-log{ align-items: center; } +.search_results { + + background: black; + position: absolute; + width: 100vw; + top: 64px; + /* height: 100vh; */ + +} + +.results-tabs li { + width: 50%; + text-align: center; +} + +.results-tabs .indicator { + height: 2px; + z-index: 9; + position: absolute; + margin-left: -16px; + margin-top: 64px; + width: 50%; +} + +#results_soundcloud { + padding: 0; +} + +#results_soundcloud #inner-results { + height: calc(100vh - 64px - 76px); +} + #search_loader_inner{ display: flex; } @@ -2011,11 +2043,15 @@ nav ul li:hover, nav ul li.active { position: absolute; width: 100%; top: 64px; - max-height: calc(100vh - 64px); + max-height: calc(100vh - 128px); overflow: overlay; overflow-x: hidden; /* z-index: 99999999; */ } + +#results_soundcloud { + max-height: calc(100vh - 64px - 64px); +} .result:hover, .hoverResults { background-color: rgba(0,0,0,0.4); } diff --git a/server/public/assets/js/channel.js b/server/public/assets/js/channel.js index ee29bd47..2afc9528 100644 --- a/server/public/assets/js/channel.js +++ b/server/public/assets/js/channel.js @@ -77,6 +77,7 @@ var Channel = { } Helper.tabs('.chatTabs'); + Helper.tabs('.results-tabs'); } var sidenavElem = document.getElementsByClassName("sidenav")[0]; M.Sidenav.init(sidenavElem, { @@ -165,6 +166,7 @@ var Channel = { Playercontrols.initSlider(); if(player_ready) { Player.player.setVolume(Crypt.get_volume()); + SC.Widget(Player.soundcloud_player).setVolume(Crypt.get_volume()); } Helper.removeClass(".video-container", "no-opacity"); var codeURL = "https://remote."+window.location.hostname+"/"+id; diff --git a/server/public/assets/js/frontpage.js b/server/public/assets/js/frontpage.js index a4198532..27105ba4 100755 --- a/server/public/assets/js/frontpage.js +++ b/server/public/assets/js/frontpage.js @@ -26,6 +26,7 @@ var Frontpage = { document.getElementById("channel-list-container").insertAdjacentHTML("beforeend", "

No channels yet

"); } else { Frontpage.populate_channels(msg.channels, true); + console.log(msg.channels); } Frontpage.set_viewers(msg.viewers); }, @@ -77,9 +78,14 @@ var Frontpage = { var id = lists[x].id; var viewers = lists[x].viewers; var description = lists[x].description; - var img = "background-image:url('https://img.youtube.com/vi/"+id+"/hqdefault.jpg');"; - if(lists[x].thumbnail) { - img = "background-image:url('" + lists[x].thumbnail + "');"; + var img; + if(id.indexOf("soundcloud.com") > -1) { + img = "background-image:url('http://icons.iconarchive.com/icons/uiconstock/socialmedia/128/Soundcloud-icon.png');"; + } else { + img = "background-image:url('https://img.youtube.com/vi/"+id+"/hqdefault.jpg');"; + if(lists[x].thumbnail) { + img = "background-image:url('" + lists[x].thumbnail + "');"; + } } var song_count = lists[x].count; diff --git a/server/public/assets/js/functions.js b/server/public/assets/js/functions.js index 8d155fd3..033edc13 100644 --- a/server/public/assets/js/functions.js +++ b/server/public/assets/js/functions.js @@ -84,6 +84,7 @@ function hide_native(way) { Helper.setHtml("#chromecast_text", "Playing on
" + castSession.La.friendlyName); } Player.player.setVolume(100); + SC.Widget(Player.soundcloud_player).setVolume(100); Helper.toggleClass("#player_overlay_text", "hide"); } else if(way == 0){ @@ -108,6 +109,7 @@ function hide_native(way) { if(!Helper.mobilecheck()){ Player.player.setVolume(Crypt.get_volume()); Playercontrols.visualVolume(Crypt.get_volume()); + SC.Widget(Player.soundcloud_player).setVolume(Crypt.get_volume()); } Helper.addClass("#player_overlay", "hide"); Helper.toggleClass("#player_overlay_text", "hide"); @@ -235,6 +237,11 @@ function contextListener(that, event) { } else if(top < 0) { top = 15; } + if(parent.getAttribute("data-video-source") == "soundcloud") { + Helper.addClass(".find-context-menu", "context-menu-disabled"); + } else { + Helper.removeClass(".find-context-menu", "context-menu-disabled"); + } Helper.css(".context-menu-root", "left", left + "px"); Helper.css(".context-menu-root", "top", top + "px"); Helper.removeClass(".context-menu-root","hide"); @@ -318,7 +325,7 @@ function del_ajax(id) { }) } -function add_ajax(id, title, duration, playlist, num, full_num, start, end) { +function add_ajax(id, title, duration, playlist, num, full_num, start, end, source, thumbnail) { /*var a = Crypt.get_pass(chan.toLowerCase()); var u = Crypt.get_userpass(chan.toLowerCase()); if(a == undefined) a = ""; @@ -332,6 +339,8 @@ function add_ajax(id, title, duration, playlist, num, full_num, start, end) { duration: duration, end_time: end, start_time: start, + thumbnail: thumbnail, + source: source, token: zoff_api_token }, headers: {"Content-Type": "application/json;charset=UTF-8"}, @@ -901,9 +910,11 @@ function searchTimeout(event) { } if(code == 13){ Search.search(search_input); + Search.soundcloudSearch(search_input); }else{ timeout_search = setTimeout(function(){ Search.search(search_input); + Search.soundcloudSearch(search_input); }, 1000); } } diff --git a/server/public/assets/js/hostcontroller.js b/server/public/assets/js/hostcontroller.js index c071de08..5b6d0917 100755 --- a/server/public/assets/js/hostcontroller.js +++ b/server/public/assets/js/hostcontroller.js @@ -38,6 +38,7 @@ var Hostcontroller = { if(arr.type == "volume") { Playercontrols.visualVolume(arr.value); Player.setVolume(arr.value); + SC.Widget(Player.soundcloud_player).setVolume(arr.value); localStorage.setItem("volume", arr.value); Playercontrols.choose_button(arr.value, false); } else if(arr.type == "channel") { diff --git a/server/public/assets/js/list.js b/server/public/assets/js/list.js index 73c54151..1787e69b 100755 --- a/server/public/assets/js/list.js +++ b/server/public/assets/js/list.js @@ -245,7 +245,7 @@ var List = { check_error_videos: function(i) { //Helper.log("Empty-checker at " + i); - if(full_playlist.length == 0) return; + if(full_playlist.length == 0 || full_playlist[i].source == "soundcloud") return; Helper.ajax({ method: "get", url: 'https://www.googleapis.com/youtube/v3/videos?id=' + full_playlist[i].id @@ -255,7 +255,7 @@ var List = { //Helper.log("Empty-checker items " + data.items.length); if (data.items.length == 0) { Helper.log(["Emtpy-checker error at " + full_playlist[i].id + " " + full_playlist[i].title]); - socket.emit("error_video", {channel: chan.toLowerCase(), id: full_playlist[i].id, title: full_playlist[i].title}); + socket.emit("error_video", {channel: chan.toLowerCase(), id: full_playlist[i].id, title: full_playlist[i].title, source: full_playlist[i].source}); } if(full_playlist.length > i + 1 && window.location.pathname != "/") { List.check_error_videos(i + 1); @@ -356,7 +356,7 @@ var List = { full_playlist.push(now_playing); } - if(document.querySelectorAll("#suggested-"+added.id).length > 0) { + if(added.source != "soundcloud" && document.querySelectorAll("#suggested-"+added.id).length > 0) { number_suggested = number_suggested - 1; if(number_suggested < 0) number_suggested = 0; @@ -366,9 +366,9 @@ var List = { } document.querySelector(".suggested-link span.badge.new.white").innerText = to_display; + Helper.removeElement("#suggested-"+added.id); } - Helper.removeElement("#suggested-"+added.id); if(List.empty){ List.empty = false; } @@ -832,43 +832,60 @@ var List = { }, addToYoutubePlaylist: function(playlist_id, full_playlist, num, request_url) { - var _data = JSON.stringify({ - 'snippet': { - 'playlistId': playlist_id, - 'resourceId': { - 'kind': 'youtube#video', - 'videoId': full_playlist[num].id + if(full_playlist[num].source != "soundcloud") { + var _data = JSON.stringify({ + 'snippet': { + 'playlistId': playlist_id, + 'resourceId': { + 'kind': 'youtube#video', + 'videoId': full_playlist[num].id + } } - } - }); - Helper.ajax({ - type: "POST", - url: request_url, - headers: { - 'Authorization': 'Bearer ' + access_token_data_youtube.access_token, - 'Content-Type': 'application/json' - }, - data: _data, - success: function(response){ - response = JSON.parse(response); - Helper.log(["Added video: " + full_playlist[num].id + " to playlist id " + playlist_id]); - if(num == full_playlist.length - 1){ - Helper.log(["All videoes added!"]); - Helper.log(["url: https://www.youtube.com/playlist?list=" + playlist_id]); - document.querySelector(".exported-list").insertAdjacentHTML("beforeend", "" + chan + ""); - Helper.addClass("#playlist_loader_export", "hide"); - Helper.addClass(".current_number", "hide"); - //$(".youtube_export_button").removeClass("hide"); - } else { - //setTimeout(function(){ - Helper.removeClass(".current_number", "hide"); - document.querySelector(".current_number").innerText = (num + 1) + " of " + (full_playlist.length); - List.addToYoutubePlaylist(playlist_id, full_playlist, num + 1, request_url) - //}, 50); + }); + Helper.ajax({ + type: "POST", + url: request_url, + headers: { + 'Authorization': 'Bearer ' + access_token_data_youtube.access_token, + 'Content-Type': 'application/json' + }, + data: _data, + success: function(response){ + response = JSON.parse(response); + Helper.log(["Added video: " + full_playlist[num].id + " to playlist id " + playlist_id]); + if(num == full_playlist.length - 1){ + Helper.log(["All videoes added!"]); + Helper.log(["url: https://www.youtube.com/playlist?list=" + playlist_id]); + document.querySelector(".exported-list").insertAdjacentHTML("beforeend", "" + chan + ""); + Helper.addClass("#playlist_loader_export", "hide"); + Helper.addClass(".current_number", "hide"); + //$(".youtube_export_button").removeClass("hide"); + } else { + //setTimeout(function(){ + Helper.removeClass(".current_number", "hide"); + document.querySelector(".current_number").innerText = (num + 1) + " of " + (full_playlist.length); + List.addToYoutubePlaylist(playlist_id, full_playlist, num + 1, request_url); + //}, 50); + } } - } - }); + }); + } else { + if(num == full_playlist.length - 1){ + Helper.log(["All videoes added!"]); + Helper.log(["url: https://www.youtube.com/playlist?list=" + playlist_id]); + document.querySelector(".exported-list").insertAdjacentHTML("beforeend", "" + chan + ""); + Helper.addClass("#playlist_loader_export", "hide"); + Helper.addClass(".current_number", "hide"); + //$(".youtube_export_button").removeClass("hide"); + } else { + //setTimeout(function(){ + Helper.removeClass(".current_number", "hide"); + document.querySelector(".current_number").innerText = (num + 1) + " of " + (full_playlist.length); + List.addToYoutubePlaylist(playlist_id, full_playlist, num + 1, request_url); + //}, 50); + } + } }, sortList: function() { @@ -899,6 +916,9 @@ var List = { var video_title = _song_info.title; var video_votes = _song_info.votes; var video_thumb_url = "//img.youtube.com/vi/"+video_id+"/mqdefault.jpg"; + if(_song_info.source == "soundcloud") { + video_thumb_url = _song_info.thumbnail; + } var video_thumb = "background-image:url('" + video_thumb_url + "');"; var song = document.createElement("div"); song.innerHTML = list_html; @@ -924,9 +944,11 @@ var List = { song.querySelector(".list-image").setAttribute(image_attr,video_thumb); if(list){ + song.querySelector("#list-song") song.querySelector(".list-votes").innerText = video_votes; song.querySelector("#list-song").setAttribute("data-video-id", video_id); song.querySelector("#list-song").setAttribute("data-video-type", "song"); + song.querySelector("#list-song").setAttribute("data-video-source", _song_info.source); song.querySelector("#list-song").setAttribute("id", video_id); song.classList.remove("hide"); song.querySelector(".vote-container").setAttribute("title", video_title); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 1c8e3aab..81a7cfdd 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -5,6 +5,10 @@ var client = false; if(domain.length > 0 && domain[0] == "client") { client = true; } +var _SC1; +var _SC2; +var firstLoad = ""; +var videoSource; var dynamicListeners = {}; var socket_connected = false; var hasadmin = 0; @@ -420,6 +424,7 @@ addListener("submit", "#description_form", function(event){ }); addListener("click", "#playpause-overlay", function(){ + console.log("playpause"); if(document.getElementById("play-overlay").classList.contains("hide")){ Player.pauseVideo(); Helper.toggleClass("#play-overlay", "hide"); @@ -488,6 +493,9 @@ addListener("click", ".copy-context-menu", function(e) { addListener("click", ".find-context-menu", function(e) { this.preventDefault(); var that = e; + if(that.classList.contains("context-menu-disabled")) { + return; + } var parent = that.parentElement; var id = parent.getAttribute("data-id"); Search.search(id, false, true); @@ -580,6 +588,12 @@ document.addEventListener("keydown", function(event) { document.querySelector("#import") != document.activeElement && document.querySelector("#find_input") != document.activeElement && document.querySelector("#import_spotify") != document.activeElement) { + console.log("play pause space", videoSource); + if(videoSource == "soundcloud") { + event.preventDefault(); + Playercontrols.play_pause(); + return false; + } if(Player.player.getPlayerState() == 1) { event.preventDefault(); Player.player.pauseVideo(); @@ -741,6 +755,10 @@ addListener("click", ".modal-close", function(event){ this.preventDefault(); }); +addListener("click", "#player_overlay", function(event) { + if(videoSource == "soundcloud") Playercontrols.play_pause(); +}); + /* addListener("change", ".password_protected", function(event) { this.preventDefault(); @@ -1254,9 +1272,16 @@ addListener("click", ".result-object", function(e){ var original_length = e.getAttribute("data-video-length"); var start = parseInt(e.querySelector(".result-start").value); var end = parseInt(e.querySelector(".result-end").value); + var source = "youtube"; + var thumbnail; + if(e.getAttribute("data-type-source") != undefined) { + source = "soundcloud"; + thumbnail = e.getAttribute("data-type-thumbnail"); + } if(end > original_length) { end = original_length; } + console.log(source); if(start > end) { M.toast({html: "Start can't be before the end..", displayLength: 3000, classes: "red lighten"}); } else if(start < 0) { @@ -1264,7 +1289,7 @@ addListener("click", ".result-object", function(e){ } else { try { var length = parseInt(end) - parseInt(start); - Search.submitAndClose(id, title, length, start, end); + Search.submitAndClose(id, title, length, start, end, source, thumbnail); } catch(err) { M.toast({html: "Only numbers are accepted as song start and end parameters..", displayLength: 3000, classes: "red lighten"}); } @@ -1349,6 +1374,12 @@ addListener("click", "#add-many", function(e){ if(end > original_length) { end = original_length; } + var source = "youtube"; + if(e.getAttribute("data-type-source") != undefined) { + source = "soundcloud"; + thumbnail = e.getAttribute("data-type-thumbnail"); + } + console.log(source); if(start > end) { M.toast({html: "Start can't be before the end..", displayLength: 3000, classes: "red lighten"}); } else if(start < 0) { @@ -1357,7 +1388,7 @@ addListener("click", "#add-many", function(e){ try { var length = parseInt(end) - parseInt(start); e.parentElement.parentElement.parentElement.remove(); - Search.submit(id, title, length, false, 0, 1, start, end); + Search.submit(id, title, length, false, 0, 1, start, end, source, thumbnail); } catch(event) { M.toast({html: "Only numbers are accepted as song start and end parameters..", displayLength: 3000, classes: "red lighten"}); } @@ -1380,7 +1411,7 @@ addListener("click", ".add-suggested", function(e){ var title = e.getAttribute("data-video-title"); var length = e.getAttribute("data-video-length"); var added_by = e.getAttribute("data-added-by"); - Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length)); + Search.submit(id, title, parseInt(length), false, 0, 1, 0, parseInt(length), "youtube"); if(added_by == "user") { number_suggested = number_suggested - 1; if(number_suggested < 0) number_suggested = 0; diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index c25008f8..c7c7bf70 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -7,6 +7,7 @@ var Player = { stopInterval: false, fireplace: "", np: {}, + soundcloud_player: document.querySelector('#soundcloud_player'), youtube_listener: function(obj) { Helper.log(["object", obj]); @@ -44,6 +45,7 @@ var Player = { startTime = time - conf.startTime; song_title = obj.np[0].title; duration = obj.np[0].duration; + videoSource = obj.np[0].hasOwnProperty("source") ? obj.np[0].source : "youtube"; if(player_ready) { Player.cueVideoById(video_id, duration); Player.stopVideo(); @@ -107,6 +109,7 @@ var Player = { Player.stopVideo(); } video_id = obj.np[0].id; + videoSource = obj.np[0].hasOwnProperty("source") ? obj.np[0].source : "youtube"; Player.np = { id: video_id, start: obj.np[0].start, @@ -156,6 +159,7 @@ var Player = { startTime = time - conf.startTime; song_title = obj.np[0].title; duration = obj.np[0].duration; + videoSource = obj.np[0].hasOwnProperty("source") ? obj.np[0].source : "youtube"; Player.setThumbnail(conf, video_id); if(mobile_beginning && Helper.mobilecheck() && seekTo === 0 && !chromecastAvailable) { seekTo = 1 + Player.np.start; @@ -246,12 +250,23 @@ var Player = { } else { empty_clear = false; } + try { + if(videoSource == "soundcloud") { + Player.player.stopVideo(); + } else { + SC.Widget(Player.soundcloud_player).pause(); + } + } catch(e) {} }, setThumbnail: function(conf, video_id) { if(embed) return; if(!conf.hasOwnProperty("thumbnail") || conf.thumbnail == "") { - document.getElementById("thumbnail_image").innerHTML = "thumbnail"; + if(videoSource == "soundcloud") { + document.getElementById("thumbnail_image").innerHTML = "thumbnail"; + } else { + document.getElementById("thumbnail_image").innerHTML = "thumbnail"; + } } }, @@ -366,11 +381,18 @@ var Player = { } //Playercontrols.play_pause(); } else { - Player.player.playVideo(); + console.log(videoSource); + if(videoSource == "soundcloud") { + console.log("you need to play now"); + SC.Widget(document.querySelector("#soundcloud_player")).play(); + } else { + Player.player.playVideo(); + } } }, pauseVideo: function(){ + console.log("pause"); if(chromecastAvailable){ castSession.sendMessage("urn:x-cast:zoff.me", {type: "pauseVideo"}); if(document.getElementById("play").classList.contains("hide")){ @@ -379,8 +401,14 @@ var Player = { } //Playercontrols.play_pause(); } else { + console.log(videoSource); paused = true; - Player.player.pauseVideo(); + if(videoSource == "soundcloud") { + console.log("you need to pause now"); + SC.Widget(document.querySelector("#soundcloud_player")).pause(); + } else { + Player.player.pauseVideo(); + } } }, @@ -406,8 +434,35 @@ var Player = { chrome.cast.media.GenericMediaMetadata({metadataType: 0, title:song_title, image: 'https://img.youtube.com/vi/'+id+'/mqdefault.jpg', images: ['https://img.youtube.com/vi/'+id+'/mqdefault.jpg']}); chrome.cast.Image('https://img.youtube.com/vi/'+id+'/mqdefault.jpg'); } else { + if(videoSource == "soundcloud") { + Helper.removeClass(document.getElementById("player_overlay"), "hide"); + SC.Widget(Player.soundcloud_player).load(id, { + auto_play: true, + buying:false, + sharing:false, + download:false, + show_user:false, + callback: function() { + SC.Widget(Player.soundcloud_player).setVolume(Crypt.get_volume()); + console.log(start, seekTo); + if(start == undefined) start = 0; + if(seekTo == undefined) seekTo = 0; + SC.Widget(Player.soundcloud_player).seekTo((start + seekTo) * 1000); + Helper.css(document.getElementById("player_overlay"), "background", "url('" + full_playlist[full_playlist.length - 1].thumbnail + "')"); + Helper.css(document.getElementById("player_overlay"), "background-size", "auto"); + Helper.css(document.getElementById("player_overlay"), "background-position", "20%"); + Helper.css(document.getElementById("player_overlay"), "background-color", document.querySelector("#controls").style.backgroundColor); + Helper.addClass("#player_overlay_text", "hide"); + } + }); + //SC.Widget(Player.soundcloud_player).play(); + } else { //window.player = Player.player; - Player.player.loadVideoById({'videoId': id, 'startSeconds': s, 'endSeconds': e}); + Helper.addClass(document.getElementById("player_overlay"), "hide"); + Helper.css(document.getElementById("player_overlay"), "background", "none"); + Helper.removeClass("#player_overlay_text", "hide"); + Player.player.loadVideoById({'videoId': id, 'startSeconds': s, 'endSeconds': e}); + } } if(offline) { getColor(id); @@ -423,8 +478,29 @@ var Player = { if(end) e = end; else e = Player.np.end; - Player.player.cueVideoById({'videoId': id, 'startSeconds': s, 'endSeconds': e}); - + if(videoSource == "soundcloud") { + SC.Widget(Player.soundcloud_player).load(id, { + auto_play: false, + buying:false, + sharing:false, + download:false, + show_user:false, + callback: function() { + SC.Widget(Player.soundcloud_player).setVolume(Crypt.get_volume()); + console.log(start, seekTo); + if(start == undefined) start = 0; + if(seekTo == undefined) seekTo = 0; + SC.Widget(Player.soundcloud_player).seekTo((start + seekTo) * 1000); + Helper.css(document.getElementById("player_overlay"), "background", "url('" + full_playlist[full_playlist.length - 1].thumbnail + "')"); + Helper.css(document.getElementById("player_overlay"), "background-size", "cover"); + Helper.css(document.getElementById("player_overlay"), "background-position", "20%"); + Helper.css(document.getElementById("player_overlay"), "background-color", document.querySelector("#controls").style.backgroundColor); + Helper.addClass("#player_overlay_text", "hide"); + } + }); + } else { + Player.player.cueVideoById({'videoId': id, 'startSeconds': s, 'endSeconds': e}); + } }, stopVideo: function(){ @@ -442,6 +518,7 @@ var Player = { castSession.setVolume(vol/100); } else { Player.player.setVolume(vol); + SC.Widget(Player.soundcloud_player).setVolume(vol); } }, @@ -571,6 +648,92 @@ var Player = { } }, + soundcloudFinish: function() { + playing = false; + paused = false; + + if(!offline) { + /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); + if(u == undefined) u = "";*/ + socket.emit("end", {id: video_id, channel: chan.toLowerCase()}); + } else { + Player.playNext(); + } + }, + + soundcloudPause: function() { + if(end_programmatically) { + paused = false; + playing = false; + end_programmatically = false; + } else { + if(!chromecastAvailable){ + if(beginning && mobile_beginning) { + Helper.css("#playpause", "visibility", "visible"); + Helper.css("#playpause", "pointer-events", "all"); + Helper.css("#channel-load", "display", "none"); + } + if(!empty_clear && !gotten_np) { + paused = true; + } + if(gotten_np) gotten_np = false; + if(window.location.pathname != "/") Playercontrols.play_pause_show(); + mobile_beginning = true; + } + Helper.removeClass("#play", "hide"); + Helper.addClass("#pause", "hide"); + } + }, + + soundcloudPlay: function() { + if(embed) { + Helper.css("#player", "visibility", "visible"); + } + if(embed && !autoplay) autoplay = true; + if(!window.MSStream) { + Helper.css("#player", "opacity", "1"); + //if(!Helper.mobilecheck()) { + Helper.css("#channel-load", "display", "none"); + + //} + } + Helper.css("#playpause", "visibility", "visible"); + Helper.css("#playpause", "pointer-events", "all"); + playing = true; + if(beginning && Helper.mobilecheck() && !chromecastAvailable){ + //Player.pauseVideo(); + beginning = false; + mobile_beginning = false; + + } + //if(!embed && window.location.pathname != "/" && !chromecastAvailable) Helper.addClass("#player_overlay", "hide"); + if(window.location.pathname != "/"){ + Helper.addClass("#play", "hide"); + Helper.removeClass("#pause", "hide"); + } + if((paused || was_stopped) && !offline) { + /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); + if(u == undefined) u = "";*/ + socket.emit('pos', {channel: chan.toLowerCase()}); + paused = false; + was_stopped = false; + } + }, + + soundcloudReady: function() { + console.log("loaded"); + SC.Widget(Player.soundcloud_player).bind(SC.Widget.Events.FINISH, Player.soundcloudFinish); + SC.Widget(Player.soundcloud_player).bind(SC.Widget.Events.PAUSE, Player.soundcloudPause); + SC.Widget(Player.soundcloud_player).bind(SC.Widget.Events.PLAY, Player.soundcloudPlay); + SC.Widget(Player.soundcloud_player).load("https://soundcloud.com/kid-astray/kid-astray-back-to-the-ordinary", { + auto_play: false, + buying:false, + sharing:false, + download:false, + show_user:false, + }); + }, + onPlayerReady: function(event) { try{ beginning = true; @@ -734,7 +897,13 @@ var Player = { dMinutes = Math.floor(duration / 60); dSeconds = duration - dMinutes * 60; - currDurr = Player.player.getCurrentTime() !== undefined ? Math.floor(Player.player.getCurrentTime()) : seekTo; + if(videoSource == "soundcloud") { + SC.Widget(Player.soundcloud_player).getPosition(function(dur) { + currDurr = Math.floor(dur) / 1000; + }); + } else { + currDurr = Player.player.getCurrentTime() !== undefined ? Math.floor(Player.player.getCurrentTime()) : seekTo; + } if(currDurr - Player.np.start > duration && !offline) { currDurr = duration - Player.np.start; } @@ -761,17 +930,33 @@ var Player = { if(!dragging) { document.getElementById("bar").style.width = per+"%"; } + if(videoSource == "soundcloud") { + SC.Widget(Player.soundcloud_player).isPaused(function(paused) { + if(Math.floor(currDurr / 1000) > Player.np.end && !paused) { + end_programmatically = true; - if(Player.player.getCurrentTime() > Player.np.end && Player.player.getPlayerState() == YT.PlayerState.PLAYING) { - end_programmatically = true; + if(!offline) { + SC.Widget(Player.soundcloud_player).pause(); + /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); + if(u == undefined) u = "";*/ + socket.emit("end", {id: video_id, channel: chan.toLowerCase()}); + } else { + Player.playNext(); + } + } + }); + } else { + if(Player.player.getCurrentTime() > Player.np.end && Player.player.getPlayerState() == YT.PlayerState.PLAYING) { + end_programmatically = true; - if(!offline) { - Player.player.pauseVideo(); - /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); - if(u == undefined) u = "";*/ - socket.emit("end", {id: video_id, channel: chan.toLowerCase()}); - } else { - Player.playNext(); + if(!offline) { + Player.player.pauseVideo(); + /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); + if(u == undefined) u = "";*/ + socket.emit("end", {id: video_id, channel: chan.toLowerCase()}); + } else { + Player.playNext(); + } } } } @@ -794,6 +979,46 @@ var Player = { firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } + + if(document.querySelectorAll("script[src='https://w.soundcloud.com/player/api.js']").length == 1) { + SC.Widget(Player.soundcloud_player); + } else { + tag = document.createElement('script'); + tag.src = "https://w.soundcloud.com/player/api.js"; + firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + + tagSearch = document.createElement('script'); + tagSearch.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; + firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tagSearch, firstScriptTag); + console.log("hello"); + + tagSearch.onload = function() { + if(firstLoad == "") { + firstLoad = "search"; + _SC2 = SC; + } else { + _SC2 = SC; + SC = _SC1; + _SC1 = _SC2; + } + console.log("loaded1") + window._SC1 = _SC1; + _SC1.initialize({ + client_id: '***REMOVED***' + }); + } + + tag.onload = function() { + if(firstLoad == "") { + firstLoad = "widget"; + _SC1 = SC; + } + SC.Widget(Player.soundcloud_player); + SC.Widget(Player.soundcloud_player).bind(SC.Widget.Events.READY, Player.soundcloudReady); + } + } } }; diff --git a/server/public/assets/js/playercontrols.js b/server/public/assets/js/playercontrols.js index 975c6e99..20371f30 100755 --- a/server/public/assets/js/playercontrols.js +++ b/server/public/assets/js/playercontrols.js @@ -8,6 +8,7 @@ var Playercontrols = { }, initControls: function() { + console.log("init controls"); document.getElementById("volume-button").addEventListener("click", Playercontrols.mute_video); document.getElementById("playpause").addEventListener("click", Playercontrols.play_pause); document.getElementById("volume-button-overlay").addEventListener("click", Playercontrols.mute_video); @@ -189,25 +190,36 @@ var Playercontrols = { }, play_pause: function() { + console.log("play pause here"); if(!chromecastAvailable){ - if(Player.player.getPlayerState() == YT.PlayerState.PLAYING) - { - Player.pauseVideo(); - if(Helper.mobilecheck() && !window.MSStream){ + if(videoSource == "soundcloud") { + SC.Widget(Player.soundcloud_player).isPaused(function(paused) { + if(paused) { + Player.playVideo(); + } else { + Player.pauseVideo(); + } + }); + } else { + if(Player.player.getPlayerState() == YT.PlayerState.PLAYING) + { + Player.pauseVideo(); + if(Helper.mobilecheck() && !window.MSStream){ + //if(Helper.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ + //document.getElementById("player").style.display = "none"; + Helper.css("#player", "display", "none"); + Helper.toggleClass(".video-container", "click-through"); + Helper.toggleClass(".page-footer", "padding-bottom-extra"); + } + } else if(Player.player.getPlayerState() == YT.PlayerState.PAUSED || Player.player.getPlayerState() === YT.PlayerState.ENDED || (Player.player.getPlayerState() === YT.PlayerState.CUED)){ + Player.playVideo(); //if(Helper.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ - //document.getElementById("player").style.display = "none"; - Helper.css("#player", "display", "none"); - Helper.toggleClass(".video-container", "click-through"); - Helper.toggleClass(".page-footer", "padding-bottom-extra"); - } - } else if(Player.player.getPlayerState() == YT.PlayerState.PAUSED || Player.player.getPlayerState() === YT.PlayerState.ENDED || (Player.player.getPlayerState() === YT.PlayerState.CUED)){ - Player.playVideo(); - //if(Helper.mobilecheck() && !/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream){ - if(Helper.mobilecheck() && !window.MSStream){ - //document.getElementById("player").style.display = "block"; - Helper.css("#player", "display", "block"); - Helper.toggleClass(".video-container", "click-through"); - Helper.toggleClass(".page-footer", "padding-bottom-extra"); + if(Helper.mobilecheck() && !window.MSStream){ + //document.getElementById("player").style.display = "block"; + Helper.css("#player", "display", "block"); + Helper.toggleClass(".video-container", "click-through"); + Helper.toggleClass(".page-footer", "padding-bottom-extra"); + } } } } else { @@ -216,6 +228,7 @@ var Playercontrols = { }, play_pause_show: function() { + console.log("pause2"); if(chromecastAvailable){ if(document.getElementById("play").classList.contains("hide")){ Player.pauseVideo(); @@ -265,6 +278,8 @@ var Playercontrols = { setVolume: function(vol) { Player.setVolume(vol); + console.log(vol); + SC.Widget(Player.soundcloud_player).setVolume(vol); Playercontrols.choose_button(vol, false); if(Player.player.isMuted()) Player.player.unMute(); @@ -345,12 +360,29 @@ var Playercontrols = { }, playPause: function() { - state = Player.player.getPlayerState(); - button = document.getElementById("playpause"); - if(state == YT.PlayerState.PLAYING) { - Player.pauseVideo(); - } else if(state == YT.PlayerState.PAUSED) { - Player.playVideo(); + console.log("playpause", videoSource); + if(videoSource == "soundcloud") { + console.log("hello"); + SC.Widget(Player.soundcloud_player).isPaused(function(paused) { + console.log(paused); + if(paused) { + Helper.addClass("#play", "hide"); + Helper.removeClass("#pause", "hide"); + SC.Widget(Player.soundcloud_player).play(); + } else { + Helper.removeClass("#play", "hide"); + Helper.addClass("#pause", "hide"); + SC.Widget(Player.soundcloud_player).pause(); + } + }) + } else { + state = Player.player.getPlayerState(); + button = document.getElementById("playpause"); + if(state == YT.PlayerState.PLAYING) { + Player.pauseVideo(); + } else if(state == YT.PlayerState.PAUSED) { + Player.playVideo(); + } } }, diff --git a/server/public/assets/js/search.js b/server/public/assets/js/search.js index d6b15e46..8324fe6a 100755 --- a/server/public/assets/js/search.js +++ b/server/public/assets/js/search.js @@ -17,28 +17,29 @@ var Search = { //$("#results").empty(); if(document.querySelector("#search-btn i").innerText == "close") { document.querySelector("body").setAttribute("style", "overflow-y:auto") - /*$("#results").slideUp({ - complete: function() { - $("#results").empty(); - } - });*/ + document.getElementById("results").innerHTML = ""; + document.getElementById("results_soundcloud").innerHTML = ""; + Helper.css(".search_results", "display", "none"); + Helper.css(".results-tabs", "display", "none"); document.querySelector(".search_input").value = ""; document.querySelector("#search-btn i").innerText = "search"; } else { document.querySelector("#search-btn i").innerText = "close"; + Helper.css(".search_results", "display", "block"); } document.querySelector("#search").focus(); }, search: function(search_input, retried, related, pagination){ + if(result_html === undefined || empty_results_html === undefined) { result_html = document.getElementById("temp-results-container"); empty_results_html = Helper.html("#empty-results-container"); } if(!pagination && document.querySelectorAll("#inner-results").length == 0) { - Helper.setHtml(".search_results", ''); + Helper.setHtml("#results", ''); } if(search_input !== ""){ searching = true; @@ -55,7 +56,8 @@ var Search = { Helper.addClass(".search_loader_spinner", "active"); - Helper.removeClass("#results", "hide"); + Helper.removeClass(".search_results", "hide"); + Helper.css(".results-tabs", "display", "none"); Helper.ajax({ type: "GET", @@ -63,11 +65,13 @@ var Search = { dataType: "jsonp", success: function(response){ response = JSON.parse(response); + var output = ""; var nextPageToken = response.nextPageToken; var prevPageToken = response.prevPageToken; if(response.items.length === 0) { document.getElementById("results").innerHTML = ""; Helper.css("#results", "display", "block"); + Helper.css(".results-tabs", "display", "block"); //$("").appendTo($("#results")).show("blind", 83.33); document.getElementById("results").insertAdjacentHTML("beforeend", "
"+empty_results_html+"
"); Helper.removeClass(".search_loader_spinner", "active"); @@ -88,18 +92,17 @@ var Search = { pre_result.innerHTML = result_html.outerHTML; //$("#results").append(result_html); - for(var i = 0; i < response.items.length; i++) { var song = response.items[i]; var duration=song.contentDetails.duration; - secs=Search.durationToSeconds(duration); + var secs=Search.durationToSeconds(duration); var _temp_duration = Helper.secondsToOther(secs); if(!longsongs || secs<720){ - title=song.snippet.title; - enc_title=title;//encodeURIComponent(title).replace(/'/g, "\\\'"); - id=song.id; + var title=song.snippet.title; + var enc_title=title;//encodeURIComponent(title).replace(/'/g, "\\\'"); + var id=song.id; duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s"); - thumb=song.snippet.thumbnails.medium.url; + var thumb=song.snippet.thumbnails.medium.url; //$("#results").append(result_html); var songs = pre_result.cloneNode(true); @@ -127,7 +130,7 @@ var Search = { if(document.querySelectorAll("#inner-results").length == 0) { fresh = true; } - document.getElementsByClassName("search_results")[0].innerHTML = ""; + document.getElementById("results").innerHTML = ""; if(output.length > 0) { //$(window).scrollTop(0); if(!pagination && fresh) { @@ -158,6 +161,7 @@ var Search = { Helper.removeClass(".search_loader_spinner", "active"); Helper.css(".search_results", "display", "block"); + Helper.css(".results-tabs", "display", "block"); } else if(!retried){ Search.search(search_input, true); @@ -179,6 +183,104 @@ var Search = { } }, + soundcloudSearch: function(keyword) { + _SC1.get('/tracks', { + q: keyword + }).then(function(tracks) { + + var pre_result = document.createElement("div"); + pre_result.innerHTML = result_html.outerHTML; + + //$("#results").append(result_html); + var output = ""; + for(var i = 0; i < tracks.length; i++) { + var song = tracks[i]; + + var duration=Math.floor(song.duration / 1000); + //var secs=Search.durationToSeconds(duration); + var secs = duration; + var _temp_duration = Helper.secondsToOther(secs); + if(!longsongs || secs<720){ + var title=song.title; + var enc_title=title;//encodeURIComponent(title).replace(/'/g, "\\\'"); + var id=song.permalink_url; + //duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s"); + //thumb=song.artwork_url; + var thumb = null; + if(thumb == null) thumb = song.waveform_url; + console.log(song); + //$("#results").append(result_html); + var songs = pre_result.cloneNode(true); + songs.querySelector(".search-title").innerText = title; + songs.querySelector(".result_info").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); + songs.querySelector(".thumb").setAttribute("src", thumb); + //songs.querySelector(".add-many").attr("onclick", "submit('"+id+"','"+enc_title+"',"+secs+");"); + songs.querySelector("#add-many").setAttribute("data-video-id", id); + songs.querySelector("#add-many").setAttribute("data-video-title", enc_title); + songs.querySelector("#add-many").setAttribute("data-video-length", secs); + //$($(songs).querySelector("div")[0]).setAttribute("onclick", "submitAndClose('"+id+"','"+enc_title+"',"+secs+");"); + songs.querySelector("#temp-results").setAttribute("data-video-id", id); + songs.querySelector("#temp-results").setAttribute("data-video-title", enc_title); + songs.querySelector("#temp-results").setAttribute("data-video-length", secs); + songs.querySelector(".open-externally").setAttribute("href", song.permalink_url); + songs.querySelector(".result-end").setAttribute("value", secs); + songs.querySelector("#temp-results").setAttribute("data-type-source", "soundcloud"); + songs.querySelector("#temp-results").setAttribute("data-type-thumbnail", thumb); + //$($(songs).querySelector("div")[0]).setAttribute("id", id) + //output += undefined; + if(songs.innerHTML != undefined && songs.innerHTML != "") { + output += songs.innerHTML; + } + } + } + var fresh = false; + if(document.querySelectorAll("#inner-results").length == 0) { + fresh = true; + } + document.getElementById("results_soundcloud").innerHTML = ""; + //console.log(output); + if(output.length > 0) { + //$(window).scrollTop(0); + /*if(!pagination && fresh) { + //Helper.css(".search_results", "display", "none"); + }*/ + //document.getElementById("results_soundcloud").insertAdjacentHTML("beforeend", pagination_buttons_html); + //$("
"+output+"
").prependTo($("#results")); + document.getElementById("results_soundcloud").insertAdjacentHTML("afterbegin", "
"+output+"
"); + if(!pagination && fresh) { + //$(".search_results").slideDown(); + } + document.getElementsByTagName("body")[0].setAttribute("style", "overflow-y:hidden !important") + + /*if(nextPageToken) { + document.querySelector(".next-results-button").setAttribute("data-pagination", nextPageToken); + } else { + Helper.addClass(".next-results-button", "disabled"); + } + if(prevPageToken) { + document.querySelector(".prev-results-button").setAttribute("data-pagination", prevPageToken); + } else { + Helper.addClass(".prev-results-button", "disabled"); + } + + document.querySelector(".pagination-results a").setAttribute("data-original-search", search_input); + */ + //setTimeout(function(){$(".thumb").lazyload({container: $("#results")});}, 250); + + /*Helper.removeClass(".search_loader_spinner", "active"); + Helper.css(".search_results", "display", "block");*/ + + } /*else if(!retried){ + Search.search(search_input, true); + } else { + //$("").appendTo($("#results_soundcloud")).show("blind", 83.33); + document.getElementById("results_soundcloud").insertAdjacentHTML("beforeend", "
"+empty_results_html+"
"); + Helper.css("#results_soundcloud", "display", "block"); + Helper.removeClass(".search_loader_spinner", "active"); + }*/ + }); + }, + backgroundSearch: function(title, artist, length, totalNumber, current){ var keyword= encodeURIComponent(title + " " + artist); var yt_url = "https://www.googleapis.com/youtube/v3/search?key="+api_key+"&videoEmbeddable=true&part=id,snippet&fields=items(id,snippet)&type=video&order=relevance&safeSearch=none&maxResults=10&videoCategoryId=10"; @@ -299,112 +401,57 @@ var Search = { if((Search.submitArray.length - 1) == Search.submitArrayExpected) { socket.emit("addPlaylist", {channel: chan.toLowerCase(), songs: Search.submitArray}); /*$.each(Search.submitArray, function(i, data){ - Search.submit(data.id, data.title, data.duration, true, i, Search.submitArray.length - 1, 0, data.duration); - });*/ - document.getElementById("import_spotify").disabled = false; - Helper.removeClass("#import_spotify", "hide"); - Helper.addClass("#playlist_loader_spotify", "hide"); - Search.submitArray = []; - Search.submitArrayExpected = null; - } - }, + Search.submit(data.id, data.title, data.duration, true, i, Search.submitArray.length - 1, 0, data.duration); + });*/ + document.getElementById("import_spotify").disabled = false; + Helper.removeClass("#import_spotify", "hide"); + Helper.addClass("#playlist_loader_spotify", "hide"); + Search.submitArray = []; + Search.submitArrayExpected = null; + } +}, - submitAndClose: function(id,title,duration, start, end){ - Search.submit(id,title, duration, false, 0, 1, start, end); - Helper.setHtml("#results", ''); - Search.showSearch(); - document.getElementById("search").value = ""; - document.getElementsByTagName("body")[0].setAttribute("style", "overflow-y:auto") - Helper.setHtml("#results",""); - Helper.removeClass(".main", "blurT"); - Helper.removeClass("#controls", "blurT"); - Helper.removeClass(".main", "clickthrough"); - }, +submitAndClose: function(id,title,duration, start, end, source, thumbnail){ + Search.submit(id,title, duration, false, 0, 1, start, end, source, thumbnail); + Helper.setHtml("#results", ''); + Search.showSearch(); + document.getElementById("search").value = ""; + document.getElementsByTagName("body")[0].setAttribute("style", "overflow-y:auto") + Helper.setHtml("#results",""); + Helper.setHtml("#results-soundcloud", ""); + Helper.removeClass(".main", "blurT"); + Helper.removeClass("#controls", "blurT"); + Helper.removeClass(".main", "clickthrough"); + Helper.css(".search_results", "display", "none"); +}, - importPlaylist: function(pId,pageToken){ - token = ""; - var headers; - var datatype; - if(pageToken !== undefined) - token = "&pageToken="+pageToken; - playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&maxResults=49&key="+api_key+"&playlistId="+pId+token; - if(youtube_authenticated) { - datatype = "html"; - headers = { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer ' + access_token_data_youtube.access_token - }; - } else { - headers = {};//'Content-Type': 'application/json'}; - datatype = "jsonp"; - } - Helper.ajax({ - type: "GET", - url: playlist_url, - dataType: datatype, - //dataType:"jsonp", - headers: headers, - success: function(response) { - response = JSON.parse(response); - if(response.error){ - if(response.error.errors[0].reason == "playlistItemsNotAccessible"){ - var nonce = Helper.randomString(29); - window.callback = function(data) { - access_token_data_youtube = data; - if(access_token_data_youtube.state == nonce){ - youtube_authenticated = true; - setTimeout(function(){ - youtube_authenticated = false; - access_token_data_youtube = {}; - }, access_token_data_youtube.expires_in * 1000); - Search.importPlaylist(pId, pageToken); - } else { - access_token_data_youtube = ""; - console.error("Nonce doesn't match"); - } - youtube_window.close(); - window.callback = ""; - }; - youtube_window = window.open("/o_callback#youtube=true&nonce=" + nonce, "", "width=600, height=600"); - } else { - Helper.log([ - "import list error: ", - response.error - ]); - document.getElementById("import").disabled = false; - Helper.addClass("#playlist_loader", "hide"); - Helper.removeClass("#import", "hide"); - before_toast(); - M.toast({html: "It seems you've entered a invalid url.", displayLength: 4000}); - } - - } else { - var ids=""; - var this_length = 0; - if(typeof(response) == "string") response = JSON.parse(response); - //Search.addVideos(response.items[0].contentDetails.videoId); - //response.items.shift(); - for(var i = 0; i < response.items.length; i++) { - var data = response.items[i]; - ids+=data.contentDetails.videoId+","; - Search.submitYouTubeArrayIds.push(data.contentDetails.videoId); - this_length += 1; - Search.submitYouTubeExpected += 1; - } - - if(response.nextPageToken) { - //Search.addVideos(ids, true, 0, false, this_length); - Search.importPlaylist(pId, response.nextPageToken); - } else { - Search.addVideos(Search.submitYouTubeArrayIds); - //Search.addVideos(ids, true, Search.submitYouTubeExpected, true, this_length); - //Search.submitYouTubeExpected = 0; - } - document.getElementById("import").value = ""; - } - }, - error: function(e) { - if(e.status == 403){ +importPlaylist: function(pId,pageToken){ + token = ""; + var headers; + var datatype; + if(pageToken !== undefined) + token = "&pageToken="+pageToken; + playlist_url = "https://www.googleapis.com/youtube/v3/playlistItems?part=contentDetails&maxResults=49&key="+api_key+"&playlistId="+pId+token; + if(youtube_authenticated) { + datatype = "html"; + headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + access_token_data_youtube.access_token + }; + } else { + headers = {};//'Content-Type': 'application/json'}; + datatype = "jsonp"; + } + Helper.ajax({ + type: "GET", + url: playlist_url, + dataType: datatype, + //dataType:"jsonp", + headers: headers, + success: function(response) { + response = JSON.parse(response); + if(response.error){ + if(response.error.errors[0].reason == "playlistItemsNotAccessible"){ var nonce = Helper.randomString(29); window.callback = function(data) { access_token_data_youtube = data; @@ -434,110 +481,167 @@ var Search = { before_toast(); M.toast({html: "It seems you've entered a invalid url.", displayLength: 4000}); } - } - }); - }, - importSpotifyPlaylist: function(url){ - Helper.ajax({ - method: "get", - url: url, - headers: { - 'Authorization': 'Bearer ' + access_token_data.access_token - }, - success: function(response) { - response = JSON.parse(response); + } else { + var ids=""; + var this_length = 0; + if(typeof(response) == "string") response = JSON.parse(response); + //Search.addVideos(response.items[0].contentDetails.videoId); + //response.items.shift(); for(var i = 0; i < response.items.length; i++) { var data = response.items[i]; - //ids+=data.contentDetails.videoId+","; - Search.backgroundSearch(data.track.name, data.track.artists.map(function(elem){return elem.name;}).join(" "), Math.floor(data.track.duration_ms/1000), response.total, i + response.offset); + ids+=data.contentDetails.videoId+","; + Search.submitYouTubeArrayIds.push(data.contentDetails.videoId); + this_length += 1; + Search.submitYouTubeExpected += 1; + } + if(response.nextPageToken) { + //Search.addVideos(ids, true, 0, false, this_length); + Search.importPlaylist(pId, response.nextPageToken); + } else { + Search.addVideos(Search.submitYouTubeArrayIds); + //Search.addVideos(ids, true, Search.submitYouTubeExpected, true, this_length); + //Search.submitYouTubeExpected = 0; } - if(response.next){ - Search.importSpotifyPlaylist(response.next); - } - }, - error: function(e) { - document.getElementById("import_spotify").disabled = false; - Helper.removeClass("#import_spotify", "hide"); - Helper.addClass("#playlist_loader_spotify", "hide"); + document.getElementById("import").value = ""; + } + }, + error: function(e) { + if(e.status == 403){ + var nonce = Helper.randomString(29); + window.callback = function(data) { + access_token_data_youtube = data; + if(access_token_data_youtube.state == nonce){ + youtube_authenticated = true; + setTimeout(function(){ + youtube_authenticated = false; + access_token_data_youtube = {}; + }, access_token_data_youtube.expires_in * 1000); + Search.importPlaylist(pId, pageToken); + } else { + access_token_data_youtube = ""; + console.error("Nonce doesn't match"); + } + youtube_window.close(); + window.callback = ""; + }; + youtube_window = window.open("/o_callback#youtube=true&nonce=" + nonce, "", "width=600, height=600"); + } else { + Helper.log([ + "import list error: ", + response.error + ]); + document.getElementById("import").disabled = false; + Helper.addClass("#playlist_loader", "hide"); + Helper.removeClass("#import", "hide"); before_toast(); M.toast({html: "It seems you've entered a invalid url.", displayLength: 4000}); } - }); - }, - - addVideos: function(ids){ - var more = false; - var next_ids = []; - var request_url="https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=" + api_key + "&id="; - for(var i = 0; i < ids.length; i++) { - if(i > 48) { - more = true; - next_ids = ids.slice(i, ids.length); - break; - } - request_url += ids[i] + ","; } - Helper.ajax({ - type: "GET", - url: request_url, - success: function(response){ - response = JSON.parse(response); - var x = 0; - if(response.error) { - Search.submitYouTubeError = true; - } - for(var i = 0; i < response.items.length; i++) { - var song = response.items[i]; - var duration=Search.durationToSeconds(song.contentDetails.duration); - if(!longsongs || duration<720){ - enc_title= song.snippet.title;//encodeURIComponent(song.snippet.title); - //Search.submit(song.id, enc_title, duration, playlist, i); - x += 1; - Search.submitYouTubeArray.push({id: song.id, title: enc_title, duration: duration}); - } - } - if(more) Search.addVideos(next_ids); - else { - socket.emit("addPlaylist", {channel: chan.toLowerCase(), songs: Search.submitYouTubeArray}); - Search.submitYouTubeArray = []; - Search.submitYouTubeExpected = 0; - } - }, - error: function(e) { - console.log(e); - } - }); - }, + }); +}, - submit: function(id,title,duration, playlist, num, full_num, start, end){ - if((client || Helper.mobilecheck()) && !socket_connected) { - add_ajax(id, title, duration, playlist, num, full_num, start, end); - return; +importSpotifyPlaylist: function(url){ + Helper.ajax({ + method: "get", + url: url, + headers: { + 'Authorization': 'Bearer ' + access_token_data.access_token + }, + success: function(response) { + response = JSON.parse(response); + for(var i = 0; i < response.items.length; i++) { + var data = response.items[i]; + //ids+=data.contentDetails.videoId+","; + Search.backgroundSearch(data.track.name, data.track.artists.map(function(elem){return elem.name;}).join(" "), Math.floor(data.track.duration_ms/1000), response.total, i + response.offset); + + } + if(response.next){ + Search.importSpotifyPlaylist(response.next); + } + }, + error: function(e) { + document.getElementById("import_spotify").disabled = false; + Helper.removeClass("#import_spotify", "hide"); + Helper.addClass("#playlist_loader_spotify", "hide"); + before_toast(); + M.toast({html: "It seems you've entered a invalid url.", displayLength: 4000}); } - if(offline && document.getElementsByName("addsongs")[0].checked && document.getElementsByName("addsongs")[0].disabled){ - var found_array = []; - for(var i = 0; i < full_playlist.length; i++) { - if(full_playlist[i].id == id) found_array.push(i); - } - if(found_array.length == 0){ - List.channel_function({type: "added", start: start, end: end, value: {added: (new Date).getTime()/1000, guids: [1], id: id, title: title, duration: duration, now_playing: false, votes: 1}}); - } else { - List.vote(id, "pos"); - } - } else { - /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); - if(u == undefined) u = "";*/ - emit("add", {id: id, start: start, end: end, title: title, list: chan.toLowerCase(), duration: duration}); - }//[id, decodeURIComponent(title), adminpass, duration, playlist]); - }, + }); +}, - durationToSeconds: function(duration) { - var matches = duration.match(time_regex); - hours= parseInt(matches[12])||0; - minutes= parseInt(matches[14])||0; - seconds= parseInt(matches[16])||0; - return hours*60*60+minutes*60+seconds; +addVideos: function(ids){ + var more = false; + var next_ids = []; + var request_url="https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key=" + api_key + "&id="; + for(var i = 0; i < ids.length; i++) { + if(i > 48) { + more = true; + next_ids = ids.slice(i, ids.length); + break; + } + request_url += ids[i] + ","; } + Helper.ajax({ + type: "GET", + url: request_url, + success: function(response){ + response = JSON.parse(response); + var x = 0; + if(response.error) { + Search.submitYouTubeError = true; + } + for(var i = 0; i < response.items.length; i++) { + var song = response.items[i]; + var duration=Search.durationToSeconds(song.contentDetails.duration); + if(!longsongs || duration<720){ + enc_title= song.snippet.title;//encodeURIComponent(song.snippet.title); + //Search.submit(song.id, enc_title, duration, playlist, i); + x += 1; + Search.submitYouTubeArray.push({id: song.id, title: enc_title, duration: duration}); + } + } + if(more) Search.addVideos(next_ids); + else { + socket.emit("addPlaylist", {channel: chan.toLowerCase(), songs: Search.submitYouTubeArray}); + Search.submitYouTubeArray = []; + Search.submitYouTubeExpected = 0; + } + }, + error: function(e) { + console.log(e); + } + }); +}, + +submit: function(id,title,duration, playlist, num, full_num, start, end, source, thumbnail){ + if((client || Helper.mobilecheck()) && !socket_connected) { + add_ajax(id, title, duration, playlist, num, full_num, start, end, source, thumbnail); + return; + } + if(offline && document.getElementsByName("addsongs")[0].checked && document.getElementsByName("addsongs")[0].disabled){ + var found_array = []; + for(var i = 0; i < full_playlist.length; i++) { + if(full_playlist[i].id == id) found_array.push(i); + } + if(found_array.length == 0){ + List.channel_function({type: "added", start: start, end: end, value: {added: (new Date).getTime()/1000, guids: [1], id: id, title: title, duration: duration, now_playing: false, votes: 1}}); + } else { + List.vote(id, "pos"); + } + } else { + /*var u = Crypt.crypt_pass(Crypt.get_userpass(chan.toLowerCase()), true); + if(u == undefined) u = "";*/ + emit("add", {id: id, start: start, end: end, title: title, list: chan.toLowerCase(), duration: duration, source: source, thumbnail: thumbnail}); + }//[id, decodeURIComponent(title), adminpass, duration, playlist]); +}, + +durationToSeconds: function(duration) { + var matches = duration.match(time_regex); + hours= parseInt(matches[12])||0; + minutes= parseInt(matches[14])||0; + seconds= parseInt(matches[16])||0; + return hours*60*60+minutes*60+seconds; +} }; diff --git a/server/public/assets/js/suggestions.js b/server/public/assets/js/suggestions.js index 7141bc8b..84fb22b9 100755 --- a/server/public/assets/js/suggestions.js +++ b/server/public/assets/js/suggestions.js @@ -37,6 +37,7 @@ var Suggestions = { }, fetchYoutubeSuggests: function(id){ + if(videoSource == "soundcloud") return; var get_url = "https://www.googleapis.com/youtube/v3/search?part=snippet&relatedToVideoId="+id+"&type=video&key="+api_key; var video_urls = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails,snippet,id&key="+api_key+"&id="; diff --git a/server/public/partials/channel/players.handlebars b/server/public/partials/channel/players.handlebars index 0dd00980..3185e9d3 100644 --- a/server/public/partials/channel/players.handlebars +++ b/server/public/partials/channel/players.handlebars @@ -3,6 +3,9 @@
{{/unless}}
+
diff --git a/server/public/partials/channel/search.handlebars b/server/public/partials/channel/search.handlebars index f4e48a08..adae34e8 100644 --- a/server/public/partials/channel/search.handlebars +++ b/server/public/partials/channel/search.handlebars @@ -1,43 +1,52 @@ -
-
-
-
-
-
- Thumb - -
-
-
-
- Start/End - - / - +
+
+ +
+
+
+
+
+
+
+ Thumb +
-
- keyboard_arrow_left +
+
+
+ Start/End + + / + +
+
+ keyboard_arrow_left +
-
-
- - open_in_new - -
- playlist_add +
+ + open_in_new + +
+ playlist_add +
-
-
-
- No results found.. +
+
+ No results found.. +
+
+
+ Prev + Next
-
- Prev - Next -
-
+
Test 2
+
diff --git a/server/routing/client/api.js b/server/routing/client/api.js index 6f4e87df..07579e2a 100644 --- a/server/routing/client/api.js +++ b/server/routing/client/api.js @@ -622,7 +622,8 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { if(!fetch_only && (!req.body.hasOwnProperty('adminpass') || !req.body.hasOwnProperty('userpass') || !req.params.hasOwnProperty('channel_name') || !req.params.hasOwnProperty('video_id') || !req.body.hasOwnProperty('duration') || !req.body.hasOwnProperty('start_time') || - !req.body.hasOwnProperty('end_time') || !req.body.hasOwnProperty('title'))) { + !req.body.hasOwnProperty('end_time') || !req.body.hasOwnProperty('title') || + !req.body.hasOwnProperty('source'))) { throw "Wrong format"; } @@ -637,6 +638,8 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { var duration = parseInt(req.body.duration); var start_time = parseInt(req.body.start_time); var end_time = parseInt(req.body.end_time); + var source = req.body.source; + if(source == "soundcloud" && !req.body.hasOwnProperty("thumbnail")) throw "Wrong format"; if(duration != end_time - start_time) duration = end_time - start_time; var title = req.body.title; if(typeof(userpass) != "string" || typeof(adminpass) != "string" || @@ -715,7 +718,8 @@ router.route('/api/list/:channel_name/:video_id').post(function(req,res) { if(now_playing.length == 0 && authenticated) { set_np = true; } - var new_song = {"added": Functions.get_time(),"guids":[guid],"id":video_id,"now_playing":set_np,"title":title,"votes":1, "duration":duration, "start": parseInt(start_time), "end": parseInt(end_time), "type": song_type}; + var new_song = {"added": Functions.get_time(),"guids":[guid],"id":video_id,"now_playing":set_np,"title":title,"votes":1, "duration":duration, "start": parseInt(start_time), "end": parseInt(end_time), "type": song_type, "source": source}; + if(source == "soundcloud") new_song.thumbnail = req.body.thumbnail; Search.get_correct_info(new_song, channel_name, false, function(element, found) { if(!found) { res.status(404).send(JSON.stringify(error.not_found.youtube)); From 602f66c03b9b3d9a238777ea193d8d63d9443e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Thu, 3 May 2018 14:30:49 +0200 Subject: [PATCH 002/299] Prettier soundcloud results and search-tabs --- server/public/assets/js/search.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/public/assets/js/search.js b/server/public/assets/js/search.js index 8324fe6a..95f0c596 100755 --- a/server/public/assets/js/search.js +++ b/server/public/assets/js/search.js @@ -24,6 +24,7 @@ var Search = { Helper.css(".results-tabs", "display", "none"); document.querySelector(".search_input").value = ""; document.querySelector("#search-btn i").innerText = "search"; + Helper.css(document.querySelector(".search_results .col.s12"), "display", "none"); } else { document.querySelector("#search-btn i").innerText = "close"; Helper.css(".search_results", "display", "block"); @@ -68,6 +69,7 @@ var Search = { var output = ""; var nextPageToken = response.nextPageToken; var prevPageToken = response.prevPageToken; + Helper.css(document.querySelector(".search_results .col.s12"), "display", "block"); if(response.items.length === 0) { document.getElementById("results").innerHTML = ""; Helper.css("#results", "display", "block"); From 9a4fdda011e62da48dae6e8a37c64e0797be261a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Thu, 3 May 2018 15:32:42 +0200 Subject: [PATCH 003/299] Start-end event updated - Visual fixes - Set start-time and end-time for soundcloud player working --- server/public/assets/css/style.css | 2 +- server/public/assets/js/list.js | 1 + server/public/assets/js/listeners.js | 6 ++ server/public/assets/js/player.js | 65 ++++++++++++------- server/public/assets/js/playercontrols.js | 1 - server/public/assets/js/search.js | 32 ++++++--- .../public/partials/channel/search.handlebars | 2 +- 7 files changed, 72 insertions(+), 37 deletions(-) diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 7b31106a..b2852aff 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -1631,7 +1631,7 @@ ul #chat-log{ } #results_soundcloud #inner-results { - height: calc(100vh - 64px - 76px); + height: calc(100vh - 64px - 64px); } #search_loader_inner{ diff --git a/server/public/assets/js/list.js b/server/public/assets/js/list.js index 1787e69b..74ad95c8 100755 --- a/server/public/assets/js/list.js +++ b/server/public/assets/js/list.js @@ -356,6 +356,7 @@ var List = { full_playlist.push(now_playing); } + console.log(added.source); if(added.source != "soundcloud" && document.querySelectorAll("#suggested-"+added.id).length > 0) { number_suggested = number_suggested - 1; if(number_suggested < 0) number_suggested = 0; diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 81a7cfdd..038283f7 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -650,6 +650,7 @@ document.addEventListener("keyup", function(event) { } });*/ document.querySelector("#results").innerHTML = ""; + document.querySelector("#results_soundcloud").innerHTML = ""; document.getElementsByTagName("body")[0].setAttribute("style", "overflow-y:auto") document.querySelector("#search-btn i").innerText = "search"; document.querySelector(".search_input").value = ""; @@ -1375,10 +1376,13 @@ addListener("click", "#add-many", function(e){ end = original_length; } var source = "youtube"; + var thumbnail; if(e.getAttribute("data-type-source") != undefined) { + source = "soundcloud"; thumbnail = e.getAttribute("data-type-thumbnail"); } + console.log(start, end); console.log(source); if(start > end) { M.toast({html: "Start can't be before the end..", displayLength: 3000, classes: "red lighten"}); @@ -1387,9 +1391,11 @@ addListener("click", "#add-many", function(e){ } else { try { var length = parseInt(end) - parseInt(start); + e.parentElement.parentElement.parentElement.remove(); Search.submit(id, title, length, false, 0, 1, start, end, source, thumbnail); } catch(event) { + console.log(event); M.toast({html: "Only numbers are accepted as song start and end parameters..", displayLength: 3000, classes: "red lighten"}); } } diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index c7c7bf70..bb59f6db 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -202,7 +202,7 @@ var Player = { } } if(!paused){ - if(((!mobile_beginning || chromecastAvailable) && prev_state != 2) && autoplay) { + if(((!mobile_beginning || chromecastAvailable) && prev_state != 2) && autoplay && videoSource != "soundcloud") { Player.playVideo(); } if(!durationBegun) { @@ -251,6 +251,8 @@ var Player = { empty_clear = false; } try { + document.getElementById("play").focus(); + console.log("focused"); if(videoSource == "soundcloud") { Player.player.stopVideo(); } else { @@ -302,6 +304,11 @@ var Player = { } break; case YT.PlayerState.PLAYING: + if(videoSource == "soundcloud") { + console.log("Supposed to play soundcloud not youtube"); + Player.player.stopVideo(); + return; + } if(embed) { Helper.css("#player", "visibility", "visible"); } @@ -435,7 +442,9 @@ var Player = { chrome.cast.Image('https://img.youtube.com/vi/'+id+'/mqdefault.jpg'); } else { if(videoSource == "soundcloud") { + Player.stopVideo(); Helper.removeClass(document.getElementById("player_overlay"), "hide"); + Helper.css(document.getElementById("player_overlay"), "background-color", "#2d2d2d"); SC.Widget(Player.soundcloud_player).load(id, { auto_play: true, buying:false, @@ -443,6 +452,7 @@ var Player = { download:false, show_user:false, callback: function() { + Player.stopVideo(); SC.Widget(Player.soundcloud_player).setVolume(Crypt.get_volume()); console.log(start, seekTo); if(start == undefined) start = 0; @@ -451,7 +461,7 @@ var Player = { Helper.css(document.getElementById("player_overlay"), "background", "url('" + full_playlist[full_playlist.length - 1].thumbnail + "')"); Helper.css(document.getElementById("player_overlay"), "background-size", "auto"); Helper.css(document.getElementById("player_overlay"), "background-position", "20%"); - Helper.css(document.getElementById("player_overlay"), "background-color", document.querySelector("#controls").style.backgroundColor); + Helper.css(document.getElementById("player_overlay"), "background-color", "#2d2d2d"); Helper.addClass("#player_overlay_text", "hide"); } }); @@ -479,6 +489,8 @@ var Player = { else e = Player.np.end; if(videoSource == "soundcloud") { + Helper.removeClass(document.getElementById("player_overlay"), "hide"); + Helper.css(document.getElementById("player_overlay"), "background-color", "#2d2d2d"); SC.Widget(Player.soundcloud_player).load(id, { auto_play: false, buying:false, @@ -494,7 +506,7 @@ var Player = { Helper.css(document.getElementById("player_overlay"), "background", "url('" + full_playlist[full_playlist.length - 1].thumbnail + "')"); Helper.css(document.getElementById("player_overlay"), "background-size", "cover"); Helper.css(document.getElementById("player_overlay"), "background-position", "20%"); - Helper.css(document.getElementById("player_overlay"), "background-color", document.querySelector("#controls").style.backgroundColor); + Helper.css(document.getElementById("player_overlay"), "background-color", "#2d2d2d"); Helper.addClass("#player_overlay_text", "hide"); } }); @@ -686,6 +698,9 @@ var Player = { }, soundcloudPlay: function() { + if(videoSource == "youtube") { + SC.Widget(Player.soundcloud_player).pause(); + } if(embed) { Helper.css("#player", "visibility", "visible"); } @@ -931,8 +946,9 @@ var Player = { document.getElementById("bar").style.width = per+"%"; } if(videoSource == "soundcloud") { + SC.Widget(Player.soundcloud_player).isPaused(function(paused) { - if(Math.floor(currDurr / 1000) > Player.np.end && !paused) { + if(currDurr > Player.np.end && !paused) { end_programmatically = true; if(!offline) { @@ -988,27 +1004,7 @@ var Player = { firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - tagSearch = document.createElement('script'); - tagSearch.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; - firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tagSearch, firstScriptTag); - console.log("hello"); - tagSearch.onload = function() { - if(firstLoad == "") { - firstLoad = "search"; - _SC2 = SC; - } else { - _SC2 = SC; - SC = _SC1; - _SC1 = _SC2; - } - console.log("loaded1") - window._SC1 = _SC1; - _SC1.initialize({ - client_id: '***REMOVED***' - }); - } tag.onload = function() { if(firstLoad == "") { @@ -1017,6 +1013,27 @@ var Player = { } SC.Widget(Player.soundcloud_player); SC.Widget(Player.soundcloud_player).bind(SC.Widget.Events.READY, Player.soundcloudReady); + tagSearch = document.createElement('script'); + tagSearch.setAttribute("async", true); + tagSearch.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; + firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tagSearch, firstScriptTag); + + tagSearch.onload = function() { + if(firstLoad == "") { + firstLoad = "search"; + _SC2 = SC; + } else { + _SC2 = SC; + SC = _SC1; + _SC1 = _SC2; + } + console.log("loaded1") + window._SC1 = _SC1; + _SC1.initialize({ + client_id: '***REMOVED***' + }); + } } } } diff --git a/server/public/assets/js/playercontrols.js b/server/public/assets/js/playercontrols.js index 20371f30..bc30570c 100755 --- a/server/public/assets/js/playercontrols.js +++ b/server/public/assets/js/playercontrols.js @@ -278,7 +278,6 @@ var Playercontrols = { setVolume: function(vol) { Player.setVolume(vol); - console.log(vol); SC.Widget(Player.soundcloud_player).setVolume(vol); Playercontrols.choose_button(vol, false); if(Player.player.isMuted()) diff --git a/server/public/assets/js/search.js b/server/public/assets/js/search.js index 95f0c596..db641278 100755 --- a/server/public/assets/js/search.js +++ b/server/public/assets/js/search.js @@ -21,13 +21,13 @@ var Search = { document.getElementById("results").innerHTML = ""; document.getElementById("results_soundcloud").innerHTML = ""; Helper.css(".search_results", "display", "none"); - Helper.css(".results-tabs", "display", "none"); + //Helper.css(".results-tabs", "display", "none"); document.querySelector(".search_input").value = ""; document.querySelector("#search-btn i").innerText = "search"; - Helper.css(document.querySelector(".search_results .col.s12"), "display", "none"); + //Helper.css(document.querySelector(".search_results .col.s12"), "display", "none"); } else { document.querySelector("#search-btn i").innerText = "close"; - Helper.css(".search_results", "display", "block"); + //Helper.css(".search_results", "display", "block"); } document.querySelector("#search").focus(); @@ -57,8 +57,8 @@ var Search = { Helper.addClass(".search_loader_spinner", "active"); - Helper.removeClass(".search_results", "hide"); - Helper.css(".results-tabs", "display", "none"); + //Helper.removeClass(".search_results", "hide"); + //Helper.css(".results-tabs", "display", "none"); Helper.ajax({ type: "GET", @@ -69,11 +69,11 @@ var Search = { var output = ""; var nextPageToken = response.nextPageToken; var prevPageToken = response.prevPageToken; - Helper.css(document.querySelector(".search_results .col.s12"), "display", "block"); + //Helper.css(document.querySelector(".search_results .col.s12"), "display", "block"); if(response.items.length === 0) { document.getElementById("results").innerHTML = ""; Helper.css("#results", "display", "block"); - Helper.css(".results-tabs", "display", "block"); + //Helper.css(".results-tabs", "display", "block"); //$("").appendTo($("#results")).show("blind", 83.33); document.getElementById("results").insertAdjacentHTML("beforeend", "
"+empty_results_html+"
"); Helper.removeClass(".search_loader_spinner", "active"); @@ -162,7 +162,9 @@ var Search = { //setTimeout(function(){$(".thumb").lazyload({container: $("#results")});}, 250); Helper.removeClass(".search_loader_spinner", "active"); - Helper.css(".search_results", "display", "block"); + if(document.querySelector("#results_soundcloud").innerHTML.length > 0) { + Helper.css(".search_results", "display", "block"); + } Helper.css(".results-tabs", "display", "block"); } else if(!retried){ @@ -171,6 +173,9 @@ var Search = { //$("").appendTo($("#results")).show("blind", 83.33); document.getElementById("results").insertAdjacentHTML("beforeend", "
"+empty_results_html+"
"); Helper.css("#results", "display", "block"); + if(document.querySelector("#results_soundcloud").innerHTML.length > 0) { + Helper.css(".search_results", "display", "block"); + } Helper.removeClass(".search_loader_spinner", "active"); } } @@ -194,6 +199,7 @@ var Search = { pre_result.innerHTML = result_html.outerHTML; //$("#results").append(result_html); + //Helper.css(document.querySelector(".search_results .col.s12"), "display", "block"); var output = ""; for(var i = 0; i < tracks.length; i++) { var song = tracks[i]; @@ -207,8 +213,8 @@ var Search = { var enc_title=title;//encodeURIComponent(title).replace(/'/g, "\\\'"); var id=song.permalink_url; //duration = duration.replace("PT","").replace("H","h ").replace("M","m ").replace("S","s"); - //thumb=song.artwork_url; - var thumb = null; + var thumb=song.artwork_url; + //var thumb = null; if(thumb == null) thumb = song.waveform_url; console.log(song); //$("#results").append(result_html); @@ -217,6 +223,8 @@ var Search = { songs.querySelector(".result_info").innerText = Helper.pad(_temp_duration[0]) + ":" + Helper.pad(_temp_duration[1]); songs.querySelector(".thumb").setAttribute("src", thumb); //songs.querySelector(".add-many").attr("onclick", "submit('"+id+"','"+enc_title+"',"+secs+");"); + songs.querySelector("#add-many").setAttribute("data-type-source", "soundcloud"); + songs.querySelector("#add-many").setAttribute("data-type-thumbnail", thumb); songs.querySelector("#add-many").setAttribute("data-video-id", id); songs.querySelector("#add-many").setAttribute("data-video-title", enc_title); songs.querySelector("#add-many").setAttribute("data-video-length", secs); @@ -242,6 +250,9 @@ var Search = { document.getElementById("results_soundcloud").innerHTML = ""; //console.log(output); if(output.length > 0) { + if(document.querySelector("#results").innerHTML.length > 0) { + Helper.css(".search_results", "display", "block"); + } //$(window).scrollTop(0); /*if(!pagination && fresh) { //Helper.css(".search_results", "display", "none"); @@ -618,6 +629,7 @@ addVideos: function(ids){ }, submit: function(id,title,duration, playlist, num, full_num, start, end, source, thumbnail){ + console.log(id,title,duration, playlist, num, full_num, start, end, source, thumbnail); if((client || Helper.mobilecheck()) && !socket_connected) { add_ajax(id, title, duration, playlist, num, full_num, start, end, source, thumbnail); return; diff --git a/server/public/partials/channel/search.handlebars b/server/public/partials/channel/search.handlebars index adae34e8..2749a555 100644 --- a/server/public/partials/channel/search.handlebars +++ b/server/public/partials/channel/search.handlebars @@ -1,4 +1,4 @@ -
+ -
Test 2
+
From 1aafdf2d866b78ad0edccaa2194bbce765a66655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 1 Aug 2018 19:05:19 +0200 Subject: [PATCH 197/299] Fixed scaling-issue when showing playlist after having it 100% width --- server/public/assets/js/functions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/public/assets/js/functions.js b/server/public/assets/js/functions.js index 446683cf..b4563bcb 100644 --- a/server/public/assets/js/functions.js +++ b/server/public/assets/js/functions.js @@ -108,7 +108,7 @@ function fullVideo(hide) { document.querySelector("#playlist").classList.remove("show-only-mobile"); document.querySelector("#video-container").classList.remove("m12"); document.querySelector("#video-container").className += " m9"; - document.querySelector("main").style.maxWidth = "99%"; + document.querySelector("main").style.maxWidth = ""; document.querySelector("#hide-playlist").style.left = (document.querySelector("#video-container").offsetWidth - document.querySelector("#hide-playlist").offsetWidth) + "px"; document.querySelector("#hide-playlist .material-icons").innerText = "keyboard_arrow_right"; } From f03c53ce2afe97cbfcecd9dbf6374d4d887ac1dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 15:37:01 +0200 Subject: [PATCH 198/299] Fixed some loading-perforamance for soundcloud player --- package-lock.json | 34 ++++++++++++++++++++ package.json | 1 + server/apps/client.js | 11 +++++++ server/public/assets/js/player.js | 2 +- server/public/layouts/client/main.handlebars | 2 +- 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52cb933d..e03458fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -836,6 +836,35 @@ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, + "compressible": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "requires": { + "mime-db": ">= 1.34.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3304,6 +3333,11 @@ "version": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" + }, "mimic-response": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", diff --git a/package.json b/package.json index fee5ebdc..52bd36ce 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "bcrypt-nodejs": "0.0.3", "body-parser": "^1.17.1", "color-thief-jimp": "^2.0.2", + "compression": "^1.7.3", "cookie-parser": "^1.4.3", "cors": "^2.8.4", "express": "^4.16.3", diff --git a/server/apps/client.js b/server/apps/client.js index 55fd0f88..ac16996f 100755 --- a/server/apps/client.js +++ b/server/apps/client.js @@ -18,6 +18,7 @@ try { var add = ""; var express = require('express'); var app = express(); +var compression = require('compression'); var exphbs = require('express-handlebars'); var cors = require('cors'); @@ -27,7 +28,17 @@ var hbs = exphbs.create({ partialsDir: publicPath + '/partials' }); var uniqid = require('uniqid'); +app.use(compression({filter: shouldCompress})) +function shouldCompress (req, res) { + if (req.headers['x-no-compression']) { + // don't compress responses with this request header + return false; + } + + // fallback to standard filter function + return compression.filter(req, res); +} app.engine('handlebars', hbs.engine); app.set('view engine', 'handlebars'); diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index c80b0f5e..b0fdadca 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -698,7 +698,7 @@ var Player = { try { scPlaying = Player.soundcloud_player.isPlaying(); } catch(e){} - resizePlaylistPlaying(Player.player.getPlayerState() == YT.PlayerState.PLAYING || scPlaying || Player.player.getPlayerState() == YT.PlayerState.BUFFERING); + resizePlaylistPlaying(scPlaying); } Helper.css("#playpause", "visibility", "visible"); diff --git a/server/public/layouts/client/main.handlebars b/server/public/layouts/client/main.handlebars index 6ecf8f92..b1cd5436 100644 --- a/server/public/layouts/client/main.handlebars +++ b/server/public/layouts/client/main.handlebars @@ -83,7 +83,7 @@ {{#unless client}} - + {{/unless}} {{#unless embed}} From 795146af886cdb24ba235bcbe8829f4e5520ecd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 16:12:54 +0200 Subject: [PATCH 199/299] Fixed soundcloud loading-issue on initial channel-load --- server/public/assets/js/channel.js | 8 ++- server/public/assets/js/listeners.js | 59 +++++++++++++++----- server/public/assets/js/player.js | 29 +++++++++- server/public/layouts/client/main.handlebars | 5 +- 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/server/public/assets/js/channel.js b/server/public/assets/js/channel.js index ce949cf6..eb2763e6 100644 --- a/server/public/assets/js/channel.js +++ b/server/public/assets/js/channel.js @@ -18,17 +18,19 @@ var Channel = { } else { if(!api_key.hasOwnProperty("soundcloud")) soundcloud_enabled = false; else { - SC.initialize({ + /*SC.initialize({ client_id: api_key.soundcloud }, function() { - }); + });*/ } if(cast_ready_connect || chromecastAvailable || chromecastReady) { Helper.addClass(".volume-container", "volume-container-cast"); } if(!embed) { + console.log("qq"); + console.log(Helper.computedStyle(document.querySelector("#video-container"))); document.querySelector("#main-container").insertAdjacentHTML("beforeend", "keyboard_arrow_right
"); - document.querySelector("#hide-playlist").style.left = (document.querySelector("#video-container").offsetWidth - document.querySelector("#hide-playlist").offsetWidth) + "px"; + document.querySelector("#hide-playlist").style.left = (document.querySelector("#video-container").offsetWidth - document.querySelector("#hide-playlist").offsetWidth) + "px"; } //Player.soundcloud_player = document.querySelector("#soundcloud_player"); } diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index fa83a8b5..54307c45 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -210,21 +210,54 @@ window.addEventListener("DOMContentLoaded", function() { Frontpage.init(); } if(window.location.pathname == "/" && !client) { - tag = document.createElement('script'); - tag.src = "https://www.youtube.com/iframe_api"; - firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + if(document.querySelectorAll("script[src='https://www.youtube.com/iframe_api']").length == 1){ + try{ + Player.onYouTubeIframeAPIReady(); + //SC.Widget(Player.soundcloud_player).bind("ready", Player.soundcloudReady); - tag.onload = function() { - if(document.querySelectorAll("script[src='https://w.soundcloud.com/player/api.js']").length == 1) { - - } else { - tagSearch = document.createElement('script'); - tagSearch.setAttribute("async", true); - tagSearch.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; - firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tagSearch, firstScriptTag); + } catch(error){ + console.error(error); + console.error("Seems YouTube iFrame script isn't correctly loaded. Please reload the page."); } + try { + //Player.soundcloudReady(); + } catch(error) { + console.error(error); + console.error("Seems SoundCloud script isn't correctly loaded. Please reload the page."); + } + } else { + tag = document.createElement('script'); + tag.src = "https://www.youtube.com/iframe_api"; + firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + } + if(document.querySelectorAll("script[src='https://connect.soundcloud.com/sdk/sdk-3.3.0.js']").length == 1) { + console.log("exists"); + } else { + tagSC = document.createElement('script'); + console.log("not exists"); + if (tagSC.readyState){ //IE + tagSC.onreadystatechange = function(){ + if (tagSC.readyState == "loaded" || + tagSC.readyState == "complete"){ + tagSC.onreadystatechange = null; + SC.initialize({ + client_id: api_key.soundcloud + }, function() { + }); + } + }; + } else { //Others + tagSC.onload = function(){ + SC.initialize({ + client_id: api_key.soundcloud + }, function() { + }); + }; + } + tagSC.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; + firstScriptTagSC = document.getElementsByTagName('script')[0]; + firstScriptTagSC.parentNode.insertBefore(tagSC, firstScriptTagSC); } } diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index b0fdadca..19cb2a5e 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -729,6 +729,10 @@ var Player = { }, soundcloudReady: function() { + SC.initialize({ + client_id: api_key.soundcloud + }, function() { + }); beginning = true; player_ready = true; if(!durationBegun) { @@ -969,7 +973,7 @@ var Player = { } }, - loadPlayer: function() { + loadPlayer: function(notify) { if(document.querySelectorAll("script[src='https://www.youtube.com/iframe_api']").length == 1){ try{ Player.onYouTubeIframeAPIReady(); @@ -991,6 +995,29 @@ var Player = { firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } + if(document.querySelectorAll("script[src='https://connect.soundcloud.com/sdk/sdk-3.3.0.js']").length == 1) { + console.log("exists"); + } else { + tagSC = document.createElement('script'); + console.log("not exists"); + if (tagSC.readyState){ //IE + tagSC.onreadystatechange = function(){ + if (tagSC.readyState == "loaded" || + tagSC.readyState == "complete"){ + tagSC.onreadystatechange = null; + Player.soundcloudReady(); + } + }; + } else { //Others + tagSC.onload = function(){ + Player.soundcloudReady(); + }; + } + tagSC.src = "https://connect.soundcloud.com/sdk/sdk-3.3.0.js"; + firstScriptTagSC = document.getElementsByTagName('script')[0]; + firstScriptTagSC.parentNode.insertBefore(tagSC, firstScriptTagSC); + } + } }; diff --git a/server/public/layouts/client/main.handlebars b/server/public/layouts/client/main.handlebars index b1cd5436..54b100f0 100644 --- a/server/public/layouts/client/main.handlebars +++ b/server/public/layouts/client/main.handlebars @@ -31,7 +31,7 @@ {{/unless}} - + {{#unless embed}} - {{#unless client}} - - {{/unless}} {{#unless embed}} From 5c12c2f261fc8a7a587affbc169fdbe64dfc345f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 16:20:23 +0200 Subject: [PATCH 200/299] Added a load-screen, will test for some time and see if it helps any --- server/public/assets/css/style.css | 11 ++ server/public/layouts/client/main.handlebars | 179 ++++++++++++++++++- 2 files changed, 189 insertions(+), 1 deletion(-) diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 1a2ae0d5..1a2e46c7 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -25,6 +25,17 @@ a { outline: 0 !important; } +.initial-load { + display: none !important; +} + body { + height: auto !important; + overflow: initial !important; +} +#main-container, footer { + display: initial !important; +} + .error-code-container { background: lightgrey; border: 1px solid darkgrey; diff --git a/server/public/layouts/client/main.handlebars b/server/public/layouts/client/main.handlebars index 54b100f0..2deff7d9 100644 --- a/server/public/layouts/client/main.handlebars +++ b/server/public/layouts/client/main.handlebars @@ -31,7 +31,7 @@ {{/unless}} - + {{#unless embed}} {{/unless}} + {{{body}}} @@ -79,6 +245,17 @@
+
+
+
+
+

Loading

+
{{/unless}} From 67356b62d9af9e13c1fea81b1b301c489dc14a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 16:21:39 +0200 Subject: [PATCH 201/299] Removed some minor logs --- server/config/api_key.example.js | 2 +- server/public/assets/js/listeners.js | 16 +--------------- server/public/assets/js/player.js | 15 +++++++-------- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/server/config/api_key.example.js b/server/config/api_key.example.js index e1f9ff16..1ccbf75d 100644 --- a/server/config/api_key.example.js +++ b/server/config/api_key.example.js @@ -1,6 +1,6 @@ var api_key = { "youtube": "xxxx", - "soundcloud": "", + "soundcloud": "xx", }; try { diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 54307c45..219eb951 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -211,20 +211,7 @@ window.addEventListener("DOMContentLoaded", function() { } if(window.location.pathname == "/" && !client) { if(document.querySelectorAll("script[src='https://www.youtube.com/iframe_api']").length == 1){ - try{ - Player.onYouTubeIframeAPIReady(); - //SC.Widget(Player.soundcloud_player).bind("ready", Player.soundcloudReady); - } catch(error){ - console.error(error); - console.error("Seems YouTube iFrame script isn't correctly loaded. Please reload the page."); - } - try { - //Player.soundcloudReady(); - } catch(error) { - console.error(error); - console.error("Seems SoundCloud script isn't correctly loaded. Please reload the page."); - } } else { tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; @@ -232,10 +219,9 @@ window.addEventListener("DOMContentLoaded", function() { firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } if(document.querySelectorAll("script[src='https://connect.soundcloud.com/sdk/sdk-3.3.0.js']").length == 1) { - console.log("exists"); + } else { tagSC = document.createElement('script'); - console.log("not exists"); if (tagSC.readyState){ //IE tagSC.onreadystatechange = function(){ if (tagSC.readyState == "loaded" || diff --git a/server/public/assets/js/player.js b/server/public/assets/js/player.js index 19cb2a5e..218c58a7 100755 --- a/server/public/assets/js/player.js +++ b/server/public/assets/js/player.js @@ -983,12 +983,7 @@ var Player = { console.error(error); console.error("Seems YouTube iFrame script isn't correctly loaded. Please reload the page."); } - try { - Player.soundcloudReady(); - } catch(error) { - console.error(error); - console.error("Seems SoundCloud script isn't correctly loaded. Please reload the page."); - } + } else { tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; @@ -996,10 +991,14 @@ var Player = { firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); } if(document.querySelectorAll("script[src='https://connect.soundcloud.com/sdk/sdk-3.3.0.js']").length == 1) { - console.log("exists"); + try { + Player.soundcloudReady(); + } catch(error) { + console.error(error); + console.error("Seems SoundCloud script isn't correctly loaded. Please reload the page."); + } } else { tagSC = document.createElement('script'); - console.log("not exists"); if (tagSC.readyState){ //IE tagSC.onreadystatechange = function(){ if (tagSC.readyState == "loaded" || From 6b7bf9f58aecf4614f89c685e2edad3203863392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 16:23:12 +0200 Subject: [PATCH 202/299] Removed gulp-sourcemaps for now because of vulnerability --- gulpfile.js | 2 +- package-lock.json | 251 +--------------------------------------------- package.json | 1 - 3 files changed, 3 insertions(+), 251 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 1e240820..b1bcd680 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,7 +1,7 @@ var gulp = require('gulp'), gutil = require('gulp-util'), uglify = require('gulp-uglify'), - sourcemaps = require('gulp-sourcemaps'), + //sourcemaps = require('gulp-sourcemaps'), concat = require('gulp-concat'); gulp.task('js', function () { diff --git a/package-lock.json b/package-lock.json index e03458fd..67af678e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,34 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - } - }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -56,11 +28,6 @@ } } }, - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" - }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -238,11 +205,6 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, - "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -916,11 +878,6 @@ "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "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=" - }, "cookie": { "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==" @@ -999,35 +956,6 @@ } } }, - "css": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", - "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", - "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "^0.10.9" - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1060,31 +988,6 @@ "ms": "2.0.0" } }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1168,11 +1071,6 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" - }, "dns-prefetch-control": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", @@ -1323,51 +1221,11 @@ "has-binary2": "~1.0.2" } }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1383,15 +1241,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "exif-parser": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", @@ -2418,31 +2267,6 @@ } } }, - "gulp-sourcemaps": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz", - "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=", - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, "gulp-uglify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", @@ -2953,11 +2777,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -3225,14 +3044,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "~0.10.2" - } - }, "macaddress": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", @@ -3277,21 +3088,6 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memoizee": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz", - "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==", - "requires": { - "d": "1", - "es5-ext": "^0.10.30", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.2" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3697,11 +3493,6 @@ "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, "nocache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", @@ -3732,14 +3523,6 @@ "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, "notepack.io": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/notepack.io/-/notepack.io-2.1.2.tgz", @@ -4332,7 +4115,8 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.2", @@ -4909,23 +4693,6 @@ "amdefine": ">=0.0.4" } }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "requires": { - "atob": "^2.1.1", - "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": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, "sparkles": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", @@ -5073,11 +4840,6 @@ "is-utf8": "^0.2.0" } }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -5260,15 +5022,6 @@ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" }, - "timers-ext": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz", - "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==", - "requires": { - "es5-ext": "~0.10.14", - "next-tick": "1" - } - }, "tinycolor2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", diff --git a/package.json b/package.json index 52bd36ce..3a1a49fd 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "express-sessions": "^1.0.6", "farmhash": "^2.1.0", "gulp": "^3.9.1", - "gulp-sourcemaps": "^2.6.4", "gulp-uglify": "^3.0.0", "gulp-uglifyjs": "^0.6.2", "gulp-util": "^3.0.8", From 836ad10500851e6e1033e62bf861e4d2d5bf6c6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 16:32:22 +0200 Subject: [PATCH 203/299] Revert "Added a load-screen" --- server/public/assets/css/style.css | 11 -- server/public/layouts/client/main.handlebars | 179 +------------------ 2 files changed, 1 insertion(+), 189 deletions(-) diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 1a2e46c7..1a2ae0d5 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -25,17 +25,6 @@ a { outline: 0 !important; } -.initial-load { - display: none !important; -} - body { - height: auto !important; - overflow: initial !important; -} -#main-container, footer { - display: initial !important; -} - .error-code-container { background: lightgrey; border: 1px solid darkgrey; diff --git a/server/public/layouts/client/main.handlebars b/server/public/layouts/client/main.handlebars index 2deff7d9..54b100f0 100644 --- a/server/public/layouts/client/main.handlebars +++ b/server/public/layouts/client/main.handlebars @@ -31,7 +31,7 @@ {{/unless}} - + {{#unless embed}} {{/unless}} - {{{body}}} @@ -245,17 +79,6 @@
-
-
-
-
-

Loading

-
{{/unless}} From b79b0cc1681d94484d060e3b10f282eaa29d1437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 21:24:02 +0200 Subject: [PATCH 204/299] Minify-css and remove spectrum css --- gulpfile.js | 30 +- package-lock.json | 1969 ++++++++++++------ package.json | 10 +- server/public/assets/js/channel.js | 5 +- server/public/layouts/client/main.handlebars | 7 +- 5 files changed, 1364 insertions(+), 657 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index b1bcd680..ea171bbd 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,7 +2,32 @@ var gulp = require('gulp'), gutil = require('gulp-util'), uglify = require('gulp-uglify'), //sourcemaps = require('gulp-sourcemaps'), - concat = require('gulp-concat'); + concat = require('gulp-concat'), + cssnano = require('gulp-cssnano'); + +gulp.task('css', function() { + return gulp.src('server/public/assets/css/style.css') + .pipe(cssnano({ + preset: ['default', { + discardComments: { + removeAll: true, + }, + }] + })) + .pipe(gulp.dest('server/public/assets/dist')); +}); + +gulp.task('css-embed', function() { + return gulp.src('server/public/assets/css/embed.css') + .pipe(cssnano({ + preset: ['default', { + discardComments: { + removeAll: true, + }, + }] + })) + .pipe(gulp.dest('server/public/assets/dist')); +}); gulp.task('js', function () { return gulp.src(['server/VERSION.js', 'server/config/api_key.js', 'server/public/assets/js/*.js', '!server/public/assets/js/embed*', '!server/public/assets/js/token*', '!server/public/assets/js/remotecontroller.js', '!server/public/assets/js/callback.js']) @@ -60,7 +85,7 @@ gulp.task('callback', function () { }); gulp.task('build', function() { - return gulp.run(['js', 'embed', 'remotecontroller', 'callback', 'token']); + return gulp.run(['css', 'css-embed', 'js', 'embed', 'remotecontroller', 'callback', 'token']); }) gulp.task('remotecontroller', function () { @@ -79,6 +104,7 @@ gulp.task('remotecontroller', function () { gulp.task('default', function(){ gulp.watch(['server/VERSION.js', 'server/public/assets/js/*.js'], ['js']); + gulp.watch(['server/public/assets/css/*.css'], ['css']); gulp.watch(['server/public/assets/js/token*.js', 'server/public/assets/js/helpers.js'], ['token']); gulp.watch(['server/VERSION.js', 'server/public/assets/js/*.js'], ['embed']); gulp.watch(['server/VERSION.js', 'server/public/assets/js/callback.js', 'server/public/assets/js/helpers.js'], ['callback']); diff --git a/package-lock.json b/package-lock.json index 67af678e..5c53bd4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,15 +54,31 @@ "repeat-string": "^1.5.2" } }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, + "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": "^0.1.0" + } + }, "ansi-gray": { "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": "0.1.0" } @@ -70,90 +86,65 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==", - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "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=" + "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": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "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=" + "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=" + "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=" + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true }, "array-flatten": { "version": "1.1.1", @@ -163,17 +154,20 @@ "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "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=" + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true }, "arraybuffer.slice": { "version": "0.0.7", @@ -193,7 +187,8 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true }, "async": { "version": "1.5.2", @@ -205,6 +200,20 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, + "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.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -237,6 +246,7 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -251,6 +261,7 @@ "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" } @@ -284,7 +295,8 @@ "beeper": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true }, "better-assert": { "version": "1.0.2", @@ -299,44 +311,6 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "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=" - }, - "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==", - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "blob": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", @@ -459,6 +433,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -478,6 +453,7 @@ "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" } @@ -486,6 +462,7 @@ "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.0" } @@ -493,38 +470,36 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, + "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" + } + }, "bson": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" }, - "buffer-alloc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.1.0.tgz", - "integrity": "sha1-BVFNM78WVtNUDGhPZbEgLpDsowM=", - "requires": { - "buffer-alloc-unsafe": "^0.1.0", - "buffer-fill": "^0.1.0" - } - }, - "buffer-alloc-unsafe": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-0.1.1.tgz", - "integrity": "sha1-/+H2dVHdBVc33iUzN7/oU9+rGmo=" - }, "buffer-equal": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" }, - "buffer-fill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-0.1.1.tgz", - "integrity": "sha512-YgBMBzdRLEfgxJIGu2wrvI2E03tMCFU1p7d1KhB4BOoMN0VxmTFjSyN5JtKt9z8Z9JajMHruI6SE25W96wNv7Q==" + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "buffer-shims": { "version": "1.0.0", @@ -540,6 +515,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -560,13 +536,32 @@ "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "optional": true }, "camelize": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, + "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.30000875", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000875.tgz", + "integrity": "sha512-L1YQcIv8YPymJpbQyO8uM2KEkEVsuFcQRO2vNp0n4GNGAmq0f8GWQKUCTqZHvsyX2EeOO4aLWgc3qCH6zMWFag==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -576,6 +571,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "optional": true, "requires": { "align-text": "^0.1.3", "lazy-cache": "^1.0.3" @@ -585,6 +581,7 @@ "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", @@ -593,15 +590,20 @@ "supports-color": "^2.0.0" } }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "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": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -613,6 +615,7 @@ "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" } @@ -621,6 +624,7 @@ "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": "^3.0.2" }, @@ -629,6 +633,7 @@ "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" } @@ -639,6 +644,7 @@ "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": "^3.0.2" }, @@ -647,6 +653,7 @@ "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" } @@ -657,6 +664,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -666,7 +674,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -674,6 +683,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "optional": true, "requires": { "center-align": "^0.1.1", "right-align": "^0.1.1", @@ -683,14 +693,16 @@ "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "optional": true } } }, "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true }, "clone-buffer": { "version": "1.0.0", @@ -701,7 +713,8 @@ "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true }, "cloneable-readable": { "version": "1.1.2", @@ -751,24 +764,65 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "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.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "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": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true }, "color-thief-jimp": { "version": "2.0.2", @@ -778,10 +832,28 @@ "jimp": "^0.2.21" } }, + "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.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, "commander": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==", + "dev": true }, "component-bind": { "version": "1.0.0", @@ -859,11 +931,6 @@ "qs": ">= 0.4.0" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -875,12 +942,14 @@ "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" }, "content-type": { - "version": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, "cookie-parser": { "version": "1.4.3", @@ -904,18 +973,21 @@ } }, "cookie-signature": { - "version": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cors": { "version": "2.8.4", @@ -956,6 +1028,78 @@ } } }, + "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 + }, + "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" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -979,10 +1123,12 @@ "dateformat": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" @@ -996,25 +1142,14 @@ "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=" - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "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" } @@ -1032,29 +1167,33 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "depd": { - "version": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha512-Jlk9xvkTDGXwZiIDyoM7+3AsuvJVoyOpRupvEVy9nX3YO3/ieZxhlgh8GpLNZ8AY7HjO6y2YwpMSh1ejhu3uIw==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "deprecated": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", - "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=" + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true }, "destroy": { "version": "1.0.4", @@ -1064,12 +1203,8 @@ "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true }, "dns-prefetch-control": { "version": "0.1.0", @@ -1095,6 +1230,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, "requires": { "readable-stream": "~1.1.9" } @@ -1115,9 +1251,15 @@ }, "ee-first": { "version": "1.1.1", - "resolved": "", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "electron-to-chromium": { + "version": "1.3.55", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.55.tgz", + "integrity": "sha1-8VDhCyC3fZ1Br8yjEu/gw7Gn/c4=", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1127,6 +1269,7 @@ "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": "~1.3.0" }, @@ -1135,6 +1278,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, "requires": { "wrappy": "1" } @@ -1142,7 +1286,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true } } }, @@ -1234,7 +1379,14 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true }, "etag": { "version": "1.8.1", @@ -1250,6 +1402,7 @@ "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": "^2.3.3", "define-property": "^0.2.5", @@ -1264,6 +1417,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -1272,6 +1426,7 @@ "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" } @@ -1280,6 +1435,7 @@ "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.0" } @@ -1288,6 +1444,7 @@ "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": "^3.0.2" }, @@ -1296,6 +1453,7 @@ "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" } @@ -1306,6 +1464,7 @@ "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": "^3.0.2" }, @@ -1314,6 +1473,7 @@ "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" } @@ -1324,6 +1484,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -1333,24 +1494,22 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "expand-template": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", - "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==" - }, "expand-tilde": { "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": "^1.0.1" } @@ -1424,6 +1583,16 @@ "mime-db": "~1.33.0" } }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", @@ -1678,6 +1847,7 @@ "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": "^1.0.0", "is-extendable": "^1.0.1" @@ -1687,6 +1857,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -1697,6 +1868,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -1712,6 +1884,7 @@ "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" } @@ -1720,6 +1893,7 @@ "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.0" } @@ -1735,21 +1909,13 @@ "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": "^0.1.1", "color-support": "^1.1.3", "time-stamp": "^1.0.0" } }, - "farmhash": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-2.1.0.tgz", - "integrity": "sha512-X2cdtc4AxiH3tVdJ/h87dOU22Ojt3JYruw3L0gAp/SJzHqUUoxMcYzX7wnVzSUeEj6CwzOwcY+v6vdfP0KVx2g==", - "requires": { - "nan": "^2.10.0", - "prebuild-install": "^2.5.3" - } - }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", @@ -1769,6 +1935,7 @@ "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": "^2.0.1", "is-number": "^3.0.0", @@ -1780,6 +1947,7 @@ "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.0" } @@ -1810,12 +1978,14 @@ "find-index": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true }, "findup-sync": { "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": "^1.0.0", "is-glob": "^3.1.0", @@ -1827,6 +1997,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, "requires": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", @@ -1838,12 +2009,20 @@ "first-chunk-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true }, "flagged-respawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=" + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true }, "for-each": { "version": "0.3.2", @@ -1856,12 +2035,14 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "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": "^1.0.1" } @@ -1927,6 +2108,7 @@ "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": "^0.2.2" } @@ -1941,42 +2123,16 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "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" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, "gaze": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, "requires": { "globule": "~0.1.0" } @@ -1984,7 +2140,8 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true }, "getpass": { "version": "0.1.7", @@ -2001,11 +2158,6 @@ } } }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, "glob": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", @@ -2029,6 +2181,7 @@ "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": "^4.3.1", "glob2base": "^0.0.12", @@ -2041,12 +2194,14 @@ "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "glob": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -2057,12 +2212,14 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, "requires": { "brace-expansion": "^1.0.0" } @@ -2071,6 +2228,7 @@ "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", @@ -2082,6 +2240,7 @@ "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" @@ -2090,7 +2249,8 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true } } }, @@ -2098,6 +2258,7 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, "requires": { "gaze": "^0.5.1" } @@ -2106,6 +2267,7 @@ "version": "0.0.12", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, "requires": { "find-index": "^0.1.1" } @@ -2123,6 +2285,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, "requires": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -2133,6 +2296,7 @@ "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": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -2145,6 +2309,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, "requires": { "glob": "~3.1.21", "lodash": "~1.0.1", @@ -2155,6 +2320,7 @@ "version": "3.1.21", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, "requires": { "graceful-fs": "~1.2.0", "inherits": "1", @@ -2164,17 +2330,20 @@ "graceful-fs": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true }, "inherits": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true }, "minimatch": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, "requires": { "lru-cache": "2", "sigmund": "~1.0.0" @@ -2186,6 +2355,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "dev": true, "requires": { "sparkles": "^1.0.0" } @@ -2199,6 +2369,7 @@ "version": "3.9.1", "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, "requires": { "archy": "^1.0.0", "chalk": "^1.0.0", @@ -2218,7 +2389,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -2267,15 +2439,38 @@ } } }, + "gulp-cssnano": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz", + "integrity": "sha512-r8qdX5pTXsBb/IRm9loE8Ijz8UiPW/URMC/bKJe4FPNHRaz4aEx8Bev03L0FYHd/7BSGu/ebmfumAkpGuTdenA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "cssnano": "^3.0.0", + "object-assign": "^4.0.1", + "plugin-error": "^1.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } + }, "gulp-uglify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", - "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.1.tgz", + "integrity": "sha512-KVffbGY9d4Wv90bW/B1KZJyunLMyfHTBbilpDvmcrj5Go0/a1G3uVpt+1gRBWSw/11dqR3coJ1oWNTt1AiXuWQ==", + "dev": true, "requires": { "gulplog": "^1.0.0", "has-gulplog": "^0.1.0", "lodash": "^4.13.1", "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", "through2": "^2.0.0", "uglify-js": "^3.0.5", "vinyl-sourcemaps-apply": "^0.2.0" @@ -2284,17 +2479,20 @@ "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "uglify-js": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.3.tgz", - "integrity": "sha512-RbOgGjF04sFUNSi8xGOTB9AmtVmMmVVAL5a7lxIgJ8urejJen+priq0ooRIHHa8AXI/dSvNF9yYMz9OP4PhybQ==", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.6.tgz", + "integrity": "sha512-O1D7L6WcOzS1qW2ehopEm4cWm5yA6bQBozlks8jO8ODxYCy4zv+bR/la4Lwp01tpkYGNonnpXvUpYtrvSu8Yzg==", + "dev": true, "requires": { "commander": "~2.16.0", "source-map": "~0.6.1" @@ -2302,20 +2500,11 @@ } } }, - "gulp-uglifyjs": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/gulp-uglifyjs/-/gulp-uglifyjs-0.6.2.tgz", - "integrity": "sha1-eTGFUD/PDzASVd3dtdrn99h0aGI=", - "requires": { - "gulp-util": "^3.0.4", - "through": "^2.3.4", - "uglify-js": "^2.4.13" - } - }, "gulp-util": { "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": "^1.0.0", "array-uniq": "^1.0.2", @@ -2340,7 +2529,8 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -2348,6 +2538,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, "requires": { "glogg": "^1.0.0" } @@ -2377,10 +2568,20 @@ "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "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": "^2.0.0" } @@ -2405,10 +2606,17 @@ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" }, + "has-flag": { + "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": "0.1.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, "requires": { "sparkles": "^1.0.0" } @@ -2418,15 +2626,11 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "has-value": { "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": "^2.0.6", "has-values": "^1.0.0", @@ -2437,6 +2641,7 @@ "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": "^3.0.0", "kind-of": "^4.0.0" @@ -2446,6 +2651,7 @@ "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": "^1.1.5" } @@ -2508,6 +2714,7 @@ "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": "^1.0.0" } @@ -2527,26 +2734,21 @@ "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" }, + "html-comment-regex": { + "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.6.2.tgz", - "integrity": "sha512-STnYGcKMXL9CGdtpeTFnLmgMSHTTNQJSHxiC4DETHKf934Q160Ht5pljrNeH24S0O9xUN+9vsDJZdZtk5js6Ww==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.1", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - } + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" } }, "http-signature": { @@ -2603,6 +2805,12 @@ "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -2632,12 +2840,14 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true }, "ip": { "version": "1.1.5", @@ -2658,15 +2868,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "requires": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, + "is-absolute-url": { + "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": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" }, @@ -2674,7 +2892,8 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -2687,6 +2906,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, "requires": { "kind-of": "^6.0.0" }, @@ -2694,7 +2914,8 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -2702,6 +2923,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2711,27 +2933,22 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-function": { "version": "1.0.1", @@ -2742,6 +2959,7 @@ "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": "^2.1.0" } @@ -2750,6 +2968,7 @@ "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": "^3.0.2" } @@ -2758,6 +2977,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, "requires": { "is-number": "^4.0.0" }, @@ -2765,14 +2985,22 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true } } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "requires": { "isobject": "^3.0.1" } @@ -2781,14 +3009,25 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, "requires": { "is-unc-path": "^1.0.0" } }, + "is-svg": { + "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": "^1.1.0" + } + }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, "requires": { "unc-path-regex": "^0.1.2" } @@ -2796,27 +3035,32 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true }, "jimp": { "version": "0.2.28", @@ -2846,6 +3090,22 @@ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" }, + "js-base64": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz", + "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==", + "dev": true + }, + "js-yaml": { + "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": "^1.0.7", + "esprima": "^2.6.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -2878,12 +3138,14 @@ "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "optional": true }, "liftoff": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, "requires": { "extend": "^3.0.0", "findup-sync": "^2.0.0", @@ -2898,7 +3160,8 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true } } }, @@ -2919,57 +3182,68 @@ "lodash": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true }, "lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true }, "lodash._basetostring": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true }, "lodash._basevalues": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true }, "lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true }, "lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true }, "lodash._reescape": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true }, "lodash._reevaluate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true }, "lodash._root": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true }, "lodash.escape": { "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": "^3.0.0" } @@ -2982,23 +3256,32 @@ "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true }, "lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true }, "lodash.keys": { "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": "^3.0.0", "lodash.isarguments": "^3.0.0", "lodash.isarray": "^3.0.0" } }, + "lodash.memoize": { + "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.reduce": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", @@ -3007,12 +3290,14 @@ "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true }, "lodash.template": { "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": "^3.0.0", "lodash._basetostring": "^3.0.0", @@ -3029,11 +3314,18 @@ "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": "^3.0.0", "lodash.escape": "^3.0.0" } }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -3042,7 +3334,8 @@ "lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true }, "macaddress": { "version": "0.2.8", @@ -3052,12 +3345,14 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, "make-error-cause": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, "requires": { "make-error": "^1.2.0" } @@ -3066,6 +3361,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz", "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=", + "dev": true, "requires": { "kind-of": "^3.1.0" } @@ -3073,16 +3369,24 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true }, "map-visit": { "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": "^1.0.0" } }, + "math-expression-evaluator": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", + "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3102,6 +3406,7 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -3121,24 +3426,21 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, "mime": { - "version": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" }, - "mimic-response": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", - "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" - }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", @@ -3164,6 +3466,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -3173,6 +3476,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -3180,15 +3484,16 @@ } }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } @@ -3437,13 +3742,14 @@ }, "ms": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multipipe": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, "requires": { "duplexer2": "0.0.2" } @@ -3453,15 +3759,11 @@ "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" - }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -3480,74 +3782,74 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, "natives": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", - "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==" + "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", + "dev": true }, "negotiator": { - "version": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "nocache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" }, - "node-abi": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.1.tgz", - "integrity": "sha512-pUlswqpHQ7zGPI9lGjZ4XDNIEUDbHxsltfIRb7dTnYdhgHWHOcB0MLZKLoCz6UMcGzSPG5wGl1HODZVQAUsH6w==", - "requires": { - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - } - } - }, "nodemailer": { "version": "4.6.4", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.6.4.tgz", "integrity": "sha512-SD4uuX7NMzZ5f5m1XHDd13J4UC3SmdJk8DsmU1g6Nrs5h3x9LcXr6EBPZIqXRJ3LrF7RdklzGhZRF/TuylTcLg==" }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + "normalize-range": { + "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": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } }, "notepack.io": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/notepack.io/-/notepack.io-2.1.2.tgz", "integrity": "sha1-lKR/XkzkrOHz1xsnxvg8cWM5PFI=" }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "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", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true }, "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=" + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true }, "object-component": { "version": "0.0.3", @@ -3558,6 +3860,7 @@ "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": "^0.1.0", "define-property": "^0.2.5", @@ -3568,6 +3871,7 @@ "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" } @@ -3576,6 +3880,7 @@ "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": "^3.0.2" } @@ -3584,6 +3889,7 @@ "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": "^3.0.2" } @@ -3592,6 +3898,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -3601,7 +3908,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } } @@ -3616,6 +3924,7 @@ "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": "^3.0.0" } @@ -3635,6 +3944,7 @@ "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": "^1.0.1", "array-slice": "^1.0.0", @@ -3646,6 +3956,7 @@ "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": "^1.0.0", "make-iterator": "^1.0.0" @@ -3655,13 +3966,15 @@ "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": "^3.0.1" } }, "on-finished": { - "version": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "requires": { "ee-first": "1.1.1" } @@ -3699,6 +4012,7 @@ "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": "~0.1.5", "sequencify": "~0.0.7", @@ -3708,12 +4022,14 @@ "ordered-read-streams": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", - "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=" + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "parse-bmfont-ascii": { "version": "1.0.6", @@ -3738,6 +4054,7 @@ "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": "^1.0.0", "map-cache": "^0.2.0", @@ -3761,7 +4078,8 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "parseqs": { "version": "0.0.5", @@ -3780,13 +4098,15 @@ } }, "parseurl": { - "version": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha512-DjIMrEiCuzD/Xsr69WhcPCTeb6iZP5JgL/DZ3cYz0zMnyiXiscoqC6LLV2dYwQHfy9O+twCDVVPiFWb7xZhaOw==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "passport": { "version": "0.4.0", @@ -3818,12 +4138,14 @@ "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true }, "path-root": { "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": "^0.1.0" } @@ -3831,7 +4153,8 @@ "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -3861,6 +4184,18 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" }, + "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.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, "pngjs": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.1.tgz", @@ -3869,41 +4204,340 @@ "posix-character-classes": { "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=" + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true }, - "prebuild-install": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.3.tgz", - "integrity": "sha512-/rI36cN2g7vDQnKWN8Uzupi++KjyqS9iS+/fpwG4Ea8d0Pip0PQ5bshUNzVwt+/D2MRfhVAplYMMvWLqWrCF/g==", + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-abi": "^2.2.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", - "rc": "^1.1.6", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "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": "^1.0.0" + } } } }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-convert-values": { + "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": "^5.0.11", + "postcss-value-parser": "^3.1.2" + } + }, + "postcss-discard-comments": { + "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": "^5.0.14" + } + }, + "postcss-discard-duplicates": { + "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": "^5.0.4" + } + }, + "postcss-discard-empty": { + "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": "^5.0.14" + } + }, + "postcss-discard-overridden": { + "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": "^5.0.16" + } + }, + "postcss-discard-unused": { + "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": "^5.0.14", + "uniqs": "^2.0.0" + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + } + }, + "postcss-merge-idents": { + "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": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + } + }, + "postcss-merge-longhand": { + "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": "^5.0.4" + } + }, + "postcss-merge-rules": { + "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": "^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": "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": "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": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "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": "^5.0.12", + "postcss-value-parser": "^3.3.0" + } + }, + "postcss-minify-params": { + "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": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "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": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + } + }, + "postcss-normalize-charset": { + "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": "^5.0.5" + } + }, + "postcss-normalize-url": { + "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": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + } + }, + "postcss-ordered-values": { + "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": "^5.0.4", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-reduce-idents": { + "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": "^5.0.4", + "postcss-value-parser": "^3.0.2" + } + }, + "postcss-reduce-initial": { + "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": "^5.0.4" + } + }, + "postcss-reduce-transforms": { + "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": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + } + }, + "postcss-selector-parser": { + "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": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "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": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + } + }, + "postcss-unique-selectors": { + "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": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "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": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true }, "process": { "version": "0.5.2", @@ -3913,7 +4547,8 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "promise": { "version": "7.3.1", @@ -3932,33 +4567,39 @@ "ipaddr.js": "1.6.0" } }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - } - } - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "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": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + } + } }, "random-bytes": { "version": "1.0.0", @@ -4019,24 +4660,6 @@ } } }, - "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "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", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, "read-chunk": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", @@ -4046,6 +4669,7 @@ "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": "~1.0.0", "inherits": "~2.0.1", @@ -4056,12 +4680,14 @@ "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true } } }, @@ -4069,6 +4695,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, "requires": { "resolve": "^1.1.6" } @@ -4093,6 +4720,42 @@ "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" }, + "reduce-css-calc": { + "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": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "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": "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": "^0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, "referrer-policy": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", @@ -4102,6 +4765,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -4121,7 +4785,8 @@ "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true }, "repeat-string": { "version": "1.6.1", @@ -4131,7 +4796,8 @@ "replace-ext": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true }, "request": { "version": "2.85.0", @@ -4258,6 +4924,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", + "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -4266,6 +4933,7 @@ "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": "^2.0.0", "global-modules": "^1.0.0" @@ -4273,35 +4941,40 @@ }, "resolve-from": { "version": "2.0.0", - "resolved": "", + "resolved": false, "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "optional": true, "requires": { "align-text": "^0.1.1" } }, "safe-buffer": { - "version": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, "requires": { "ret": "~0.1.10" } @@ -4319,7 +4992,8 @@ "semver": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true }, "send": { "version": "0.16.2", @@ -4346,6 +5020,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", @@ -4356,7 +5035,8 @@ "sequencify": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", - "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=" + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true }, "serve-static": { "version": "1.13.2", @@ -4369,15 +5049,11 @@ "send": "0.16.2" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -4389,6 +5065,7 @@ "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.0" } @@ -4396,34 +5073,15 @@ } }, "setprototypeof": { - "version": "1.0.3", - "resolved": "", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", - "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", - "requires": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true }, "sliced": { "version": "1.0.1", @@ -4434,6 +5092,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -4448,12 +5107,14 @@ "atob": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==" + "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "dev": true }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -4462,6 +5123,7 @@ "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" } @@ -4470,6 +5132,7 @@ "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.0" } @@ -4478,6 +5141,7 @@ "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": "^3.0.2" }, @@ -4486,6 +5150,7 @@ "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" } @@ -4496,6 +5161,7 @@ "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": "^3.0.2" }, @@ -4504,6 +5170,7 @@ "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" } @@ -4514,6 +5181,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -4523,22 +5191,26 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-resolve": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, "requires": { "atob": "^2.0.0", "decode-uri-component": "^0.2.0", @@ -4550,7 +5222,8 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true } } }, @@ -4558,6 +5231,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -4568,6 +5242,7 @@ "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" } @@ -4578,6 +5253,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, "requires": { "kind-of": "^3.2.0" } @@ -4614,8 +5290,9 @@ } }, "socket.io-adapter": { - "version": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha512-a8zS9B5yaggPHh4odsSZJmMmHsVi4eOym5zIjTALl6GQCkOCghorCGQjBCke3WKbY14lgHh7L1E7ZBZy8/sYrQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" }, "socket.io-client": { "version": "2.1.0", @@ -4685,6 +5362,15 @@ "uid2": "0.0.3" } }, + "sort-keys": { + "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": "^1.0.0" + } + }, "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", @@ -4696,20 +5382,29 @@ "sparkles": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=" + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, "requires": { "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "static-extend": { "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": "^0.2.5", "object-copy": "^0.1.0" @@ -4719,6 +5414,7 @@ "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" } @@ -4727,6 +5423,7 @@ "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": "^3.0.2" }, @@ -4735,6 +5432,7 @@ "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" } @@ -4745,6 +5443,7 @@ "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": "^3.0.2" }, @@ -4753,6 +5452,7 @@ "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" } @@ -4763,6 +5463,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -4772,7 +5473,8 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true } } }, @@ -4793,7 +5495,8 @@ "stream-consume": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==" + "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==", + "dev": true }, "stream-to": { "version": "0.2.2", @@ -4808,25 +5511,23 @@ "stream-to": "~0.2.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "strict-uri-encode": { + "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 }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "strip-ansi": { "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": "^2.0.0" } @@ -4835,111 +5536,38 @@ "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": "^1.0.0", "is-utf8": "^0.2.0" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true }, - "tar-fs": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.2.tgz", - "integrity": "sha512-LdknWjPEiZC1nOBwhv0JBzfJBGPJar08dZg2rwZe0ZTLQoRGEzgrl7vF3qUEkCHpI/wN9e7RyCuDhMsJUCLPPQ==", + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, "requires": { - "chownr": "^1.0.1", - "mkdirp": "^0.5.1", - "pump": "^1.0.0", - "tar-stream": "^1.1.2" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - }, - "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } + "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" } }, - "tar-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.0.tgz", - "integrity": "sha512-lh2iAPG/BHNmN6WB9Ybdynk9rEJ5GD/dy4zscHmVlwa1dq2tpE+BH78i5vjYwYVWEaOXGBjzxr89aVACF17Cpw==", - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.0.0", - "to-buffer": "^1.1.0", - "xtend": "^4.0.0" - }, - "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==", - "requires": { - "once": "^1.4.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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==", - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -4948,27 +5576,32 @@ "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "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", @@ -4982,12 +5615,14 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true }, "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" } @@ -4995,12 +5630,14 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true } } }, @@ -5013,6 +5650,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, "requires": { "os-homedir": "^1.0.0" } @@ -5020,7 +5658,8 @@ "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true }, "tinycolor2": { "version": "1.4.1", @@ -5032,11 +5671,6 @@ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, "to-mongodb-core": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-mongodb-core/-/to-mongodb-core-2.0.0.tgz", @@ -5046,6 +5680,7 @@ "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": "^3.0.2" } @@ -5054,6 +5689,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -5065,6 +5701,7 @@ "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": "^3.0.0", "repeat-string": "^1.6.1" @@ -5122,6 +5759,7 @@ "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "optional": true, "requires": { "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", @@ -5131,7 +5769,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true } } }, @@ -5162,12 +5801,14 @@ "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true }, "union-value": { "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": "^3.1.0", "get-value": "^2.0.6", @@ -5179,6 +5820,7 @@ "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.0" } @@ -5187,6 +5829,7 @@ "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": "^2.0.1", "is-extendable": "^0.1.1", @@ -5196,6 +5839,12 @@ } } }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, "uniqid": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", @@ -5204,19 +5853,28 @@ "macaddress": "^0.2.8" } }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, "unique-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", - "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=" + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true }, "unpipe": { - "version": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "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": "^0.3.1", "isobject": "^3.0.0" @@ -5226,6 +5884,7 @@ "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": "^2.0.3", "has-values": "^0.1.4", @@ -5236,6 +5895,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -5245,19 +5905,22 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true } } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true }, "url-regex": { "version": "3.2.0", @@ -5271,6 +5934,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, "requires": { "kind-of": "^6.0.2" }, @@ -5278,35 +5942,47 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "utils-merge": { - "version": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "v8flags": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, "requires": { "user-home": "^1.1.1" } }, "vary": { - "version": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", + "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==", + "dev": true }, "verror": { "version": "1.10.0", @@ -5334,6 +6010,7 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -5344,6 +6021,7 @@ "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": "^1.0.0", "glob-stream": "^3.1.5", @@ -5358,17 +6036,20 @@ "clone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "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=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "graceful-fs": { "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": "^1.1.0" } @@ -5376,17 +6057,20 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -5395,6 +6079,7 @@ "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", @@ -5406,6 +6091,7 @@ "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" @@ -5415,6 +6101,7 @@ "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" @@ -5423,7 +6110,8 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true } } }, @@ -5431,6 +6119,7 @@ "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": "^0.5.1" }, @@ -5438,35 +6127,31 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, + "whet.extend": { + "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": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "^2.0.0" } }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "^1.0.2" - } - }, "window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "optional": true }, "wordwrap": { "version": "0.0.3", @@ -5529,13 +6214,15 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha512-iTwvhNBRetXWe81+VcIw5YeadVSWyze7uA7nVnpP13ulrpnJ3UfQm5ApGnrkmxDJFdrblRdZs0EvaTCIfei5oQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "optional": true, "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", diff --git a/package.json b/package.json index 3a1a49fd..f2732d28 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Zoff, the shared YouTube based radio services", "main": "server/app.js", "scripts": { - "start": "gulp build && node server/app.js", + "start": "npm install --only=dev && npm install && gulp build && node server/app.js", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -22,7 +22,8 @@ "devDependencies": { "gulp": "~3.9.0", "gulp-concat": "^2.6.1", - "gulp-uglifyjs": "~0.6.2", + "gulp-cssnano": "^2.1.3", + "gulp-uglify": "^3.0.1", "gulp-util": "~3.0.6" }, "homepage": "https://github.com/zoff-music/zoff#readme", @@ -39,11 +40,6 @@ "express-recaptcha": "^3.0.1", "express-session": "^1.15.6", "express-sessions": "^1.0.6", - "farmhash": "^2.1.0", - "gulp": "^3.9.1", - "gulp-uglify": "^3.0.0", - "gulp-uglifyjs": "^0.6.2", - "gulp-util": "^3.0.8", "helmet": "^3.12.0", "jimp": "^0.2.28", "mongodb": "^2.2.35", diff --git a/server/public/assets/js/channel.js b/server/public/assets/js/channel.js index eb2763e6..f97daa83 100644 --- a/server/public/assets/js/channel.js +++ b/server/public/assets/js/channel.js @@ -27,8 +27,6 @@ var Channel = { Helper.addClass(".volume-container", "volume-container-cast"); } if(!embed) { - console.log("qq"); - console.log(Helper.computedStyle(document.querySelector("#video-container"))); document.querySelector("#main-container").insertAdjacentHTML("beforeend", "
keyboard_arrow_right
"); document.querySelector("#hide-playlist").style.left = (document.querySelector("#video-container").offsetWidth - document.querySelector("#hide-playlist").offsetWidth) + "px"; } @@ -578,9 +576,10 @@ var Channel = { Helper.css("#embed-button", "display", "none"); if(!Helper.mobilecheck()) { - Helper.tooltip('.castButton', "destroy"); + Helper.tooltip(".castButton", "destroy"); Helper.tooltip("#viewers", "destroy"); Helper.tooltip("#offline-mode", "destroy"); + Helper.tooltip("search-btn", "destroy"); Helper.tooltip('#fullscreen', "destroy"); if(M.Tooltip.getInstance(document.getElementById("admin-lock")) != undefined) { Helper.tooltip('#admin-lock', "destroy"); diff --git a/server/public/layouts/client/main.handlebars b/server/public/layouts/client/main.handlebars index 54b100f0..3e962f85 100644 --- a/server/public/layouts/client/main.handlebars +++ b/server/public/layouts/client/main.handlebars @@ -24,17 +24,16 @@ {{#unless embed}} - {{/unless}} - + {{#unless embed}} - {{#unless embed}} - + {{/unless}} From 1255940682909ba53fdc69ab9f21d32ea3c264b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 22:21:53 +0200 Subject: [PATCH 205/299] Started work on fetching frontpage-lists at the same time as sending the html --- server/public/assets/css/style.css | 4 -- server/public/assets/js/frontpage.js | 4 +- .../partials/frontpage/channel.handlebars | 57 ++++++++++-------- .../partials/frontpage/channels.handlebars | 6 +- .../partials/frontpage/header.handlebars | 5 +- server/routing/client/router.js | 59 ++++++++++++++++++- 6 files changed, 99 insertions(+), 36 deletions(-) diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 1a2ae0d5..7726ec47 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -899,10 +899,6 @@ nav .zbrand{ height: 120px; } -#channels{ - display: none; -} - .white-bg{ background-color:white !important; } diff --git a/server/public/assets/js/frontpage.js b/server/public/assets/js/frontpage.js index 2a5a736f..9fe17e5a 100755 --- a/server/public/assets/js/frontpage.js +++ b/server/public/assets/js/frontpage.js @@ -269,7 +269,7 @@ var Frontpage = { if(window.location.hostname == "fb.zoff.me") { add = "https://zoff.me"; } - Helper.ajax({ + /*Helper.ajax({ url: add + "/api/frontpages", method: "get", success: function(response){ @@ -282,7 +282,7 @@ var Frontpage = { Frontpage.get_frontpage_lists(); }, 3000); }, - }); + });*/ }, start_snowfall: function() { diff --git a/server/public/partials/frontpage/channel.handlebars b/server/public/partials/frontpage/channel.handlebars index 4bec4a5e..7ba97e27 100644 --- a/server/public/partials/frontpage/channel.handlebars +++ b/server/public/partials/frontpage/channel.handlebars @@ -1,26 +1,31 @@ -
  • - -
  • + +
  • + +
  • diff --git a/server/public/partials/frontpage/channels.handlebars b/server/public/partials/frontpage/channels.handlebars index 2aaadd3c..b2f53965 100644 --- a/server/public/partials/frontpage/channels.handlebars +++ b/server/public/partials/frontpage/channels.handlebars @@ -1,5 +1,9 @@
      - {{> frontpage/channel}} + {{#each channels}} + {{#if frontpage}} + {{> frontpage/channel}} + {{/if}} + {{/each}}
    diff --git a/server/public/partials/frontpage/header.handlebars b/server/public/partials/frontpage/header.handlebars index cc576944..08948e9c 100644 --- a/server/public/partials/frontpage/header.handlebars +++ b/server/public/partials/frontpage/header.handlebars @@ -4,7 +4,10 @@ -
    +
    + visibility + {{viewers}} +
      {{#if client}}
    • Client
    • diff --git a/server/routing/client/router.js b/server/routing/client/router.js index 81bd6529..b91ad2bb 100644 --- a/server/routing/client/router.js +++ b/server/routing/client/router.js @@ -7,6 +7,8 @@ var analytics = "xx"; var mongojs = require('mongojs'); var token_db = mongojs("tokens"); var Functions = require(pathThumbnails + '/handlers/functions.js'); + +var db = require(pathThumbnails + '/handlers/db.js'); //var db = require(pathThumbnails + '/handlers/db.js'); try { @@ -142,14 +144,67 @@ function root(req, res, next) { embed: false, client: false, og_image: "https://zoff.me/assets/images/small-square.jpg", + channels: [], } if(subdomain[0] == "client") { data.client = true; } - res.render('layouts/client/frontpage', data); + var project_object = { + "_id": 1, + "count": 1, + "frontpage": 1, + "id": 1, + "title": 1, + "viewers": 1, + "pinned": 1, + "description": 1, + "thumbnail": { + $ifNull: [ {$cond: { + "if": { + "$or": [ + { "$eq": [ "$thumbnail", ""] }, + { "$eq": [ "$thumbnail", null] }, + { "$eq": [ "$thumbnail", undefined] } + ] + }, + then: { + $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] + }, + else: "$thumbnail" + }}, { $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]}] + + } + }; + db.collection("frontpage_lists").aggregate([ + { + "$match": { + frontpage: true, + count: {$gt: 0}, + } + }, + { + "$project": project_object + }, + { + "$sort" : { + "pinned": -1, + "count": -1, + "accessed": -1, + "title": 1 + } + }, + ], function(err, docs) { + db.collection("connected_users").find({"_id": "total_users"}, function(err, tot) { + data.channels = docs.slice(0, 12); + data.channel_list = docs; + data.viewers = tot[0].total_users.length; + res.render('layouts/client/frontpage', data); + }); + }); + } } catch(e) { - //console.log(e); + console.log(e); //res.redirect("https://zoff.me"); } } From 7d6a54ae109aac871e8a2aa39a8618d91470140e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Wed, 8 Aug 2018 22:54:41 +0200 Subject: [PATCH 206/299] Working updating of playlist and populating --- server/public/assets/css/style.css | 5 + server/public/assets/js/frontpage.js | 201 ++++++++++-------- server/public/assets/js/listeners.js | 2 +- .../layouts/client/frontpage.handlebars | 4 +- .../partials/frontpage/channel.handlebars | 5 +- .../partials/frontpage/channels.handlebars | 8 + server/routing/client/router.js | 17 +- 7 files changed, 140 insertions(+), 102 deletions(-) diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 7726ec47..ffb9e5b7 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -899,6 +899,11 @@ nav .zbrand{ height: 120px; } +.description_text { + color: #2d2d2d; + text-align: left; +} + .white-bg{ background-color:white !important; } diff --git a/server/public/assets/js/frontpage.js b/server/public/assets/js/frontpage.js index 9fe17e5a..7351c956 100755 --- a/server/public/assets/js/frontpage.js +++ b/server/public/assets/js/frontpage.js @@ -13,113 +13,121 @@ var Frontpage = { all_channels: [], - frontpage_function: function(msg) { + frontpage_function: function() { frontpage = true; Helper.log([ "Frontpage fetch", msg ]); - Frontpage.all_channels = msg.channels; - if(msg.channels.length == 0) { + Frontpage.all_channels = lists; + var msg = lists; + delete lists; + lists = undefined; + document.querySelector("#lists-script").remove(); + if(msg.length == 0) { Helper.css("#preloader", "display", "none"); document.getElementById("channel-list-container").insertAdjacentHTML("beforeend", "

      No channels yet

      "); } else { - Frontpage.populate_channels(msg.channels, true); + console.log(msg); + Frontpage.populate_channels(msg, true, false); } - Frontpage.set_viewers(msg.viewers); + //Frontpage.set_viewers(msg.viewers); }, - populate_channels: function(lists, popular) { - document.getElementById("channels").innerHTML = ""; + populate_channels: function(lists, popular, set) { + //document.getElementById("channels").innerHTML = ""; var num = 0; - - if(popular) { - lists = lists.sort(Helper.predicate({ - name: 'pinned', - reverse: true - }, { - name: 'viewers', - reverse: true - }, { - name: 'accessed', - reverse: true - }, { - name: 'count', - reverse: true - })); - } else { - lists = lists.sort(Helper.predicate({ - name: 'viewers', - reverse: true - }, { - name: 'count', - reverse: true - })); - } - - if(!Helper.mobilecheck()) { - clearTimeout(rotation_timeout); - Frontpage.add_backdrop(lists, 0); - } - - pre_card = channel_list; - - Helper.log([ - "Pre_card: ", - pre_card - ]); - - for(var x in lists) { - //console.log(lists[x]._id); - var chan = Helper.decodeChannelName(lists[x]._id); - if(num<12 || !popular) { - var id = lists[x].id; - var viewers = lists[x].viewers; - var description = lists[x].description; - var img; - img = "background-image:url('https://img.youtube.com/vi/"+id+"/hqdefault.jpg');"; - if(lists[x].thumbnail && lists[x].thumbnail != "") { - img = "background-image:url('" + lists[x].thumbnail + "');"; - } - - var song_count = lists[x].count; - var card = document.createElement("div"); - card.innerHTML += pre_card; - //card.innerHTML = card.children[0]; - if(song_count > 3) { - if(lists[x].pinned == 1) { - card.querySelector(".pin").setAttribute("style", "display:block;"); - //card.find(".card").attr("title", "Featured list"); - } else { - /*card.find(".pin").attr("style", "display:none;"); - card.find(".card").attr("title", "");*/ - card.querySelector(".pin").remove(); - } - card.querySelector(".chan-name").innerText = chan; - card.querySelector(".chan-name").setAttribute("title", chan); - card.querySelector(".chan-views").innerText = viewers; - card.querySelector(".chan-songs").innerText = song_count; - card.querySelector(".chan-bg").setAttribute("style", img); - card.querySelector(".chan-link").setAttribute("href", chan + "/"); - - if(description != "" && description != undefined && !Helper.mobilecheck()) { - card.querySelector(".card-title").innerText = chan; - card.querySelector(".description_text").innerText = description; - description = ""; - } else { - card.querySelector(".card-reveal").remove(); - Helper.removeClass(card.querySelector(".card"), "sticky-action") - } - - document.getElementById("channels").insertAdjacentHTML("beforeend", card.children[0].innerHTML); - } else { - num--; - } - + if(!set) Frontpage.add_backdrop(lists, 0); + else if(set) { + document.getElementById("channels").innerHTML = ""; + if(popular) { + lists = lists.sort(Helper.predicate({ + name: 'pinned', + reverse: true + }, { + name: 'viewers', + reverse: true + }, { + name: 'accessed', + reverse: true + }, { + name: 'count', + reverse: true + })); + } else { + lists = lists.sort(Helper.predicate({ + name: 'viewers', + reverse: true + }, { + name: 'count', + reverse: true + })); + } + + if(!Helper.mobilecheck()) { + clearTimeout(rotation_timeout); + Frontpage.add_backdrop(lists, 0); + } + + pre_card = channel_list; + + Helper.log([ + "Pre_card: ", + pre_card + ]); + + for(var x in lists) { + //console.log(lists[x]._id); + var chan = Helper.decodeChannelName(lists[x]._id); + if(num<12 || !popular) { + var id = lists[x].id; + var viewers = lists[x].viewers; + var description = lists[x].description; + var img; + img = "background-image:url('https://img.youtube.com/vi/"+id+"/hqdefault.jpg');"; + if(lists[x].thumbnail && lists[x].thumbnail != "") { + img = "background-image:url('" + lists[x].thumbnail + "');"; + } + + var song_count = lists[x].count; + var card = document.createElement("div"); + card.innerHTML += pre_card; + //card.innerHTML = card.children[0]; + if(song_count > 3) { + if(lists[x].pinned == 1) { + card.querySelector(".pin").setAttribute("style", "display:block;"); + //card.find(".card").attr("title", "Featured list"); + } else { + /*card.find(".pin").attr("style", "display:none;"); + card.find(".card").attr("title", ""); + card.querySelector(".pin").remove();*/ + } + card.querySelector(".chan-name").innerText = chan; + card.querySelector(".chan-name").setAttribute("title", chan); + card.querySelector(".chan-views").innerText = viewers; + card.querySelector(".chan-songs").innerText = song_count; + card.querySelector(".chan-bg").setAttribute("style", img); + card.querySelector(".chan-link").setAttribute("href", chan + "/"); + + if(description != "" && description != undefined && !Helper.mobilecheck()) { + card.querySelector(".card-title").innerText = chan; + card.querySelector(".description_text").innerText = description; + description = ""; + } else { + //card.querySelector(".card-reveal").remove(); + Helper.removeClass(card.querySelector(".card"), "sticky-action") + } + + document.getElementById("channels").insertAdjacentHTML("beforeend", card.children[0].innerHTML); + } else { + num--; + } + + } + num++; } - num++; } var options_list = lists.slice(); @@ -148,7 +156,7 @@ var Frontpage = { }, }); - document.getElementById("preloader").style.display = "none"; + //document.getElementById("preloader").style.display = "none"; document.getElementById("channels").style.display = "block"; //Materialize.fadeInImage('#channels'); //$("#channels").fadeIn(800); @@ -269,6 +277,7 @@ var Frontpage = { if(window.location.hostname == "fb.zoff.me") { add = "https://zoff.me"; } + Frontpage.frontpage_function(); /*Helper.ajax({ url: add + "/api/frontpages", method: "get", @@ -430,7 +439,11 @@ var Frontpage = { Helper.addClass("footer", "hide"); } - channel_list = document.getElementById("channel-list-container").cloneNode(true).innerHTML; + channel_list = document.querySelector(".hidden-channel-list").cloneNode(true).innerHTML; + console.log(channel_list); + try { + document.querySelector(".hidden-channel-list").remove(); + }catch(e){} if(window.location.hostname != "fb.zoff.me") Frontpage.share_link_modifier(); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 219eb951..e147955d 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -959,7 +959,7 @@ addListener("click", "#aprilfools", function(){ addListener("change", '#view_channels_select', function(event) { var that = this; if(currently_showing_channels != parseInt(that.target.value)) { - Frontpage.populate_channels(Frontpage.all_channels, (parseInt(that.target.value) == 1 ? true : false)); + Frontpage.populate_channels(Frontpage.all_channels, (parseInt(that.target.value) == 1 ? true : false), true); } currently_showing_channels = parseInt(that.target.value); }); diff --git a/server/public/layouts/client/frontpage.handlebars b/server/public/layouts/client/frontpage.handlebars index 93aecbf3..1bd243e4 100755 --- a/server/public/layouts/client/frontpage.handlebars +++ b/server/public/layouts/client/frontpage.handlebars @@ -18,9 +18,9 @@
    -
    + {{> frontpage/channels}}
    diff --git a/server/public/partials/frontpage/channel.handlebars b/server/public/partials/frontpage/channel.handlebars index 7ba97e27..057ae1db 100644 --- a/server/public/partials/frontpage/channel.handlebars +++ b/server/public/partials/frontpage/channel.handlebars @@ -1,7 +1,7 @@
  • diff --git a/server/public/partials/frontpage/channels.handlebars b/server/public/partials/frontpage/channels.handlebars index b2f53965..96b70a8d 100644 --- a/server/public/partials/frontpage/channels.handlebars +++ b/server/public/partials/frontpage/channels.handlebars @@ -6,4 +6,12 @@ {{/if}} {{/each}} +
    +
      + {{>frontpage/channel}} +
    +
    +
    diff --git a/server/routing/client/router.js b/server/routing/client/router.js index b91ad2bb..531a93b1 100644 --- a/server/routing/client/router.js +++ b/server/routing/client/router.js @@ -157,7 +157,20 @@ function root(req, res, next) { "title": 1, "viewers": 1, "pinned": 1, - "description": 1, + "description": { + $ifNull: [ {$cond: { + "if": { + "$or": [ + { "$eq": [ "$description", ""] }, + { "$eq": [ "$description", null] }, + { "$eq": [ "$description", undefined] } + ] + }, + then: "This list has no description", + else: "$description" + }}, "This list has no description"] + + }, "thumbnail": { $ifNull: [ {$cond: { "if": { @@ -196,7 +209,7 @@ function root(req, res, next) { ], function(err, docs) { db.collection("connected_users").find({"_id": "total_users"}, function(err, tot) { data.channels = docs.slice(0, 12); - data.channel_list = docs; + data.channel_list = JSON.stringify(docs); data.viewers = tot[0].total_users.length; res.render('layouts/client/frontpage', data); }); From dfbce195a065f4d5e3a58082fb29a00ffbf9efeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Fri, 10 Aug 2018 11:51:28 +0200 Subject: [PATCH 207/299] More instant frontpage-loading, and sorting frontpages on the backend for consistency --- server/handlers/frontpage.js | 63 ++++++++++++++++ server/public/assets/css/style.css | 13 ++++ server/public/assets/js/channel.js | 6 ++ server/public/assets/js/frontpage.js | 27 ++++--- server/public/assets/js/listeners.js | 22 +++++- .../layouts/client/frontpage.handlebars | 7 +- .../partials/frontpage/channel.handlebars | 6 +- .../partials/frontpage/channels.handlebars | 17 +++-- .../partials/frontpage/header.handlebars | 2 +- server/routing/client/api.js | 3 +- server/routing/client/router.js | 71 +++---------------- 11 files changed, 147 insertions(+), 90 deletions(-) diff --git a/server/handlers/frontpage.js b/server/handlers/frontpage.js index 78ce9eb7..ccb57917 100644 --- a/server/handlers/frontpage.js +++ b/server/handlers/frontpage.js @@ -19,6 +19,68 @@ function frontpage_lists(msg, socket) { }); } +function get_frontpage_lists(callback) { + var project_object = { + "_id": 1, + "count": 1, + "frontpage": 1, + "id": 1, + "title": 1, + "viewers": 1, + "pinned": 1, + "description": { + $ifNull: [ {$cond: { + "if": { + "$or": [ + { "$eq": [ "$description", ""] }, + { "$eq": [ "$description", null] }, + { "$eq": [ "$description", undefined] } + ] + }, + then: "This list has no description", + else: "$description" + }}, "This list has no description"] + + }, + "thumbnail": { + $ifNull: [ {$cond: { + "if": { + "$or": [ + { "$eq": [ "$thumbnail", ""] }, + { "$eq": [ "$thumbnail", null] }, + { "$eq": [ "$thumbnail", undefined] } + ] + }, + then: { + $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"] + }, + else: "$thumbnail" + }}, { $concat : [ "https://img.youtube.com/vi/", "$id", "/mqdefault.jpg"]}] + + } + }; + db.collection("frontpage_lists").aggregate([ + { + "$match": { + frontpage: true, + count: {$gt: 0}, + } + }, + { + "$project": project_object + }, + { + "$sort" : { + "pinned": -1, + "viewers": -1, + "count": -1, + "accessed": -1, + "title": 1 + } + }, + ], callback); +} + function update_frontpage(coll, id, title, thumbnail, source, callback) { //coll = coll.replace(/ /g,''); db.collection("frontpage_lists").find({_id: coll}, function(e, doc) { @@ -38,5 +100,6 @@ if(doc.length > 0 && ((doc[0].thumbnail != "" && doc[0].thumbnail != undefined & }); } +module.exports.get_frontpage_lists = get_frontpage_lists; module.exports.frontpage_lists = frontpage_lists; module.exports.update_frontpage = update_frontpage; diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index ffb9e5b7..f9bb94f7 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -899,6 +899,19 @@ nav .zbrand{ height: 120px; } +.no-jump-select { + height: calc(3rem + 1px) !important; + margin: 0 0 8px 0; + display: flex; + justify-content: space-between; + border-bottom: 1px solid #9e9e9e; + align-items: center; + font-size: 16px; + + line-height: 3rem; + color: #000; +} + .description_text { color: #2d2d2d; text-align: left; diff --git a/server/public/assets/js/channel.js b/server/public/assets/js/channel.js index f97daa83..4f2e42c1 100644 --- a/server/public/assets/js/channel.js +++ b/server/public/assets/js/channel.js @@ -677,6 +677,12 @@ var Channel = { var response = document.createElement("div"); response.innerHTML = e; + + var newList = response.querySelector("#lists-script").innerHTML; + newList = newList.trim().replace("window.lists = ", ""); + newList = newList.substring(0, newList.length); + window.lists = JSON.parse(newList); + response.querySelector("#lists-script").remove(); Helper.removeElement("#sidenav-overlay"); document.getElementsByTagName("main")[0].className = "center-align container"; Helper.removeClass("#main-container", "channelpage"); diff --git a/server/public/assets/js/frontpage.js b/server/public/assets/js/frontpage.js index 7351c956..0d308d81 100755 --- a/server/public/assets/js/frontpage.js +++ b/server/public/assets/js/frontpage.js @@ -20,16 +20,16 @@ var Frontpage = { "Frontpage fetch", msg ]); - Frontpage.all_channels = lists; - var msg = lists; - delete lists; - lists = undefined; - document.querySelector("#lists-script").remove(); + + Frontpage.all_channels = window.lists; + var msg = window.lists; + delete window.lists; + window.lists = undefined; + //document.querySelector("#lists-script").remove(); if(msg.length == 0) { Helper.css("#preloader", "display", "none"); document.getElementById("channel-list-container").insertAdjacentHTML("beforeend", "

    No channels yet

    "); } else { - console.log(msg); Frontpage.populate_channels(msg, true, false); } //Frontpage.set_viewers(msg.viewers); @@ -79,7 +79,6 @@ var Frontpage = { ]); for(var x in lists) { - //console.log(lists[x]._id); var chan = Helper.decodeChannelName(lists[x]._id); if(num<12 || !popular) { var id = lists[x].id; @@ -160,7 +159,7 @@ var Frontpage = { document.getElementById("channels").style.display = "block"; //Materialize.fadeInImage('#channels'); //$("#channels").fadeIn(800); - document.getElementById("autocomplete-input").focus(); + //document.getElementById("autocomplete-input").focus(); num = 0; }, @@ -264,7 +263,7 @@ var Frontpage = { if(Frontpage.times_rotated == 50 && frontpage){ Frontpage.times_rotated = 0; i = 0; - Frontpage.get_frontpage_lists(); + //Frontpage.get_frontpage_lists(); }else if(frontpage){ Frontpage.times_rotated += 1; Frontpage.add_backdrop(list, i+1); @@ -440,12 +439,11 @@ var Frontpage = { } channel_list = document.querySelector(".hidden-channel-list").cloneNode(true).innerHTML; - console.log(channel_list); try { document.querySelector(".hidden-channel-list").remove(); }catch(e){} - if(window.location.hostname != "fb.zoff.me") Frontpage.share_link_modifier(); + Frontpage.share_link_modifier(); if(window.location.hostname == "zoff.me" || window.location.hostname == "fb.zoff.me") add = "https://zoff.me"; else add = window.location.hostname; @@ -464,10 +462,11 @@ var Frontpage = { setup_playlist_listener(); } - M.Modal.init(document.getElementById("about")); + /*M.Modal.init(document.getElementById("about")); M.Modal.init(document.getElementById("help")); - M.Modal.init(document.getElementById("contact")); + M.Modal.init(document.getElementById("contact"));*/ var elem = document.querySelector('select'); + document.querySelector(".no-jump-select").remove(); M.FormSelect.init(elem); Helper.log([ @@ -516,7 +515,7 @@ var Frontpage = { if(!localStorage.ok_cookie){ before_toast(); - M.toast({html: "We're using cookies to enhance your experience! ok", displayLength: 10000}); + //M.toast({html: "We're using cookies to enhance your experience! ok", displayLength: 10000}); } //var pad = 0; diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index e147955d..fd8d9d38 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -941,11 +941,11 @@ addListener("click", ".first_page", function(event){ addListener("click", ".donate-button", function(event) { this.preventDefault(); + M.Modal.init(document.getElementById("donate")); ga('send', 'event', "button-click", "donate"); M.Modal.getInstance(document.getElementById("donate")).open(); }); - addListener("click", '#toast-container', function(){ before_toast(); }); @@ -1223,14 +1223,32 @@ addListener("click", "#twitter-code-link", function() { }); addListener("click", ".help-button-footer", function() { + this.preventDefault(); + M.Modal.init(document.getElementById("help")); ga('send', 'event', "button-click", "help-footer"); + M.Modal.getInstance(document.getElementById("help")).open(); }); addListener("click", "#embed-button", function() { + this.preventDefault(); + M.Modal.init(document.getElementById("embed")); ga('send', 'event', "button-click", "embed-channel", "channel-name", chan.toLowerCase()); -}) + M.Modal.getInstance(document.getElementById("embed")).open(); +}); +addListener("click", "#contact-button", function() { + this.preventDefault(); + M.Modal.init(document.getElementById("contact")); + ga('send', 'event', "button-click", "contact-footer"); + M.Modal.getInstance(document.getElementById("contact")).open(); +}); +addListener("click", ".about-button", function() { + this.preventDefault(); + M.Modal.init(document.getElementById("about")); + ga('send', 'event', "button-click", "contact-footer"); + M.Modal.getInstance(document.getElementById("about")).open(); +}); addListener("click", ".playlist-link", function(event){ chat_active = false; diff --git a/server/public/layouts/client/frontpage.handlebars b/server/public/layouts/client/frontpage.handlebars index 1bd243e4..a5063f8f 100755 --- a/server/public/layouts/client/frontpage.handlebars +++ b/server/public/layouts/client/frontpage.handlebars @@ -10,6 +10,10 @@
    +
    + Most Popular + +
    checkX
    "); + } else { + document.querySelector("#" + dest + "_cont").insertAdjacentHTML("beforeend", "
    " + decodeChannelName(resp[x].channel) + "
    checkX
    "); + } + } +} + +function loaded() { + ajax({ + type: "GET", + headers: { + "Content-Type": "application/json" + }, url: "/api/api_token", success: function(response) { if(response.length == 0) { - if(!$(".header-api-fields").hasClass("hide")) { - $(".header-api-fields").addClass("hide"); - } + addClass(".header-api-fields", "hide"); return; } - $(".header-api-fields").removeClass("hide"); + removeClass(".header-api-fields", "hide"); for(var i = 0; i < response.length; i++) { - var to_add = api_token_list.clone(); - to_add.find(".api_token_limit").val(response[i].limit); - to_add.attr("id", response[i]._id); - to_add.find(".api_token_name").text(response[i].name); - to_add.find(".api_token_usage").text(response[i].usage); - to_add.find(".api_token_origin").text(response[i].origin); - to_add.find(".update_api_token").attr("id", response[i]._id + "-update"); - to_add.find(".api_token_limit").attr("id", response[i]._id + "-limit"); - to_add.find(".delete_api_token").attr("id", response[i]._id + "-delete"); - to_add.find(".delete_api_token").attr("data-id", response[i]._id); - to_add.find(".update_api_token").attr("data-id", response[i]._id); + var to_add = api_token_list.cloneNode(true); + + to_add.querySelector(".api_token_limit").value = response[i].limit; + to_add.setAttribute("id", response[i]._id); + to_add.querySelector(".api_token_name").innerText = response[i].name; + to_add.querySelector(".api_token_usage").innerText = response[i].usage; + to_add.querySelector(".api_token_origin").innerText = response[i].origin; + to_add.querySelector(".update_api_token").setAttribute("id", response[i]._id + "-update"); + to_add.querySelector(".api_token_limit").setAttribute("id", response[i]._id + "-limit"); + to_add.querySelector(".delete_api_token").setAttribute("id", response[i]._id + "-delete"); + to_add.querySelector(".delete_api_token").setAttribute("data-id", response[i]._id); + to_add.querySelector(".update_api_token").setAttribute("data-id", response[i]._id); if(response[i].active) { - to_add.find(".check").removeClass("hide"); + removeClass(to_add.querySelector(".check"), "hide"); } else { - to_add.find(".uncheck").removeClass("hide"); + removeClass(to_add.querySelector(".uncheck"), "hide"); } - $("#api_keys").append(to_add); + document.querySelector("#api_keys").insertAdjacentHTML("beforeend", to_add.innerHTML); } }, error: function(err) { } }); - $.ajax({ + ajax({ type: "GET", + headers: { + "Content-Type": "application/json" + }, url: "/api/lists", success: function(response){ response = response.sort(predicate({ @@ -160,411 +576,71 @@ function loaded() { output_delete += ""; } - $("#frontpage_pinned").html(output_pinned); - $("#remove_thumbnail").html($("#frontpage_pinned").clone().html()); - $("#remove_description").html($("#frontpage_pinned").clone().html()); - $("#delete_list_name").html($("#frontpage_pinned").clone().html()); - $("#delete_userpass_name").html($("#frontpage_pinned").clone().html()); - $("#delete_channel_name").html($("#frontpage_pinned").clone().html()); - $("select").material_select(); - - if(!$(".preloader-wrapper").hasClass("hide")) { - $(".preloader-wrapper").addClass("hide") + document.querySelector("#frontpage_pinned").innerHTML = output_pinned; + document.querySelector("#remove_thumbnail").innerHTML = document.querySelector("#frontpage_pinned").cloneNode(true).innerHTML; + document.querySelector("#remove_description").innerHTML = document.querySelector("#frontpage_pinned").cloneNode(true).innerHTML; + document.querySelector("#delete_list_name").innerHTML = document.querySelector("#frontpage_pinned").cloneNode(true).innerHTML; + document.querySelector("#delete_userpass_name").innerHTML = document.querySelector("#frontpage_pinned").cloneNode(true).innerHTML; + document.querySelector("#delete_channel_name").innerHTML = document.querySelector("#frontpage_pinned").cloneNode(true).innerHTML; + var selects = document.querySelectorAll("select"); + for(var i = 0; i < selects.length; i++) { + M.FormSelect.init(selects[i]); } - $(".channel_things").removeClass("hide"); + + addClass(".preloader-wrapper", "hide"); + removeClass(".channel_things", "hide"); } }); - $.ajax({ + ajax({ type: "GET", url: "/api/names", + headers: { + "Content-Type": "application/json" + }, success: function(response) { for(var i = 0; i < response.length; i++) { var icon = ""; if(response[i].icon && response[i].icon != "") { icon = "" + response[i]._id + ""; } - $(".names-container").append("
    " + icon + response[i]._id + "
    check
    "); + document.querySelector(".names-container").insertAdjacentHTML("beforeend", "
    " + icon + response[i]._id + "
    check
    "); } }, }); - $.ajax({ + ajax({ type: "GET", url: "/api/thumbnails", + headers: { + "Content-Type": "application/json" + }, success: function(response){ if(response.length > 0){ - $(".thumbnails-badge").removeClass("hide"); - $(".thumbnails-badge").text(response.length); + removeClass(".thumbnails-badge", "hide"); + document.querySelector(".thumbnails-badge").innerText = response.length; } + console.log(response); add_to_tab("thumbnails", response); } }); - $.ajax({ + ajax({ type: "GET", url: "/api/descriptions", + headers: { + "Content-Type": "application/json" + }, success: function(response){ if(response.length > 0){ - $(".descriptions-badge").removeClass("hide"); - $(".descriptions-badge").text(response.length); + removeClass(".descriptions-badge", "hide"); + document.querySelector(".descriptions-badge").innerText = response.length; } add_to_tab("descriptions", response); } }); } -$(document).on("click", ".approve_name", function(e) { - var that = this; - var name = $(that).attr("data-name"); - var value = $("." + name + "_input").val(); - $.ajax({ - type: "POST", - url: "/api/names", - data: { - icon: value, - name: name, - }, - success: function(resp) { - if(resp == true) { - Materialize.toast("Approved image!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", ".thumbnail_link", function(e) { - e.preventDefault(); - window.open("https:" + this.value,'_blank'); -}); - -function add_to_tab(dest, resp){ - for(var x = 0; x < resp.length; x++){ - if(dest == "thumbnails"){ - $("#" + dest + "_cont").append("
    " + decodeChannelName(resp[x].channel) + "
    checkX
    "); - } else { - $("#" + dest + "_cont").append("
    " + decodeChannelName(resp[x].channel) + "
    checkX
    "); - } - } -} - -$(document).on("click", "#get_token", function(e){ - e.preventDefault(); - $.ajax({ - type: "GET", - url: "/api/token", - success: function(response){ - if(response != false){ - $("#new_token").val(response.token); - $("#get_token").toggleClass("hide"); - $("#remove_token").toggleClass("hide"); - } - } - }) -}); - -$(document).on("click", ".approve_thumbnails", function(e){ - e.preventDefault(); - var channel = $(this).attr("data-channel"); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/approve_thumbnail", - data: { - channel: channel - }, - success: function(response){ - if(response){ - $(that).parent().remove(); - var length = parseInt($(".thumbnails-badge").text()); - length = length - 1; - $(".thumbnails-badge").text(length); - if(length <= 0 && !$(".thumbnails-badge").hasClass("hide")){ - $(".thumbnails-badge").addClass("hide"); - } - Materialize.toast("Approved Thumbnail!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", ".deny_thumbnails", function(e){ - e.preventDefault(); - var channel = $(this).attr("data-channel"); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/deny_thumbnail", - data: { - channel: channel - }, - success: function(response){ - if(response){ - $(that).parent().remove(); - var length = parseInt($(".thumbnails-badge").text()); - length = length - 1; - $(".thumbnails-badge").text(length); - if(length <= 0 && !$(".thumbnails-badge").hasClass("hide")){ - $(".thumbnails-badge").addClass("hide"); - } - Materialize.toast("Denied thumbnail!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", ".approve_descriptions", function(e){ - e.preventDefault(); - var channel = $(this).attr("data-channel"); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/approve_description", - data: { - channel: channel - }, - success: function(response){ - if(response){ - $(that).parent().remove(); - var length = parseInt($(".descriptions-badge").text()); - length = length - 1; - $(".descriptions-badge").text(length); - if(length <= 0 && !$(".descriptions-badge").hasClass("hide")){ - $(".descriptions-badge").addClass("hide"); - } - Materialize.toast("Approved description!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", ".deny_descriptions", function(e){ - e.preventDefault(); - var channel = $(this).attr("data-channel"); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/deny_description", - data: { - channel: channel - }, - success: function(response){ - if(response){ - $(that).parent().remove(); - var length = parseInt($(".descriptions-badge").text()); - length = length - 1; - $(".descriptions-badge").text(length); - if(length <= 0 && !$(".descriptions-badge").hasClass("hide")){ - $(".descriptions-badge").addClass("hide"); - } - Materialize.toast("Denied description!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", "#remove_description_button", function(e){ - e.preventDefault(); - var channel = $("#remove_description").val(); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/remove_description", - data: { - channel: channel - }, - success: function(response){ - if(response){ - Materialize.toast("Removed description!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("click", "#remove_thumbnail_button", function(e){ - e.preventDefault(); - var channel = $("#remove_thumbnail").val(); - if(!channel) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var that = this; - $.ajax({ - type: "POST", - url: "/api/remove_thumbnail", - data: { - channel: channel - }, - success: function(response){ - if(response){ - Materialize.toast("Removed thumbnail!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }); -}); - -$(document).on("submit", "#delete_channel", function(e){ - e.preventDefault(); - var to_delete = $("#delete_channel_name").val(); - if(!to_delete) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - var r = confirm("Delete list \""+ decodeChannelName(to_delete) + "\"?"); - if (r == true) { - $.ajax({ - type: "POST", - url: "/api/delete", - data: { - _id: to_delete - }, - success: function(response){ - if(response == true){ - loaded(); - Materialize.toast("Deleted channel!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }) - } -}); - -$(document).on("click", "#delete_channel_button", function(e){ - e.preventDefault(); - $("#delete_channel").submit(); -}); - -$(document).on("click", "#remove_token", function(e){ - e.preventDefault(); - $.ajax({ - type: "GET", - url: "/api/remove_token", - success: function(response){ - if(response != false){ - $("#new_token").val(""); - $("#get_token").toggleClass("hide"); - $("#remove_token").toggleClass("hide"); - } - } - }) -}); - -$(document).on("submit", "#change_pinned", function(e){ - e.preventDefault(); - var to_pin = $("#frontpage_pinned").val(); - if(!to_pin) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - $.ajax({ - type: "POST", - url: "/api/pinned", - data: { - _id: to_pin - }, - success: function(response){ - if(response == true){ - Materialize.toast("Pinned channel!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }) -}); - -$(document).on("click", "#change_pinned_button", function(){ - $("#change_pinned").submit(); -}); - -$(document).on("click", "#delete_admin_button", function(){ - $("#delete_list").submit(); -}); - -$(document).on("click", "#delete_userpass_button", function(){ - $("#delete_userpass").submit(); -}); - -$(document).on("submit", "#delete_list", function(e){ - e.preventDefault(); - var to_remove_password = $("#delete_list_name").val(); - if(!to_remove_password) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - $.ajax({ - type: "POST", - url: "/api/admin", - data: { - _id: to_remove_password - }, - success: function(response){ - if(response == true){ - Materialize.toast("Removed admin password!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }) -}); - -$(document).on("submit", "#delete_userpass", function(e){ - e.preventDefault(); - var to_remove_password = $("#delete_userpass_name").val(); - if(!to_remove_password) { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - return; - } - $.ajax({ - type: "POST", - url: "/api/userpass", - data: { - _id: to_remove_password - }, - success: function(response){ - if(response == true){ - Materialize.toast("Removed userpass password!", 2000, "green lighten"); - } else { - Materialize.toast("Something went wrong...", 2000, "red lighten"); - } - } - }) -}); - function predicate() { var fields = [], n_fields = arguments.length, @@ -624,4 +700,191 @@ function predicate() { }; } +function removeClass(element, className) { + try { + if(typeof(element) == "object") { + element.classList.remove(className); + } else if(element.substring(0,1) == "#") { + document.getElementById(element.substring(1)).classList.remove(className); + } else { + var elements = document.getElementsByClassName(element.substring(1)); + for(var i = 0; i < elements.length; i++) { + elements[i].classList.remove(className); + } + } + } catch(e) { + //console.log(e); + } +} + +function addClass(element, className) { + try { + if(typeof(element) == "object") { + try { + if(element.length > 0) { + for(var i = 0; i < element.length; i++) { + if(element[i].className.indexOf(className) == -1) { + element[i].className += " " + className; + } + } + } else { + if(element.className.indexOf(className) == -1) { + element.className += " " + className; + } + } + } catch(e) { + if(element.className.indexOf(className) == -1) { + element.className += " " + className; + } + } + } else if(element.substring(0,1) == "#") { + var elem = document.getElementById(element.substring(1)); + if(elem.className.indexOf(className) == -1) { + elem.className += " " + className; + } + } else { + var elements; + if(element.substring(0,1) == ".") { + elements = document.getElementsByClassName(element.substring(1)); + } else { + elements = document.getElementsByTagName(element); + } + for(var i = 0; i < elements.length; i++) { + if(elements[i].className.indexOf(className) == -1) { + elements[i].className += " " + className; + } + } + } + }catch(e) {} +} + +function decodeChannelName(str) { + var _fn = decodeURIComponent; + str = str.toUpperCase(); + try { + var toReturn = _fn(str.replace(/%5F/g, "_")); + return toReturn.toLowerCase(); + } catch(e) { + return str.toLowerCase(); + } +} + +function toggleClass(element, className) { + try { + if(typeof(element) == "object") { + if(element.className.indexOf(className) == -1) { + addClass(element, className); + } else { + removeClass(element, className); + } + } else if(element.substring(0,1) == "#") { + var elem = document.getElementById(element.substring(1)); + if(elem.className.indexOf(className) == -1) { + addClass(elem, className); + } else { + removeClass(elem, className); + } + } else { + var elements; + if(element.substring(0,1) == ".") { + var testSplit = element.substring(1).split(" "); + if(testSplit.length > 1) { + var insideElement = document.getElementsByClassName(testSplit[0]); + elements = []; + for(var i = 0; i < insideElement.length; i++) { + var innards = insideElement[i].querySelectorAll(testSplit[1]); + for(var y = 0; y < innards.length; y++) { + elements.push(innards[y]); + } + } + } else { + elements = document.getElementsByClassName(element.substring(1)); + } + } else { + elements = document.getElementsByTagName(element); + } + for(var i = 0; i < elements.length; i++) { + if(elements[i].className.indexOf(className) == -1) { + addClass(elements[i], className); + } else { + removeClass(element, className); + } + } + } + }catch(e) { + //console.log(e); + } +} + +function ajax(obj) { + var _async = true; + if(obj.async) _async = obj.async; + if(obj.method == undefined && obj.type != undefined) obj.method = obj.type; + if(obj.method == undefined) obj.method = "GET"; + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function() { + if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 + if (xmlhttp.status == 200 || xmlhttp.status == 201 || xmlhttp.status == 202) { + obj.success(xmlhttp.responseText, xmlhttp); + } + else if(obj.hasOwnProperty("error")){ + obj.error(xmlhttp); + } + } + }; + + xmlhttp.open(obj.method, obj.url, _async); + if(obj.headers) { + for(header in obj.headers) { + xmlhttp.setRequestHeader(header, obj.headers[header]); + } + } + if(obj.data) { + if(typeof(obj.data) == "object") obj.data = JSON.stringify(obj.data); + //xmlhttp.send(sendRequest); + xmlhttp.send(obj.data); + } + else xmlhttp.send(); +} + +function handleEvent(e, target, tried, type) { + var path = e.path || (e.composedPath && e.composedPath()); + if(!path) { + var path = [target]; + var parent = target.parentElement; + while(parent != null) { + path.push(parent); + try { + parent = parent.parentElement; + } catch(e){break;} + } + } + if(path) { + for(var y = 0; y < path.length; y++) { + var target = path[y]; + if(dynamicListeners[type] && dynamicListeners[type]["#" + target.id]) { + dynamicListeners[type]["#" + target.id].call(e, target); + return; + } else { + if(target.classList == undefined) return; + for(var i = 0; i < target.classList.length; i++) { + if(dynamicListeners[type] && dynamicListeners[type]["." + target.classList[i]]) { + dynamicListeners[type]["." + target.classList[i]].call(e, target); + return; + } + } + } + } + } +} + +function addListener(type, element, callback) { + if(dynamicListeners[type] == undefined) dynamicListeners[type] = {}; + dynamicListeners[type][element] = callback; +} + +function removeListener(type, element) { + delete dynamicListeners[type][element]; +} + socket.emit("get_spread"); diff --git a/server/public/assets/admin/not_authenticated/js/main.js b/server/public/assets/admin/not_authenticated/js/main.js index a22b893a..4bab911b 100644 --- a/server/public/assets/admin/not_authenticated/js/main.js +++ b/server/public/assets/admin/not_authenticated/js/main.js @@ -1,22 +1,21 @@ -$(document).on("click", "#login_button", function(e){ - e.preventDefault(); - $("#login_form").submit(); -}) +window.addEventListener("DOMContentLoaded", function() { + document.getElementById("login_button").addEventListener("click", function(event) { + this.preventDefault(); + document.querySelector("#login_form").submit(); + }); -$(document).ready(function(){ - if(window.location.pathname == "/signup/" || window.location.pathname == "/signup"){ - $("#login_form").prepend(""); - $("#login_form").attr("action", "/signup"); - } - if(window.location.hash == "#failed") { - window.location.hash = ""; - Materialize.toast("Couldn't find a user with that username or password..", 4000, "red lighten"); - } + document.getElementById("login_form").addEventListener("submit", function(event) { + if(this.password.value == "" || this.username.value == ""){ + e.preventDefault(); + } + }); + + if(window.location.pathname == "/signup/" || window.location.pathname == "/signup"){ + document.querySelector("#login_form").insertAdjacentHTML("afterbegin", ""); + document.querySelector("#login_form").setAttribute("action", "/signup"); + } + if(window.location.hash == "#failed") { + window.location.hash = ""; + M.toast({ html: "Couldn't find a user with that username or password..", displayLength: 4000, classes: "red lighten"}); + } }); - - -$(document).on("submit", "#login_form", function(e){ - if(this.password.value == "" || this.username.value == ""){ - e.preventDefault(); - } -}) diff --git a/server/public/layouts/admin/main.handlebars b/server/public/layouts/admin/main.handlebars index cd9e5572..6200a950 100644 --- a/server/public/layouts/admin/main.handlebars +++ b/server/public/layouts/admin/main.handlebars @@ -1,9 +1,9 @@ - + - Zoff Admin + Zoff Admin @@ -15,56 +15,52 @@ - - + - - + + - - - + + {{{body}}} - + + From 049a91ad4053496b6028b1b1a831c2d4b9529e0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20Rynning-T=C3=B8nnesen?= Date: Mon, 13 Aug 2018 13:19:24 +0200 Subject: [PATCH 218/299] No more jquery in adminpanel --- server/apps/admin.js | 1 + .../assets/admin/authenticated/js/main.js | 112 +++++++++++------- .../assets/admin/not_authenticated/js/main.js | 2 +- .../layouts/admin/authenticated.handlebars | 10 +- 4 files changed, 74 insertions(+), 51 deletions(-) diff --git a/server/apps/admin.js b/server/apps/admin.js index c0e3bdea..a9e8f2fe 100644 --- a/server/apps/admin.js +++ b/server/apps/admin.js @@ -32,6 +32,7 @@ app.set('view engine', 'handlebars'); app.set('trust proxy', '127.0.0.1'); app.enable('view cache'); app.set('views', publicPath); +app.use( bodyParser.json() ); // to support JSON-encoded bodies app.use(bodyParser.urlencoded({ extended: true })); diff --git a/server/public/assets/admin/authenticated/js/main.js b/server/public/assets/admin/authenticated/js/main.js index f9f58b1b..ff848632 100644 --- a/server/public/assets/admin/authenticated/js/main.js +++ b/server/public/assets/admin/authenticated/js/main.js @@ -14,7 +14,7 @@ function toast(text, length, classes) { window.addEventListener("DOMContentLoaded", function() { M.Tabs.init(document.querySelector("ul.tabs")); api_token_list = document.querySelector("#api_token_list").cloneNode(true); - //document.querySelector("#api_token_list").remove(); + document.querySelector("#api_token_list").remove(); loaded(); addClass(".channel_things", "hide"); @@ -37,9 +37,10 @@ window.addEventListener("DOMContentLoaded", function() { }, true); document.getElementById("refresh_all").addEventListener("click", function(event) { - this.preventDefault(); - document.getElementById("descriptions_cont").empty(); - document.getElementById("thumbnails_cont").empty(); + event.preventDefault(); + document.getElementById("descriptions_cont").innerHTML = ""; + document.getElementById("thumbnails_cont").innerHTML = ""; + document.querySelector(".names-container").innerHTML = ""; document.querySelector(".api_token_container").remove(); addClass(".channel_things", "hide"); @@ -55,11 +56,11 @@ addListener("click", ".update_api_token", function(event) { this.preventDefault(); var that = event; var id = that.getAttribute("data-id"); - var limit = document.querySelector("#" + id + "-limit").value; + var limit = document.querySelector("#limit-" + id).value; toggleClass(that, "disabled"); - toggleClass("#" + id + "-delete", "disabled"); + toggleClass("#delete-" + id, "disabled"); ajax({ type: "PUT", url: "api/api_token", @@ -77,7 +78,7 @@ addListener("click", ".update_api_token", function(event) { toast("Something went wrong...", 2000, "red lighten"); } toggleClass(that, "disabled"); - toggleClass("#" + id + "-delete", "disabled"); + toggleClass("#delete-" + id, "disabled"); } }); }); @@ -87,7 +88,7 @@ addListener("click", ".delete_api_token", function(event) { var that = event; var id = that.getAttribute("data-id"); toggleClass(that, "disabled"); - toggleClass("#" + id + "-limit", "disabled"); + toggleClass("#limit-" + id, "disabled"); ajax({ type: "DELETE", url: "api/api_token", @@ -100,11 +101,11 @@ addListener("click", ".delete_api_token", function(event) { success: function(response) { if(response == "success") { toast("Removed token!", 2000, "green lighten"); - document.querySelector("#" + id).remove(); + document.querySelector("#element-" + id).remove(); } else { toast("Something went wrong...", 2000, "red lighten"); toggleClass(that, "disabled"); - toggleClass("#" + id + "-limit", "disabled"); + toggleClass("#limit-" + id, "disabled"); } }, }); @@ -136,7 +137,7 @@ addListener("click", ".approve_name", function(event) { addListener("click", ".thumbnail_link", function(event) { this.preventDefault(); - window.open("https:" + this.value,'_blank'); + window.open("https:" + event.value,'_blank'); }); addListener("click", "#get_token", function(event) { @@ -187,6 +188,8 @@ addListener("click", ".approve_thumbnails", function(event) { } else { toast("Something went wrong...", 2000, "red lighten"); } + }, + error: function(err) { } }); }); @@ -351,8 +354,7 @@ addListener("click", "#remove_thumbnail_button", function(event) { }); }); -addListener("submit", "#delete_channel", function(event) { - this.preventDefault(); +function delete_channel(that) { var to_delete = document.querySelector("#delete_channel_name").value; if(!to_delete) { toast("Something went wrong...", 2000, "red lighten"); @@ -379,11 +381,16 @@ addListener("submit", "#delete_channel", function(event) { } }) } +} + +addListener("submit", "#delete_channel", function(event) { + this.preventDefault(); + delete_channel(event); }); addListener("click", "#delete_channel_button", function(event) { this.preventDefault(); - document.querySelector("#delete_channel").submit(); + delete_channel(event); }); addListener("click", "#remove_token", function(event) { @@ -406,6 +413,20 @@ addListener("click", "#remove_token", function(event) { addListener("submit", "#change_pinned", function(event) { this.preventDefault(); + change_pinned(event); +}); + +addListener("click", "#change_pinned_button", function(event) { + this.preventDefault(); + change_pinned(event); +}); + +addListener("click", "#delete_admin_button", function(event) { + this.preventDefault(); + delete_admin_list(event); +}); + +function change_pinned(that) { var to_pin = document.querySelector("#frontpage_pinned").value; if(!to_pin) { toast("Something went wrong...", 2000, "red lighten"); @@ -428,25 +449,9 @@ addListener("submit", "#change_pinned", function(event) { } } }) -}); +} -addListener("click", "#change_pinned_button", function(event) { - this.preventDefault(); - document.querySelector("#change_pinned").submit(); -}); - -addListener("click", "#delete_admin_button", function(event) { - this.preventDefault(); - document.querySelector("#delete_list").submit(); -}); - -addListener("click", "#delete_userpass_button", function(event) { - this.preventDefault(); - document.querySelector("#delete_userpass").submit(); -}); - -addListener("submit", "#delete_list", function(event) { - this.preventDefault(); +function delete_admin_list(that) { var to_remove_password = document.querySelector("#delete_list_name").value; if(!to_remove_password) { toast("Something went wrong...", 2000, "red lighten"); @@ -468,11 +473,10 @@ addListener("submit", "#delete_list", function(event) { toast("Something went wrong...", 2000, "red lighten"); } } - }) -}); + }); +} -addListener("submit", "#delete_userpass", function(event) { - this.preventDefault(); +function delete_userpass(that) { var to_remove_password = document.querySelector("#delete_userpass_name").value; if(!to_remove_password) { toast("Something went wrong...", 2000, "red lighten"); @@ -495,6 +499,21 @@ addListener("submit", "#delete_userpass", function(event) { } } }) +} + +addListener("click", "#delete_userpass_button", function(event) { + this.preventDefault(); + delete_userpass(event); +}); + +addListener("submit", "#delete_list", function(event) { + this.preventDefault(); + delete_admin_list(event); +}); + +addListener("submit", "#delete_userpass", function(event) { + this.preventDefault(); + delete_userpass(event); }); socket.on("spread_listeners", function(obj){ @@ -533,15 +552,14 @@ function loaded() { removeClass(".header-api-fields", "hide"); for(var i = 0; i < response.length; i++) { var to_add = api_token_list.cloneNode(true); - - to_add.querySelector(".api_token_limit").value = response[i].limit; - to_add.setAttribute("id", response[i]._id); + to_add.setAttribute("id", "element-" + response[i]._id); to_add.querySelector(".api_token_name").innerText = response[i].name; to_add.querySelector(".api_token_usage").innerText = response[i].usage; to_add.querySelector(".api_token_origin").innerText = response[i].origin; - to_add.querySelector(".update_api_token").setAttribute("id", response[i]._id + "-update"); - to_add.querySelector(".api_token_limit").setAttribute("id", response[i]._id + "-limit"); - to_add.querySelector(".delete_api_token").setAttribute("id", response[i]._id + "-delete"); + to_add.querySelector(".update_api_token").setAttribute("id", "update-" + response[i]._id); + to_add.querySelector(".api_token_limit").setAttribute("id", "limit-" + response[i]._id); + to_add.querySelector("#limit-" + response[i]._id).value = parseInt(response[i].limit); + to_add.querySelector(".delete_api_token").setAttribute("id", "delete-" + response[i]._id); to_add.querySelector(".delete_api_token").setAttribute("data-id", response[i]._id); to_add.querySelector(".update_api_token").setAttribute("data-id", response[i]._id); if(response[i].active) { @@ -549,7 +567,8 @@ function loaded() { } else { removeClass(to_add.querySelector(".uncheck"), "hide"); } - document.querySelector("#api_keys").insertAdjacentHTML("beforeend", to_add.innerHTML); + document.querySelector("#api_keys").insertAdjacentHTML("beforeend", '
    ' + to_add.innerHTML + "
    "); + document.querySelector("#limit-" + response[i]._id).value = parseInt(response[i].limit); } }, error: function(err) { @@ -620,7 +639,6 @@ function loaded() { removeClass(".thumbnails-badge", "hide"); document.querySelector(".thumbnails-badge").innerText = response.length; } - console.log(response); add_to_tab("thumbnails", response); } }); @@ -825,7 +843,11 @@ function ajax(obj) { xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 if (xmlhttp.status == 200 || xmlhttp.status == 201 || xmlhttp.status == 202) { - obj.success(xmlhttp.responseText, xmlhttp); + try { + obj.success(JSON.parse(xmlhttp.responseText), xmlhttp); + } catch(e) { + obj.success(xmlhttp.responseText, xmlhttp); + } } else if(obj.hasOwnProperty("error")){ obj.error(xmlhttp); diff --git a/server/public/assets/admin/not_authenticated/js/main.js b/server/public/assets/admin/not_authenticated/js/main.js index 4bab911b..297e5cd0 100644 --- a/server/public/assets/admin/not_authenticated/js/main.js +++ b/server/public/assets/admin/not_authenticated/js/main.js @@ -1,6 +1,6 @@ window.addEventListener("DOMContentLoaded", function() { document.getElementById("login_button").addEventListener("click", function(event) { - this.preventDefault(); + event.preventDefault(); document.querySelector("#login_form").submit(); }); diff --git a/server/public/layouts/admin/authenticated.handlebars b/server/public/layouts/admin/authenticated.handlebars index 9556423a..c550b78a 100644 --- a/server/public/layouts/admin/authenticated.handlebars +++ b/server/public/layouts/admin/authenticated.handlebars @@ -101,7 +101,7 @@
    -
    + -
    +