Skip to content
This repository has been archived by the owner on Jun 13, 2022. It is now read-only.

Commit

Permalink
fix(core): improve dates parsing and formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
juliomrqz committed Mar 14, 2019
1 parent 7bf4a93 commit aa32346
Show file tree
Hide file tree
Showing 22 changed files with 914 additions and 12,205 deletions.
8 changes: 6 additions & 2 deletions packages/@statusfy/common/index.js
@@ -1,11 +1,15 @@
const path = require('upath')
const esm = require('./lib/esm')

exports.logger = require('./lib/logger')
exports.validator = require('./lib/validator')
exports.grayMatter = require('./lib/gray-matter')
exports.slugify = require('./lib/slugify')
exports.generateDemoContent = require('./lib/generate-content')
exports.style = require('./lib/style')
exports.postcss = require('./lib/postcss')
exports.esm = require('./lib/esm')
exports.esm = esm
exports.Dates = esm(path.join(__dirname, './lib/dates.js')).default

exports.toml = require('toml')
exports.tomlify = require('tomlify-j0.4')
Expand All @@ -14,5 +18,5 @@ exports.yaml = require('yaml')
exports.chalk = require('chalk')
exports.fse = require('fs-extra')
exports.hash = require('hash-sum')
exports.path = require('upath')
exports.path = path
exports.LRU = require('lru-cache')
61 changes: 61 additions & 0 deletions packages/@statusfy/common/lib/dates.js
@@ -0,0 +1,61 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')

const logger = require('./logger')

dayjs.extend(utc)

export default () => {
return {
addLocales(extraLangs) {
if (extraLangs && extraLangs.length > 0) {
extraLangs.forEach(l => dayjs.locale(l))
}
},
format(date, template, locale = 'en') {
return dayjs.utc(date).locale(locale).format(template)
},
parse(inputDate) {
const date = inputDate ? inputDate : new Date()
return dayjs.utc(date)
},
range(start, end, by = 'day') {
const startDate = this.parse(start)
const endDate = this.parse(end)
let dates = []
let diff = {};

if (endDate.diff(startDate) < 0) {
logger.fatal('End Date must be greater than Start Date')
process.exit(0)
}

if (by === 'day') {
const startD = startDate.startOf('day');
const endD = endDate.startOf('day');

diff.day = endD.diff(startD, 'day', true)
dates.push(startD)

for (let i = 1; i <= diff.day; i++) {
dates.push(startD.add(i, 'day'))
}
} else if (by === 'month') {
const startM = startDate.startOf('month');
const endM = endDate.startOf('month');

diff.month = endM.diff(startM, 'month', true)
dates.push(startM)

for (let i = 1; i <= diff.month; i++) {
dates.push(startM.add(i, 'month'))
}
}

return {
diff,
dates
}
}
}
}
22 changes: 13 additions & 9 deletions packages/@statusfy/common/lib/generate-content/index.js
@@ -1,17 +1,21 @@
const hash = require('hash-sum')
const _ = require('lodash')
const moment = require('moment')
const fse = require('fs-extra')
const path = require('upath')

const esm = require('../esm')
const Dates = esm(path.join(__dirname, '../dates.js')).default;
const data = require('./data.json')

const severities = [
'under-maintenance',
'degraded-performance',
'partial-outage',
'major-outage'
]

const dates = Dates()

