Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add eslint config & update package-lock.json #54

Merged
merged 4 commits into from
Sep 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
'extends': [
'@jeroentvb/eslint-config-typescript'
],
};
6,230 changes: 4,272 additions & 1,958 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
"test-dev": "node tests/dev-sandbox.js",
"build": "rm -rf ./dist && tsc",
"build:prod": "npm run build && npm run package",
"package": "npm pack && node scripts/unpack.js"
"package": "npm pack && node scripts/unpack.js",
"lint": "eslint ./src",
"lint:fix": "eslint --fix ./src"
},
"repository": {
"type": "git",
Expand All @@ -39,12 +41,14 @@
"puppeteer": "^13.4.0"
},
"devDependencies": {
"@jeroentvb/eslint-config-typescript": "^1.3.0",
"@types/cheerio": "^0.22.31",
"@types/jest": "^27.5.0",
"@types/node": "^17.0.32",
"@types/node": "^20.5.9",
"@types/node-fetch": "^2.5.10",
"@types/puppeteer": "^5.4.3",
"dotenv": "^16.0.1",
"eslint": "^8.15.0",
"jeroentvb-helper": "github:jeroentvb/jeroentvb-helper",
"jest": "^28.1.0",
"typescript": "^4.6.4"
Expand Down
6 changes: 3 additions & 3 deletions src/constants/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ export enum WindReportErrors {
NO_SPOT_OR_REPORT = 'the spot doesn\'t exist or doesn\'t have a report'
}

export const REQUEST_TIMEOUT = 'The request timed out after 30000ms'
export const REQUEST_TIMEOUT = 'The request timed out after 30000ms';

export const WIND_REPORT_API_URL = 'https://api.windfinder.com/v2/spots'
export const WIND_REPORT_API_URL = 'https://api.windfinder.com/v2/spots';

export const PPTR_TIMEOUT = 'TimeoutError'
export const PPTR_TIMEOUT = 'TimeoutError';
38 changes: 19 additions & 19 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
import windfinder from './partials/windfinder'
import { windguru, customWindguru } from './partials/windguru'
import windy from './partials/windy'
import windReport from './partials/windfinder-report'
import windfinder from './partials/windfinder';
import { windguru, customWindguru } from './partials/windguru';
import windy from './partials/windy';
import windReport from './partials/windfinder-report';

import { WindfinderData } from './interfaces/windfinder'
import { WindguruData } from './interfaces/windguru'
import { WindyData } from './interfaces/windy'
import { WindReport } from './interfaces/wind-report'
import { WindfinderData } from './interfaces/windfinder';
import { WindguruData } from './interfaces/windguru';
import { WindyData } from './interfaces/windy';
import { WindReport } from './interfaces/wind-report';

export {
windfinder,
windguru,
customWindguru,
windy,
windReport,
windfinder,
windguru,
customWindguru,
windy,
windReport,

// Expose types
WindfinderData,
WindguruData,
WindyData,
WindReport
}
// Expose types
WindfinderData,
WindguruData,
WindyData,
WindReport
};
148 changes: 74 additions & 74 deletions src/partials/data-parsers/windfinder-parser.ts
Original file line number Diff line number Diff line change
@@ -1,89 +1,89 @@
import WindfinderUtils from '../utils/windfinder-utils'
import WindfinderUtils from '../utils/windfinder-utils';

import { ExtractedWindfinderData, ParsedWindfinderDay, WindfinderData } from '../../interfaces/windfinder'
import { ExtractedWindfinderData, ParsedWindfinderDay, WindfinderData } from '../../interfaces/windfinder';

