@jsnodor/week-pack
Version:
Utilities to generate arrays made of date objects grouped into 7 items to form a week
108 lines (90 loc) • 3.67 kB
text/typescript
(function (global: any) {
function resetDay(day: Date | string) {
var date = new Date(day)
for (var m of ['Hours', 'Minutes', 'Seconds', 'Milliseconds'])
(date as any)['set' + m](0)
return date
}
/**
* Generate dates back in time
* @param startDate The date to start with. This date is not included
* @param numweeks The number of weeks to generate
* @returns A week pack excluding `startDate`
*/
function prependWeeks(startDate: Date | string | 'today', numWeeks: number = 10) {
var data: Date[][] = []
var argDate = startDate == 'today' ? resetDay(new Date) : new Date(startDate)
var day0 = new Date(argDate.getTime() - (1000 * 60 * 60 * 24)) // Subtract one day
for (var i = 0; i < numWeeks; i++) {
var tmp: Date[] = []
for (var j = 0; j < 7; j++) {
var dt = new Date(day0.getTime() - ((j + i * 7) * (1000 * 60 * 60 * 24))) // Subtract
tmp.unshift(dt)
}
data.unshift(tmp)
}
return data
}
/**
*
* @param startDate Generate dates a head of time
* @param numweeks The number of weeks to generate
* @returns A week pack exluding `startDate`
*/
function appendWeeks(startDate: Date | string | 'today', numWeeks: number = 10) {
var data: Date[][] = []
var argDate = startDate == 'today' ? resetDay(new Date) : new Date(startDate)
var day0 = new Date(argDate.getTime() + (1000 * 60 * 60 * 24)) // Add one day
for (var i = 0; i < numWeeks; i++) {
var tmp: Date[] = []
for (var j = 0; j < 7; j++) {
var dt = new Date(day0.getTime() + ((j + i * 7) * (1000 * 60 * 60 * 24))) // Add
tmp.push(dt)
}
data.push(tmp)
}
return data
}
function generateInitialWeeks(startDate: Date | string | 'today', numWeeks: number = 8) {
var today = startDate == 'today' ? resetDay(new Date) : new Date(startDate)
var firstDayOfThisWeek = computeFirstDayOfWeek(today)
var after = appendWeeks(new Date(firstDayOfThisWeek.getTime() - (1000 * 60 * 60 * 24)), numWeeks) // Subtract one day
// var after = appendWeeks(dayjs(firstDayOfThisWeek).subtract(1, 'day').toDate())
var before = prependWeeks(firstDayOfThisWeek, numWeeks)
var pack = before.concat(after)
return [firstDayOfThisWeek, today, pack]
/**
* Get the first day of the week.
* @param d The reference date
* @returns
*/
function computeFirstDayOfWeek(d: Date) {
d = new Date(d);
var day = d.getDay(),
diff = d.getDate() - day + (day == 0 ? -6 : 1); // adjust when day is sunday
return new Date(d.setDate(diff));
}
}
function isBrowser() {
var process:any=process||null
var require:any=require||null
// Check if the environment is Node.js
if (typeof process === "object" &&
typeof require === "function") {
return false;
}
// Check if the environment is a
// Service worker
if (typeof importScripts === "function") {
return false;
}
// Check if the environment is a Browser
if (typeof window === "object") {
return true;
}
}
const WEEK_PACK = { prependWeeks, appendWeeks, generateInitialWeeks }
if (isBrowser())
Object.assign(global, { WEEK_PACK })
else Object.assign(global, WEEK_PACK)
}(this));