const getDaySubtraction = (index) => {
// Two incidents per day
// a_n = 1/4 (2 n + (-1)^(n + 1) - 3)
Expand Down Expand Up @@ -65,15 +69,15 @@ module.exports = function generateDemoContent (dest, finalDate, amount = 20) {
getId(i + 1, data.updates.content.en.length),
getId(i + 2, data.updates.content.en.length)
]
const date = moment(finalDate)
.subtract(getDaySubtraction(i), 'd')
.subtract(monthSubtraction, 'M')
const date = dates.parse(finalDate)
.subtract(getDaySubtraction(i), 'day')
.subtract(monthSubtraction, 'month')

const incident = {
id: hash(i),
date: date.toISOString(),
modified: date.add(2, 'h').toISOString(),
scheduled: i === 1 ? moment(finalDate).add(7, 'd').toISOString() : undefined,
modified: date.add(2, 'hour').toISOString(),
scheduled: i === 1 ? dates.parse(finalDate).add(7, 'day').toISOString() : undefined,
resolved: i > 2,
severity: i === 1 ? severities[0] : severities[getId(i, 4)],
affectedsystems: data.affectedsystems.slice(0, getId(i, 4) + 1),
Expand All @@ -87,7 +91,7 @@ module.exports = function generateDemoContent (dest, finalDate, amount = 20) {
},
updates: i === 1 ? [] : [
{
date: date.add(2, 'h').toISOString(),
date: date.add(2, 'hour').toISOString(),
title: {
en: data.updates.title.resolved.en,
es: data.updates.title.resolved.es
Expand All @@ -98,7 +102,7 @@ module.exports = function generateDemoContent (dest, finalDate, amount = 20) {
}
},
{
date: date.add(1, 'h').toISOString(),
date: date.add(1, 'hour').toISOString(),
title: {
en: data.updates.title.monitoring.en,
es: data.updates.title.monitoring.es
Expand All @@ -109,7 +113,7 @@ module.exports = function generateDemoContent (dest, finalDate, amount = 20) {
}
},
{
date: date.add(30, 'm').toISOString(),
date: date.add(30, 'minute').toISOString(),
title: {
en: data.updates.title.resolved.en,
es: data.updates.title.resolved.es
Expand Down
2 changes: 1 addition & 1 deletion packages/@statusfy/common/package.json
Expand Up @@ -26,13 +26,13 @@
"consola": "^2.5.6",
"css-mqpacker": "^7.0.0",
"cssnano": "^4.1.4",
"dayjs": "^1.8.10",
"esm": "^3.2.16",
"fs-extra": "^7.0.0",
"gray-matter": "^4.0.1",
"hash-sum": "^1.0.2",
"lodash.isstring": "^4.0.1",
"lru-cache": "5.1.1",
"moment": "^2.22.2",
"postcss-combine-duplicated-selectors": "^7.0.0",
"postcss-import": "^12.0.0",
"postcss-nested": "^4.1.2",
Expand Down
99 changes: 99 additions & 0 deletions packages/@statusfy/common/test/__snapshots__/dates.spec.js.snap
@@ -0,0 +1,99 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`common:dates range 1`] = `
Array [
"2019-03-06T00:00:00.000Z",
"2019-03-07T00:00:00.000Z",
"2019-03-08T00:00:00.000Z",
"2019-03-09T00:00:00.000Z",
"2019-03-10T00:00:00.000Z",
"2019-03-11T00:00:00.000Z",
"2019-03-12T00:00:00.000Z",
"2019-03-13T00:00:00.000Z",
]
`;

exports[`common:dates range 2`] = `
Array [
"2019-01-11T00:00:00.000Z",
"2019-01-12T00:00:00.000Z",
"2019-01-13T00:00:00.000Z",
"2019-01-14T00:00:00.000Z",
"2019-01-15T00:00:00.000Z",
"2019-01-16T00:00:00.000Z",
"2019-01-17T00:00:00.000Z",
"2019-01-18T00:00:00.000Z",
"2019-01-19T00:00:00.000Z",
"2019-01-20T00:00:00.000Z",
"2019-01-21T00:00:00.000Z",
"2019-01-22T00:00:00.000Z",
"2019-01-23T00:00:00.000Z",
"2019-01-24T00:00:00.000Z",
"2019-01-25T00:00:00.000Z",
"2019-01-26T00:00:00.000Z",
"2019-01-27T00:00:00.000Z",
"2019-01-28T00:00:00.000Z",
"2019-01-29T00:00:00.000Z",
"2019-01-30T00:00:00.000Z",
"2019-01-31T00:00:00.000Z",
"2019-02-01T00:00:00.000Z",
"2019-02-02T00:00:00.000Z",
"2019-02-03T00:00:00.000Z",
"2019-02-04T00:00:00.000Z",
"2019-02-05T00:00:00.000Z",
"2019-02-06T00:00:00.000Z",
"2019-02-07T00:00:00.000Z",
"2019-02-08T00:00:00.000Z",
"2019-02-09T00:00:00.000Z",
"2019-02-10T00:00:00.000Z",
"2019-02-11T00:00:00.000Z",
"2019-02-12T00:00:00.000Z",
"2019-02-13T00:00:00.000Z",
"2019-02-14T00:00:00.000Z",
"2019-02-15T00:00:00.000Z",
"2019-02-16T00:00:00.000Z",
"2019-02-17T00:00:00.000Z",
"2019-02-18T00:00:00.000Z",
"2019-02-19T00:00:00.000Z",
"2019-02-20T00:00:00.000Z",
"2019-02-21T00:00:00.000Z",
"2019-02-22T00:00:00.000Z",
"2019-02-23T00:00:00.000Z",
"2019-02-24T00:00:00.000Z",
"2019-02-25T00:00:00.000Z",
"2019-02-26T00:00:00.000Z",
"2019-02-27T00:00:00.000Z",
"2019-02-28T00:00:00.000Z",
"2019-03-01T00:00:00.000Z",
"2019-03-02T00:00:00.000Z",
"2019-03-03T00:00:00.000Z",
"2019-03-04T00:00:00.000Z",
"2019-03-05T00:00:00.000Z",
"2019-03-06T00:00:00.000Z",
"2019-03-07T00:00:00.000Z",
"2019-03-08T00:00:00.000Z",
"2019-03-09T00:00:00.000Z",
"2019-03-10T00:00:00.000Z",
"2019-03-11T00:00:00.000Z",
"2019-03-12T00:00:00.000Z",
"2019-03-13T00:00:00.000Z",
]
`;

exports[`common:dates range 3`] = `
Array [
"2019-01-01T00:00:00.000Z",
"2019-02-01T00:00:00.000Z",
"2019-03-01T00:00:00.000Z",
]
`;

exports[`common:dates range 4`] = `
Array [
"2018-11-01T00:00:00.000Z",
"2018-12-01T00:00:00.000Z",
"2019-01-01T00:00:00.000Z",
"2019-02-01T00:00:00.000Z",
"2019-03-01T00:00:00.000Z",
]
`;
91 changes: 91 additions & 0 deletions packages/@statusfy/common/test/dates.spec.js
@@ -0,0 +1,91 @@
import Dates from '@/common/lib/dates'

const dates = Dates()

describe('common:dates', () => {
test('parse', () => {
const date1 = dates.parse('2019-03-13T15:30:13.758Z')
const date2 = dates.parse('2019-03-10T02:30:13Z')
const date3 = dates.parse('2019-03-11T13:06:03.407Z')
const date4 = dates.parse(new Date('2019-03-11T13:06:03.407Z'))
const date5 = dates.parse(new Date('05 October 2011 14:48 UTC'))

expect(date1.isValid()).toBeTruthy()
expect(date1.utcOffset()).toBe(0)

expect(date2.isValid()).toBeTruthy()
expect(date2.utcOffset()).toBe(0)

expect(date3.isValid()).toBeTruthy()
expect(date3.utcOffset()).toBe(0)

expect(date4.isValid()).toBeTruthy()
expect(date4.utcOffset()).toBe(0)

expect(date5.isValid()).toBeTruthy()
expect(date5.utcOffset()).toBe(0)
})

test('format', () => {
const date1 = dates.parse('2019-03-13T15:30:13.758Z')
const date2 = dates.parse('2019-03-10T02:30:13Z')
const date3 = dates.parse('2019-03-11T13:06:03.407Z')
const date4 = dates.parse(new Date('2019-03-11T13:06:03.407Z'))
const date5 = dates.parse(new Date('05 October 2011 14:48 UTC'))

expect(dates.format(date1)).toBe('2019-03-13T15:30:13Z')
expect(date1.toISOString()).toBe('2019-03-13T15:30:13.758Z')
expect(date1.toString()).toBe('Wed, 13 Mar 2019 15:30:13 GMT')

expect(dates.format(date2)).toBe('2019-03-10T02:30:13Z')
expect(date2.toISOString()).toBe('2019-03-10T02:30:13.000Z')
expect(date2.toString()).toBe('Sun, 10 Mar 2019 02:30:13 GMT')

expect(dates.format(date3)).toBe('2019-03-11T13:06:03Z')
expect(date3.toISOString()).toBe('2019-03-11T13:06:03.407Z')
expect(date3.toString()).toBe('Mon, 11 Mar 2019 13:06:03 GMT')

expect(dates.format(date4)).toBe('2019-03-11T13:06:03Z')
expect(date4.toISOString()).toBe('2019-03-11T13:06:03.407Z')
expect(date4.toString()).toBe('Mon, 11 Mar 2019 13:06:03 GMT')

expect(dates.format(date5)).toBe('2011-10-05T14:48:00Z')
expect(date5.toISOString()).toBe('2011-10-05T14:48:00.000Z')
expect(date5.toString()).toBe('Wed, 05 Oct 2011 14:48:00 GMT')
})

test('range', () => {
const date1 = dates.parse('2019-03-13T15:30:13.758Z')
const date2 = dates.parse('2019-03-06T02:30:13Z')
const date3 = dates.parse('2019-01-11T13:06:03.407Z')
const date4 = dates.parse('2018-11-11T13:06:03.407Z')

const date2date1DayRange = dates.range(date2, date1)
const date3date1DayRange = dates.range(date3, date1)

const date3date1MonthRange = dates.range(date3, date1, 'month')
const date4date1MonthRange = dates.range(date4, date1, 'month')

// diff day
expect(date2date1DayRange.diff.day).toBe(7)
expect(date2date1DayRange.dates).toMatchSnapshot();
expect(date2date1DayRange.dates[0]).toEqual(date2.startOf('day'))
expect(date2date1DayRange.dates[date2date1DayRange.dates.length - 1]).toEqual(date1.startOf('day'))

expect(date3date1DayRange.diff.day).toBe(61)
expect(date3date1DayRange.dates).toMatchSnapshot();
expect(date3date1DayRange.dates[0]).toEqual(date3.startOf('day'))
expect(date3date1DayRange.dates[date3date1DayRange.dates.length - 1]).toEqual(date1.startOf('day'))

// diff month
expect(date3date1MonthRange.diff.month).toBe(2)
expect(date3date1MonthRange.dates).toMatchSnapshot();
expect(date3date1MonthRange.dates[0]).toEqual(date3.startOf('month'))
expect(date3date1MonthRange.dates[date3date1MonthRange.dates.length - 1]).toEqual(date1.startOf('month'))

expect(date4date1MonthRange.diff.month).toBe(4)
expect(date4date1MonthRange.dates).toMatchSnapshot();
expect(date4date1MonthRange.dates[0]).toEqual(date4.startOf('month'))
expect(date4date1MonthRange.dates[date4date1MonthRange.dates.length - 1]).toEqual(date1.startOf('month'))
})
})
10 changes: 6 additions & 4 deletions packages/@statusfy/core/client/components/Incident.vue
Expand Up @@ -171,11 +171,13 @@ export default {
blockElements.forEach((el, i) => {
const dateEl = el.querySelectorAll(".update-block-date")[0];
const date = this.$statusfy.dayjs(dateEl.innerHTML);
const date = this.$statusfy.dates.parse(dateEl.innerHTML);
dateEl.innerHTML = date
.locale(this.$i18n.locale)
.format($t(`dates.formats.long`));
dateEl.innerHTML = this.$statusfy.dates.format(
date,
$t(`dates.formats.long`),
this.$i18n.locale
);
});
externalLinksElements.forEach((el, i) => {
Expand Down
10 changes: 6 additions & 4 deletions packages/@statusfy/core/client/components/NiceDate.vue
Expand Up @@ -19,11 +19,13 @@ export default {
computed: {
label() {
const $t = this.$t.bind(this);
const parsedDate = this.$statusfy.dayjs(this.date);
const parsedDate = this.$statusfy.dates.parse(this.date);
return parsedDate
.locale(this.$i18n.locale)
.format($t(`dates.formats.${this.format}`));
return this.$statusfy.dates.format(
parsedDate,
$t(`dates.formats.${this.format}`),
this.$i18n.locale
);
}
}
};
Expand Down

0 comments on commit aa32346

Please sign in to comment.