export default class Windfinder extends WindfinderUtils {
private extractedData!: ExtractedWindfinderData
private parsedData!: WindfinderData
private extractedData!: ExtractedWindfinderData;
private parsedData!: WindfinderData;

constructor (html: string) {
super(html)
constructor(html: string) {
super(html);

return this
}
return this;
}

extract (): this {
const winddirectionDegrees = this.getDataArray(['.directionarrow', '.units-wd-sym'], (el) => {
return parseInt((this.$(el).attr('title') as string).replace('°', ' '))
})
const winddirectionLetters = winddirectionDegrees.map(windDirection => this.getWindDirection(windDirection))
extract(): this {
const winddirectionDegrees = this.getDataArray(['.directionarrow', '.units-wd-sym'], (el) => {
return parseInt((this.$(el).attr('title') as string).replace('°', ' '));
});
const winddirectionLetters = winddirectionDegrees.map(windDirection => this.getWindDirection(windDirection));

this.extractedData = {
name: 'Windfinder',
spot: this.$('#spotheader-spotname').contents().first().text(),
date: this.getDataArray(['h3', '.weathertable__header'], (el) => this.$(el).text().trim()),
time: this.getDataArray<number>(['.value', '.data-time'], (el) => parseInt(this.$(el).text().replace('h', ''))),
windspeed: this.getDataArray<number>(['.units-ws', '.data--major']),
windgust: this.getDataArray<number>(['.units-ws', '.data-gusts']),
winddirectionDegrees,
winddirectionLetters,
temperature: this.getDataArray<number>(['.units-at', '.data-temp']),
wavedirection: this.getDataArray(['.directionarrow', '.units-wad-sym'], (el) => {
return parseInt((this.$(el).attr('title') as string).replace('°', ' '))
}),
waveheight: this.getDataArray(['.units-wh', '.data-waveheight'], (el) => parseFloat(this.$(el).text())),
waveinterval: this.getDataArray<number>(['.data-wavefreq'])
}
this.extractedData = {
name: 'Windfinder',
spot: this.$('#spotheader-spotname').contents().first().text(),
date: this.getDataArray(['h3', '.weathertable__header'], (el) => this.$(el).text().trim()),
time: this.getDataArray<number>(['.value', '.data-time'], (el) => parseInt(this.$(el).text().replace('h', ''))),
windspeed: this.getDataArray<number>(['.units-ws', '.data--major']),
windgust: this.getDataArray<number>(['.units-ws', '.data-gusts']),
winddirectionDegrees,
winddirectionLetters,
temperature: this.getDataArray<number>(['.units-at', '.data-temp']),
wavedirection: this.getDataArray(['.directionarrow', '.units-wad-sym'], (el) => {
return parseInt((this.$(el).attr('title') as string).replace('°', ' '));
}),
waveheight: this.getDataArray(['.units-wh', '.data-waveheight'], (el) => parseFloat(this.$(el).text())),
waveinterval: this.getDataArray<number>(['.data-wavefreq'])
};

return this
}
return this;
}

parse (): this {
this.parsedData = {
name: 'Windfinder',
spot: this.extractedData.spot,
days: this.extractedData.date
.map((_, i) => this.getWindfinderDay(i))
.map(day => {
return {
date: day.date,
hours: day.time.map((hour, i) => {
return {
hour: hour,
windspeed: day.windspeed[i],
windgust: day.windgust[i],
winddirectionDegrees: day.winddirectionDegrees[i],
winddirectionLetters: day.winddirectionLetters[i],
temperature: day.temperature[i],
wavedirection: day.wavedirection[i],
waveheight: day.waveheight[i],
waveinterval: day.waveinterval[i]
}
parse(): this {
this.parsedData = {
name: 'Windfinder',
spot: this.extractedData.spot,
days: this.extractedData.date
.map((_, i) => this.getWindfinderDay(i))
.map(day => {
return {
date: day.date,
hours: day.time.map((hour, i) => {
return {
hour: hour,
windspeed: day.windspeed[i],
windgust: day.windgust[i],
winddirectionDegrees: day.winddirectionDegrees[i],
winddirectionLetters: day.winddirectionLetters[i],
temperature: day.temperature[i],
wavedirection: day.wavedirection[i],
waveheight: day.waveheight[i],
waveinterval: day.waveinterval[i]
};
})
};
})
}
})
}
};

return this
}
return this;
}

get (): WindfinderData {
return this.parsedData
}
get(): WindfinderData {
return this.parsedData;
}

private getWindfinderDay (index: number): ParsedWindfinderDay {
return {
date: this.extractedData.date[index],
time: this.sliceDay(this.extractedData.time, index),
windspeed: this.sliceDay(this.extractedData.windspeed, index),
windgust: this.sliceDay(this.extractedData.windgust, index),
winddirectionDegrees: this.sliceDay(this.extractedData.winddirectionDegrees, index),
winddirectionLetters: this.sliceDay(this.extractedData.winddirectionLetters, index),
temperature: this.sliceDay(this.extractedData.temperature, index),
wavedirection: this.sliceDay(this.extractedData.wavedirection, index),
waveheight: this.sliceDay(this.extractedData.waveheight, index),
waveinterval: this.sliceDay(this.extractedData.waveinterval, index)
}
}
private getWindfinderDay(index: number): ParsedWindfinderDay {
return {
date: this.extractedData.date[index],
time: this.sliceDay(this.extractedData.time, index),
windspeed: this.sliceDay(this.extractedData.windspeed, index),
windgust: this.sliceDay(this.extractedData.windgust, index),
winddirectionDegrees: this.sliceDay(this.extractedData.winddirectionDegrees, index),
winddirectionLetters: this.sliceDay(this.extractedData.winddirectionLetters, index),
temperature: this.sliceDay(this.extractedData.temperature, index),
wavedirection: this.sliceDay(this.extractedData.wavedirection, index),
waveheight: this.sliceDay(this.extractedData.waveheight, index),
waveinterval: this.sliceDay(this.extractedData.waveinterval, index)
};
}

}
54 changes: 27 additions & 27 deletions src/partials/data-parsers/windfinder-report-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,36 @@ import { ExtractedWindReport } from '../../interfaces/wind-report';
import { WindReport } from '../../interfaces/wind-report';

export default class Report {
readonly data: ExtractedWindReport
readonly spot: string
private parsedData!: WindReport
readonly data: ExtractedWindReport;
readonly spot: string;
private parsedData!: WindReport;

constructor (spot: string, data: ExtractedWindReport) {
this.spot = spot
this.data = data
}
constructor(spot: string, data: ExtractedWindReport) {
this.spot = spot;
this.data = data;
}

parse (): this {
const report = this.data.map(datapoint => ({
windspeed: datapoint.ws,
winddirection: datapoint.wd,
time: datapoint.dtl,
...(datapoint.wg && { windgust: datapoint.wg }),
...(datapoint.at && { temperature: datapoint.at }),
...(datapoint.ap && { airPressure: datapoint.ap })
}))
parse(): this {
const report = this.data.map(datapoint => ({
windspeed: datapoint.ws,
winddirection: datapoint.wd,
time: datapoint.dtl,
...(datapoint.wg && { windgust: datapoint.wg }),
...(datapoint.at && { temperature: datapoint.at }),
...(datapoint.ap && { airPressure: datapoint.ap })
}));

this.parsedData = {
name: 'Windfinder report',
spot: this.spot,
report
}

return this
}
this.parsedData = {
name: 'Windfinder report',
spot: this.spot,
report
};

get (): WindReport {
return this.parsedData
}
return this;
}

get(): WindReport {
return this.parsedData;
}

}
Loading
Loading