Skip to content

Commit

Permalink
feat: 🎸 Replaced Moment with Luxon (kolplattformen#30)
Browse files Browse the repository at this point in the history
* feat: 🎸 Replaced Moment with Luxon

Replaced Moment with Luxon since the former is deprecated for various
reasons. Also updated types to be fully serialized.

BREAKING CHANGE: 🧨 Change to types (moment -> strings) and api.getSchedule (moment ->
luxon.DateTime)
  • Loading branch information
JohanObrink authored Jan 3, 2021
1 parent 40166f3 commit e41f0bf
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 64 deletions.
6 changes: 3 additions & 3 deletions lib/api.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Moment } from 'moment'
import { DateTime } from 'luxon'
import { EventEmitter } from 'events'
import {
checkStatus, LoginStatusChecker,
Expand Down Expand Up @@ -95,8 +95,8 @@ export class Api extends EventEmitter {
return parse.classmates(data)
}

async getSchedule(child: Child, from: Moment, to: Moment): Promise<ScheduleItem[]> {
const url = routes.schedule(child.sdsId, from.format('YYYY-MM-DD'), to.format('YYYY-MM-DD'))
async getSchedule(child: Child, from: DateTime, to: DateTime): Promise<ScheduleItem[]> {
const url = routes.schedule(child.sdsId, from.toISODate(), to.toISODate())
const response = await this.fetch('schedule', url, this.session)
const data = await response.json()
return parse.schedule(data)
Expand Down
16 changes: 7 additions & 9 deletions lib/parse.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import * as moment from 'moment'
import * as parse from "./parse"
import { NewsItem } from "./types"

describe('parse', () => {
let response: parse.EtjanstResponse
Expand Down Expand Up @@ -99,8 +97,8 @@ describe('parse', () => {
location: null,
title: 'Jullov',
description: 'hello',
startDate: moment(new Date('2020-12-21 09:00')),
endDate: moment(new Date('2021-01-08 10:00')),
startDate: '2020-12-21T09:00:00.000+01:00',
endDate: '2021-01-08T10:00:00.000+01:00',
allDay: false,
}])
})
Expand Down Expand Up @@ -205,8 +203,8 @@ describe('parse', () => {
title: 'Canceled: Julavslutning 8C',
description: 'Nåt kul',
location: 'Lakritskolan',
startDate: moment(new Date('2020-12-14 14:10')),
endDate: moment(new Date('2020-12-14 14:40')),
startDate: '2020-12-14T14:10:00.000+01:00',
endDate: '2020-12-14T14:40:00.000+01:00',
oneDayEvent: true,
allDayEvent: false,
}])
Expand Down Expand Up @@ -273,8 +271,8 @@ describe('parse', () => {
expect(item.header).toEqual('Problemet med att se betyg i bild, slöjd och teknik löst!')
expect(item.imageUrl).toEqual('A703552D-DBF3-45B0-8E67-6E062105A0C5.jpeg')
expect(item.intro).toEqual('Hej,Nu är problemet löst! Alla betyg syns som de ska.God jul!...')
expect(item.modified).toEqual(moment(new Date('18 december 2020 16:18')))
expect(item.published).toEqual(moment(new Date('18 december 2020 16:15')))
expect(item.modified).toEqual('2020-12-18T16:18:00.000+01:00')
expect(item.published).toEqual('2020-12-18T16:15:00.000+01:00')
})
it('parses body correctly', () => {
const [item] = parse.news(response)
Expand Down Expand Up @@ -376,7 +374,7 @@ describe('parse', () => {
message: 'Betygen är publicerade.',
sender: 'Elevdokumentation',
url: 'https://elevdokumentation.stockholm.se/loa3/gradesStudent.do',
dateCreated: moment(new Date('2020-12-18T15:59:46.34')),
dateCreated: '2020-12-18T15:59:46.340+01:00',
category: null,
type: 'webnotify',
}])
Expand Down
22 changes: 14 additions & 8 deletions lib/parse.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import * as moment from 'moment'
import { DateTime, DateTimeOptions } from 'luxon'
import * as h2m from 'h2m'
import { htmlDecode } from 'js-htmlencode'
import {
Expand All @@ -7,6 +7,12 @@ import {

const camel = require('camelcase-keys')

const dateTimeOptions: DateTimeOptions = {
locale: 'sv',
setZone: true,
zone: 'Europe/Stockholm',
}

export interface EtjanstResponse {
Success: boolean
Error: string | null
Expand Down Expand Up @@ -67,8 +73,8 @@ export const calendarItem = ({
description,
location,
allDay: allDayEvent,
startDate: longEventDateTime ? moment(new Date(longEventDateTime)) : undefined,
endDate: longEndDateTime ? moment(new Date(longEndDateTime)) : undefined,
startDate: longEventDateTime ? DateTime.fromSQL(longEventDateTime, dateTimeOptions).toISO() : undefined,
endDate: longEndDateTime ? DateTime.fromSQL(longEndDateTime, dateTimeOptions).toISO() : undefined,
})
export const calendar = (data: any): CalendarItem[] => etjanst(data).map(calendarItem)

Expand All @@ -80,8 +86,8 @@ export const newsItem = ({
intro: preamble,
imageUrl: bannerImageUrl,
body: htmlDecode(h2m(body)),
published: moment(new Date(pubDateSe)),
modified: moment(new Date(modDateSe)),
published: DateTime.fromFormat(pubDateSe, 'dd LLLL yyyy HH:mm', dateTimeOptions).toISO(),
modified: DateTime.fromFormat(modDateSe, 'dd LLLL yyyy HH:mm', dateTimeOptions).toISO(),
})
export const news = (data: any): NewsItem[] => etjanst(data).newsItems.map(newsItem)

Expand All @@ -92,8 +98,8 @@ export const scheduleItem = ({
description,
location,
allDayEvent,
startDate: moment(new Date(longEventDateTime)),
endDate: moment(new Date(longEndDateTime)),
startDate: DateTime.fromSQL(longEventDateTime, dateTimeOptions).toISO(),
endDate: DateTime.fromSQL(longEndDateTime, dateTimeOptions).toISO(),
oneDayEvent: isSameDay,
})
export const schedule = (data: any): ScheduleItem[] => etjanst(data).map(scheduleItem)
Expand Down Expand Up @@ -131,7 +137,7 @@ export const notification = ({
message: messagetext,
sender: name,
url: linkbackurl,
dateCreated: moment(new Date(dateCreated)),
dateCreated: DateTime.fromISO(dateCreated, dateTimeOptions).toISO(),
category,
type,
})
Expand Down
66 changes: 32 additions & 34 deletions lib/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { Moment } from 'moment'

export interface AsyncishFunction { (): void | Promise<void> }

export interface RequestInit {
Expand Down Expand Up @@ -36,59 +34,59 @@ export interface AuthTicket {
* @interface CalendarItem
*/
export interface CalendarItem {
id: number;
title: string;
description?: string;
location?: string;
startDate?: Moment;
endDate?: Moment;
allDay?: boolean;
id: number
title: string
description?: string
location?: string
startDate?: string
endDate?: string
allDay?: boolean
}

/**
* @export
* @interface Child
*/
export interface Child {
id: string;
id: string
/**
* <p>Special ID used to access certain subsystems</p>
* @type {string}
* @memberof Child
*/
sdsId: string;
name: string;
sdsId: string
name: string
/**
* <p>F - förskola, GR - grundskola?</p>
* @type {string}
* @memberof Child
*/
status?: string;
schoolId?: string;
status?: string
schoolId?: string
}

/**
* @export
* @interface Classmate
*/
export interface Classmate {
sisId: string;
className?: string;
firstname: string;
lastname: string;
guardians: Guardian[];
sisId: string
className?: string
firstname: string
lastname: string
guardians: Guardian[]
}

/**
* @export
* @interface Guardian
*/
export interface Guardian {
email?: string;
firstname: string;
lastname: string;
mobile?: string;
address?: string;
email?: string
firstname: string
lastname: string
mobile?: string
address?: string
}

/**
Expand All @@ -97,13 +95,13 @@ export interface Guardian {
* @interface NewsItem
*/
export interface NewsItem {
id?: string;
header?: string;
intro?: string;
body?: string;
published: Moment;
modified?: Moment;
imageUrl?: string;
id?: string
header?: string
intro?: string
body?: string
published: string
modified?: string
imageUrl?: string
}

/**
Expand All @@ -113,7 +111,7 @@ export interface NewsItem {
export interface Notification {
id: string
sender: string
dateCreated: Moment
dateCreated: string
message: string
/**
* <p>
Expand All @@ -136,8 +134,8 @@ export interface ScheduleItem {
title: string
description?: string
location?: string
startDate: Moment
endDate: Moment
startDate: string
endDate: string
oneDayEvent: boolean
allDayEvent: boolean
}
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
},
"devDependencies": {
"@types/jest": "^26.0.19",
"@types/luxon": "^1.25.0",
"@types/node-fetch": "^2.5.7",
"@typescript-eslint/eslint-plugin": "^4.10.0",
"@typescript-eslint/parser": "^4.10.0",
Expand All @@ -39,6 +40,6 @@
"events": "^3.2.0",
"h2m": "^0.7.0",
"js-htmlencode": "^0.3.0",
"moment": "^2.29.1"
"luxon": "^1.25.0"
}
}
8 changes: 4 additions & 4 deletions run.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const moment = require('moment')
const { DateTime } = require('luxon')
const nodeFetch = require('node-fetch')
const { CookieJar } = require('tough-cookie')
const fetchCookie = require('fetch-cookie/node-fetch')
Expand Down Expand Up @@ -71,15 +71,15 @@ async function run() {
// console.log(classmates)

console.log('schedule')
const schedule = await api.getSchedule(children[0], moment().subtract(1, 'week'), moment())
const schedule = await api.getSchedule(children[0], DateTime.local(), DateTime.local().plus({ week: 1 }))
// console.log(schedule)

console.log('news')
const news = await api.getNews(children[0])
// console.log(news)

console.log('image')
const blob = await api.getImage(news[0].imageUrl)
// console.log('image')
// const blob = await api.getImage(news[0].imageUrl)
// console.log(blob)

// const arrayBuffer = await blob.arrayBuffer()
Expand Down
15 changes: 10 additions & 5 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,11 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=

"@types/luxon@^1.25.0":
version "1.25.0"
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-1.25.0.tgz#3d6fe591fac874f48dd225cb5660b2b785a21a05"
integrity sha512-iIJp2CP6C32gVqI08HIYnzqj55tlLnodIBMCcMf28q9ckqMfMzocCmIzd9JWI/ALLPMUiTkCu1JGv3FFtu6t3g==

"@types/node-fetch@^2.5.7":
version "2.5.7"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c"
Expand Down Expand Up @@ -3186,6 +3191,11 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"

luxon@^1.25.0:
version "1.25.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.25.0.tgz#d86219e90bc0102c0eb299d65b2f5e95efe1fe72"
integrity sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==

make-dir@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
Expand Down Expand Up @@ -3301,11 +3311,6 @@ mkdirp@1.x:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==

moment@^2.29.1:
version "2.29.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==

ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
Expand Down

0 comments on commit e41f0bf

Please sign in to comment.