Commit 3081c4d9 authored by Johannes Bill's avatar Johannes Bill

quick fix for bodystreet with date-holidays

parent 1cf3c06f
"use strict";
'use strict';
var tmUtils = require('./timeUtils');
var holidaysGetter = {};
var Holidays = require('./holidays');
var includeString = "810a6deb-46f2-4fa8-b779-bb5c2a6b5577";
var excludeString = "bb74c170-b06f-4d2b-ab88-2f6bf9ce8068";
var maybeIncludeString = "e85aacb0-bd79-4091-a271-85de0cebf66d";
const tmUtils = require('./timeUtils');
const holidaysGetter = {};
const Holidays = require('./holidays');
function wrapper(_epochSpan) {
var debugInfo = '';
let debugInfo = '';
var epochSpan;
var year;
var startYear;
var endYear;
let epochSpan;
let year;
let startYear;
let endYear;
setEpocheSpan(_epochSpan);
function setEpocheSpan(newEpochSpan) {
epochSpan = newEpochSpan;
startYear = epochSpan[0].getFullYear();
endYear = epochSpan[1].getFullYear();
for (var yr = startYear; yr <= endYear; yr++) {
if (!holidaysGetter[yr])
for (let yr = startYear; yr <= endYear; yr++) {
if (!holidaysGetter[yr]) {
holidaysGetter[yr] = new Holidays(yr);
}
}
year = new Date(epochSpan[0].getTime() / 2 + epochSpan[1].getTime() / 2).getFullYear();
}
function parseJSON(data) {
var rawCustom = data["custom"];
const rawCustom = data['custom'];
var custom = {};
for (var key in rawCustom) {
var field = rawCustom[key];
const custom = {};
for (const key in rawCustom) {
const field = rawCustom[key];
custom[key] = {
include: field.include || [],
exclude: field.exclude || []
}
};
}
return {
incl: data["include"],
excl: data["exclude"],
maybe: data["maybe"],
incl: data['include'],
excl: data['exclude'],
maybe: data['maybe'],
custom: custom
}
};
}
function getData(info, cb) {
var json = parseJSON(info.data);
const json = parseJSON(info.data);
getAllHolidays(info, function (err, holidays) {
if (err)
if (err) {
return cb(err);
}
var holidayIntervals = holidays.map(function (date) {
let holidayIntervals = holidays.map(function (date) {
return tmUtils.singleDay(date);
});
tmUtils.sort(holidayIntervals);
holidayIntervals = tmUtils.andOp(holidayIntervals, [epochSpan]);
try {
var ret = {holidays: holidays};
const ret = { holidays: holidays };
ret.intervals = buildOpeningHours([json.incl, json.excl], holidayIntervals);
ret.maybeIntervals = [];
if (json.maybe) {
var maybeIntervals = buildOpeningHours([json.maybe], holidayIntervals);
const maybeIntervals = buildOpeningHours([json.maybe], holidayIntervals);
ret.maybeIntervals = tmUtils.andNotOp(maybeIntervals, ret.intervals);
}
ret.debugInfo = debugInfo;
if (json.custom) {
var custIntervals = ret.customIntervals = {};
let custObj = json.custom;
for (let key in custObj) {
let field = custObj[key];
const custIntervals = (ret.customIntervals = {});
const custObj = json.custom;
for (const key in custObj) {
const field = custObj[key];
custIntervals[key] = buildOpeningHours([field.include, field.exclude], []);
}
}
cb(null, ret);
}
catch (err) {
} catch (err) {
cb(err);
}
})
});
}
function buildOpeningHours(json, allHolidayIntervals) {
var jsonIncl;
var jsonExcl;
jsonIncl = json[0];
jsonExcl = json[1];
const jsonIncl = json[0];
const jsonExcl = json[1];
if (!jsonIncl) {
throw new Error('no openinghours model found');
}
var resultIncl = [];
var resultExcl = [];
var holidayIncl = [];
let resultIncl = [];
let resultExcl = [];
let holidayIncl = [];
let data, option, key;
for (key in jsonIncl) {
data = jsonIncl[key];
option = getOption(data);
if (option == 'holiday') {
holidayIncl = holidayIncl.concat(getHolidays(data));
} else if (option == 'vacation') {
resultExcl.push(getOpeningHours(data, option));
} else {
resultIncl.push(getOpeningHours(data, option));
}
}
var data, option, key;
try {
for (key in jsonIncl) {
data = jsonIncl[key];
if (jsonExcl) {
for (key in jsonExcl) {
data = jsonExcl[key];
option = getOption(data);
if (option == "holiday")
holidayIncl = holidayIncl.concat(getHolidays(data));
else if (option == "vacation") {
if (option == 'holiday') {
resultExcl.push(getHolidays(data));
} else {
resultExcl.push(getOpeningHours(data, option));
}
else
resultIncl.push(getOpeningHours(data, option));
}
if (jsonExcl) {
for (key in jsonExcl) {
data = jsonExcl[key];
option = getOption(data);
if (option == "holiday")
resultExcl.push(getHolidays(data));
else
resultExcl.push(getOpeningHours(data, option));
}
resultExcl = tmUtils.orOp(resultExcl);
}
}
catch (err) {
throw err;
resultExcl = tmUtils.orOp(resultExcl);
}
holidayIncl = tmUtils.andOp(holidayIncl, [epochSpan]);
......@@ -142,9 +130,10 @@ function wrapper(_epochSpan) {
resultIncl = tmUtils.andNotOp(resultIncl, allHolidayIntervals);
resultIncl = tmUtils.orOp([resultIncl, holidayIncl]);
var result = resultIncl;
if (jsonExcl)
let result = resultIncl;
if (jsonExcl) {
result = tmUtils.andNotOp(resultIncl, resultExcl);
}
//result = tmUtils.splitMidnight(result);
......@@ -152,9 +141,11 @@ function wrapper(_epochSpan) {
}
function getDaySpan(data) {
var dayoptionS = data["dayoption"];
var dayoption = parseInt(dayoptionS);
if (dayoption < 7) return [dayoption, dayoption];
const dayoptionS = data['dayoption'];
const dayoption = parseInt(dayoptionS);
if (dayoption < 7) {
return [dayoption, dayoption];
}
switch (dayoption) {
case 7:
return [0, 0];
......@@ -165,48 +156,48 @@ function wrapper(_epochSpan) {
case 10:
return [1, 6];
default:
throw new Error("Invalid day option: " + dayoptionS);
throw new Error('Invalid day option: ' + dayoptionS);
}
}
function parseTime(time) {
time = time || "";
var split = time.split(":");
time = time || '';
const split = time.split(':');
return {
h: parseInt(split[0]) || 0,
m: parseInt(split[1]) || 0
}
};
}
function parseDate(date) {
date = date || "";
date = date || '';
var split = date.split(".");
if(!split || split.length < 2) {
const split = date.split('.');
if (!split || split.length < 2) {
return null;
}
var month = parseInt(split[1]);
var day = parseInt(split[0]);
const month = parseInt(split[1]);
const day = parseInt(split[0]);
return [day, month];
}
function getHolidays(data) {
var option = data["option"];
if (option != "holiday") {
const option = data['option'];
if (option != 'holiday') {
throw new Error('not holiday: ' + option);
}
var timeSpan = getTimeSpan(data);
var holidayId = data["holidayoption"];
const timeSpan = getTimeSpan(data);
const holidayId = data['holidayoption'];
var days = [];
for (var year = startYear; year <= endYear; year++) {
let days = [];
for (let year = startYear; year <= endYear; year++) {
days = days.concat(holidaysGetter[year].getHoliday(holidayId));
}
var intervals = days.map(function (date) {
const intervals = days.map(function (date) {
return tmUtils.singleDay(date, timeSpan);
});
tmUtils.sort(intervals);
......@@ -214,13 +205,15 @@ function wrapper(_epochSpan) {
}
function getAllHolidays(info, cb) {
var days = [];
var cnt = endYear - startYear;
let days = [];
let cnt = endYear - startYear;
var errRec = false;
let errRec = false;
function _cb(err, result) {
if (errRec) return;
if (errRec) {
return;
}
if (err) {
errRec = true;
return cb(err);
......@@ -229,25 +222,24 @@ function wrapper(_epochSpan) {
days = days.concat(result);
if (cnt-- === 0) {
cb(null, days);
}
}
for (var year = startYear; year <= endYear; year++) {
for (let year = startYear; year <= endYear; year++) {
holidaysGetter[year].getAllHolidays(info, epochSpan, _cb);
}
}
function getDateSpan(data) {
var start = parseDate(data["opening_day_from"]);
var end = parseDate(data["opening_day_to"]);
const start = parseDate(data['opening_day_from']);
const end = parseDate(data['opening_day_to']);
if (!start) {
return [epochSpan];
}
var startDate, endDate;
let startDate, endDate;
if (!end) {
debugInfo += 'no endDate for dateSpan';
......@@ -256,107 +248,126 @@ function wrapper(_epochSpan) {
return [[startDate, endDate]];
}
var newYear = 0;
if (end[1] < start[1] || (end[1] == start[1] && end[0] < start[0])) newYear = 1;
let newYear = 0;
if (end[1] < start[1] || (end[1] == start[1] && end[0] < start[0])) {
newYear = 1;
}
var dateSpanArray = [];
for (var offset = -1; offset <= 1; offset++) {
dateSpanArray.push([new Date(startYear + offset, start[1] - 1, start[0]),
new Date(startYear + offset + newYear, end[1] - 1, end[0] + 1)])
const dateSpanArray = [];
for (let offset = -1; offset <= 1; offset++) {
dateSpanArray.push([
new Date(startYear + offset, start[1] - 1, start[0]),
new Date(startYear + offset + newYear, end[1] - 1, end[0] + 1)
]);
}
return dateSpanArray;
}
function getTimeSpan(data) {
return [parseTime(data["opening_from"]), parseTime(data["opening_to"])];
return [parseTime(data['opening_from']), parseTime(data['opening_to'])];
}
function getOption(data) {
return data["option"];
return data['option'];
}
function getOpeningHours(data, option) {
option = option || getOption(data);
switch (option) {
case "default":
case 'default':
return getOpeningHoursDefault(data);
case "season":
case 'season':
return getOpeningHoursSeason(data);
case "repeatable":
case 'repeatable':
return getOpeningHoursRepeatable(data);
case "vacation":
case 'vacation':
return getOpeningHoursVacation(data);
case "datespan":
case 'datespan':
return getOpeningHoursDatespan(data);
case "":
case '':
return [];
default:
throw new Error("option not supported: " + option);
return [];
throw new Error('option not supported: ' + option);
}
}
function getOpeningHoursDefault(data) {
var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data);
const daySpan = getDaySpan(data);
const timeSpan = getTimeSpan(data);
return tmUtils.standardFromTillDay(daySpan, timeSpan, epochSpan, epochSpan, 7);
}
function getOpeningHoursSeason(data) {
var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data);
var dateSpan = getDateSpan(data);
return tmUtils.orOp(dateSpan.map(function (dateSpanElem) {
return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpanElem, epochSpan, 7);
}));
const daySpan = getDaySpan(data);
const timeSpan = getTimeSpan(data);
const dateSpan = getDateSpan(data);
return tmUtils.orOp(
dateSpan.map(function (dateSpanElem) {
return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpanElem, epochSpan, 7);
})
);
}
function getOpeningHoursDatespan(data) {
// TODO JB remove entries beyond epochespan
var from = new Date(data['opening_date_from']);
var to = new Date(data['opening_date_to']);
if(!from || !to) {
console.error(new Error('invalid data for datespan option ' + JSON.stringify(data)))
}
else {
const from = new Date(data['opening_date_from']);
const to = new Date(data['opening_date_to']);
if (!from || !to) {
console.error(new Error('invalid data for datespan option ' + JSON.stringify(data)));
} else {
return [[from, to]];
}
}
function getOpeningHoursVacation(data) {
if (data["opening_day_from"] == "" || data["opening_day_to"] == "") {
console.error(new Error("opening_day cant be empty in vacations"));
if (data['opening_day_from'] == '' || data['opening_day_to'] == '') {
console.error(new Error('opening_day cant be empty in vacations'));
}
var dateSpan = getDateSpan(data);
return tmUtils.orOp(dateSpan.map(function (dateSpanElem) {
return tmUtils.dateSpan(dateSpanElem);
}));
const dateSpan = getDateSpan(data);
return tmUtils.orOp(
dateSpan.map(function (dateSpanElem) {
return tmUtils.dateSpan(dateSpanElem);
})
);
}
function getOpeningHoursRepeatable(data) {
var daySpan = getDaySpan(data);
var timeSpan = getTimeSpan(data);
var dateSpan = getDateSpan(data);
var repeatOption = parseInt(data["repeatoption"]);
var noInMonth;
if (repeatOption <= 4) noInMonth = repeatOption;
else if (repeatOption == 30) noInMonth = -1;
if (noInMonth)
return tmUtils.orOp(dateSpan.map(function (dateSpanElem) {
return tmUtils.cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpanElem, epochSpan);
}));
else {
const daySpan = getDaySpan(data);
const timeSpan = getTimeSpan(data);
const dateSpan = getDateSpan(data);
const repeatOption = parseInt(data['repeatoption']);
let noInMonth;
if (repeatOption <= 4) {
noInMonth = repeatOption;
} else if (repeatOption == 30) {
noInMonth = -1;
}
if (noInMonth) {
return tmUtils.orOp(
dateSpan.map(function (dateSpanElem) {
return tmUtils.cyclicFromTillDay(daySpan, noInMonth, timeSpan, dateSpanElem, epochSpan);
})
);
} else {
switch (repeatOption) {
case 14:
case 21:
case 28:
return tmUtils.orOp(dateSpan.map(function (dateSpanElem) {
return tmUtils.standardFromTillDay(daySpan, timeSpan, dateSpanElem, epochSpan, repeatOption);
}));
return tmUtils.orOp(
dateSpan.map(function (dateSpanElem) {
return tmUtils.standardFromTillDay(
daySpan,
timeSpan,
dateSpanElem,
epochSpan,
repeatOption
);
})
);
default:
throw new Error("invalid repeatoption");
throw new Error('invalid repeatoption');
}
}
}
......@@ -367,6 +378,3 @@ function wrapper(_epochSpan) {
};
}
module.exports = wrapper;
var holidayMapping = require('./holidayMapping.json');
var easterSunday = require('./easterSunday');
var requestHandler = require('./regionInfoRequest');
var easterSundays = {};
var fixedHolidays = {
101: "0101",
106: "0601",
501: "0105",
808: "0808",
815: "1508",
103: "0310",
131: "3110",
111: "0111",
121: "2412",
122: "2512",
123: "2612"
const holidayMapping = require('./holidayMapping.json');
const easterSunday = require('./easterSunday');
const DateHolidays = require('date-holidays');
let requestHandler = require('./regionInfoRequest');
const easterSundays = {};
const fixedHolidays = {
101: '0101',
106: '0601',
501: '0105',
808: '0808',
815: '1508',
103: '0310',
131: '3110',
111: '0111',
121: '2412',
122: '2512',
123: '2612'
};
var variableOffsets = {
const variableOffsets = {
301: -2,
302: 0,
303: 1,
......@@ -29,48 +29,45 @@ var variableOffsets = {
603: 60
};
function Holidays(year) {
function getEasterSunday() {
if (!easterSundays[year])
if (!easterSundays[year]) {
easterSundays[year] = easterSunday.getEasterSunday(year);
}
return easterSundays[year];
}
function getFixedHolidays(fixedHolidays, object) {
var result = object || {};
for (var key in fixedHolidays) {
var dateString = fixedHolidays[key];
var date = parseInt(dateString.slice(0, 2));
var month = parseInt(dateString.slice(2, 4));
const result = object || {};
for (const key in fixedHolidays) {
const dateString = fixedHolidays[key];
const date = parseInt(dateString.slice(0, 2));
const month = parseInt(dateString.slice(2, 4));
result[key] = new Date(year, month - 1, date);
}
return result;
}
function getVariableHolidaysMap(offsets, object) {
var result = object || {};
var easterDate = getEasterSunday();
for (var key in offsets) {
var offset = offsets[key];
const result = object || {};
const easterDate = getEasterSunday();
for (const key in offsets) {
const offset = offsets[key];
result[key] = new Date(year, easterDate.getMonth(), easterDate.getDate() + offset);
}
return result;
}
var holidays = getFixedHolidays(fixedHolidays);
let holidays = getFixedHolidays(fixedHolidays);
holidays = getVariableHolidaysMap(variableOffsets, holidays);
function getIsAugsburg(plz) {
return !!(86150 <= plz && plz <= 86199);
}
function isInEpochSpan(date, epochSpan) {
var dateTime = date.getTime();
return epochSpan[0].getTime() <= dateTime && dateTime <= epochSpan[1].getTime()
const dateTime = date.getTime();
return epochSpan[0].getTime() <= dateTime && dateTime <= epochSpan[1].getTime();
}
function getRelevantHolidayKeys(epochSpan) {
......@@ -80,9 +77,9 @@ function Holidays(year) {
}
function getHolidayKeys(info, epochSpan, cb) {
var initKeys = getRelevantHolidayKeys(epochSpan);
const initKeys = getRelevantHolidayKeys(epochSpan);
var specialKeys = holidayMapping["specificHolidays"].filter(function(key) {
const specialKeys = holidayMapping['specificHolidays'].filter(function (key) {
return initKeys.indexOf(key) >= 0;
});
......@@ -91,50 +88,53 @@ function Holidays(year) {
}
requestHandler.getBundesland(info, function (err, blnd) {
if (err) return cb(err);
var keys = holidayMapping["sureHolidays"].filter(function(key) {
if (err) {
return cb(err);
}
const keys = holidayMapping['sureHolidays'].filter(function (key) {
return initKeys.indexOf(key) >= 0;
});
var regionMap = holidayMapping["region"][blnd];
if(regionMap) {
var regionHolidays = regionMap['default'];
for (var i = 0; i < regionHolidays.length; i++) {
var key = regionHolidays[i];
const regionMap = holidayMapping['region'][blnd];
if (regionMap) {
const regionHolidays = regionMap['default'];
for (let i = 0; i < regionHolidays.length; i++) {
const key = regionHolidays[i];
if (initKeys.indexOf(key) >= 0) {
keys.push(key);
}
}
} else {
console.error(new Error('No Mapping for Bundesland: ' + blnd));
}
else {
console.error(new Error("No Mapping for Bundesland: " + blnd));
}
if(blnd != "BY") {
if (blnd != 'BY') {
cb(null, keys);
}
else {
if(regionMap["augsburg"] && getIsAugsburg(info.zip)) {
var augsHDs = regionMap["augsburg"];
for (var i = 0; i < augsHDs.length; i++) {
var key = augsHDs[i];
if(initKeys.indexOf(key) >= 0)
} else {
if (regionMap['augsburg'] && getIsAugsburg(info.zip)) {
const augsHDs = regionMap['augsburg'];
for (let i = 0; i < augsHDs.length; i++) {
const key = augsHDs[i];
if (initKeys.indexOf(key) >= 0) {
keys.push(key);
}
}
}
if(regionMap["kath"] && regionMap["kath"].length > 0) {
requestHandler.getKatholisch(info, function(err, kath) {
if(err) return cb(err);
if(kath) {
var kathHDs = regionMap["kath"];
for (var i = 0; i < kathHDs.length; i++) {
var key = kathHDs[i];
if(initKeys.indexOf(key) >= 0)
if (regionMap['kath'] && regionMap['kath'].length > 0) {
requestHandler.getKatholisch(info, function (err, kath) {
if (err) {
return cb(err);
}
if (kath) {
const kathHDs = regionMap['kath'];
for (let i = 0; i < kathHDs.length; i++) {
const key = kathHDs[i];
if (initKeys.indexOf(key) >= 0) {
keys.push(key);
}
}
}
cb(null, keys);
})
}
else {
});
} else {
cb(null, keys);
}
}
......@@ -142,30 +142,50 @@ function Holidays(year) {
}
this.getAllHolidays = function (info, epochSpan, cb) {
if (info.countryCode && ['DE', 'GB', 'US'].includes(info.countryCode)) {
const dateHolidays = new DateHolidays(info.countryCode);
const holidayDays = dateHolidays
.getHolidays(2021)
.filter(x => x.type === 'public')
.map(x => {
const dateDay = x.date.slice(0, 10); // strip hours
const date = new Date(`${dateDay}T00:00`); // converts 2021-05-13 to "2021-05-12T22:00:00.000Z"
return date;
});
return cb(null, holidayDays);
}
getHolidayKeys(info, epochSpan, function (err, keys) {
if (err)
if (err) {
return cb(err);
var result = [];
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var elem = holidays[key];
if (elem)
}
const result = [];
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
const elem = holidays[key];
if (elem) {
result.push(elem);
}
}
cb(err, result);
});
};
this.getHoliday = function (id) {
if(id == 0) {
var ret = [];
for(var key in holidays)
if (id == 0) {
const ret = [];
for (const key in holidays) {
ret.push(holidays[key]);
}
return ret;
}
if (id in holidays)
if (id in holidays) {
return [holidays[id]];
console.error("invalid holiday id " + id);
}
console.error('invalid holiday id ' + id);
return null;
};
}
......@@ -177,20 +197,19 @@ module.exports = Holidays;
* for testing reasons
* @param handler
*/
module.exports.setRequestHandler = function(handler) {
module.exports.setRequestHandler = function (handler) {
requestHandler = handler;
};
module.exports.setTestHandler = function() {
module.exports.setTestHandler = function () {
requestHandler = {
getBundesland: function (plz, cb) {
// console.log("bundesland is bayern");
cb(null, "BY");
// console.log("bundesland is bayern");
cb(null, 'BY');
},
getKatholisch: function (plz, cb) {
// console.log("is katholic");
// console.log("is katholic");
cb(null, true);
}
};
};
{
"name": "opening-hours",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dev": true,
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
"dev": true
},
"assertion-error": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz",
"integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=",
"dev": true
},
"astronomia": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/astronomia/-/astronomia-3.0.4.tgz",
"integrity": "sha512-NbX2KsH86iKfVeJUsSlfFXcOO3clWiIcXDA7/rGyCR+lqohSAaP+1ap/ee15ycxadN1sFULG6egjDXjsb+V+TQ=="
},
"async": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"requires": {
"lodash": "^4.17.14"
}
},
"bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
"dev": true
},
"bluebird": {
"version": "3.7.2",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"dev": true,
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
}
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"dev": true
},
"caldate": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caldate/-/caldate-2.0.0.tgz",
"integrity": "sha512-g2utCvTFOn+lScBU59PW1VjOwV7SIgpvXD8+EhrWrQSEtne5TDO9cy/o6s+vK4qwYwVE84gWRbbLTuDY9J1ARA==",
"requires": {
"moment-timezone": "^0.5.33"
}
},
"chai": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-1.10.0.tgz",
"integrity": "sha1-5AMcyHZURhp1lD5aNatG6vOcHrk=",
"dev": true,
"requires": {
"assertion-error": "1.0.0",
"deep-eql": "0.1.3"
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"component-emitter": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
"integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
"dev": true
},
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
"dev": true,
"requires": {
"safe-buffer": "5.1.2"
}
},
"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==",
"dev": true
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
"dev": true
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
"dev": true
},
"cookiejar": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.0.6.tgz",
"integrity": "sha1-Cr81atANHFohnYjURRgEbdAmrP4=",
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
"date-bengali-revised": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/date-bengali-revised/-/date-bengali-revised-2.0.0.tgz",
"integrity": "sha512-DjlFFNjlCQTVHcijNeur8qd65rjgijT9xI7uORKX510v0ukZNaRC3731WgwVNLgMU4ovaPJ9j9ix+czbJJdrKg=="
},
"date-chinese": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/date-chinese/-/date-chinese-2.0.0.tgz",
"integrity": "sha512-oOWsPiN84use5p1n5Dgz6l9B5jsfIIG7ESvRRTpJVaV+NgJPWER/bdgbNUxJghuR9YjT3n/vXWR4/WGiljFmiw==",
"requires": {
"astronomia": "^3.0.0"
}
},
"date-easter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.0.tgz",
"integrity": "sha512-18bMwrMWmp/psK1W/XUdorLw5utYZAa0Fb7eC1/sdwQNIpfIeU7GUa/pNYED50tS7WVIL6zha/U3hxmdldZWRg=="
},
"date-holidays": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.3.0.tgz",
"integrity": "sha512-nD5oFXLKaDdetreHWDSyq+Kp8vHQacI5nMdVAa3MnULCF/ewRh8Rq4K11NSKvPMAIjFCJhZqM+a58ppkuNG6tg==",
"requires": {
"date-holidays-parser": "^3.1.0",
"js-yaml": "^4.1.0",
"lodash.omit": "^4.5.0",
"lodash.pick": "^4.4.0",
"prepin": "^1.0.3"
}
},
"date-holidays-parser": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/date-holidays-parser/-/date-holidays-parser-3.1.0.tgz",
"integrity": "sha512-gBow/WnmNt9nZWzv8n+J63F9vvaBAmdsYI/1vQLMcDIZyHwgNNNXCzCmsAiFadQhxsra+BBZCxvnXc2zzNNcJg==",
"requires": {
"astronomia": "^3.0.4",
"caldate": "^2.0.0",
"date-bengali-revised": "^2.0.0",
"date-chinese": "^2.0.0",
"date-easter": "^1.0.0",
"deepmerge": "^4.2.2",
"moment-timezone": "^0.5.33"
}
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"deep-eql": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
"integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
"dev": true,
"requires": {
"type-detect": "0.1.1"
}
},
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
"dev": true
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
"dev": true
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
"dev": true
},
"ejs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz",
"integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=",
"dev": true
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"dev": true
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
"dev": true
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
"dev": true
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"dev": true,
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
}
},
"extend": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
"integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=",
"dev": true
},
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
}
},
"form-data": {
"version": "1.0.0-rc3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz",
"integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=",
"dev": true,
"requires": {
"async": "^1.4.0",
"combined-stream": "^1.0.5",
"mime-types": "^2.1.3"
},
"dependencies": {
"async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true
}
}
},
"formidable": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.16.tgz",
"integrity": "sha1-SRbP38TL7QILJXpqlQWpqzjCzQ4=",
"dev": true
},
"forwarded": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
"dev": true
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
"dev": true
},
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
"dev": true,
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
}
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
"js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"requires": {
"argparse": "^2.0.1"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.omit": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
"integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA="
},
"lodash.pick": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
"integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"dev": true
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
"dev": true
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
"dev": true
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true
},
"mime-db": {
"version": "1.47.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
"integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
"dev": true
},
"mime-types": {
"version": "2.1.30",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
"integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
"dev": true,
"requires": {
"mime-db": "1.47.0"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"moment-timezone": {
"version": "0.5.33",
"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz",
"integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==",
"requires": {
"moment": ">= 2.9.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"dev": true,
"requires": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
}
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"dev": true
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"dev": true,
"requires": {
"ee-first": "1.1.1"
}
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true
},
"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=",
"dev": true
},
"prepin": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/prepin/-/prepin-1.0.3.tgz",
"integrity": "sha512-0XL2hreherEEvUy0fiaGEfN/ioXFV+JpImqIzQjxk6iBg4jQ2ARKqvC4+BmRD8w/pnpD+lbxvh0Ub+z7yBEjvA=="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
"proxy-addr": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"dev": true,
"requires": {
"forwarded": "~0.1.2",
"ipaddr.js": "1.9.1"
}
},
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
"dev": true
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"dev": true,
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"reduce-component": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz",
"integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=",
"dev": true
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"dev": true,
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
"dev": true
},
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=",
"dev": true
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
}
},
"superagent": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-1.8.5.tgz",
"integrity": "sha1-HA3cOvMOgOuE68BcshItqP6UC1U=",
"dev": true,
"requires": {
"component-emitter": "~1.2.0",
"cookiejar": "2.0.6",
"debug": "2",
"extend": "3.0.0",
"form-data": "1.0.0-rc3",
"formidable": "~1.0.14",
"methods": "~1.1.1",
"mime": "1.3.4",
"qs": "2.3.3",
"readable-stream": "1.0.27-1",
"reduce-component": "1.0.1"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
"dev": true
},
"mime": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
"integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
"dev": true
},
"qs": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz",
"integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=",
"dev": true
},
"readable-stream": {
"version": "1.0.27-1",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.27-1.tgz",
"integrity": "sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg=",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
"isarray": "0.0.1",
"string_decoder": "~0.10.x"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
"dev": true
}
}
},
"supertest": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/supertest/-/supertest-1.2.0.tgz",
"integrity": "sha1-hQp5X5Bo0vrxngF5n/CZYuDOQ74=",
"dev": true,
"requires": {
"methods": "1.x",
"superagent": "^1.7.2"
}
},
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
"dev": true
},
"type-detect": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
"integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
"dev": true
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
"dev": true
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
"dev": true
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"dev": true
}
}
}
......@@ -5,6 +5,7 @@
"dependencies": {
"async": "^2.0.1",
"bluebird": "^3.4.6",
"date-holidays": "^3.3.0",
"moment": "^2.15.0"
},
"devDependencies": {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment