Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
opening-hours
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
regionalkauf
opening-hours
Commits
3081c4d9
Commit
3081c4d9
authored
May 11, 2021
by
Johannes Bill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
quick fix for bodystreet with date-holidays
parent
1cf3c06f
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
1055 additions
and
242 deletions
+1055
-242
dateArray.js
lib/dateArray.js
+165
-157
holidays.js
lib/holidays.js
+104
-85
package-lock.json
package-lock.json
+785
-0
package.json
package.json
+1
-0
No files found.
lib/dateArray.js
View file @
3081c4d9
"use strict"
;
'use strict'
;
var
tmUtils
=
require
(
'./timeUtils'
);
const
tmUtils
=
require
(
'./timeUtils'
);
var
holidaysGetter
=
{};
const
holidaysGetter
=
{};
var
Holidays
=
require
(
'./holidays'
);
const
Holidays
=
require
(
'./holidays'
);
var
includeString
=
"810a6deb-46f2-4fa8-b779-bb5c2a6b5577"
;
var
excludeString
=
"bb74c170-b06f-4d2b-ab88-2f6bf9ce8068"
;
var
maybeIncludeString
=
"e85aacb0-bd79-4091-a271-85de0cebf66d"
;
function
wrapper
(
_epochSpan
)
{
function
wrapper
(
_epochSpan
)
{
var
debugInfo
=
''
;
let
debugInfo
=
''
;
var
epochSpan
;
let
epochSpan
;
var
year
;
let
year
;
var
startYear
;
let
startYear
;
var
endYear
;
let
endYear
;
setEpocheSpan
(
_epochSpan
);
setEpocheSpan
(
_epochSpan
);
function
setEpocheSpan
(
newEpochSpan
)
{
function
setEpocheSpan
(
newEpochSpan
)
{
epochSpan
=
newEpochSpan
;
epochSpan
=
newEpochSpan
;
startYear
=
epochSpan
[
0
].
getFullYear
();
startYear
=
epochSpan
[
0
].
getFullYear
();
endYear
=
epochSpan
[
1
].
getFullYear
();
endYear
=
epochSpan
[
1
].
getFullYear
();
for
(
var
yr
=
startYear
;
yr
<=
endYear
;
yr
++
)
{
for
(
let
yr
=
startYear
;
yr
<=
endYear
;
yr
++
)
{
if
(
!
holidaysGetter
[
yr
])
if
(
!
holidaysGetter
[
yr
])
{
holidaysGetter
[
yr
]
=
new
Holidays
(
yr
);
holidaysGetter
[
yr
]
=
new
Holidays
(
yr
);
}
}
}
year
=
new
Date
(
epochSpan
[
0
].
getTime
()
/
2
+
epochSpan
[
1
].
getTime
()
/
2
).
getFullYear
();
year
=
new
Date
(
epochSpan
[
0
].
getTime
()
/
2
+
epochSpan
[
1
].
getTime
()
/
2
).
getFullYear
();
}
}
function
parseJSON
(
data
)
{
function
parseJSON
(
data
)
{
var
rawCustom
=
data
[
"custom"
];
const
rawCustom
=
data
[
'custom'
];
var
custom
=
{};
const
custom
=
{};
for
(
var
key
in
rawCustom
)
{
for
(
const
key
in
rawCustom
)
{
var
field
=
rawCustom
[
key
];
const
field
=
rawCustom
[
key
];
custom
[
key
]
=
{
custom
[
key
]
=
{
include
:
field
.
include
||
[],
include
:
field
.
include
||
[],
exclude
:
field
.
exclude
||
[]
exclude
:
field
.
exclude
||
[]
}
}
;
}
}
return
{
return
{
incl
:
data
[
"include"
],
incl
:
data
[
'include'
],
excl
:
data
[
"exclude"
],
excl
:
data
[
'exclude'
],
maybe
:
data
[
"maybe"
],
maybe
:
data
[
'maybe'
],
custom
:
custom
custom
:
custom
}
}
;
}
}
function
getData
(
info
,
cb
)
{
function
getData
(
info
,
cb
)
{
var
json
=
parseJSON
(
info
.
data
);
const
json
=
parseJSON
(
info
.
data
);
getAllHolidays
(
info
,
function
(
err
,
holidays
)
{
getAllHolidays
(
info
,
function
(
err
,
holidays
)
{
if
(
err
)
if
(
err
)
{
return
cb
(
err
);
return
cb
(
err
);
}
var
holidayIntervals
=
holidays
.
map
(
function
(
date
)
{
let
holidayIntervals
=
holidays
.
map
(
function
(
date
)
{
return
tmUtils
.
singleDay
(
date
);
return
tmUtils
.
singleDay
(
date
);
});
});
tmUtils
.
sort
(
holidayIntervals
);
tmUtils
.
sort
(
holidayIntervals
);
holidayIntervals
=
tmUtils
.
andOp
(
holidayIntervals
,
[
epochSpan
]);
holidayIntervals
=
tmUtils
.
andOp
(
holidayIntervals
,
[
epochSpan
]);
try
{
try
{
var
ret
=
{
holidays
:
holidays
};
const
ret
=
{
holidays
:
holidays
};
ret
.
intervals
=
buildOpeningHours
([
json
.
incl
,
json
.
excl
],
holidayIntervals
);
ret
.
intervals
=
buildOpeningHours
([
json
.
incl
,
json
.
excl
],
holidayIntervals
);
ret
.
maybeIntervals
=
[];
ret
.
maybeIntervals
=
[];
if
(
json
.
maybe
)
{
if
(
json
.
maybe
)
{
var
maybeIntervals
=
buildOpeningHours
([
json
.
maybe
],
holidayIntervals
);
const
maybeIntervals
=
buildOpeningHours
([
json
.
maybe
],
holidayIntervals
);
ret
.
maybeIntervals
=
tmUtils
.
andNotOp
(
maybeIntervals
,
ret
.
intervals
);
ret
.
maybeIntervals
=
tmUtils
.
andNotOp
(
maybeIntervals
,
ret
.
intervals
);
}
}
ret
.
debugInfo
=
debugInfo
;
ret
.
debugInfo
=
debugInfo
;
if
(
json
.
custom
)
{
if
(
json
.
custom
)
{
var
custIntervals
=
ret
.
customIntervals
=
{}
;
const
custIntervals
=
(
ret
.
customIntervals
=
{})
;
le
t
custObj
=
json
.
custom
;
cons
t
custObj
=
json
.
custom
;
for
(
le
t
key
in
custObj
)
{
for
(
cons
t
key
in
custObj
)
{
le
t
field
=
custObj
[
key
];
cons
t
field
=
custObj
[
key
];
custIntervals
[
key
]
=
buildOpeningHours
([
field
.
include
,
field
.
exclude
],
[]);
custIntervals
[
key
]
=
buildOpeningHours
([
field
.
include
,
field
.
exclude
],
[]);
}
}
}
}
cb
(
null
,
ret
);
cb
(
null
,
ret
);
}
}
catch
(
err
)
{
catch
(
err
)
{
cb
(
err
);
cb
(
err
);
}
}
});
})
}
}
function
buildOpeningHours
(
json
,
allHolidayIntervals
)
{
function
buildOpeningHours
(
json
,
allHolidayIntervals
)
{
var
jsonIncl
;
const
jsonIncl
=
json
[
0
];
var
jsonExcl
;
const
jsonExcl
=
json
[
1
];
jsonIncl
=
json
[
0
];
jsonExcl
=
json
[
1
];
if
(
!
jsonIncl
)
{
if
(
!
jsonIncl
)
{
throw
new
Error
(
'no openinghours model found'
);
throw
new
Error
(
'no openinghours model found'
);
}
}
var
resultIncl
=
[];
let
resultIncl
=
[];
var
resultExcl
=
[];
let
resultExcl
=
[];
var
holidayIncl
=
[];
let
holidayIncl
=
[];
let
data
,
option
,
key
;
var
data
,
option
,
key
;
try
{
for
(
key
in
jsonIncl
)
{
for
(
key
in
jsonIncl
)
{
data
=
jsonIncl
[
key
];
data
=
jsonIncl
[
key
];
option
=
getOption
(
data
);
option
=
getOption
(
data
);
if
(
option
==
"holiday"
)
if
(
option
==
'holiday'
)
{
holidayIncl
=
holidayIncl
.
concat
(
getHolidays
(
data
));
holidayIncl
=
holidayIncl
.
concat
(
getHolidays
(
data
));
else
if
(
option
==
"vacation"
)
{
}
else
if
(
option
==
'vacation'
)
{
resultExcl
.
push
(
getOpeningHours
(
data
,
option
));
resultExcl
.
push
(
getOpeningHours
(
data
,
option
));
}
}
else
{
else
resultIncl
.
push
(
getOpeningHours
(
data
,
option
));
resultIncl
.
push
(
getOpeningHours
(
data
,
option
));
}
}
}
if
(
jsonExcl
)
{
if
(
jsonExcl
)
{
for
(
key
in
jsonExcl
)
{
for
(
key
in
jsonExcl
)
{
data
=
jsonExcl
[
key
];
data
=
jsonExcl
[
key
];
option
=
getOption
(
data
);
option
=
getOption
(
data
);
if
(
option
==
"holiday"
)
if
(
option
==
'holiday'
)
{
resultExcl
.
push
(
getHolidays
(
data
));
resultExcl
.
push
(
getHolidays
(
data
));
else
}
else
{
resultExcl
.
push
(
getOpeningHours
(
data
,
option
));
resultExcl
.
push
(
getOpeningHours
(
data
,
option
));
}
}
resultExcl
=
tmUtils
.
orOp
(
resultExcl
);
}
}
}
resultExcl
=
tmUtils
.
orOp
(
resultExcl
);
catch
(
err
)
{
throw
err
;
}
}
holidayIncl
=
tmUtils
.
andOp
(
holidayIncl
,
[
epochSpan
]);
holidayIncl
=
tmUtils
.
andOp
(
holidayIncl
,
[
epochSpan
]);
...
@@ -142,9 +130,10 @@ function wrapper(_epochSpan) {
...
@@ -142,9 +130,10 @@ function wrapper(_epochSpan) {
resultIncl
=
tmUtils
.
andNotOp
(
resultIncl
,
allHolidayIntervals
);
resultIncl
=
tmUtils
.
andNotOp
(
resultIncl
,
allHolidayIntervals
);
resultIncl
=
tmUtils
.
orOp
([
resultIncl
,
holidayIncl
]);
resultIncl
=
tmUtils
.
orOp
([
resultIncl
,
holidayIncl
]);
var
result
=
resultIncl
;
let
result
=
resultIncl
;
if
(
jsonExcl
)
if
(
jsonExcl
)
{
result
=
tmUtils
.
andNotOp
(
resultIncl
,
resultExcl
);
result
=
tmUtils
.
andNotOp
(
resultIncl
,
resultExcl
);
}
//result = tmUtils.splitMidnight(result);
//result = tmUtils.splitMidnight(result);
...
@@ -152,9 +141,11 @@ function wrapper(_epochSpan) {
...
@@ -152,9 +141,11 @@ function wrapper(_epochSpan) {
}
}
function
getDaySpan
(
data
)
{
function
getDaySpan
(
data
)
{
var
dayoptionS
=
data
[
"dayoption"
];
const
dayoptionS
=
data
[
'dayoption'
];
var
dayoption
=
parseInt
(
dayoptionS
);
const
dayoption
=
parseInt
(
dayoptionS
);
if
(
dayoption
<
7
)
return
[
dayoption
,
dayoption
];
if
(
dayoption
<
7
)
{
return
[
dayoption
,
dayoption
];
}
switch
(
dayoption
)
{
switch
(
dayoption
)
{
case
7
:
case
7
:
return
[
0
,
0
];
return
[
0
,
0
];
...
@@ -165,48 +156,48 @@ function wrapper(_epochSpan) {
...
@@ -165,48 +156,48 @@ function wrapper(_epochSpan) {
case
10
:
case
10
:
return
[
1
,
6
];
return
[
1
,
6
];
default
:
default
:
throw
new
Error
(
"Invalid day option: "
+
dayoptionS
);
throw
new
Error
(
'Invalid day option: '
+
dayoptionS
);
}
}
}
}
function
parseTime
(
time
)
{
function
parseTime
(
time
)
{
time
=
time
||
""
;
time
=
time
||
''
;
var
split
=
time
.
split
(
":"
);
const
split
=
time
.
split
(
':'
);
return
{
return
{
h
:
parseInt
(
split
[
0
])
||
0
,
h
:
parseInt
(
split
[
0
])
||
0
,
m
:
parseInt
(
split
[
1
])
||
0
m
:
parseInt
(
split
[
1
])
||
0
}
}
;
}
}
function
parseDate
(
date
)
{
function
parseDate
(
date
)
{
date
=
date
||
""
;
date
=
date
||
''
;
var
split
=
date
.
split
(
"."
);
const
split
=
date
.
split
(
'.'
);
if
(
!
split
||
split
.
length
<
2
)
{
if
(
!
split
||
split
.
length
<
2
)
{
return
null
;
return
null
;
}
}
var
month
=
parseInt
(
split
[
1
]);
const
month
=
parseInt
(
split
[
1
]);
var
day
=
parseInt
(
split
[
0
]);
const
day
=
parseInt
(
split
[
0
]);
return
[
day
,
month
];
return
[
day
,
month
];
}
}
function
getHolidays
(
data
)
{
function
getHolidays
(
data
)
{
var
option
=
data
[
"option"
];
const
option
=
data
[
'option'
];
if
(
option
!=
"holiday"
)
{
if
(
option
!=
'holiday'
)
{
throw
new
Error
(
'not holiday: '
+
option
);
throw
new
Error
(
'not holiday: '
+
option
);
}
}
var
timeSpan
=
getTimeSpan
(
data
);
const
timeSpan
=
getTimeSpan
(
data
);
var
holidayId
=
data
[
"holidayoption"
];
const
holidayId
=
data
[
'holidayoption'
];
var
days
=
[];
let
days
=
[];
for
(
var
year
=
startYear
;
year
<=
endYear
;
year
++
)
{
for
(
let
year
=
startYear
;
year
<=
endYear
;
year
++
)
{
days
=
days
.
concat
(
holidaysGetter
[
year
].
getHoliday
(
holidayId
));
days
=
days
.
concat
(
holidaysGetter
[
year
].
getHoliday
(
holidayId
));
}
}
var
intervals
=
days
.
map
(
function
(
date
)
{
const
intervals
=
days
.
map
(
function
(
date
)
{
return
tmUtils
.
singleDay
(
date
,
timeSpan
);
return
tmUtils
.
singleDay
(
date
,
timeSpan
);
});
});
tmUtils
.
sort
(
intervals
);
tmUtils
.
sort
(
intervals
);
...
@@ -214,13 +205,15 @@ function wrapper(_epochSpan) {
...
@@ -214,13 +205,15 @@ function wrapper(_epochSpan) {
}
}
function
getAllHolidays
(
info
,
cb
)
{
function
getAllHolidays
(
info
,
cb
)
{
var
days
=
[];
let
days
=
[];
var
cnt
=
endYear
-
startYear
;
let
cnt
=
endYear
-
startYear
;
var
errRec
=
false
;
let
errRec
=
false
;
function
_cb
(
err
,
result
)
{
function
_cb
(
err
,
result
)
{
if
(
errRec
)
return
;
if
(
errRec
)
{
return
;
}
if
(
err
)
{
if
(
err
)
{
errRec
=
true
;
errRec
=
true
;
return
cb
(
err
);
return
cb
(
err
);
...
@@ -229,25 +222,24 @@ function wrapper(_epochSpan) {
...
@@ -229,25 +222,24 @@ function wrapper(_epochSpan) {
days
=
days
.
concat
(
result
);
days
=
days
.
concat
(
result
);
if
(
cnt
--
===
0
)
{
if
(
cnt
--
===
0
)
{
cb
(
null
,
days
);
cb
(
null
,
days
);
}
}
}
}
for
(
var
year
=
startYear
;
year
<=
endYear
;
year
++
)
{
for
(
let
year
=
startYear
;
year
<=
endYear
;
year
++
)
{
holidaysGetter
[
year
].
getAllHolidays
(
info
,
epochSpan
,
_cb
);
holidaysGetter
[
year
].
getAllHolidays
(
info
,
epochSpan
,
_cb
);
}
}
}
}
function
getDateSpan
(
data
)
{
function
getDateSpan
(
data
)
{
var
start
=
parseDate
(
data
[
"opening_day_from"
]);
const
start
=
parseDate
(
data
[
'opening_day_from'
]);
var
end
=
parseDate
(
data
[
"opening_day_to"
]);
const
end
=
parseDate
(
data
[
'opening_day_to'
]);
if
(
!
start
)
{
if
(
!
start
)
{
return
[
epochSpan
];
return
[
epochSpan
];
}
}
var
startDate
,
endDate
;
let
startDate
,
endDate
;
if
(
!
end
)
{
if
(
!
end
)
{
debugInfo
+=
'no endDate for dateSpan'
;
debugInfo
+=
'no endDate for dateSpan'
;
...
@@ -256,107 +248,126 @@ function wrapper(_epochSpan) {
...
@@ -256,107 +248,126 @@ function wrapper(_epochSpan) {
return
[[
startDate
,
endDate
]];
return
[[
startDate
,
endDate
]];
}
}
var
newYear
=
0
;
let
newYear
=
0
;
if
(
end
[
1
]
<
start
[
1
]
||
(
end
[
1
]
==
start
[
1
]
&&
end
[
0
]
<
start
[
0
]))
newYear
=
1
;
if
(
end
[
1
]
<
start
[
1
]
||
(
end
[
1
]
==
start
[
1
]
&&
end
[
0
]
<
start
[
0
]))
{
newYear
=
1
;
}
var
dateSpanArray
=
[];
const
dateSpanArray
=
[];
for
(
var
offset
=
-
1
;
offset
<=
1
;
offset
++
)
{
for
(
let
offset
=
-
1
;
offset
<=
1
;
offset
++
)
{
dateSpanArray
.
push
([
new
Date
(
startYear
+
offset
,
start
[
1
]
-
1
,
start
[
0
]),
dateSpanArray
.
push
([
new
Date
(
startYear
+
offset
+
newYear
,
end
[
1
]
-
1
,
end
[
0
]
+
1
)])
new
Date
(
startYear
+
offset
,
start
[
1
]
-
1
,
start
[
0
]),
new
Date
(
startYear
+
offset
+
newYear
,
end
[
1
]
-
1
,
end
[
0
]
+
1
)
]);
}
}
return
dateSpanArray
;
return
dateSpanArray
;
}
}
function
getTimeSpan
(
data
)
{
function
getTimeSpan
(
data
)
{
return
[
parseTime
(
data
[
"opening_from"
]),
parseTime
(
data
[
"opening_to"
])];
return
[
parseTime
(
data
[
'opening_from'
]),
parseTime
(
data
[
'opening_to'
])];
}
}
function
getOption
(
data
)
{
function
getOption
(
data
)
{
return
data
[
"option"
];
return
data
[
'option'
];
}
}
function
getOpeningHours
(
data
,
option
)
{
function
getOpeningHours
(
data
,
option
)
{
option
=
option
||
getOption
(
data
);
option
=
option
||
getOption
(
data
);
switch
(
option
)
{
switch
(
option
)
{
case
"default"
:
case
'default'
:
return
getOpeningHoursDefault
(
data
);
return
getOpeningHoursDefault
(
data
);
case
"season"
:
case
'season'
:
return
getOpeningHoursSeason
(
data
);
return
getOpeningHoursSeason
(
data
);
case
"repeatable"
:
case
'repeatable'
:
return
getOpeningHoursRepeatable
(
data
);
return
getOpeningHoursRepeatable
(
data
);
case
"vacation"
:
case
'vacation'
:
return
getOpeningHoursVacation
(
data
);
return
getOpeningHoursVacation
(
data
);
case
"datespan"
:
case
'datespan'
:
return
getOpeningHoursDatespan
(
data
);
return
getOpeningHoursDatespan
(
data
);
case
""
:
case
''
:
return
[];
return
[];
default
:
default
:
throw
new
Error
(
"option not supported: "
+
option
);
throw
new
Error
(
'option not supported: '
+
option
);
return
[];
}
}
}
}
function
getOpeningHoursDefault
(
data
)
{
function
getOpeningHoursDefault
(
data
)
{
var
daySpan
=
getDaySpan
(
data
);
const
daySpan
=
getDaySpan
(
data
);
var
timeSpan
=
getTimeSpan
(
data
);
const
timeSpan
=
getTimeSpan
(
data
);
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
epochSpan
,
epochSpan
,
7
);
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
epochSpan
,
epochSpan
,
7
);
}
}
function
getOpeningHoursSeason
(
data
)
{
function
getOpeningHoursSeason
(
data
)
{
var
daySpan
=
getDaySpan
(
data
);
const
daySpan
=
getDaySpan
(
data
);
var
timeSpan
=
getTimeSpan
(
data
);
const
timeSpan
=
getTimeSpan
(
data
);
var
dateSpan
=
getDateSpan
(
data
);
const
dateSpan
=
getDateSpan
(
data
);
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpanElem
,
epochSpan
,
7
);
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpanElem
,
epochSpan
,
7
);
}));
})
);
}
}
function
getOpeningHoursDatespan
(
data
)
{
function
getOpeningHoursDatespan
(
data
)
{
// TODO JB remove entries beyond epochespan
// TODO JB remove entries beyond epochespan
var
from
=
new
Date
(
data
[
'opening_date_from'
]);
const
from
=
new
Date
(
data
[
'opening_date_from'
]);
var
to
=
new
Date
(
data
[
'opening_date_to'
]);
const
to
=
new
Date
(
data
[
'opening_date_to'
]);
if
(
!
from
||
!
to
)
{
if
(
!
from
||
!
to
)
{
console
.
error
(
new
Error
(
'invalid data for datespan option '
+
JSON
.
stringify
(
data
)))
console
.
error
(
new
Error
(
'invalid data for datespan option '
+
JSON
.
stringify
(
data
)));
}
}
else
{
else
{
return
[[
from
,
to
]];
return
[[
from
,
to
]];
}
}
}
}
function
getOpeningHoursVacation
(
data
)
{
function
getOpeningHoursVacation
(
data
)
{
if
(
data
[
"opening_day_from"
]
==
""
||
data
[
"opening_day_to"
]
==
""
)
{
if
(
data
[
'opening_day_from'
]
==
''
||
data
[
'opening_day_to'
]
==
''
)
{
console
.
error
(
new
Error
(
"opening_day cant be empty in vacations"
));
console
.
error
(
new
Error
(
'opening_day cant be empty in vacations'
));
}
}
var
dateSpan
=
getDateSpan
(
data
);
const
dateSpan
=
getDateSpan
(
data
);
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
dateSpan
(
dateSpanElem
);
return
tmUtils
.
dateSpan
(
dateSpanElem
);
}));
})
);
}
}
function
getOpeningHoursRepeatable
(
data
)
{
function
getOpeningHoursRepeatable
(
data
)
{
var
daySpan
=
getDaySpan
(
data
);
const
daySpan
=
getDaySpan
(
data
);
var
timeSpan
=
getTimeSpan
(
data
);
const
timeSpan
=
getTimeSpan
(
data
);
var
dateSpan
=
getDateSpan
(
data
);
const
dateSpan
=
getDateSpan
(
data
);
var
repeatOption
=
parseInt
(
data
[
"repeatoption"
]);
const
repeatOption
=
parseInt
(
data
[
'repeatoption'
]);
var
noInMonth
;
let
noInMonth
;
if
(
repeatOption
<=
4
)
noInMonth
=
repeatOption
;
if
(
repeatOption
<=
4
)
{
else
if
(
repeatOption
==
30
)
noInMonth
=
-
1
;
noInMonth
=
repeatOption
;
if
(
noInMonth
)
}
else
if
(
repeatOption
==
30
)
{
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
noInMonth
=
-
1
;
}
if
(
noInMonth
)
{
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
cyclicFromTillDay
(
daySpan
,
noInMonth
,
timeSpan
,
dateSpanElem
,
epochSpan
);
return
tmUtils
.
cyclicFromTillDay
(
daySpan
,
noInMonth
,
timeSpan
,
dateSpanElem
,
epochSpan
);
}));
})
else
{
);
}
else
{
switch
(
repeatOption
)
{
switch
(
repeatOption
)
{
case
14
:
case
14
:
case
21
:
case
21
:
case
28
:
case
28
:
return
tmUtils
.
orOp
(
dateSpan
.
map
(
function
(
dateSpanElem
)
{
return
tmUtils
.
orOp
(
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpanElem
,
epochSpan
,
repeatOption
);
dateSpan
.
map
(
function
(
dateSpanElem
)
{
}));
return
tmUtils
.
standardFromTillDay
(
daySpan
,
timeSpan
,
dateSpanElem
,
epochSpan
,
repeatOption
);
})
);
default
:
default
:
throw
new
Error
(
"invalid repeatoption"
);
throw
new
Error
(
'invalid repeatoption'
);
}
}
}
}
}
}
...
@@ -367,6 +378,3 @@ function wrapper(_epochSpan) {
...
@@ -367,6 +378,3 @@ function wrapper(_epochSpan) {
};
};
}
}
module
.
exports
=
wrapper
;
module
.
exports
=
wrapper
;
lib/holidays.js
View file @
3081c4d9
var
holidayMapping
=
require
(
'./holidayMapping.json'
);
const
holidayMapping
=
require
(
'./holidayMapping.json'
);
var
easterSunday
=
require
(
'./easterSunday'
);
const
easterSunday
=
require
(
'./easterSunday'
);
const
DateHolidays
=
require
(
'date-holidays'
);
var
requestHandler
=
require
(
'./regionInfoRequest'
);
let
requestHandler
=
require
(
'./regionInfoRequest'
);
var
easterSundays
=
{};
const
easterSundays
=
{};
var
fixedHolidays
=
{
const
fixedHolidays
=
{
101
:
"0101"
,
101
:
'0101'
,
106
:
"0601"
,
106
:
'0601'
,
501
:
"0105"
,
501
:
'0105'
,
808
:
"0808"
,
808
:
'0808'
,
815
:
"1508"
,
815
:
'1508'
,
103
:
"0310"
,
103
:
'0310'
,
131
:
"3110"
,
131
:
'3110'
,
111
:
"0111"
,
111
:
'0111'
,
121
:
"2412"
,
121
:
'2412'
,
122
:
"2512"
,
122
:
'2512'
,
123
:
"2612"
123
:
'2612'
};
};
var
variableOffsets
=
{
const
variableOffsets
=
{
301
:
-
2
,
301
:
-
2
,
302
:
0
,
302
:
0
,
303
:
1
,
303
:
1
,
...
@@ -29,48 +29,45 @@ var variableOffsets = {
...
@@ -29,48 +29,45 @@ var variableOffsets = {
603
:
60
603
:
60
};
};
function
Holidays
(
year
)
{
function
Holidays
(
year
)
{
function
getEasterSunday
()
{
function
getEasterSunday
()
{
if
(
!
easterSundays
[
year
])
if
(
!
easterSundays
[
year
])
{
easterSundays
[
year
]
=
easterSunday
.
getEasterSunday
(
year
);
easterSundays
[
year
]
=
easterSunday
.
getEasterSunday
(
year
);
}
return
easterSundays
[
year
];
return
easterSundays
[
year
];
}
}
function
getFixedHolidays
(
fixedHolidays
,
object
)
{
function
getFixedHolidays
(
fixedHolidays
,
object
)
{
var
result
=
object
||
{};
const
result
=
object
||
{};
for
(
var
key
in
fixedHolidays
)
{
for
(
const
key
in
fixedHolidays
)
{
var
dateString
=
fixedHolidays
[
key
];
const
dateString
=
fixedHolidays
[
key
];
var
date
=
parseInt
(
dateString
.
slice
(
0
,
2
));
const
date
=
parseInt
(
dateString
.
slice
(
0
,
2
));
var
month
=
parseInt
(
dateString
.
slice
(
2
,
4
));
const
month
=
parseInt
(
dateString
.
slice
(
2
,
4
));
result
[
key
]
=
new
Date
(
year
,
month
-
1
,
date
);
result
[
key
]
=
new
Date
(
year
,
month
-
1
,
date
);
}
}
return
result
;
return
result
;
}
}
function
getVariableHolidaysMap
(
offsets
,
object
)
{
function
getVariableHolidaysMap
(
offsets
,
object
)
{
var
result
=
object
||
{};
const
result
=
object
||
{};
var
easterDate
=
getEasterSunday
();
const
easterDate
=
getEasterSunday
();
for
(
var
key
in
offsets
)
{
for
(
const
key
in
offsets
)
{
var
offset
=
offsets
[
key
];
const
offset
=
offsets
[
key
];
result
[
key
]
=
new
Date
(
year
,
easterDate
.
getMonth
(),
easterDate
.
getDate
()
+
offset
);
result
[
key
]
=
new
Date
(
year
,
easterDate
.
getMonth
(),
easterDate
.
getDate
()
+
offset
);
}
}
return
result
;
return
result
;
}
}
var
holidays
=
getFixedHolidays
(
fixedHolidays
);
let
holidays
=
getFixedHolidays
(
fixedHolidays
);
holidays
=
getVariableHolidaysMap
(
variableOffsets
,
holidays
);
holidays
=
getVariableHolidaysMap
(
variableOffsets
,
holidays
);
function
getIsAugsburg
(
plz
)
{
function
getIsAugsburg
(
plz
)
{
return
!!
(
86150
<=
plz
&&
plz
<=
86199
);
return
!!
(
86150
<=
plz
&&
plz
<=
86199
);
}
}
function
isInEpochSpan
(
date
,
epochSpan
)
{
function
isInEpochSpan
(
date
,
epochSpan
)
{
var
dateTime
=
date
.
getTime
();
const
dateTime
=
date
.
getTime
();
return
epochSpan
[
0
].
getTime
()
<=
dateTime
&&
dateTime
<=
epochSpan
[
1
].
getTime
()
return
epochSpan
[
0
].
getTime
()
<=
dateTime
&&
dateTime
<=
epochSpan
[
1
].
getTime
()
;
}
}
function
getRelevantHolidayKeys
(
epochSpan
)
{
function
getRelevantHolidayKeys
(
epochSpan
)
{
...
@@ -80,9 +77,9 @@ function Holidays(year) {
...
@@ -80,9 +77,9 @@ function Holidays(year) {
}
}
function
getHolidayKeys
(
info
,
epochSpan
,
cb
)
{
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
;
return
initKeys
.
indexOf
(
key
)
>=
0
;
});
});
...
@@ -91,50 +88,53 @@ function Holidays(year) {
...
@@ -91,50 +88,53 @@ function Holidays(year) {
}
}
requestHandler
.
getBundesland
(
info
,
function
(
err
,
blnd
)
{
requestHandler
.
getBundesland
(
info
,
function
(
err
,
blnd
)
{
if
(
err
)
return
cb
(
err
);
if
(
err
)
{
var
keys
=
holidayMapping
[
"sureHolidays"
].
filter
(
function
(
key
)
{
return
cb
(
err
);
}
const
keys
=
holidayMapping
[
'sureHolidays'
].
filter
(
function
(
key
)
{
return
initKeys
.
indexOf
(
key
)
>=
0
;
return
initKeys
.
indexOf
(
key
)
>=
0
;
});
});
var
regionMap
=
holidayMapping
[
"region"
][
blnd
];
const
regionMap
=
holidayMapping
[
'region'
][
blnd
];
if
(
regionMap
)
{
if
(
regionMap
)
{
var
regionHolidays
=
regionMap
[
'default'
];
const
regionHolidays
=
regionMap
[
'default'
];
for
(
var
i
=
0
;
i
<
regionHolidays
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
regionHolidays
.
length
;
i
++
)
{
var
key
=
regionHolidays
[
i
];
const
key
=
regionHolidays
[
i
];
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
{
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
{
keys
.
push
(
key
);
keys
.
push
(
key
);
}
}
}
}
}
else
{
console
.
error
(
new
Error
(
'No Mapping for Bundesland: '
+
blnd
));
}
}
else
{
if
(
blnd
!=
'BY'
)
{
console
.
error
(
new
Error
(
"No Mapping for Bundesland: "
+
blnd
));
}
if
(
blnd
!=
"BY"
)
{
cb
(
null
,
keys
);
cb
(
null
,
keys
);
}
}
else
{
else
{
if
(
regionMap
[
'augsburg'
]
&&
getIsAugsburg
(
info
.
zip
))
{
if
(
regionMap
[
"augsburg"
]
&&
getIsAugsburg
(
info
.
zip
))
{
const
augsHDs
=
regionMap
[
'augsburg'
];
var
augsHDs
=
regionMap
[
"augsburg"
];
for
(
let
i
=
0
;
i
<
augsHDs
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
augsHDs
.
length
;
i
++
)
{
const
key
=
augsHDs
[
i
];
var
key
=
augsHDs
[
i
];
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
{
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
keys
.
push
(
key
);
keys
.
push
(
key
);
}
}
}
}
if
(
regionMap
[
"kath"
]
&&
regionMap
[
"kath"
].
length
>
0
)
{
}
requestHandler
.
getKatholisch
(
info
,
function
(
err
,
kath
)
{
if
(
regionMap
[
'kath'
]
&&
regionMap
[
'kath'
].
length
>
0
)
{
if
(
err
)
return
cb
(
err
);
requestHandler
.
getKatholisch
(
info
,
function
(
err
,
kath
)
{
if
(
kath
)
{
if
(
err
)
{
var
kathHDs
=
regionMap
[
"kath"
];
return
cb
(
err
);
for
(
var
i
=
0
;
i
<
kathHDs
.
length
;
i
++
)
{
}
var
key
=
kathHDs
[
i
];
if
(
kath
)
{
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
const
kathHDs
=
regionMap
[
'kath'
];
for
(
let
i
=
0
;
i
<
kathHDs
.
length
;
i
++
)
{
const
key
=
kathHDs
[
i
];
if
(
initKeys
.
indexOf
(
key
)
>=
0
)
{
keys
.
push
(
key
);
keys
.
push
(
key
);
}
}
}
}
cb
(
null
,
keys
);
})
}
}
else
{
cb
(
null
,
keys
);
});
}
else
{
cb
(
null
,
keys
);
cb
(
null
,
keys
);
}
}
}
}
...
@@ -142,30 +142,50 @@ function Holidays(year) {
...
@@ -142,30 +142,50 @@ function Holidays(year) {
}
}
this
.
getAllHolidays
=
function
(
info
,
epochSpan
,
cb
)
{
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
)
{
getHolidayKeys
(
info
,
epochSpan
,
function
(
err
,
keys
)
{
if
(
err
)
if
(
err
)
{
return
cb
(
err
);
return
cb
(
err
);
var
result
=
[];
}
for
(
var
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
const
result
=
[];
var
key
=
keys
[
i
];
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
var
elem
=
holidays
[
key
];
const
key
=
keys
[
i
];
if
(
elem
)
const
elem
=
holidays
[
key
];
if
(
elem
)
{
result
.
push
(
elem
);
result
.
push
(
elem
);
}
}
}
cb
(
err
,
result
);
cb
(
err
,
result
);
});
});
};
};
this
.
getHoliday
=
function
(
id
)
{
this
.
getHoliday
=
function
(
id
)
{
if
(
id
==
0
)
{
if
(
id
==
0
)
{
var
ret
=
[];
const
ret
=
[];
for
(
var
key
in
holidays
)
for
(
const
key
in
holidays
)
{
ret
.
push
(
holidays
[
key
]);
ret
.
push
(
holidays
[
key
]);
}
return
ret
;
return
ret
;
}
}
if
(
id
in
holidays
)
if
(
id
in
holidays
)
{
return
[
holidays
[
id
]];
return
[
holidays
[
id
]];
console
.
error
(
"invalid holiday id "
+
id
);
}
console
.
error
(
'invalid holiday id '
+
id
);
return
null
;
return
null
;
};
};
}
}
...
@@ -177,20 +197,19 @@ module.exports = Holidays;
...
@@ -177,20 +197,19 @@ module.exports = Holidays;
* for testing reasons
* for testing reasons
* @param handler
* @param handler
*/
*/
module
.
exports
.
setRequestHandler
=
function
(
handler
)
{
module
.
exports
.
setRequestHandler
=
function
(
handler
)
{
requestHandler
=
handler
;
requestHandler
=
handler
;
};
};
module
.
exports
.
setTestHandler
=
function
()
{
module
.
exports
.
setTestHandler
=
function
()
{
requestHandler
=
{
requestHandler
=
{
getBundesland
:
function
(
plz
,
cb
)
{
getBundesland
:
function
(
plz
,
cb
)
{
// console.log("bundesland is bayern");
// console.log("bundesland is bayern");
cb
(
null
,
"BY"
);
cb
(
null
,
'BY'
);
},
},
getKatholisch
:
function
(
plz
,
cb
)
{
getKatholisch
:
function
(
plz
,
cb
)
{
// console.log("is katholic");
// console.log("is katholic");
cb
(
null
,
true
);
cb
(
null
,
true
);
}
}
};
};
};
};
package-lock.json
0 → 100644
View file @
3081c4d9
{
"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
}
}
}
package.json
View file @
3081c4d9
...
@@ -5,6 +5,7 @@
...
@@ -5,6 +5,7 @@
"dependencies"
:
{
"dependencies"
:
{
"
async
"
:
"^2.0.1"
,
"
async
"
:
"^2.0.1"
,
"
bluebird
"
:
"^3.4.6"
,
"
bluebird
"
:
"^3.4.6"
,
"
date-holidays
"
:
"^3.3.0"
,
"
moment
"
:
"^2.15.0"
"
moment
"
:
"^2.15.0"
},
},
"devDependencies"
:
{
"devDependencies"
:
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment