diff --git a/Backend/api.js b/Backend/api.js new file mode 100644 index 000000000..a5f15e927 --- /dev/null +++ b/Backend/api.js @@ -0,0 +1,60 @@ +/** + * Created by chaika on 09.02.16. + */ +var LIQPAY_PUBLIC_KEY = "i52562539941"; +var LIQPAY_PRIVATE_KEY = "jXtyOihGPd4wfVi1mROoNm5btRJ9br57RluxNTCn"; + +var crypto = require('crypto'); + +function sha1(string) { + var sha1 = crypto.createHash('sha1'); + sha1.update(string); + return sha1.digest('base64'); +} + +function base64(str) { + return new Buffer(str).toString('base64'); +} + +var Pizza_List = require('./data/Pizza_List'); + +exports.getPizzaList = function (req, res) { + res.send(Pizza_List); +}; + +exports.createOrder = function (req, res) { + var order_info = req.body; + console.log("Creating Order", order_info); + + var descrip = ""; + + order_info.Pizzas.forEach(function (t) { + descrip += "<" + t.pizza.title + "> "; + }) + + var order = { + version: 3, + public_key: LIQPAY_PUBLIC_KEY, + action: "pay", + amount: order_info.Sum, + currency: "UAH", + description: "Pizzas ordered: " + descrip + "\nName: " + + order_info.Name + "\nPhone: " + order_info.Phone + "\nAddress: " + order_info.Address, + order_id: Math.random(), + //!!!Важливо щоб було 1, бо інакше візьме гроші!!! + sandbox: 1 + }; + var data = base64(JSON.stringify(order)); + var signature = sha1(LIQPAY_PRIVATE_KEY + data + LIQPAY_PRIVATE_KEY); + + res.send({ + success: true, + Name: order_info.Name, + Phone: order_info.Phone, + Address: order_info.Address, + Pizzas: order_info.Pizzas.length, + Sum: order_info.Sum, + data: data, + signature: signature + }); +}; \ No newline at end of file diff --git a/Backend/data/Pizza_List.js b/Backend/data/Pizza_List.js new file mode 100644 index 000000000..134fb6c81 --- /dev/null +++ b/Backend/data/Pizza_List.js @@ -0,0 +1,177 @@ +/** + * Created by diana on 12.01.16. + */ + +var pizza_info = [ + { + id:1, + icon:'assets/images/pizza_7.jpg', + title: "Імпреза", + type: 'М’ясна піца', + content: { + meat: ['балик', 'салямі'], + chicken: ['куриця'], + cheese: ['сир моцарелла', 'сир рокфорд'], + pineapple: ['ананаси'], + additional: ['томатна паста', 'петрушка'] + }, + small_size:{ + weight: 370, + size: 30, + price: 99 + }, + big_size:{ + weight: 660, + size: 40, + price: 169 + }, + is_new:true, + is_popular:true + + }, + { + id:2, + icon:'assets/images/pizza_2.jpg', + title: "BBQ", + type: 'М’ясна піца', + content: { + meat: ['мисливські ковбаски', 'ковбаски папероні', 'шинка'], + cheese: ['сир домашній'], + mushroom: ['шампінйони'], + additional: ['петрушка', 'оливки'] + }, + small_size:{ + weight: 460, + size: 30, + price: 139 + }, + big_size:{ + weight: 840, + size: 40, + price: 199 + }, + is_popular:true + }, + { + id:3, + icon:'assets/images/pizza_1.jpg', + title: "Міксовий поло", + type: 'М’ясна піца', + content: { + meat: ['вітчина', 'куриця копчена'], + cheese: ['сир моцарелла'], + pineapple: ['ананаси'], + additional: ['кукурудза', 'петрушка', 'соус томатний'] + }, + small_size:{ + weight: 430, + size: 30, + price: 115 + }, + big_size:{ + weight: 780, + size: 40, + price: 179 + } + }, + { + id:4, + icon:'assets/images/pizza_5.jpg', + title: "Сициліано", + type: 'М’ясна піца', + content: { + meat: ['вітчина', 'салямі'], + cheese: ['сир моцарелла'], + mushroom: ['шампінйони'], + additional: ['перець болгарський', 'соус томатний'] + }, + small_size:{ + weight: 450, + size: 30, + price: 111 + }, + big_size:{ + weight: 790, + size: 40, + price: 169 + } + }, + { + id:17, + icon:'assets/images/pizza_3.jpg', + title: "Маргарита", + type: 'Вега піца', + content: { + cheese: ['сир моцарелла', 'сир домашній'], + tomato: ['помідори'], + additional: ['базилік', 'оливкова олія', 'соус томатний'] + }, + small_size:{ + weight: 370, + size: 30, + price: 89 + } + }, + { + id:43, + icon:'assets/images/pizza_6.jpg', + title: "Мікс смаків", + type: 'М’ясна піца', + content: { + meat: ['ковбаски'], + cheese: ['сир моцарелла'], + mushroom: ['шампінйони'], + pineapple: ['ананаси'], + additional: ['цибуля кримська', 'огірки квашені', 'соус гірчичний'] + }, + small_size:{ + weight: 470, + size: 30, + price: 115 + }, + big_size:{ + weight: 780, + size: 40, + price: 180 + } + }, + { + id:90, + icon:'assets/images/pizza_8.jpg', + title: "Дольче Маре", + type: 'Морська піца', + content: { + ocean: ['криветки тигрові', 'мідії', 'ікра червона', 'філе червоної риби'], + cheese: ['сир моцарелла'], + additional: ['оливкова олія', 'вершки'] + }, + big_size:{ + weight: 845, + size: 40, + price: 399 + } + }, + { + id:6, + icon:'assets/images/pizza_4.jpg', + title: "Россо Густо", + type: 'Морська піца', + content: { + ocean: ['ікра червона', 'лосось копчений'], + cheese: ['сир моцарелла'], + additional: ['оливкова олія', 'вершки'] + }, + small_size:{ + weight: 400, + size: 30, + price: 189 + }, + big_size:{ + weight: 700, + size: 40, + price: 299 + } + } +]; + +module.exports = pizza_info; \ No newline at end of file diff --git a/Backend/main.js b/Backend/main.js new file mode 100644 index 000000000..53e66a2c8 --- /dev/null +++ b/Backend/main.js @@ -0,0 +1,53 @@ +/** + * Created by chaika on 09.02.16. + */ +var express = require('express'); +var path = require('path'); +var morgan = require('morgan'); +var bodyParser = require('body-parser'); + +function configureEndpoints(app) { + var pages = require('./pages'); + var api = require('./api'); + + //Налаштування URL за якими буде відповідати сервер + //Отримання списку піц + app.get('/api/get-pizza-list/', api.getPizzaList); + app.post('/api/create-order/', api.createOrder); + + //Сторінки + //Головна сторінка + app.get('/', pages.mainPage); + + //Сторінка замовлення + app.get('/order.html', pages.orderPage); + + //Якщо не підійшов жоден url, тоді повертаємо файли з папки www + app.use(express.static(path.join(__dirname, '../Frontend/www'))); +} + +function startServer(port) { + //Створюється застосунок + var app = express(); + + //Налаштування директорії з шаблонами + app.set('views', path.join(__dirname, 'views')); + app.set('view engine', 'ejs'); + + //Налаштування виводу в консоль списку запитів до сервера + app.use(morgan('dev')); + + //Розбір POST запитів + app.use(bodyParser.urlencoded({extended: false})); + app.use(bodyParser.json()); + + //Налаштовуємо сторінки + configureEndpoints(app); + + //Запуск додатка за вказаним портом + app.listen(port, function () { + console.log('My Application Running on http://localhost:' + port + '/'); + }); +} + +exports.startServer = startServer; \ No newline at end of file diff --git a/Backend/pages.js b/Backend/pages.js new file mode 100644 index 000000000..e9568556c --- /dev/null +++ b/Backend/pages.js @@ -0,0 +1,14 @@ +/** + * Created by chaika on 09.02.16. + */ +exports.mainPage = function(req, res) { + res.render('mainPage', { + pageTitle: 'Вибір Піци' + }); +}; + +exports.orderPage = function(req, res) { + res.render('orderPage', { + pageTitle: 'Підтвердження замовлення' + }); +}; \ No newline at end of file diff --git a/Backend/views/common/footer.ejs b/Backend/views/common/footer.ejs new file mode 100644 index 000000000..bf8cb2d77 --- /dev/null +++ b/Backend/views/common/footer.ejs @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Backend/views/common/header.ejs b/Backend/views/common/header.ejs new file mode 100644 index 000000000..4f37c63b5 --- /dev/null +++ b/Backend/views/common/header.ejs @@ -0,0 +1,36 @@ + + + + + <%= pageTitle %> - Pizza KMA + + + + + + + + + + + + +
+
+
+
+ ЦЬОГО ТИЖНЯ +
+ НА ВСЕ +
+
-20%
+
+
+
+
+ PIZZA +
+ KMA +
+
+ diff --git a/Backend/views/common/rightPanel.ejs b/Backend/views/common/rightPanel.ejs new file mode 100644 index 000000000..7ce549902 --- /dev/null +++ b/Backend/views/common/rightPanel.ejs @@ -0,0 +1,29 @@ +
+
+
+
+
+
+ + Замовлення + 0 + + +
+
+
+
+ + Сума замовлення + + + 0 грн. + +
+ +
+
+
+
\ No newline at end of file diff --git a/Backend/views/common/rightPanelForSubmission.ejs b/Backend/views/common/rightPanelForSubmission.ejs new file mode 100644 index 000000000..33c94edcb --- /dev/null +++ b/Backend/views/common/rightPanelForSubmission.ejs @@ -0,0 +1,28 @@ +
+
+
+
+
+
+ + Замовлення + 0 + +
+
+
+
+ + Сума замовлення + + + 0 грн. + +
+ +
+
+
+
\ No newline at end of file diff --git a/Backend/views/common/topPanel.ejs b/Backend/views/common/topPanel.ejs new file mode 100644 index 000000000..b1b11f107 --- /dev/null +++ b/Backend/views/common/topPanel.ejs @@ -0,0 +1,20 @@ +
+
+
+
+ (044) 222 5 222 +
+
+ 24 години/ 7 днів на тиждень +
+
+ Безкоштовна доставка піци +
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/Backend/views/mainPage.ejs b/Backend/views/mainPage.ejs new file mode 100644 index 000000000..2fc00ec91 --- /dev/null +++ b/Backend/views/mainPage.ejs @@ -0,0 +1,49 @@ +<% include common/header.ejs %> + +
+ +
+ +<% include common/topPanel.ejs %> +<% include common/rightPanel.ejs %> +<% include common/footer.ejs %> \ No newline at end of file diff --git a/Backend/views/orderPage.ejs b/Backend/views/orderPage.ejs new file mode 100644 index 000000000..2a2d0eff5 --- /dev/null +++ b/Backend/views/orderPage.ejs @@ -0,0 +1,71 @@ +<% include common/header.ejs %> + +
+
+
+
+ 1. Контактні дані +
+
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+
+
+

Інформація про замовлення

+

+ Приблизний час доставки: + невідомий +

+ +

+ Адреса доставки: + невідома +

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +<% include common/topPanel.ejs %> +<% include common/rightPanelForSubmission.ejs %> +<% include common/footer.ejs %> \ No newline at end of file diff --git a/Frontend/src/API.js b/Frontend/src/API.js new file mode 100644 index 000000000..2f246c8ec --- /dev/null +++ b/Frontend/src/API.js @@ -0,0 +1,40 @@ +/** + * Created by chaika on 09.02.16. + */ +var API_URL = "http://localhost:5050"; + +function backendGet(url, callback) { + $.ajax({ + url: API_URL + url, + type: 'GET', + success: function(data){ + callback(null, data); + }, + error: function() { + callback(new Error("Ajax Failed")); + } + }) +} + +function backendPost(url, data, callback) { + $.ajax({ + url: API_URL + url, + type: 'POST', + contentType : 'application/json', + data: JSON.stringify(data), + success: function(data){ + callback(null, data); + }, + error: function() { + callback(new Error("Ajax Failed")); + } + }) +} + +exports.getPizzaList = function(callback) { + backendGet("/api/get-pizza-list/", callback); +}; + +exports.createOrder = function(order_info, callback) { + backendPost("/api/create-order/", order_info, callback); +}; diff --git a/Frontend/src/Pizza_List.js b/Frontend/src/Pizza_List.js index 134fb6c81..d82b10006 100644 --- a/Frontend/src/Pizza_List.js +++ b/Frontend/src/Pizza_List.js @@ -15,7 +15,7 @@ var pizza_info = [ pineapple: ['ананаси'], additional: ['томатна паста', 'петрушка'] }, - small_size:{ + small_size: { weight: 370, size: 30, price: 99 diff --git a/Frontend/src/Templates.js b/Frontend/src/Templates.js index 8729954f9..8a4d6d23c 100644 --- a/Frontend/src/Templates.js +++ b/Frontend/src/Templates.js @@ -8,3 +8,5 @@ var ejs = require('ejs'); exports.PizzaMenu_OneItem = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaMenu_OneItem.ejs', "utf8")); exports.PizzaCart_OneItem = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaCart_OneItem.ejs', "utf8")); + +exports.PizzaCart_OneItemSubmission = ejs.compile(fs.readFileSync('./Frontend/templates/PizzaCart_OneItemSubmission.ejs', "utf8")); diff --git a/Frontend/src/googleMaps.js b/Frontend/src/googleMaps.js new file mode 100644 index 000000000..c4fb3da10 --- /dev/null +++ b/Frontend/src/googleMaps.js @@ -0,0 +1,110 @@ +var old_marker = null; +var gmap = null; + +function initialize() { +//Тут починаємо працювати з картою + var mapProp = { + center: new google.maps.LatLng(50.464379, 30.519131), + zoom: 15 + }; + var html_element = document.getElementById("googleMaps"); + gmap = new google.maps.Map(html_element, mapProp); + + //show shop marker + var point = new google.maps.LatLng(50.464379, 30.519131); + var shopMarker = new google.maps.Marker({ + position: point, + map: gmap, + icon: "assets/images/map-icon.png" + }); + //Карта створена і показана + + google.maps.event.addListener(gmap, 'click', function (me) { + var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + updateMarker(coordinates); + + geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text(address); + $("#inputAddress").val(address); + } else { + $(".order-adress").text("Немає адреси"); + } + }) + + calculateRoute(point, coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) + }); +} + +//адресу за координатами +function geocodeLatLng(latlng, callback) { +//Модуль за роботу з адресою + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'location': latlng}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[1]) { + var adress = results[1].formatted_address; + callback(null, adress); + } else { + callback(new Error("Can't find adress")); + } + }); +} + +//координати за адресою +function geocodeAddress(address, callback) { + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'address': address}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[0]) { + var coordinates = results[0].geometry.location; + callback(null, coordinates); + } else { + callback(new Error("Can not find the address")); + } + }); +} + +function updateMarker(coordinates) { + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: gmap, + icon: "assets/images/home-icon.png" + }); +} + +function calculateRoute(A_latlng, B_latlng, callback) { + var directionService = new google.maps.DirectionsService(); + directionService.route({ + origin: A_latlng, + destination: B_latlng, + travelMode: google.maps.TravelMode["DRIVING"] + }, function (response, status) { + if (status == google.maps.DirectionsStatus.OK) { + var leg = response.routes[0].legs[0]; + callback(null, { + duration: leg.duration + }); + } else { + callback(new Error("Can not find direction")); + } + }); +} + +//Коли сторінка завантажилась +google.maps.event.addDomListener(window, 'load', initialize); + +exports.geocodeAddress = geocodeAddress; +exports.geocodeLatLng = geocodeLatLng; +exports.updateMarker = updateMarker; +exports.calculateRoute = calculateRoute; + diff --git a/Frontend/src/main.js b/Frontend/src/main.js index 292a17032..a87681a2a 100644 --- a/Frontend/src/main.js +++ b/Frontend/src/main.js @@ -2,14 +2,128 @@ * Created by chaika on 25.01.16. */ -$(function(){ +$(function () { //This code will execute when the page is ready var PizzaMenu = require('./pizza/PizzaMenu'); var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + var googleMaps = require("./googleMaps"); + PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); + $(".nav-pills li").on("click", function () { + $(".nav-pills li").removeClass("active"); + $(this).addClass("active"); + var filt = $(this).find('a').data("filter"); + PizzaMenu.filterPizza(filt); + }) + + $(".clear-cart").click(function () { + PizzaCart.clearCart(); + }); + + $(".next-step-button").click(function () { + if ($("#inputName").val() === "") { + $(".name-help-block").show(); + } else $(".name-help-block").hide(); + if ($("#inputPhone").val() === "") { + $(".phone-help-block").show(); + } else $(".phone-help-block").hide(); + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + } else $(".address-help-block").hide(); + }); + + $("#inputName").on("input", function () { + if (!valName()) { + $(".name-help-block").show(); + } else { + $(".name-help-block").hide(); + } + }); + + $("#inputPhone").on("input", function () { + if (!valPhone()) { + $(".phone-help-block").show(); + } else { + $(".phone-help-block").hide(); + } + }); + + $("#inputAddress").on("input", function () { + if (!valAddress()) { + $(".address-help-block").show(); + } else { + $(".address-help-block").hide(); + } + + googleMaps.geocodeAddress($("#inputAddress").val(), function (err, coordinates) { + if (!err) { + googleMaps.geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text($("#inputAddress").val()); + googleMaps.updateMarker(coordinates); + googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { + if (!err) { + $(".order-time").text(data.duration.text); + } else { + $(".order-time").text("Помилка"); + } + }) + } else { + $(".order-adress").text("Немає адреси"); + } + }); + } + }); + + + }); + + function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); + } + + function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); + } + + function valAddress() { + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + return false + } else $(".address-help-block").hide(); + return true; + } + + $(".next-step-button").click(function () { + if (valName() && valPhone() && valAddress()) { + PizzaCart.createOrder(function (err, data) { + if (err) { + return console.log("Can't create order"); + } + // alert("Order created"); + + LiqPayCheckout.init({ + data: data.data, + signature: data.signature, + embedTo: "#liqpay", + mode: "embed" // popup || popup + }).on("liqpay.callback", function (data) { + console.log(data.status); + console.log(data); + alert("Order status: " + data.status); + }).on("liqpay.ready", function (data) { + // ready + }).on("liqpay.close", function (data) { + // close + }); + }); + } + }); }); \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaCart.js b/Frontend/src/pizza/PizzaCart.js index 17f30f78c..dccf06399 100644 --- a/Frontend/src/pizza/PizzaCart.js +++ b/Frontend/src/pizza/PizzaCart.js @@ -2,6 +2,8 @@ * Created by chaika on 02.02.16. */ var Templates = require('../Templates'); +var Storage = require('./Storage'); +var API = require('../API'); //Перелік розмірів піци var PizzaSize = { @@ -17,30 +19,50 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок + function checkIfPresent() { + for (var i = 0; i < Cart.length; i++) { + if (Cart[i].pizza.id == pizza.id && size == Cart[i].size) return i; + } + return -1; + } - //Приклад реалізації, можна робити будь-яким іншим способом - Cart.push({ - pizza: pizza, - size: size, - quantity: 1 - }); + var check = checkIfPresent(); + if (check === -1) { + Cart.push({ + pizza: pizza, + size: size, + quantity: 1 + }); + } else { + Cart[check].quantity++; + } //Оновити вміст кошика на сторінці updateCart(); } -function removeFromCart(cart_item) { - //Видалити піцу з кошика - //TODO: треба зробити - //Після видалення оновити відображення +function removeFromCart(cart_item) { + Cart.splice(Cart.indexOf(cart_item), 1); updateCart(); } +function clearCart() { + $(".clear-order").click(function () { + Cart = []; + $(".order-count").text(0); + updateCart(); + }); +} + function initialiseCart() { //Фукнція віпрацьвуватиме при завантаженні сторінки //Тут можна наприклад, зчитати вміст корзини який збережено в Local Storage то показати його - //TODO: ... + + var saved_cart = Storage.read("cart"); + if (saved_cart) { + Cart = saved_cart; + } updateCart(); } @@ -50,24 +72,62 @@ function getPizzaInCart() { return Cart; } +function countTotal() { + var total = 0; + Cart.forEach(function (pizzacart) { + total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; + }); + return total; +} + function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + var number_of_pizzas = Cart.length; + $(".order-count").text(number_of_pizzas); + $(".sum-number").text(countTotal() + " грн."); - //Очищаємо старі піци в кошику - $cart.html(""); + Storage.write("cart", Cart); + $cart.html(""); //Очищаємо старі піци в кошику + + var one_pizza_sum = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { - var html_code = Templates.PizzaCart_OneItem(cart_item); - + var html_code; + if($(".clear-order").html() === undefined){ + html_code = Templates.PizzaCart_OneItemSubmission(cart_item); + }else { + html_code = Templates.PizzaCart_OneItem(cart_item); + } var $node = $(html_code); - $node.find(".plus").click(function(){ + $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; - //Оновлюємо відображення + one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); + + updateCart(); + }); + + $node.find(".minus").click(function () { + //Збільшуємо кількість замовлених піц + if (cart_item.quantity === 1) { + removeFromCart(cart_item); + updateCart(); + } else { + cart_item.quantity -= 1; + + one_pizza_sum -= cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); + updateCart(); + } + }); + + $node.find(".count-clear").click(function () { + removeFromCart(cart_item); updateCart(); }); @@ -76,6 +136,33 @@ function updateCart() { Cart.forEach(showOnePizzaInCart); + if (number_of_pizzas === 0) { + $cart.html("
\n" + + " Пусто в холодильнику?\n" + + "
\n" + + " Замовте піцу!\n" + + "
"); + $(".sum-title").hide(); + $(".sum-number").hide(); + $(".button-order").prop("disabled", true); + } else { + $(".sum-title").show(); + $(".sum-number").show(); + $(".button-order").prop("disabled", false); + } +} + +function createOrder(callback) { + API.createOrder({ + Name: $("#inputName").val(), + Phone: $("#inputPhone").val(), + Address: $("#inputAddress").val(), + Pizzas: Cart, + Sum: countTotal() + }, function (err, result) { + if(err) return callback(err); + callback(null, result); + }) } exports.removeFromCart = removeFromCart; @@ -84,4 +171,7 @@ exports.addToCart = addToCart; exports.getPizzaInCart = getPizzaInCart; exports.initialiseCart = initialiseCart; -exports.PizzaSize = PizzaSize; \ No newline at end of file +exports.clearCart = clearCart(); +exports.PizzaSize = PizzaSize; + +exports.createOrder = createOrder; \ No newline at end of file diff --git a/Frontend/src/pizza/PizzaMenu.js b/Frontend/src/pizza/PizzaMenu.js index c08ee2d59..c54f673d5 100644 --- a/Frontend/src/pizza/PizzaMenu.js +++ b/Frontend/src/pizza/PizzaMenu.js @@ -18,10 +18,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".buy-big").click(function(){ + $node.find(".bb").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".buy-small").click(function(){ + $node.find(".bs").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -31,25 +31,72 @@ function showPizzaList(list) { list.forEach(showOnePizza); } +var PizzaFilter = { + All: 0, + Meat: 1, + Pineaple: 2, + Mushroom: 3, + Sea: 4, + Veg: 5 +} + + function filterPizza(filter) { //Масив куди потраплять піци які треба показати var pizza_shown = []; - Pizza_List.forEach(function(pizza){ - //Якщо піка відповідає фільтру - //pizza_shown.push(pizza); - - //TODO: зробити фільтри - }); - - //Показати відфільтровані піци - showPizzaList(pizza_shown); + if (filter === PizzaFilter.All) { + showPizzaList(Pizza_List); + $(".all-pizza-title").text("Усі піци"); + $(".pizza-count").text("8"); + } else { + if (filter === PizzaFilter.Meat) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'М’ясна піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("М'ясні піци"); + } else if (filter === PizzaFilter.Pineaple) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.pineapple) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з ананасами"); + }else if (filter === PizzaFilter.Mushroom) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.mushroom) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з грибами"); + }else if (filter === PizzaFilter.Sea) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.ocean) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з морепродуктами"); + }else if (filter === PizzaFilter.Veg) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'Вега піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Вегетарінські піци"); + } + $(".pizza-count").text(pizza_shown.length); + //Показати відфільтровані піци + showPizzaList(pizza_shown); + } } + function initialiseMenu() { //Показуємо усі піци showPizzaList(Pizza_List) } exports.filterPizza = filterPizza; -exports.initialiseMenu = initialiseMenu; \ No newline at end of file +exports.initialiseMenu = initialiseMenu; diff --git a/Frontend/src/pizza/Storage.js b/Frontend/src/pizza/Storage.js new file mode 100644 index 000000000..ae40952dc --- /dev/null +++ b/Frontend/src/pizza/Storage.js @@ -0,0 +1,10 @@ +var basil = require('basil.js'); +basil = new basil(); + +exports.write = function (key, value) { + basil.set(key, value); +} + +exports.read = function (key) { + return basil.get(key); +} \ No newline at end of file diff --git a/Frontend/templates/PizzaCart_OneItem.ejs b/Frontend/templates/PizzaCart_OneItem.ejs index 657df0094..6e6bce06b 100644 --- a/Frontend/templates/PizzaCart_OneItem.ejs +++ b/Frontend/templates/PizzaCart_OneItem.ejs @@ -1,9 +1,41 @@ -
- <%= pizza.title %> (<%= size %>) -
Ціна: <%= pizza[size].price %> грн.
-
- - <%= quantity %> - +<% +function someFunction(pizza) { + +} + +%> + + +
+ Піца + +

+ <% if(pizza[size].size === 30){ %> + <%= pizza.title %> (Мала) + <% }else { %> + <%= pizza.title %> (Велика) + <% } %> +

+
+ + <%= pizza[size].size %> + + <%= pizza[size].weight %> +
+
+ <%= pizza[size].price*quantity%> грн. + + + + + <%= quantity %> + + + + + + + +
\ No newline at end of file diff --git a/Frontend/templates/PizzaCart_OneItemSubmission.ejs b/Frontend/templates/PizzaCart_OneItemSubmission.ejs new file mode 100644 index 000000000..3678838ea --- /dev/null +++ b/Frontend/templates/PizzaCart_OneItemSubmission.ejs @@ -0,0 +1,23 @@ +
+ Піца + +

+ <% if(pizza[size].size === 30){ %> + <%= pizza.title %> (Мала) + <% }else { %> + <%= pizza.title %> (Велика) + <% } %> +

+
+ + <%= pizza[size].size %> + + <%= pizza[size].weight %> +
+
+ <%= pizza[size].price*quantity%> грн. + + піц: <%= quantity %> + +
+
\ No newline at end of file diff --git a/Frontend/templates/PizzaMenu_OneItem.ejs b/Frontend/templates/PizzaMenu_OneItem.ejs index d9b4e9fd9..39e6873aa 100644 --- a/Frontend/templates/PizzaMenu_OneItem.ejs +++ b/Frontend/templates/PizzaMenu_OneItem.ejs @@ -8,7 +8,6 @@ function getIngredientsArray(pizza) { //Object.keys повертає масив ключів в об’єкті JavaScript Object.keys(content).forEach(function(key){ - //a.concat(b) створює спільний масив із масивів a та b result = result.concat(content[key]); }); @@ -19,13 +18,13 @@ function getIngredientsArray(pizza) { %>
- Pizza <% if(pizza.is_new) { %> - Нова + Нова <% } else if(pizza.is_popular) {%> - Популярна + Популярна <% } %> +
<%= pizza.title %> @@ -33,9 +32,80 @@ function getIngredientsArray(pizza) {
<%= getIngredientsArray(pizza).join(", ") %>
+
+ <%if (pizza.small_size && pizza.big_size){%> +
+
+ + <%= pizza.small_size.size %> +
+
+ + <%= pizza.small_size.weight %> +
+

+
+ <%= pizza.small_size.price %> +
грн.
+
+

+ Купити +
+
+
+ + <%= pizza.big_size.size %> +
+
+ + <%= pizza.big_size.weight %> +
+

+
+ <%= pizza.big_size.price %> +
грн.
+
+

+ Купити +
+ <% } else if (pizza.small_size) {%> +
+
+ + <%= pizza.small_size.size %> +
+
+ + <%= pizza.small_size.weight %> +
+

+
+ <%= pizza.small_size.price %> +
грн.
+
+

+ Купити +
+ <% } else { %> +
+
+ + <%= pizza.big_size.size %> +
+
+ + <%= pizza.big_size.weight %> +
+

+
+ <%= pizza.big_size.price %> +
грн.
+
+

+ Купити +
+ <% } %> +
- - -
\ No newline at end of file diff --git a/Frontend/www/assets/js/main.js b/Frontend/www/assets/js/main.js index da110673c..d31d6ee87 100644 --- a/Frontend/www/assets/js/main.js +++ b/Frontend/www/assets/js/main.js @@ -1,4 +1,46 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o\n
\n
\n \" alt=\"Pizza\">\n\n <% if(pizza.is_new) { %>\n Нова\n <% } else if(pizza.is_popular) {%>\n Популярна\n <% } %>\n\n
\n <%= pizza.title %>\n
<%= pizza.type %>
\n
\n <%= getIngredientsArray(pizza).join(\", \") %>\n
\n
\n\n \n \n
\n
"); +exports.PizzaMenu_OneItem = ejs.compile("<%\r\n\r\nfunction getIngredientsArray(pizza) {\r\n //Отримує вміст піци\r\n var content = pizza.content;\r\n var result = [];\r\n\r\n //Object.keys повертає масив ключів в об’єкті JavaScript\r\n\r\n Object.keys(content).forEach(function(key){\r\n //a.concat(b) створює спільний масив із масивів a та b\r\n result = result.concat(content[key]);\r\n });\r\n\r\n return result;\r\n}\r\n\r\n %>\r\n
\r\n
\r\n\r\n <% if(pizza.is_new) { %>\r\n Нова\r\n <% } else if(pizza.is_popular) {%>\r\n Популярна\r\n <% } %>\r\n \">\r\n\r\n
\r\n <%= pizza.title %>\r\n
<%= pizza.type %>
\r\n
\r\n <%= getIngredientsArray(pizza).join(\", \") %>\r\n
\r\n
\r\n <%if (pizza.small_size && pizza.big_size){%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else if (pizza.small_size) {%>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.small_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.small_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } else { %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.size %>\r\n
\r\n
\r\n \r\n <%= pizza.big_size.weight %>\r\n
\r\n

\r\n
\r\n <%= pizza.big_size.price %>\r\n
грн.
\r\n
\r\n

\r\n Купити\r\n
\r\n <% } %>\r\n
\r\n
\r\n
\r\n
"); + +exports.PizzaCart_OneItem = ejs.compile("<%\r\nfunction someFunction(pizza) {\r\n\r\n}\r\n\r\n%>\r\n\r\n\r\n
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n \r\n \r\n \r\n \r\n <%= quantity %>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
"); + +exports.PizzaCart_OneItemSubmission = ejs.compile("
\r\n \"Піца\"\">\r\n\r\n

\r\n <% if(pizza[size].size === 30){ %>\r\n <%= pizza.title %> (Мала)\r\n <% }else { %>\r\n <%= pizza.title %> (Велика)\r\n <% } %>\r\n

\r\n
\r\n \r\n <%= pizza[size].size %>\r\n \r\n <%= pizza[size].weight %>\r\n
\r\n
\r\n <%= pizza[size].price*quantity%> грн.\r\n\r\n піц: <%= quantity %> \r\n\r\n
\r\n
"); + +},{"ejs":11}],4:[function(require,module,exports){ +var old_marker = null; +var gmap = null; + +function initialize() { +//Тут починаємо працювати з картою + var mapProp = { + center: new google.maps.LatLng(50.464379, 30.519131), + zoom: 15 + }; + var html_element = document.getElementById("googleMaps"); + gmap = new google.maps.Map(html_element, mapProp); + + //show shop marker + var point = new google.maps.LatLng(50.464379, 30.519131); + var shopMarker = new google.maps.Marker({ + position: point, + map: gmap, + icon: "assets/images/map-icon.png" + }); + //Карта створена і показана + + google.maps.event.addListener(gmap, 'click', function (me) { + var coordinates = me.latLng; //coordinates - такий самий об’єкт як створений new google.maps.LatLng(...) + updateMarker(coordinates); + + geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text(address); + $("#inputAddress").val(address); + } else { + $(".order-adress").text("Немає адреси"); + } + }) + + calculateRoute(point, coordinates, function (err, data) { + if(!err){ + $(".order-time").text(data.duration.text); + }else{ + $(".order-time").text("Помилка"); + } + }) + }); +} + +//адресу за координатами +function geocodeLatLng(latlng, callback) { +//Модуль за роботу з адресою + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'location': latlng}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[1]) { + var adress = results[1].formatted_address; + callback(null, adress); + } else { + callback(new Error("Can't find adress")); + } + }); +} + +//координати за адресою +function geocodeAddress(address, callback) { + var geocoder = new google.maps.Geocoder(); + geocoder.geocode({'address': address}, function (results, status) { + if (status === google.maps.GeocoderStatus.OK && results[0]) { + var coordinates = results[0].geometry.location; + callback(null, coordinates); + } else { + callback(new Error("Can not find the address")); + } + }); +} + +function updateMarker(coordinates) { + if (old_marker) { + old_marker.setMap(null); + old_marker = null; + } + + old_marker = new google.maps.Marker({ + position: coordinates, + map: gmap, + icon: "assets/images/home-icon.png" + }); +} + +function calculateRoute(A_latlng, B_latlng, callback) { + var directionService = new google.maps.DirectionsService(); + directionService.route({ + origin: A_latlng, + destination: B_latlng, + travelMode: google.maps.TravelMode["DRIVING"] + }, function (response, status) { + if (status == google.maps.DirectionsStatus.OK) { + var leg = response.routes[0].legs[0]; + callback(null, { + duration: leg.duration + }); + } else { + callback(new Error("Can not find direction")); + } + }); +} + +//Коли сторінка завантажилась +google.maps.event.addDomListener(window, 'load', initialize); + +exports.geocodeAddress = geocodeAddress; +exports.geocodeLatLng = geocodeLatLng; +exports.updateMarker = updateMarker; +exports.calculateRoute = calculateRoute; -exports.PizzaCart_OneItem = ejs.compile("
\n <%= pizza.title %> (<%= size %>)\n
Ціна: <%= pizza[size].price %> грн.
\n
\n \n <%= quantity %>\n \n
\n
"); -},{"ejs":6}],3:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ /** * Created by chaika on 25.01.16. */ -$(function(){ +$(function () { //This code will execute when the page is ready var PizzaMenu = require('./pizza/PizzaMenu'); var PizzaCart = require('./pizza/PizzaCart'); var Pizza_List = require('./Pizza_List'); + var googleMaps = require("./googleMaps"); + PizzaCart.initialiseCart(); PizzaMenu.initialiseMenu(); + $(".nav-pills li").on("click", function () { + $(".nav-pills li").removeClass("active"); + $(this).addClass("active"); + var filt = $(this).find('a').data("filter"); + PizzaMenu.filterPizza(filt); + }) + + $(".clear-cart").click(function () { + PizzaCart.clearCart(); + }); + + $(".next-step-button").click(function () { + if ($("#inputName").val() === "") { + $(".name-help-block").show(); + } else $(".name-help-block").hide(); + if ($("#inputPhone").val() === "") { + $(".phone-help-block").show(); + } else $(".phone-help-block").hide(); + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + } else $(".address-help-block").hide(); + }); + + $("#inputName").on("input", function () { + if (!valName()) { + $(".name-help-block").show(); + } else { + $(".name-help-block").hide(); + } + }); + + $("#inputPhone").on("input", function () { + if (!valPhone()) { + $(".phone-help-block").show(); + } else { + $(".phone-help-block").hide(); + } + }); + + $("#inputAddress").on("input", function () { + if (!valAddress()) { + $(".address-help-block").show(); + } else { + $(".address-help-block").hide(); + } + + googleMaps.geocodeAddress($("#inputAddress").val(), function (err, coordinates) { + if (!err) { + googleMaps.geocodeLatLng(coordinates, function (err, address) { + if (!err) { + $(".order-adress").text($("#inputAddress").val()); + googleMaps.updateMarker(coordinates); + googleMaps.calculateRoute(new google.maps.LatLng(50.464379, 30.519131), coordinates, function (err, data) { + if (!err) { + $(".order-time").text(data.duration.text); + } else { + $(".order-time").text("Помилка"); + } + }) + } else { + $(".order-adress").text("Немає адреси"); + } + }); + } + }); + + + }); + + function valName() { + var expr = $("#inputName").val(); + return expr.match(/^([a-zA-Zа-яА-Я]+|[a-zA-Zа-яА-Я]+[ ][a-zA-Zа-яА-Я]+|([a-zA-Zа-яА-Я]+[\-][a-zA-Zа-яА-Я]+))+$/); + } + + function valPhone() { + var expr = $("#inputPhone").val(); + return expr.match(/^(\+380\d{9}|0\d{9})$/); + } + + function valAddress() { + if ($("#inputAddress").val() === "") { + $(".address-help-block").show(); + return false + } else $(".address-help-block").hide(); + return true; + } + + $(".next-step-button").click(function () { + if (valName() && valPhone() && valAddress()) { + PizzaCart.createOrder(function (err, data) { + if (err) { + return console.log("Can't create order"); + } + // alert("Order created"); + + LiqPayCheckout.init({ + data: data.data, + signature: data.signature, + embedTo: "#liqpay", + mode: "embed" // popup || popup + }).on("liqpay.callback", function (data) { + console.log(data.status); + console.log(data); + alert("Order status: " + data.status); + }).on("liqpay.ready", function (data) { + // ready + }).on("liqpay.close", function (data) { + // close + }); + }); + } + }); }); -},{"./Pizza_List":1,"./pizza/PizzaCart":4,"./pizza/PizzaMenu":5}],4:[function(require,module,exports){ +},{"./Pizza_List":2,"./googleMaps":4,"./pizza/PizzaCart":6,"./pizza/PizzaMenu":7}],6:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ var Templates = require('../Templates'); +var Storage = require('./Storage'); +var API = require('../API'); //Перелік розмірів піци var PizzaSize = { @@ -224,30 +496,50 @@ var $cart = $("#cart"); function addToCart(pizza, size) { //Додавання однієї піци в кошик покупок + function checkIfPresent() { + for (var i = 0; i < Cart.length; i++) { + if (Cart[i].pizza.id == pizza.id && size == Cart[i].size) return i; + } + return -1; + } - //Приклад реалізації, можна робити будь-яким іншим способом - Cart.push({ - pizza: pizza, - size: size, - quantity: 1 - }); + var check = checkIfPresent(); + if (check === -1) { + Cart.push({ + pizza: pizza, + size: size, + quantity: 1 + }); + } else { + Cart[check].quantity++; + } //Оновити вміст кошика на сторінці updateCart(); } -function removeFromCart(cart_item) { - //Видалити піцу з кошика - //TODO: треба зробити - //Після видалення оновити відображення +function removeFromCart(cart_item) { + Cart.splice(Cart.indexOf(cart_item), 1); updateCart(); } +function clearCart() { + $(".clear-order").click(function () { + Cart = []; + $(".order-count").text(0); + updateCart(); + }); +} + function initialiseCart() { //Фукнція віпрацьвуватиме при завантаженні сторінки //Тут можна наприклад, зчитати вміст корзини який збережено в Local Storage то показати його - //TODO: ... + + var saved_cart = Storage.read("cart"); + if (saved_cart) { + Cart = saved_cart; + } updateCart(); } @@ -257,24 +549,62 @@ function getPizzaInCart() { return Cart; } +function countTotal() { + var total = 0; + Cart.forEach(function (pizzacart) { + total += pizzacart.pizza[pizzacart.size].price * pizzacart.quantity; + }); + return total; +} + function updateCart() { //Функція викликається при зміні вмісту кошика //Тут можна наприклад показати оновлений кошик на екрані та зберегти вміт кошика в Local Storage + var number_of_pizzas = Cart.length; + $(".order-count").text(number_of_pizzas); + $(".sum-number").text(countTotal() + " грн."); - //Очищаємо старі піци в кошику - $cart.html(""); + Storage.write("cart", Cart); + $cart.html(""); //Очищаємо старі піци в кошику + + var one_pizza_sum = 0; //Онволення однієї піци function showOnePizzaInCart(cart_item) { - var html_code = Templates.PizzaCart_OneItem(cart_item); - + var html_code; + if($(".clear-order").html() === undefined){ + html_code = Templates.PizzaCart_OneItemSubmission(cart_item); + }else { + html_code = Templates.PizzaCart_OneItem(cart_item); + } var $node = $(html_code); - $node.find(".plus").click(function(){ + $node.find(".plus").click(function () { //Збільшуємо кількість замовлених піц cart_item.quantity += 1; - //Оновлюємо відображення + one_pizza_sum = cart_item.pizza[cart_item.size].quantity * cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); + + updateCart(); + }); + + $node.find(".minus").click(function () { + //Збільшуємо кількість замовлених піц + if (cart_item.quantity === 1) { + removeFromCart(cart_item); + updateCart(); + } else { + cart_item.quantity -= 1; + + one_pizza_sum -= cart_item.pizza[cart_item.size].price; + $(".price").text(one_pizza_sum); + updateCart(); + } + }); + + $node.find(".count-clear").click(function () { + removeFromCart(cart_item); updateCart(); }); @@ -283,6 +613,33 @@ function updateCart() { Cart.forEach(showOnePizzaInCart); + if (number_of_pizzas === 0) { + $cart.html("
\n" + + " Пусто в холодильнику?\n" + + "
\n" + + " Замовте піцу!\n" + + "
"); + $(".sum-title").hide(); + $(".sum-number").hide(); + $(".button-order").prop("disabled", true); + } else { + $(".sum-title").show(); + $(".sum-number").show(); + $(".button-order").prop("disabled", false); + } +} + +function createOrder(callback) { + API.createOrder({ + Name: $("#inputName").val(), + Phone: $("#inputPhone").val(), + Address: $("#inputAddress").val(), + Pizzas: Cart, + Sum: countTotal() + }, function (err, result) { + if(err) return callback(err); + callback(null, result); + }) } exports.removeFromCart = removeFromCart; @@ -291,8 +648,11 @@ exports.addToCart = addToCart; exports.getPizzaInCart = getPizzaInCart; exports.initialiseCart = initialiseCart; +exports.clearCart = clearCart(); exports.PizzaSize = PizzaSize; -},{"../Templates":2}],5:[function(require,module,exports){ + +exports.createOrder = createOrder; +},{"../API":1,"../Templates":3,"./Storage":8}],7:[function(require,module,exports){ /** * Created by chaika on 02.02.16. */ @@ -313,10 +673,10 @@ function showPizzaList(list) { var $node = $(html_code); - $node.find(".buy-big").click(function(){ + $node.find(".bb").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Big); }); - $node.find(".buy-small").click(function(){ + $node.find(".bs").click(function () { PizzaCart.addToCart(pizza, PizzaCart.PizzaSize.Small); }); @@ -326,21 +686,68 @@ function showPizzaList(list) { list.forEach(showOnePizza); } +var PizzaFilter = { + All: 0, + Meat: 1, + Pineaple: 2, + Mushroom: 3, + Sea: 4, + Veg: 5 +} + + function filterPizza(filter) { //Масив куди потраплять піци які треба показати var pizza_shown = []; - Pizza_List.forEach(function(pizza){ - //Якщо піка відповідає фільтру - //pizza_shown.push(pizza); - - //TODO: зробити фільтри - }); - - //Показати відфільтровані піци - showPizzaList(pizza_shown); + if (filter === PizzaFilter.All) { + showPizzaList(Pizza_List); + $(".all-pizza-title").text("Усі піци"); + $(".pizza-count").text("8"); + } else { + if (filter === PizzaFilter.Meat) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'М’ясна піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("М'ясні піци"); + } else if (filter === PizzaFilter.Pineaple) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.pineapple) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з ананасами"); + }else if (filter === PizzaFilter.Mushroom) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.mushroom) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з грибами"); + }else if (filter === PizzaFilter.Sea) { + Pizza_List.forEach(function (pizza) { + if (pizza.content.ocean) { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Піци з морепродуктами"); + }else if (filter === PizzaFilter.Veg) { + Pizza_List.forEach(function (pizza) { + if (pizza.type === 'Вега піца') { + pizza_shown.push(pizza); + } + }); + $(".all-pizza-title").text("Вегетарінські піци"); + } + $(".pizza-count").text(pizza_shown.length); + //Показати відфільтровані піци + showPizzaList(pizza_shown); + } } + function initialiseMenu() { //Показуємо усі піци showPizzaList(Pizza_List) @@ -348,7 +755,409 @@ function initialiseMenu() { exports.filterPizza = filterPizza; exports.initialiseMenu = initialiseMenu; -},{"../Pizza_List":1,"../Templates":2,"./PizzaCart":4}],6:[function(require,module,exports){ + +},{"../Pizza_List":2,"../Templates":3,"./PizzaCart":6}],8:[function(require,module,exports){ +var basil = require('basil.js'); +basil = new basil(); + +exports.write = function (key, value) { + basil.set(key, value); +} + +exports.read = function (key) { + return basil.get(key); +} +},{"basil.js":9}],9:[function(require,module,exports){ +(function () { + // Basil + var Basil = function (options) { + return Basil.utils.extend({}, Basil.plugins, new Basil.Storage().init(options)); + }; + + // Version + Basil.version = '0.4.4'; + + // Utils + Basil.utils = { + extend: function () { + var destination = typeof arguments[0] === 'object' ? arguments[0] : {}; + for (var i = 1; i < arguments.length; i++) { + if (arguments[i] && typeof arguments[i] === 'object') + for (var property in arguments[i]) + destination[property] = arguments[i][property]; + } + return destination; + }, + each: function (obj, fnIterator, context) { + if (this.isArray(obj)) { + for (var i = 0; i < obj.length; i++) + if (fnIterator.call(context, obj[i], i) === false) return; + } else if (obj) { + for (var key in obj) + if (fnIterator.call(context, obj[key], key) === false) return; + } + }, + tryEach: function (obj, fnIterator, fnError, context) { + this.each(obj, function (value, key) { + try { + return fnIterator.call(context, value, key); + } catch (error) { + if (this.isFunction(fnError)) { + try { + fnError.call(context, value, key, error); + } catch (error) {} + } + } + }, this); + }, + registerPlugin: function (methods) { + Basil.plugins = this.extend(methods, Basil.plugins); + }, + getTypeOf: function (obj) { + if (typeof obj === 'undefined' || obj === null) + return '' + obj; + return Object.prototype.toString.call(obj).replace(/^\[object\s(.*)\]$/, function ($0, $1) { return $1.toLowerCase(); }); + } + }; + // Add some isType methods: isArguments, isBoolean, isFunction, isString, isArray, isNumber, isDate, isRegExp, isUndefined, isNull. + var types = ['Arguments', 'Boolean', 'Function', 'String', 'Array', 'Number', 'Date', 'RegExp', 'Undefined', 'Null']; + for (var i = 0; i < types.length; i++) { + Basil.utils['is' + types[i]] = (function (type) { + return function (obj) { + return Basil.utils.getTypeOf(obj) === type.toLowerCase(); + }; + })(types[i]); + } + + // Plugins + Basil.plugins = {}; + + // Options + Basil.options = Basil.utils.extend({ + namespace: 'b45i1', + storages: ['local', 'cookie', 'session', 'memory'], + expireDays: 365 + }, window.Basil ? window.Basil.options : {}); + + // Storage + Basil.Storage = function () { + var _salt = 'b45i1' + (Math.random() + 1) + .toString(36) + .substring(7), + _storages = {}, + _isValidKey = function (key) { + var type = Basil.utils.getTypeOf(key); + return (type === 'string' && key) || type === 'number' || type === 'boolean'; + }, + _toStoragesArray = function (storages) { + if (Basil.utils.isArray(storages)) + return storages; + return Basil.utils.isString(storages) ? [storages] : []; + }, + _toStoredKey = function (namespace, path) { + var key = ''; + if (_isValidKey(path)) { + key += path; + } else if (Basil.utils.isArray(path)) { + path = Basil.utils.isFunction(path.filter) ? path.filter(_isValidKey) : path; + key = path.join('.'); + } + return key && _isValidKey(namespace) ? namespace + '.' + key : key; + }, + _toKeyName = function (namespace, key) { + if (!_isValidKey(namespace)) + return key; + return key.replace(new RegExp('^' + namespace + '.'), ''); + }, + _toStoredValue = function (value) { + return JSON.stringify(value); + }, + _fromStoredValue = function (value) { + return value ? JSON.parse(value) : null; + }; + + // HTML5 web storage interface + var webStorageInterface = { + engine: null, + check: function () { + try { + window[this.engine].setItem(_salt, true); + window[this.engine].removeItem(_salt); + } catch (e) { + return false; + } + return true; + }, + set: function (key, value, options) { + if (!key) + throw Error('invalid key'); + window[this.engine].setItem(key, value); + }, + get: function (key) { + return window[this.engine].getItem(key); + }, + remove: function (key) { + window[this.engine].removeItem(key); + }, + reset: function (namespace) { + for (var i = 0, key; i < window[this.engine].length; i++) { + key = window[this.engine].key(i); + if (!namespace || key.indexOf(namespace) === 0) { + this.remove(key); + i--; + } + } + }, + keys: function (namespace) { + var keys = []; + for (var i = 0, key; i < window[this.engine].length; i++) { + key = window[this.engine].key(i); + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + } + return keys; + } + }; + + // local storage + _storages.local = Basil.utils.extend({}, webStorageInterface, { + engine: 'localStorage' + }); + // session storage + _storages.session = Basil.utils.extend({}, webStorageInterface, { + engine: 'sessionStorage' + }); + + // memory storage + _storages.memory = { + _hash: {}, + check: function () { + return true; + }, + set: function (key, value, options) { + if (!key) + throw Error('invalid key'); + this._hash[key] = value; + }, + get: function (key) { + return this._hash[key] || null; + }, + remove: function (key) { + delete this._hash[key]; + }, + reset: function (namespace) { + for (var key in this._hash) { + if (!namespace || key.indexOf(namespace) === 0) + this.remove(key); + } + }, + keys: function (namespace) { + var keys = []; + for (var key in this._hash) + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + return keys; + } + }; + + // cookie storage + _storages.cookie = { + check: function () { + if (!navigator.cookieEnabled) + return false; + if (window.self !== window.top) { + // we need to check third-party cookies; + var cookie = 'thirdparty.check=' + Math.round(Math.random() * 1000); + document.cookie = cookie + '; path=/'; + return document.cookie.indexOf(cookie) !== -1; + } + return true; + }, + set: function (key, value, options) { + if (!this.check()) + throw Error('cookies are disabled'); + options = options || {}; + if (!key) + throw Error('invalid key'); + var cookie = encodeURIComponent(key) + '=' + encodeURIComponent(value); + // handle expiration days + if (options.expireDays) { + var date = new Date(); + date.setTime(date.getTime() + (options.expireDays * 24 * 60 * 60 * 1000)); + cookie += '; expires=' + date.toGMTString(); + } + // handle domain + if (options.domain && options.domain !== document.domain) { + var _domain = options.domain.replace(/^\./, ''); + if (document.domain.indexOf(_domain) === -1 || _domain.split('.').length <= 1) + throw Error('invalid domain'); + cookie += '; domain=' + options.domain; + } + // handle secure + if (options.secure === true) { + cookie += '; secure'; + } + document.cookie = cookie + '; path=/'; + }, + get: function (key) { + if (!this.check()) + throw Error('cookies are disabled'); + var encodedKey = encodeURIComponent(key); + var cookies = document.cookie ? document.cookie.split(';') : []; + // retrieve last updated cookie first + for (var i = cookies.length - 1, cookie; i >= 0; i--) { + cookie = cookies[i].replace(/^\s*/, ''); + if (cookie.indexOf(encodedKey + '=') === 0) + return decodeURIComponent(cookie.substring(encodedKey.length + 1, cookie.length)); + } + return null; + }, + remove: function (key) { + // remove cookie from main domain + this.set(key, '', { expireDays: -1 }); + // remove cookie from upper domains + var domainParts = document.domain.split('.'); + for (var i = domainParts.length; i >= 0; i--) { + this.set(key, '', { expireDays: -1, domain: '.' + domainParts.slice(- i).join('.') }); + } + }, + reset: function (namespace) { + var cookies = document.cookie ? document.cookie.split(';') : []; + for (var i = 0, cookie, key; i < cookies.length; i++) { + cookie = cookies[i].replace(/^\s*/, ''); + key = cookie.substr(0, cookie.indexOf('=')); + if (!namespace || key.indexOf(namespace) === 0) + this.remove(key); + } + }, + keys: function (namespace) { + if (!this.check()) + throw Error('cookies are disabled'); + var keys = [], + cookies = document.cookie ? document.cookie.split(';') : []; + for (var i = 0, cookie, key; i < cookies.length; i++) { + cookie = cookies[i].replace(/^\s*/, ''); + key = decodeURIComponent(cookie.substr(0, cookie.indexOf('='))); + if (!namespace || key.indexOf(namespace) === 0) + keys.push(_toKeyName(namespace, key)); + } + return keys; + } + }; + + return { + init: function (options) { + this.setOptions(options); + return this; + }, + setOptions: function (options) { + this.options = Basil.utils.extend({}, this.options || Basil.options, options); + }, + support: function (storage) { + return _storages.hasOwnProperty(storage); + }, + check: function (storage) { + if (this.support(storage)) + return _storages[storage].check(); + return false; + }, + set: function (key, value, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return false; + value = options.raw === true ? value : _toStoredValue(value); + var where = null; + // try to set key/value in first available storage + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + _storages[storage].set(key, value, options); + where = storage; + return false; // break; + }, null, this); + if (!where) { + // key has not been set anywhere + return false; + } + // remove key from all other storages + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + if (storage !== where) + _storages[storage].remove(key); + }, null, this); + return true; + }, + get: function (key, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return null; + var value = null; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage, index) { + if (value !== null) + return false; // break if a value has already been found. + value = _storages[storage].get(key, options) || null; + value = options.raw === true ? value : _fromStoredValue(value); + }, function (storage, index, error) { + value = null; + }, this); + return value; + }, + remove: function (key, options) { + options = Basil.utils.extend({}, this.options, options); + if (!(key = _toStoredKey(options.namespace, key))) + return; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + _storages[storage].remove(key); + }, null, this); + }, + reset: function (options) { + options = Basil.utils.extend({}, this.options, options); + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + _storages[storage].reset(options.namespace); + }, null, this); + }, + keys: function (options) { + options = options || {}; + var keys = []; + for (var key in this.keysMap(options)) + keys.push(key); + return keys; + }, + keysMap: function (options) { + options = Basil.utils.extend({}, this.options, options); + var map = {}; + Basil.utils.tryEach(_toStoragesArray(options.storages), function (storage) { + Basil.utils.each(_storages[storage].keys(options.namespace), function (key) { + map[key] = Basil.utils.isArray(map[key]) ? map[key] : []; + map[key].push(storage); + }, this); + }, null, this); + return map; + } + }; + }; + + // Access to native storages, without namespace or basil value decoration + Basil.memory = new Basil.Storage().init({ storages: 'memory', namespace: null, raw: true }); + Basil.cookie = new Basil.Storage().init({ storages: 'cookie', namespace: null, raw: true }); + Basil.localStorage = new Basil.Storage().init({ storages: 'local', namespace: null, raw: true }); + Basil.sessionStorage = new Basil.Storage().init({ storages: 'session', namespace: null, raw: true }); + + // browser export + window.Basil = Basil; + + // AMD export + if (typeof define === 'function' && define.amd) { + define(function() { + return Basil; + }); + // commonjs export + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = Basil; + } + +})(); + +},{}],10:[function(require,module,exports){ + +},{}],11:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -370,7 +1179,7 @@ exports.initialiseMenu = initialiseMenu; 'use strict'; /** - * @file Embedded JavaScript templating engine. + * @file Embedded JavaScript templating engine. {@link http://ejs.co} * @author Matthew Eernisse * @author Tiancheng "Timothy" Gu * @project EJS @@ -395,19 +1204,23 @@ exports.initialiseMenu = initialiseMenu; * @public */ -var fs = require('fs') - , utils = require('./utils') - , scopeOptionWarned = false - , _VERSION_STRING = require('../package.json').version - , _DEFAULT_DELIMITER = '%' - , _DEFAULT_LOCALS_NAME = 'locals' - , _REGEX_STRING = '(<%%|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)' - , _OPTS = [ 'cache', 'filename', 'delimiter', 'scope', 'context' - , 'debug', 'compileDebug', 'client', '_with', 'rmWhitespace' - , 'strict', 'localsName' - ] - , _TRAILING_SEMCOL = /;\s*$/ - , _BOM = /^\uFEFF/; +var fs = require('fs'); +var path = require('path'); +var utils = require('./utils'); + +var scopeOptionWarned = false; +var _VERSION_STRING = require('../package.json').version; +var _DEFAULT_DELIMITER = '%'; +var _DEFAULT_LOCALS_NAME = 'locals'; +var _NAME = 'ejs'; +var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)'; +var _OPTS = ['delimiter', 'scope', 'context', 'debug', 'compileDebug', + 'client', '_with', 'rmWhitespace', 'strict', 'filename']; +// We don't allow 'cache' option to be passed in the data obj +// for the normal `render` call, but this is where Express puts it +// so we make an exception for `renderFile` +var _OPTS_EXPRESS = _OPTS.concat('cache'); +var _BOM = /^\uFEFF/; /** * EJS template function cache. This can be a LRU object from lru-cache NPM @@ -419,10 +1232,19 @@ var fs = require('fs') exports.cache = utils.cache; +/** + * Custom file loader. Useful for template preprocessing or restricting access + * to a certain part of the filesystem. + * + * @type {fileLoader} + */ + +exports.fileLoader = fs.readFileSync; + /** * Name of the object containing the locals. * - * This variable is overriden by {@link Options}`.localsName` if it is not + * This variable is overridden by {@link Options}`.localsName` if it is not * `undefined`. * * @type {String} @@ -435,24 +1257,64 @@ exports.localsName = _DEFAULT_LOCALS_NAME; * Get the path to the included file from the parent file path and the * specified path. * - * @param {String} name specified path - * @param {String} filename parent file path + * @param {String} name specified path + * @param {String} filename parent file path + * @param {Boolean} isDir parent file path whether is directory * @return {String} */ - -exports.resolveInclude = function(name, filename) { - var path = require('path') - , dirname = path.dirname - , extname = path.extname - , resolve = path.resolve - , includePath = resolve(dirname(filename), name) - , ext = extname(name); +exports.resolveInclude = function(name, filename, isDir) { + var dirname = path.dirname; + var extname = path.extname; + var resolve = path.resolve; + var includePath = resolve(isDir ? filename : dirname(filename), name); + var ext = extname(name); if (!ext) { includePath += '.ejs'; } return includePath; }; +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +function getIncludePath(path, options) { + var includePath; + var filePath; + var views = options.views; + + // Abs path + if (path.charAt(0) == '/') { + includePath = exports.resolveInclude(path.replace(/^\/*/,''), options.root || '/', true); + } + // Relative paths + else { + // Look relative to a passed filename first + if (options.filename) { + filePath = exports.resolveInclude(path, options.filename); + if (fs.existsSync(filePath)) { + includePath = filePath; + } + } + // Then look in any views directories + if (!includePath) { + if (Array.isArray(views) && views.some(function (v) { + filePath = exports.resolveInclude(path, v, true); + return fs.existsSync(filePath); + })) { + includePath = filePath; + } + } + if (!includePath) { + throw new Error('Could not find include include file.'); + } + } + return includePath; +} + /** * Get the template from a string or a file, either compiled on-the-fly or * read from cache (if enabled), and cache the template if needed. @@ -472,35 +1334,70 @@ exports.resolveInclude = function(name, filename) { */ function handleCache(options, template) { - var fn - , path = options.filename - , hasTemplate = arguments.length > 1; + var func; + var filename = options.filename; + var hasTemplate = arguments.length > 1; if (options.cache) { - if (!path) { + if (!filename) { throw new Error('cache option requires a filename'); } - fn = exports.cache.get(path); - if (fn) { - return fn; + func = exports.cache.get(filename); + if (func) { + return func; } if (!hasTemplate) { - template = fs.readFileSync(path).toString().replace(_BOM, ''); + template = fileLoader(filename).toString().replace(_BOM, ''); } } else if (!hasTemplate) { // istanbul ignore if: should not happen at all - if (!path) { + if (!filename) { throw new Error('Internal EJS error: no file name or template ' + 'provided'); } - template = fs.readFileSync(path).toString().replace(_BOM, ''); + template = fileLoader(filename).toString().replace(_BOM, ''); } - fn = exports.compile(template, options); + func = exports.compile(template, options); if (options.cache) { - exports.cache.set(path, fn); + exports.cache.set(filename, func); + } + return func; +} + +/** + * Try calling handleCache with the given options and data and call the + * callback with the result. If an error occurs, call the callback with + * the error. Used by renderFile(). + * + * @memberof module:ejs-internal + * @param {Options} options compilation options + * @param {Object} data template data + * @param {RenderFileCallback} cb callback + * @static + */ + +function tryHandleCache(options, data, cb) { + var result; + try { + result = handleCache(options)(data); } - return fn; + catch (err) { + return cb(err); + } + return cb(null, result); +} + +/** + * fileLoader is independent + * + * @param {String} filePath ejs file path. + * @return {String} The contents of the specified file. + * @static + */ + +function fileLoader(filePath){ + return exports.fileLoader(filePath); } /** @@ -518,10 +1415,7 @@ function handleCache(options, template) { function includeFile(path, options) { var opts = utils.shallowCopy({}, options); - if (!opts.filename) { - throw new Error('`include` requires the \'filename\' option.'); - } - opts.filename = exports.resolveInclude(path, opts.filename); + opts.filename = getIncludePath(path, opts); return handleCache(opts); } @@ -531,24 +1425,24 @@ function includeFile(path, options) { * @memberof module:ejs-internal * @param {String} path path for the specified file * @param {Options} options compilation options - * @return {String} + * @return {Object} * @static */ function includeSource(path, options) { - var opts = utils.shallowCopy({}, options) - , includePath - , template; - if (!opts.filename) { - throw new Error('`include` requires the \'filename\' option.'); - } - includePath = exports.resolveInclude(path, opts.filename); - template = fs.readFileSync(includePath).toString().replace(_BOM, ''); - + var opts = utils.shallowCopy({}, options); + var includePath; + var template; + includePath = getIncludePath(path, opts); + template = fileLoader(includePath).toString().replace(_BOM, ''); opts.filename = includePath; var templ = new Template(template, opts); templ.generateSource(); - return templ.source; + return { + source: templ.source, + filename: includePath, + template: template + }; } /** @@ -564,11 +1458,11 @@ function includeSource(path, options) { * @static */ -function rethrow(err, str, filename, lineno){ - var lines = str.split('\n') - , start = Math.max(lineno - 3, 0) - , end = Math.min(lines.length, lineno + 3); - +function rethrow(err, str, flnm, lineno, esc){ + var lines = str.split('\n'); + var start = Math.max(lineno - 3, 0); + var end = Math.min(lines.length, lineno + 3); + var filename = esc(flnm); // eslint-disable-line // Error context var context = lines.slice(start, end).map(function (line, i){ var curr = i + start + 1; @@ -588,24 +1482,8 @@ function rethrow(err, str, filename, lineno){ throw err; } -/** - * Copy properties in data object that are recognized as options to an - * options object. - * - * This is used for compatibility with earlier versions of EJS and Express.js. - * - * @memberof module:ejs-internal - * @param {Object} data data object - * @param {Options} opts options object - * @static - */ - -function cpOptsInData(data, opts) { - _OPTS.forEach(function (p) { - if (typeof data[p] != 'undefined') { - opts[p] = data[p]; - } - }); +function stripSemi(str){ + return str.replace(/;(\s*$)/, '$1'); } /** @@ -653,15 +1531,14 @@ exports.compile = function compile(template, opts) { * @public */ -exports.render = function (template, data, opts) { - data = data || {}; - opts = opts || {}; - var fn; +exports.render = function (template, d, o) { + var data = d || {}; + var opts = o || {}; // No options object -- if there are optiony names // in the data, copy them to options if (arguments.length == 2) { - cpOptsInData(data, opts); + utils.shallowCopyFromList(opts, data, _OPTS); } return handleCache(opts, template)(data); @@ -681,37 +1558,43 @@ exports.render = function (template, data, opts) { */ exports.renderFile = function () { - var args = Array.prototype.slice.call(arguments) - , path = args.shift() - , cb = args.pop() - , data = args.shift() || {} - , opts = args.pop() || {} - , result; - - // Don't pollute passed in opts obj with new vals - opts = utils.shallowCopy({}, opts); - - // No options object -- if there are optiony names - // in the data, copy them to options - if (arguments.length == 3) { - // Express 4 - if (data.settings && data.settings['view options']) { - cpOptsInData(data.settings['view options'], opts); + var filename = arguments[0]; + var cb = arguments[arguments.length - 1]; + var opts = {filename: filename}; + var data; + + if (arguments.length > 2) { + data = arguments[1]; + + // No options object -- if there are optiony names + // in the data, copy them to options + if (arguments.length === 3) { + // Express 4 + if (data.settings) { + if (data.settings['view options']) { + utils.shallowCopyFromList(opts, data.settings['view options'], _OPTS_EXPRESS); + } + if (data.settings.views) { + opts.views = data.settings.views; + } + } + // Express 3 and lower + else { + utils.shallowCopyFromList(opts, data, _OPTS_EXPRESS); + } } - // Express 3 and lower else { - cpOptsInData(data, opts); + // Use shallowCopy so we don't pollute passed in opts obj with new vals + utils.shallowCopy(opts, arguments[2]); } - } - opts.filename = path; - try { - result = handleCache(opts)(data); + opts.filename = filename; } - catch(err) { - return cb(err); + else { + data = {}; } - return cb(null, result); + + return tryHandleCache(opts, data, cb); }; /** @@ -742,7 +1625,9 @@ function Template(text, opts) { options.context = opts.context; options.cache = opts.cache || false; options.rmWhitespace = opts.rmWhitespace; + options.root = opts.root; options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME; + options.views = opts.views; if (options.strict) { options._with = false; @@ -757,39 +1642,28 @@ function Template(text, opts) { } Template.modes = { - EVAL: 'eval' -, ESCAPED: 'escaped' -, RAW: 'raw' -, COMMENT: 'comment' -, LITERAL: 'literal' + EVAL: 'eval', + ESCAPED: 'escaped', + RAW: 'raw', + COMMENT: 'comment', + LITERAL: 'literal' }; Template.prototype = { createRegex: function () { - var str = _REGEX_STRING - , delim = utils.escapeRegExpChars(this.opts.delimiter); + var str = _REGEX_STRING; + var delim = utils.escapeRegExpChars(this.opts.delimiter); str = str.replace(/%/g, delim); return new RegExp(str); - } - -, compile: function () { - var src - , fn - , opts = this.opts - , prepended = '' - , appended = '' - , escape = opts.escapeFunction; - - if (opts.rmWhitespace) { - // Have to use two separate replace here as `^` and `$` operators don't - // work well with `\r`. - this.templateText = - this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, ''); - } + }, - // Slurp spaces and tabs before <%_ and after _%> - this.templateText = - this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>'); + compile: function () { + var src; + var fn; + var opts = this.opts; + var prepended = ''; + var appended = ''; + var escapeFn = opts.escapeFunction; if (!this.source) { this.generateSource(); @@ -810,19 +1684,15 @@ Template.prototype = { + 'try {' + '\n' + this.source + '} catch (e) {' + '\n' - + ' rethrow(e, __lines, __filename, __line);' + '\n' + + ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n' + '}' + '\n'; } else { src = this.source; } - if (opts.debug) { - console.log(src); - } - if (opts.client) { - src = 'escape = escape || ' + escape.toString() + ';' + '\n' + src; + src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src; if (opts.compileDebug) { src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src; } @@ -831,9 +1701,12 @@ Template.prototype = { if (opts.strict) { src = '"use strict";\n' + src; } + if (opts.debug) { + console.log(src); + } try { - fn = new Function(opts.localsName + ', escape, include, rethrow', src); + fn = new Function(opts.localsName + ', escapeFn, include, rethrow', src); } catch(e) { // istanbul ignore else @@ -841,7 +1714,9 @@ Template.prototype = { if (opts.filename) { e.message += ' in ' + opts.filename; } - e.message += ' while compiling ejs'; + e.message += ' while compiling ejs\n\n'; + e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n'; + e.message += 'https://github.com/RyanZim/EJS-Lint'; } throw e; } @@ -862,24 +1737,38 @@ Template.prototype = { } return includeFile(path, opts)(d); }; - return fn.apply(opts.context, [data || {}, escape, include, rethrow]); + return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]); }; returnedFn.dependencies = this.dependencies; return returnedFn; - } + }, -, generateSource: function () { - var self = this - , matches = this.parseTemplateText() - , d = this.opts.delimiter; + generateSource: function () { + var opts = this.opts; + + if (opts.rmWhitespace) { + // Have to use two separate replace here as `^` and `$` operators don't + // work well with `\r`. + this.templateText = + this.templateText.replace(/\r/g, '').replace(/^\s+|\s+$/gm, ''); + } + + // Slurp spaces and tabs before <%_ and after _%> + this.templateText = + this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>'); + + var self = this; + var matches = this.parseTemplateText(); + var d = this.opts.delimiter; if (matches && matches.length) { matches.forEach(function (line, index) { - var opening - , closing - , include - , includeOpts - , includeSrc; + var opening; + var closing; + var include; + var includeOpts; + var includeObj; + var includeSrc; // If this is an opening tag, check for closing tags // FIXME: May end up with some false positives here // Better to store modes as k/v with '<' + delimiter as key @@ -897,9 +1786,23 @@ Template.prototype = { // Must be in EVAL or RAW mode if (opening && (opening == '<' + d || opening == '<' + d + '-' || opening == '<' + d + '_')) { includeOpts = utils.shallowCopy({}, self.opts); - includeSrc = includeSource(include[1], includeOpts); - includeSrc = ' ; (function(){' + '\n' + includeSrc + - ' ; })()' + '\n'; + includeObj = includeSource(include[1], includeOpts); + if (self.opts.compileDebug) { + includeSrc = + ' ; (function(){' + '\n' + + ' var __line = 1' + '\n' + + ' , __lines = ' + JSON.stringify(includeObj.template) + '\n' + + ' , __filename = ' + JSON.stringify(includeObj.filename) + ';' + '\n' + + ' try {' + '\n' + + includeObj.source + + ' } catch (e) {' + '\n' + + ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n' + + ' }' + '\n' + + ' ; }).call(this)' + '\n'; + }else{ + includeSrc = ' ; (function(){' + '\n' + includeObj.source + + ' ; }).call(this)' + '\n'; + } self.source += includeSrc; self.dependencies.push(exports.resolveInclude(include[1], includeOpts.filename)); @@ -910,19 +1813,17 @@ Template.prototype = { }); } - } + }, -, parseTemplateText: function () { - var str = this.templateText - , pat = this.regex - , result = pat.exec(str) - , arr = [] - , firstPos - , lastPos; + parseTemplateText: function () { + var str = this.templateText; + var pat = this.regex; + var result = pat.exec(str); + var arr = []; + var firstPos; while (result) { firstPos = result.index; - lastPos = pat.lastIndex; if (firstPos !== 0) { arr.push(str.substring(0, firstPos)); @@ -939,116 +1840,117 @@ Template.prototype = { } return arr; - } + }, -, scanLine: function (line) { - var self = this - , d = this.opts.delimiter - , newLineCount = 0; - - function _addOutput() { - if (self.truncate) { - // Only replace single leading linebreak in the line after - // -%> tag -- this is the single, trailing linebreak - // after the tag that the truncation mode replaces - // Handle Win / Unix / old Mac linebreaks -- do the \r\n - // combo first in the regex-or - line = line.replace(/^(?:\r\n|\r|\n)/, '') - self.truncate = false; - } - else if (self.opts.rmWhitespace) { - // Gotta be more careful here. - // .replace(/^(\s*)\n/, '$1') might be more appropriate here but as - // rmWhitespace already removes trailing spaces anyway so meh. - line = line.replace(/^\n/, ''); - } - if (!line) { - return; - } + _addOutput: function (line) { + if (this.truncate) { + // Only replace single leading linebreak in the line after + // -%> tag -- this is the single, trailing linebreak + // after the tag that the truncation mode replaces + // Handle Win / Unix / old Mac linebreaks -- do the \r\n + // combo first in the regex-or + line = line.replace(/^(?:\r\n|\r|\n)/, ''); + this.truncate = false; + } + else if (this.opts.rmWhitespace) { + // rmWhitespace has already removed trailing spaces, just need + // to remove linebreaks + line = line.replace(/^\n/, ''); + } + if (!line) { + return line; + } - // Preserve literal slashes - line = line.replace(/\\/g, '\\\\'); + // Preserve literal slashes + line = line.replace(/\\/g, '\\\\'); - // Convert linebreaks - line = line.replace(/\n/g, '\\n'); - line = line.replace(/\r/g, '\\r'); + // Convert linebreaks + line = line.replace(/\n/g, '\\n'); + line = line.replace(/\r/g, '\\r'); - // Escape double-quotes - // - this will be the delimiter during execution - line = line.replace(/"/g, '\\"'); - self.source += ' ; __append("' + line + '")' + '\n'; - } + // Escape double-quotes + // - this will be the delimiter during execution + line = line.replace(/"/g, '\\"'); + this.source += ' ; __append("' + line + '")' + '\n'; + }, + + scanLine: function (line) { + var self = this; + var d = this.opts.delimiter; + var newLineCount = 0; newLineCount = (line.split('\n').length - 1); switch (line) { - case '<' + d: - case '<' + d + '_': - this.mode = Template.modes.EVAL; - break; - case '<' + d + '=': - this.mode = Template.modes.ESCAPED; - break; - case '<' + d + '-': - this.mode = Template.modes.RAW; - break; - case '<' + d + '#': - this.mode = Template.modes.COMMENT; - break; - case '<' + d + d: - this.mode = Template.modes.LITERAL; - this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n'; - break; - case d + '>': - case '-' + d + '>': - case '_' + d + '>': - if (this.mode == Template.modes.LITERAL) { - _addOutput(); - } + case '<' + d: + case '<' + d + '_': + this.mode = Template.modes.EVAL; + break; + case '<' + d + '=': + this.mode = Template.modes.ESCAPED; + break; + case '<' + d + '-': + this.mode = Template.modes.RAW; + break; + case '<' + d + '#': + this.mode = Template.modes.COMMENT; + break; + case '<' + d + d: + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace('<' + d + d, '<' + d) + '")' + '\n'; + break; + case d + d + '>': + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace(d + d + '>', d + '>') + '")' + '\n'; + break; + case d + '>': + case '-' + d + '>': + case '_' + d + '>': + if (this.mode == Template.modes.LITERAL) { + this._addOutput(line); + } - this.mode = null; - this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0; - break; - default: + this.mode = null; + this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0; + break; + default: // In script mode, depends on type of tag - if (this.mode) { + if (this.mode) { // If '//' is found without a line break, add a line break. - switch (this.mode) { - case Template.modes.EVAL: - case Template.modes.ESCAPED: - case Template.modes.RAW: - if (line.lastIndexOf('//') > line.lastIndexOf('\n')) { - line += '\n'; - } + switch (this.mode) { + case Template.modes.EVAL: + case Template.modes.ESCAPED: + case Template.modes.RAW: + if (line.lastIndexOf('//') > line.lastIndexOf('\n')) { + line += '\n'; } - switch (this.mode) { + } + switch (this.mode) { // Just executing code - case Template.modes.EVAL: - this.source += ' ; ' + line + '\n'; - break; + case Template.modes.EVAL: + this.source += ' ; ' + line + '\n'; + break; // Exec, esc, and output - case Template.modes.ESCAPED: - this.source += ' ; __append(escape(' + - line.replace(_TRAILING_SEMCOL, '').trim() + '))' + '\n'; - break; + case Template.modes.ESCAPED: + this.source += ' ; __append(escapeFn(' + stripSemi(line) + '))' + '\n'; + break; // Exec and output - case Template.modes.RAW: - this.source += ' ; __append(' + - line.replace(_TRAILING_SEMCOL, '').trim() + ')' + '\n'; - break; - case Template.modes.COMMENT: + case Template.modes.RAW: + this.source += ' ; __append(' + stripSemi(line) + ')' + '\n'; + break; + case Template.modes.COMMENT: // Do nothing - break; + break; // Literal <%% mode, append as raw output - case Template.modes.LITERAL: - _addOutput(); - break; - } + case Template.modes.LITERAL: + this._addOutput(line); + break; } + } // In string mode, just add the output - else { - _addOutput(); - } + else { + this._addOutput(line); + } } if (self.opts.compileDebug && newLineCount) { @@ -1058,6 +1960,20 @@ Template.prototype = { } }; +/** + * Escape characters reserved in XML. + * + * This is simply an export of {@link module:utils.escapeXML}. + * + * If `markup` is `undefined` or `null`, the empty string is returned. + * + * @param {String} markup Input string + * @return {String} Escaped string + * @public + * @func + * */ +exports.escapeXML = utils.escapeXML; + /** * Express.js support. * @@ -1072,14 +1988,14 @@ exports.__express = exports.renderFile; // Add require support /* istanbul ignore else */ if (require.extensions) { - require.extensions['.ejs'] = function (module, filename) { - filename = filename || /* istanbul ignore next */ module.filename; + require.extensions['.ejs'] = function (module, flnm) { + var filename = flnm || /* istanbul ignore next */ module.filename; var options = { - filename: filename - , client: true - } - , template = fs.readFileSync(filename).toString() - , fn = exports.compile(template, options); + filename: filename, + client: true + }; + var template = fileLoader(filename).toString(); + var fn = exports.compile(template, options); module._compile('module.exports = ' + fn.toString() + ';', filename); }; } @@ -1094,12 +2010,22 @@ if (require.extensions) { exports.VERSION = _VERSION_STRING; +/** + * Name for detection of EJS. + * + * @readonly + * @type {String} + * @public + */ + +exports.name = _NAME; + /* istanbul ignore if */ if (typeof window != 'undefined') { window.ejs = exports; } -},{"../package.json":8,"./utils":7,"fs":9,"path":10}],7:[function(require,module,exports){ +},{"../package.json":13,"./utils":12,"fs":10,"path":14}],12:[function(require,module,exports){ /* * EJS Embedded JavaScript templates * Copyright 2112 Matthew Eernisse (mde@fleegix.org) @@ -1147,17 +2073,17 @@ exports.escapeRegExpChars = function (string) { }; var _ENCODE_HTML_RULES = { - '&': '&' - , '<': '<' - , '>': '>' - , '"': '"' - , "'": ''' - } - , _MATCH_HTML = /[&<>\'"]/g; + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +var _MATCH_HTML = /[&<>\'"]/g; function encode_char(c) { return _ENCODE_HTML_RULES[c] || c; -}; +} /** * Stringified version of constants used by {@link module:utils.escapeXML}. @@ -1200,11 +2126,13 @@ exports.escapeXML = function (markup) { .replace(_MATCH_HTML, encode_char); }; exports.escapeXML.toString = function () { - return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr + return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr; }; /** - * Copy all properties from one object to another, in a shallow fashion. + * Naive copy of properties from one object to another. + * Does not recurse into non-scalar properties + * Does not check to see if the property has a value before copying * * @param {Object} to Destination object * @param {Object} from Source object @@ -1220,6 +2148,28 @@ exports.shallowCopy = function (to, from) { return to; }; +/** + * Naive copy of a list of key names, from one object to another. + * Only copies property if it is actually defined + * Does not recurse into non-scalar properties + * + * @param {Object} to Destination object + * @param {Object} from Source object + * @param {Array} list List of properties to copy + * @return {Object} Destination object + * @static + * @private + */ +exports.shallowCopyFromList = function (to, from, list) { + for (var i = 0; i < list.length; i++) { + var p = list[i]; + if (typeof from[p] != 'undefined') { + to[p] = from[p]; + } + } + return to; +}; + /** * Simple in-process cache implementation. Does not implement limits of any * sort. @@ -1241,22 +2191,40 @@ exports.cache = { } }; - -},{}],8:[function(require,module,exports){ +},{}],13:[function(require,module,exports){ module.exports={ - "name": "ejs", - "description": "Embedded JavaScript templates", - "keywords": [ - "template", - "engine", - "ejs" + "_from": "ejs@^2.4.1", + "_id": "ejs@2.5.7", + "_inBundle": false, + "_integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "_location": "/ejs", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "ejs@^2.4.1", + "name": "ejs", + "escapedName": "ejs", + "rawSpec": "^2.4.1", + "saveSpec": null, + "fetchSpec": "^2.4.1" + }, + "_requiredBy": [ + "/" ], - "version": "2.4.1", + "_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "_shasum": "cc872c168880ae3c7189762fd5ffc00896c9518a", + "_spec": "ejs@^2.4.1", + "_where": "D:\\GitHub_repositories\\JS-Pizza", "author": { "name": "Matthew Eernisse", "email": "mde@fleegix.org", "url": "http://fleegix.org" }, + "bugs": { + "url": "https://github.com/mde/ejs/issues" + }, + "bundleDependencies": false, "contributors": [ { "name": "Timothy Gu", @@ -1264,67 +2232,47 @@ module.exports={ "url": "https://timothygu.github.io" } ], - "license": "Apache-2.0", - "main": "./lib/ejs.js", - "repository": { - "type": "git", - "url": "git://github.com/mde/ejs.git" - }, - "bugs": { - "url": "https://github.com/mde/ejs/issues" - }, - "homepage": "https://github.com/mde/ejs", "dependencies": {}, + "deprecated": false, + "description": "Embedded JavaScript templates", "devDependencies": { - "browserify": "^8.0.3", - "istanbul": "~0.3.5", + "browserify": "^13.0.1", + "eslint": "^3.0.0", + "git-directory-deploy": "^1.5.1", + "istanbul": "~0.4.3", "jake": "^8.0.0", - "jsdoc": "^3.3.0-beta1", - "lru-cache": "^2.5.0", - "mocha": "^2.1.0", - "rimraf": "^2.2.8", - "uglify-js": "^2.4.16" + "jsdoc": "^3.4.0", + "lru-cache": "^4.0.1", + "mocha": "^3.0.2", + "uglify-js": "^2.6.2" }, "engines": { "node": ">=0.10.0" }, + "homepage": "https://github.com/mde/ejs", + "keywords": [ + "template", + "engine", + "ejs" + ], + "license": "Apache-2.0", + "main": "./lib/ejs.js", + "name": "ejs", + "repository": { + "type": "git", + "url": "git://github.com/mde/ejs.git" + }, "scripts": { - "test": "mocha", "coverage": "istanbul cover node_modules/mocha/bin/_mocha", - "doc": "rimraf out && jsdoc -c jsdoc.json lib/* docs/jsdoc/*", - "devdoc": "rimraf out && jsdoc -p -c jsdoc.json lib/* docs/jsdoc/*" - }, - "_id": "ejs@2.4.1", - "_shasum": "82e15b1b2a1f948b18097476ba2bd7c66f4d1566", - "_resolved": "https://registry.npmjs.org/ejs/-/ejs-2.4.1.tgz", - "_from": "ejs@>=2.4.1 <3.0.0", - "_npmVersion": "2.10.1", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "mde", - "email": "mde@fleegix.org" - }, - "maintainers": [ - { - "name": "tjholowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "mde", - "email": "mde@fleegix.org" - } - ], - "dist": { - "shasum": "82e15b1b2a1f948b18097476ba2bd7c66f4d1566", - "tarball": "http://registry.npmjs.org/ejs/-/ejs-2.4.1.tgz" + "devdoc": "jake doc[dev]", + "doc": "jake doc", + "lint": "eslint \"**/*.js\" Jakefile", + "test": "jake test" }, - "directories": {}, - "readme": "ERROR: No README data found!" + "version": "2.5.7" } -},{}],9:[function(require,module,exports){ - -},{}],10:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -1552,16 +2500,105 @@ var substr = 'ab'.substr(-1) === 'b' ; }).call(this,require('_process')) -},{"_process":11}],11:[function(require,module,exports){ +},{"_process":15}],15:[function(require,module,exports){ // shim for using process in browser - var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); @@ -1577,7 +2614,7 @@ function drainQueue() { if (draining) { return; } - var timeout = setTimeout(cleanUpNextTick); + var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -1594,7 +2631,7 @@ function drainQueue() { } currentQueue = null; draining = false; - clearTimeout(timeout); + runClearTimeout(timeout); } process.nextTick = function (fun) { @@ -1606,7 +2643,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); + runTimeout(drainQueue); } }; @@ -1634,6 +2671,10 @@ process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } process.binding = function (name) { throw new Error('process.binding is not supported'); @@ -1645,4 +2686,4 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}]},{},[3]); +},{}]},{},[5]); diff --git a/Frontend/www/assets/less/main.less b/Frontend/www/assets/less/main.less index e49b0b5fa..83d8189de 100644 --- a/Frontend/www/assets/less/main.less +++ b/Frontend/www/assets/less/main.less @@ -1,3 +1,176 @@ -@mainColor: blue; +@mainColor: orange; -@import "pizza/pizza-card"; \ No newline at end of file +@import "pizza/pizza-card"; +@import "panels/right-panel"; +@import "panels/top-panel"; +@import "panels/bottom-panel"; + +@RightPanelWidth: 330px; +@TopPanelHeight: 80px; +@BottomPanelHeight: 100px; + +.main-pizza { + margin-right: @RightPanelWidth; + margin-top: @TopPanelHeight; +} + +.inner-container { + max-width: 1000px; + margin: auto; + + padding: 10px; +} + +.orange { + background-color: #ec890e; +} + +.page-title { + margin: 20px; +} + +.pizza-all-types { + display: inline-block; +} + +.page-title .all-pizza-type-wrap .pizza-all-types .active a { + color: white; + background-color: #ec890e; +} + +a { + color: #ec890e; +} + +.top-badge { + position: fixed; + top: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 100px; + padding: 10px; + color: #ffffff; + + .badge-before { + position: fixed; + top: 100px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + transform: scaleY(-1); + } + + .badge-title { + font-size: 23px; + //font-weight: 700; + font-family: Helvetica, Calibri; + padding-top: 10px; + padding-bottom: 3px; + } +} + +.discount-panel { + position: fixed; + bottom: 0; + left: 9px; + border-left: 1px solid #d16200; + border-right: 1px solid #d16200; + + background-color: #ea862e; + z-index: 99; + width: 100px; + height: 116px; + padding: 10px; + color: #ffffff; + + .discount-before { + position: fixed; + bottom: 116px; + left: 9px; + width: 100px; + height: 11px; + background-image: url(../images/discount.svg); + background-size: 100px 11px; + padding: 0; + margin: 0; + } + + .discount-title { + font-size: 15px; + font-weight: 700; + font-family: Helvetica, Calibri; + border-bottom: 2px dotted #d16301; + margin-bottom: 7px; + padding-bottom: 3px; + } + + .discount-text { + font-size: 15px; + font-weight: 700; + } +} + +.main-order-container { + padding: 100px 50px 20px 20px; + .form-description { + font-size: 20px; + padding-bottom: 10px; + } + + .next-step-wrap { + float: right; + padding-right: 30px; + margin-top: 15px; + + .next-step-width{ + width: 100px; + } + } + + .form-group{ + margin-left: -15px; + margin-right: -15px; + + .help-block{ + margin-left: 110px; + color: #880a02; + } + } + + .bs-callout{ + padding: 20px; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 5px; + background-color: #fff; + } + + .bs-call-out-warning{ + border-left-color: #ec890e; + } +} + +.google-maps{ + width: 100%; + height: 350px; + margin-top: 10px; + margin-bottom: 20px; + padding-left: 50px; +} + +.bottom-panel, .page-title, .pizza-all-types, .all-pizza-type-wrap, .pizza-small, .pizza-big, .discount-panel, .top-badge { + text-align: center; +} + +* { + box-sizing: border-box; +} diff --git a/Frontend/www/assets/less/panels/bottom-panel.less b/Frontend/www/assets/less/panels/bottom-panel.less new file mode 100644 index 000000000..a2a4c050b --- /dev/null +++ b/Frontend/www/assets/less/panels/bottom-panel.less @@ -0,0 +1,13 @@ +.bottom-panel { + width: 100%; + height: @BottomPanelHeight; + + bottom: 0; + right: 0; + background-color: #fff; + border-top: 1px solid #e5e5e5; + padding: 30px 30px 30px 30px; + + color: grey; + font-size: 14px; +} \ No newline at end of file diff --git a/Frontend/www/assets/less/panels/right-panel.less b/Frontend/www/assets/less/panels/right-panel.less new file mode 100644 index 000000000..3254787f9 --- /dev/null +++ b/Frontend/www/assets/less/panels/right-panel.less @@ -0,0 +1,168 @@ +.right-panel { + height: 100%; + width: @RightPanelWidth; + + position: fixed; + top: 0; + right: 0; + + box-shadow: rgba(0,0,0,.2) -3px 3px 10px; + background-color: #F5F5F5; +} + +@RightTopHeight: 80px; +@RightBottomHeight: 100px; + +.center-part { + width: 100%; + height: 100%; + + overflow-x: hidden; + overflow-y: auto; + + padding-top: @RightTopHeight; + padding-bottom: @RightBottomHeight; + + .order-one { +// display: none; + height: 120px; + padding: 20px 61px 10px 24px; + border-bottom: 1px solid rgba(0, 0, 0, .1); + position: relative; + + .img-aside { + position: absolute; + right: -48px; + top: 5px; + border-radius: 50% 0 0 50%; + max-height: 96px; + max-width: 96px; + } + + .order-title { + font-size: 20px; + color: #ec890e; + } + + .order-text { + font-size: 12px; + margin-top: 6px; + margin-bottom: 6px; + + .gram-image { + margin-left: 15px; + } + } + + .price-box { + font-size: 14px; + font-weight: 700; + + .price-menu { + margin-right: 10px; + } + .btn-circle { + width: 30px; + height: 30px; + padding: 6px 0; + font-size: 12px; + border-radius: 15px; + } + .order-pizza-count { + font-size: 14px; + } + .count-clear { + margin-left: 25px; + color: #ec890e; + } + } + } + + .no-order-text { + // display: none; + font-size: 16px; + color: #4e4e4e; + text-align: center; + padding-top: 50px; + padding-bottom: 50px; + } +} + +.top-part { + position: absolute; + top: 0; + right: 0; + + width: 100%; + height: @RightTopHeight; + + padding-top: 25px; + background-color: #fff; + + .top-order-title { + width: 100%; + padding-bottom: 13px; + + .order-list-title { + font-size: 20px; + font-weight: 700; + padding-left: 15px; + } + + .clear-order { + float: right; + margin-top: 10px; + padding-right: 15px; + font-size: 10px; + color: rgba(0, 0, 0, .5); + border: 0px; + background-color: white; + } + + .clear-order:focus{ + outline: none; + } + + } +} + +.bottom-part { + position: absolute; + bottom: 0; + right: 0; + + width: 100%; + height: @RightBottomHeight; + + padding: 10px; + margin: 0; + background-color: #fff; + box-sizing: border-box; + + .order-state { + padding: 5px; + + .sum-title { + //display: none; + font-size: 15px; + font-weight: 700; + margin-bottom: 5px; + } + + .sum-number { + // display: none; + float: right; + font-size: 20px; + font-weight: 700; + padding-right: 30px; + margin-bottom: 5px; + margin-top: -5px; + } + + .do-order-button { + padding: 10px 20px 10px 10px; + } + + } +} + diff --git a/Frontend/www/assets/less/panels/top-panel.less b/Frontend/www/assets/less/panels/top-panel.less new file mode 100644 index 000000000..877d10127 --- /dev/null +++ b/Frontend/www/assets/less/panels/top-panel.less @@ -0,0 +1,50 @@ +.top-panel { + padding-right: @RightPanelWidth; + width: 100%; + height: @TopPanelHeight; + + position: fixed; + top: 0; + left: 0; + background-color: rgba(12, 6, 1, 0.8); + + .headers { + margin-left: 130px; + padding-right: @RightPanelWidth/2; + width: 100%; + height: 100%; + // border: 1px solid #a1a1a1; + + .top-header { + height: @TopPanelHeight/2; + color: #a1a1a1; + border-bottom: 1px solid #a1a1a1; + .sign-in { + color: #fff; + margin-top: 3px; + float: right; + } + .phone-number { + font-size: 20px; + padding: 5px 30px 5px 5px; + } + .work-days { + font-size: 12px; + padding-right: 30px; + } + .delivery { + font-size: 16px; + padding-right: 30px; + } + } + .down-header { + height: @TopPanelHeight/2; + color: #a1a1a1; + padding-top: 5px; + .pizza-page { + font-size: 16px; + color: white; + } + } + } +} \ No newline at end of file diff --git a/Frontend/www/assets/less/pizza/pizza-card.less b/Frontend/www/assets/less/pizza/pizza-card.less index a0448e2df..ba548e9b4 100644 --- a/Frontend/www/assets/less/pizza/pizza-card.less +++ b/Frontend/www/assets/less/pizza/pizza-card.less @@ -1,10 +1,38 @@ .pizza-card { - img { - max-width: 250px; - } + position: relative; h3 { color: @mainColor; background-color: lighten(@mainColor, 45%); } -} \ No newline at end of file + + .pizza-card-icon { + max-width: 100%; + width: 300px; + } + + .title { + font-size: 30px; + color: #ec6a1c; + font-weight: 700; + font-family: "Helvetica Neue"; + } + .type { + font-size: 12px; + color: #a3a0a0; + } + .description { + font-size: 14px; + overflow: hidden; + height: 60px; + margin-bottom: 30px; + } + + .badge-new { + position: absolute; + top: -15px; + right: 7px; + + font-size: 18px; + } +} diff --git a/Frontend/www/index.html b/Frontend/www/index.html index 41873db7d..8e247b9da 100644 --- a/Frontend/www/index.html +++ b/Frontend/www/index.html @@ -8,73 +8,138 @@ - + -
-
-
-
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 2 - Button 1 -

-
+
+
+
+
+ ЦЬОГО ТИЖНЯ +
+ НА ВСЕ +
+
-20%
+
+
+
+
+ PIZZA +
+ KMA +
+
+
+ - -
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 3 - Button 4 -

+
+
+
+
+
+
+ (044) 222 5 222 +
+
+ 24 години/ 7 днів на тиждень +
+
+ Безкоштовна доставка піци
+ +
+
+
- -
-
- - -

Thumbnail label

- -

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

- -

- Button 5 - Button 6 -

+
+
+
+
+
+
+
+ + Замовлення + 0 + + +
+
+
+
+ + Сума замовлення + + + 0 грн. + +
+
+
+

+ Pizza.22 - практичний проект в межах курсу JavaScript в Києво-Могилянській Академії +

+

+ Доставка піци не здійснюється +

+
- - + + - - + + - - + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..1990a2a39 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3247 @@ +{ + "name": "Pizza", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "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==" + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", + "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", + "requires": { + "util": "0.10.3" + } + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" + }, + "basic-auth": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", + "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "basil.js": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/basil.js/-/basil.js-0.4.5.tgz", + "integrity": "sha1-qTs2dAUsuMa79lOdZBvf1mxfVaY=" + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "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" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brfs": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.4.3.tgz", + "integrity": "sha1-22ddb16SPm3wh/ylhZyQkKrtMhY=", + "requires": { + "quote-stream": "1.0.2", + "resolve": "1.5.0", + "static-module": "1.5.0", + "through2": "2.0.3" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", + "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.6.1", + "defined": "1.0.0", + "through2": "1.1.1", + "umd": "3.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-11.2.0.tgz", + "integrity": "sha1-oRu53SCdeVcrgT9+7q+Cil9cDk4=", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.3.0", + "browser-pack": "5.0.1", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.1.4", + "buffer": "3.6.0", + "builtins": "0.0.7", + "commondir": "0.0.1", + "concat-stream": "1.4.10", + "console-browserify": "1.1.0", + "constants-browserify": "0.0.1", + "crypto-browserify": "3.11.1", + "defined": "1.0.0", + "deps-sort": "1.3.9", + "domain-browser": "1.1.7", + "duplexer2": "0.0.2", + "events": "1.0.2", + "glob": "4.5.3", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "0.0.1", + "inherits": "2.0.3", + "insert-module-globals": "6.6.3", + "isarray": "0.0.1", + "labeled-stream-splicer": "1.0.2", + "module-deps": "3.9.1", + "os-browserify": "0.1.2", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "1.1.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "0.0.1", + "stream-browserify": "2.0.1", + "stream-http": "1.7.1", + "string_decoder": "0.10.31", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "1.1.1", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.10.3", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + } + } + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", + "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", + "requires": { + "base64-js": "0.0.8", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "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-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz", + "integrity": "sha1-MGN+4mKXisBxdOFtf4LwrQbgha0=" + }, + "builtins": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.7.tgz", + "integrity": "sha1-NVIZzWzxjb58Acx/0tznZc/cVJo=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=" + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" + }, + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.5.0", + "lodash.memoize": "3.0.4", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "commondir": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-0.0.1.tgz", + "integrity": "sha1-ifAP3NUbUZxXhzP+xWPmptp/W+I=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-0.0.1.tgz", + "integrity": "sha1-kld9tSe6bEzwpFaNhLwDH0QeIfI=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "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=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + }, + "deps-sort": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-1.3.9.tgz", + "integrity": "sha1-Kd//U+F7Nq7K51MK27v2IsLtGnE=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detective": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", + "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", + "requires": { + "acorn": "4.0.13", + "defined": "1.0.0" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" + }, + "events": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/events/-/events-1.0.2.tgz", + "integrity": "sha1-dYSdz+k9EPsFfDAFWv29UdBqjiQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "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" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "requires": { + "acorn": "5.2.1", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "faye-websocket": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", + "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "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" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", + "requires": { + "glob": "3.2.11", + "lodash": "2.4.2" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "requires": { + "globule": "0.1.0" + } + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=" + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=" + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=" + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "requires": { + "async": "0.1.22", + "coffee-script": "1.3.3", + "colors": "0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.1.3", + "getobject": "0.1.0", + "glob": "3.1.21", + "grunt-legacy-log": "0.1.3", + "grunt-legacy-util": "0.2.0", + "hooker": "0.2.3", + "iconv-lite": "0.2.11", + "js-yaml": "2.0.5", + "lodash": "0.9.2", + "minimatch": "0.2.14", + "nopt": "1.0.10", + "rimraf": "2.2.8", + "underscore.string": "2.2.1", + "which": "1.0.9" + } + }, + "grunt-browserify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/grunt-browserify/-/grunt-browserify-4.0.1.tgz", + "integrity": "sha1-9c7ZAmlYqADy6ImOGk3x5SX/af8=", + "requires": { + "async": "0.9.2", + "browserify": "11.2.0", + "glob": "5.0.15", + "lodash": "3.10.1", + "resolve": "1.5.0", + "watchify": "3.9.0" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "grunt-contrib-watch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", + "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "requires": { + "async": "0.2.10", + "gaze": "0.5.2", + "lodash": "2.4.2", + "tiny-lr-fork": "0.0.5" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + } + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "requires": { + "colors": "0.6.2", + "grunt-legacy-log-utils": "0.1.1", + "hooker": "0.2.3", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "requires": { + "colors": "0.6.2", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "requires": { + "async": "0.1.22", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "0.9.2", + "underscore.string": "2.2.1", + "which": "1.0.9" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "requires": { + "function-bind": "1.1.1" + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=" + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "requires": { + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "insert-module-globals": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-6.6.3.tgz", + "integrity": "sha1-IGOOKaMPntHKLjqCX7wsulJG3fw=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.6.1", + "concat-stream": "1.4.10", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "requires": { + "argparse": "0.1.16", + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + } + } + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "1.3.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "requires": { + "astw": "2.2.0" + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "requires": { + "mime-db": "1.30.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "module-deps": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-3.9.1.tgz", + "integrity": "sha1-6nXK+RmQkNJbDVUStaysuW5/h/M=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "concat-stream": "1.4.10", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.0.2", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "1.1.14", + "resolve": "1.5.0", + "stream-combiner2": "1.0.2", + "subarg": "1.0.0", + "through2": "1.1.1", + "xtend": "4.0.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.10.tgz", + "integrity": "sha1-rMO79WAsuMyYDGrIQPp9hgPj7zY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "1.1.14", + "typedarray": "0.0.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "morgan": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", + "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", + "requires": { + "basic-auth": "2.0.0", + "debug": "2.6.9", + "depd": "1.1.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "debug": { + "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" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1.1.1" + } + }, + "noptify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", + "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "requires": { + "nopt": "2.0.0" + }, + "dependencies": { + "nopt": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", + "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "requires": { + "abbrev": "1.1.1" + } + } + } + }, + "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.1.0" + } + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "on-finished": { + "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" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=" + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "requires": { + "shell-quote": "1.6.1" + }, + "dependencies": { + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + } + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", + "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "1.2.0", + "through2": "2.0.3" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + } + } + }, + "read-only-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-1.1.1.tgz", + "integrity": "sha1-Xad8eZ7ROI0++IoYRxu1kk+KC6E=", + "requires": { + "readable-stream": "1.1.14", + "readable-wrap": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readable-wrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/readable-wrap/-/readable-wrap-1.0.0.tgz", + "integrity": "sha1-O1ohHGMeEjA6VJkcgGwX564ga/8=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + } + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "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=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "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" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.9" + } + }, + "shell-quote": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-0.0.1.tgz", + "integrity": "sha1-GkEZbzwDM8SCMjWT1ohuzxU92YY=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", + "requires": { + "escodegen": "0.0.28" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "requires": { + "esprima": "1.0.4", + "estraverse": "1.3.2", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + } + } + }, + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", + "requires": { + "concat-stream": "1.6.0", + "duplexer2": "0.0.2", + "escodegen": "1.3.3", + "falafel": "2.1.0", + "has": "1.0.1", + "object-inspect": "0.4.0", + "quote-stream": "0.0.0", + "readable-stream": "1.0.34", + "shallow-copy": "0.0.1", + "static-eval": "0.2.4", + "through2": "0.4.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", + "requires": { + "minimist": "0.0.8", + "through2": "0.4.2" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-combiner2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.0.2.tgz", + "integrity": "sha1-unKmtQy/q/qVD8i8h2BL0B62BnE=", + "requires": { + "duplexer2": "0.0.2", + "through2": "0.5.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "stream-http": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-1.7.1.tgz", + "integrity": "sha1-09Km4Uw2o4udr7GZrue7xXBRmXg=", + "requires": { + "builtin-status-codes": "1.0.0", + "foreach": "2.0.5", + "indexof": "0.0.1", + "inherits": "2.0.3", + "object-keys": "1.0.11", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + "requires": { + "indexof": "0.0.1", + "inherits": "2.0.3", + "isarray": "0.0.1", + "readable-stream": "1.1.14", + "readable-wrap": "1.0.0", + "through2": "1.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "requires": { + "readable-stream": "1.1.14", + "xtend": "4.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "1.2.0" + } + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "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=", + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "0.11.10" + } + }, + "tiny-lr-fork": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", + "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "requires": { + "debug": "0.7.4", + "faye-websocket": "0.4.4", + "noptify": "0.0.3", + "qs": "0.5.6" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", + "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=" + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchify": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", + "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", + "requires": { + "anymatch": "1.3.2", + "browserify": "14.5.0", + "chokidar": "1.7.0", + "defined": "1.0.0", + "outpipe": "1.1.1", + "through2": "2.0.3", + "xtend": "4.0.1" + }, + "dependencies": { + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "browser-pack": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", + "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "defined": "1.0.0", + "through2": "2.0.3", + "umd": "3.0.1" + } + }, + "browserify": { + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", + "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", + "requires": { + "JSONStream": "1.3.1", + "assert": "1.4.1", + "browser-pack": "6.0.2", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.2.0", + "buffer": "5.0.8", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.1.7", + "duplexer2": "0.1.4", + "events": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.0.1", + "labeled-stream-splicer": "2.0.0", + "module-deps": "4.1.1", + "os-browserify": "0.3.0", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "2.0.3", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.8.tgz", + "integrity": "sha512-xXvjQhVNz50v2nPeoOsNqWCLGfiv4ji/gXZM28jnVwdLJxH4mFyqgqCKfaK9zf1KUbG6zTkjLOy7ou+jSMarGA==", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "combine-source-map": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", + "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + } + }, + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.3" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "0.5.7" + } + }, + "insert-module-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", + "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "concat-stream": "1.5.2", + "is-buffer": "1.1.6", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "labeled-stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", + "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.3", + "resolve": "1.5.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "2.3.3" + } + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + } + } + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } +} diff --git a/package.json b/package.json index a4e3a9d89..697531a0b 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,13 @@ "license": "ISC", "dependencies": { "basil.js": "^0.4.3", + "body-parser": "^1.14.2", "brfs": "^1.4.3", "ejs": "^2.4.1", + "express": "^4.13.4", "grunt": "^0.4.5", "grunt-browserify": "^4.0.1", - "grunt-contrib-watch": "^0.6.1" + "grunt-contrib-watch": "^0.6.1", + "morgan": "^1.6.1" } } diff --git a/server.js b/server.js new file mode 100644 index 000000000..f30329cde --- /dev/null +++ b/server.js @@ -0,0 +1,2 @@ +var main = require('./Backend/main'); +main.startServer(5050); \ No newline at end of file