@powercalc/power-router 1.0.52 → 1.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/controllers/LoadAndParse.d.ts +10 -0
  2. package/dist/controllers/LoadAndParse.js +54 -0
  3. package/dist/controllers/LoadAndParse.js.map +1 -0
  4. package/dist/controllers/Router.d.ts +7 -0
  5. package/dist/controllers/Router.js +103 -0
  6. package/dist/controllers/Router.js.map +1 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +2 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/interfaces/config.d.ts +5 -0
  11. package/dist/interfaces/config.js +2 -0
  12. package/dist/interfaces/config.js.map +1 -0
  13. package/dist/interfaces/entsoe.d.ts +50 -0
  14. package/dist/interfaces/entsoe.js +2 -0
  15. package/dist/interfaces/entsoe.js.map +1 -0
  16. package/dist/interfaces/queryoptions.d.ts +15 -0
  17. package/dist/interfaces/queryoptions.js +13 -0
  18. package/dist/interfaces/queryoptions.js.map +1 -0
  19. package/dist/interfaces/types.d.ts +12 -0
  20. package/dist/interfaces/types.js +2 -0
  21. package/dist/interfaces/types.js.map +1 -0
  22. package/dist/services/CommonTimestamps.d.ts +15 -0
  23. package/dist/services/CommonTimestamps.js +173 -0
  24. package/dist/services/CommonTimestamps.js.map +1 -0
  25. package/dist/services/Eurostat.d.ts +10 -0
  26. package/dist/services/Eurostat.js +65 -0
  27. package/dist/services/Eurostat.js.map +1 -0
  28. package/dist/services/LoadService.d.ts +27 -0
  29. package/dist/services/LoadService.js +79 -0
  30. package/dist/services/LoadService.js.map +1 -0
  31. package/dist/services/Loader.d.ts +38 -0
  32. package/dist/services/Loader.js +116 -0
  33. package/dist/services/Loader.js.map +1 -0
  34. package/dist/services/ParseEdifact.d.ts +28 -0
  35. package/dist/services/ParseEdifact.js +155 -0
  36. package/dist/services/ParseEdifact.js.map +1 -0
  37. package/dist/services/ParseInstalled.d.ts +9 -0
  38. package/dist/services/ParseInstalled.js +42 -0
  39. package/dist/services/ParseInstalled.js.map +1 -0
  40. package/dist/services/batch/maxHydrofill.d.ts +10 -0
  41. package/dist/services/batch/maxHydrofill.js +62 -0
  42. package/dist/services/batch/maxHydrofill.js.map +1 -0
  43. package/package.json +8 -8
  44. package/dist-build/index.js +0 -6
@@ -0,0 +1,10 @@
1
+ import { Request } from 'express';
2
+ import { LoadService } from '../services/LoadService';
3
+ import { Config } from '../interfaces/config';
4
+ export declare class LoadAndParse {
5
+ country: string;
6
+ private countries;
7
+ loadService: LoadService;
8
+ constructor(config: Config);
9
+ get(req: Request, chartType: string): Promise<any>;
10
+ }
@@ -0,0 +1,54 @@
1
+ import { join } from 'path';
2
+ import { readFileSync } from 'fs';
3
+ import { LoadService } from '../services/LoadService';
4
+ import { Format, PosNeg } from '../interfaces/queryoptions';
5
+ export class LoadAndParse {
6
+ constructor(config) {
7
+ this.country = '';
8
+ const countriesFile = join(__dirname, '../config/countries.json'); // Set the path to your config file
9
+ this.countries = JSON.parse(readFileSync(countriesFile, 'utf8')); // Read the config file from disk
10
+ this.loadService = new LoadService(config);
11
+ }
12
+ async get(req, chartType) {
13
+ var _a;
14
+ const country = req.params.country;
15
+ if (this.country !== country) {
16
+ //console.log(`=========== ${country} =============`)
17
+ this.country = country;
18
+ }
19
+ const queryOptions = {};
20
+ const year = parseInt(req.params.year);
21
+ const month = parseInt(req.params.month);
22
+ if (req.query.posneg === PosNeg.POS || req.query.posneg === PosNeg.NEG) {
23
+ queryOptions.posneg = req.query.posneg;
24
+ }
25
+ if (typeof (req.query.format) === 'string' && Object.values(Format).includes(req.query.format)) {
26
+ queryOptions.format = req.query.format;
27
+ }
28
+ let reload = false;
29
+ if (typeof (req.headers.reload) === 'string') {
30
+ reload = true;
31
+ queryOptions.reload = true;
32
+ }
33
+ const countryCode = (_a = this.countries.find(item => item.name === country)) === null || _a === void 0 ? void 0 : _a.code;
34
+ if (!countryCode) {
35
+ throw new Error('Unknown country ' + country);
36
+ }
37
+ if (chartType === 'installed') {
38
+ return await this.loadService.getInstalled(countryCode, reload);
39
+ }
40
+ if (chartType === 'power') {
41
+ return await this.loadService.getPower(countryCode, year, month, queryOptions);
42
+ }
43
+ if (chartType === 'hydrofill') {
44
+ return await this.loadService.getHydrofill(countryCode, reload);
45
+ }
46
+ if (chartType === 'fossil') {
47
+ return await this.loadService.getFossil(countryCode);
48
+ }
49
+ if (chartType === 'countrydata') {
50
+ return await this.loadService.getCountrydata(countryCode, reload);
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=LoadAndParse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadAndParse.js","sourceRoot":"","sources":["../../src/router/controllers/LoadAndParse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Router, Request, Response } from 'express';
2
+ import { Config } from '../interfaces/config';
3
+ export declare class PowerRouter {
4
+ static init(config: Config): Router;
5
+ static load(config: Config, req: Request, res: Response, type: string): Promise<void>;
6
+ static calcCacheTime(req: Request): number;
7
+ }
@@ -0,0 +1,103 @@
1
+ import { Router } from 'express';
2
+ import { createHash } from 'crypto';
3
+ import { stat, writeFile } from 'fs/promises';
4
+ import { gzipSync } from 'zlib';
5
+ import { Buffer } from 'node:buffer';
6
+ import { createReadStream } from 'fs';
7
+ import { LoadAndParse } from './LoadAndParse';
8
+ import { join } from 'path';
9
+ export class PowerRouter {
10
+ static init(config) {
11
+ console.log('init', config);
12
+ const router = Router();
13
+ router.get(`/:country/:year/:month`, async (req, res) => {
14
+ await this.load(config, req, res, 'power');
15
+ });
16
+ router.get(`/:country/fossil`, async (req, res) => {
17
+ await this.load(config, req, res, 'fossil');
18
+ });
19
+ router.get(`/:country/installed`, async (req, res) => {
20
+ await this.load(config, req, res, 'installed');
21
+ });
22
+ router.get(`/:country/hydrofill`, async (req, res) => {
23
+ await this.load(config, req, res, 'hydrofill');
24
+ });
25
+ router.get(`/:country/countrydata`, async (req, res) => {
26
+ await this.load(config, req, res, 'countrydata');
27
+ });
28
+ router.get('/types', async (req, res) => {
29
+ const filePath = join(__dirname, '..', 'config', 'types.json');
30
+ res.set({ 'Cache-Control': 'max-age=86400' });
31
+ res.sendFile(filePath);
32
+ });
33
+ router.get('/countries', async (req, res) => {
34
+ const filePath = join(__dirname, '..', 'config', 'countrydata.json');
35
+ res.set({ 'Cache-Control': 'max-age=86400' });
36
+ res.sendFile(filePath);
37
+ });
38
+ return router;
39
+ }
40
+ static async load(config, req, res, type) {
41
+ const entsoeLoader = new LoadAndParse(config);
42
+ const cacheTime = this.calcCacheTime(req);
43
+ const successHeaders = {
44
+ 'Cache-Control': `public, max-age=${cacheTime}`,
45
+ 'Content-Encoding': 'gzip',
46
+ 'Content-Type': 'application/json'
47
+ };
48
+ try {
49
+ let cacheData;
50
+ const cacheKey = req.url;
51
+ const cacheFilePath = `${config.cacheDir}/json.gz/${createHash('md5').update(cacheKey).digest('hex')}.json.gz`;
52
+ if (!(req.headers['reload'] === 'full')) {
53
+ // check if there is a cache file for this request
54
+ try {
55
+ const stats = await stat(cacheFilePath);
56
+ const modtime = stats.mtime.getTime();
57
+ // Check if the If-Modified-Since header matches the last modified date
58
+ const ifModifiedSince = req.headers['if-modified-since'];
59
+ if (ifModifiedSince && (modtime - new Date(ifModifiedSince).getTime()) < 5000) {
60
+ res.status(304).end();
61
+ return;
62
+ }
63
+ res.setHeader('Last-Modified', (new Date(modtime)).toUTCString());
64
+ res.set(successHeaders);
65
+ // console.log('cached')
66
+ createReadStream(cacheFilePath)
67
+ .pipe(res);
68
+ return;
69
+ }
70
+ catch (err) {
71
+ // no cache file found, continue with request
72
+ }
73
+ }
74
+ // if no cache hit, load data and store in cache
75
+ if (!cacheData) {
76
+ // LOAD THE DATA FROM SOURCE
77
+ const body = await entsoeLoader.get(req, type);
78
+ const buf = Buffer.from(JSON.stringify(body), 'utf-8');
79
+ const cacheDataBuffer = gzipSync(buf);
80
+ //await mkdir(basename(cacheFilePath), {recursive:true});
81
+ await writeFile(cacheFilePath, cacheDataBuffer, 'utf-8');
82
+ res.setHeader('Last-Modified', (new Date()).toUTCString());
83
+ res.set(successHeaders);
84
+ res.send(cacheDataBuffer);
85
+ }
86
+ }
87
+ catch (e) {
88
+ console.log(e);
89
+ }
90
+ }
91
+ static calcCacheTime(req) {
92
+ const reqMonth = `${req.params.year} ${req.params.month}`;
93
+ const now = new Date();
94
+ const nowMonth = `${now.getFullYear()} ${now.getMonth() + 1}`;
95
+ if (reqMonth === nowMonth) {
96
+ return 5 * 60;
97
+ }
98
+ else {
99
+ return 3600 * 7;
100
+ }
101
+ }
102
+ }
103
+ //# sourceMappingURL=Router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.js","sourceRoot":"","sources":["../../src/router/controllers/Router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { PowerRouter } from './controllers/Router';
2
+ export { Config } from './interfaces/config';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { PowerRouter } from './controllers/Router';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/router/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface Config {
2
+ securityToken: string;
3
+ cacheDir: string;
4
+ entsoeDomain: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/router/interfaces/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ export interface Entsoe {
2
+ GL_MarketDocument?: EntsoeDocument;
3
+ Publication_MarketDocument?: EntsoeDocument;
4
+ Acknowledgement_MarketDocument?: ErrorDocument;
5
+ }
6
+ export interface EntsoeDocument {
7
+ TimeSeries: TimeSeries[];
8
+ 'period.timeInterval'?: TimeInterval[];
9
+ 'time_Period.timeInterval'?: TimeInterval[];
10
+ type?: string[];
11
+ }
12
+ export interface TimeSeries {
13
+ Period: EntsoePeriod[];
14
+ MktPSRType?: MktPSRType[];
15
+ 'outBiddingZone_Domain.mRID': string;
16
+ }
17
+ export interface EntsoePeriod {
18
+ Point: EntsoePoint[];
19
+ resolution: string;
20
+ timeInterval: TimeInterval[];
21
+ }
22
+ interface TimeInterval {
23
+ start: string[];
24
+ end: string[];
25
+ }
26
+ export interface MktPSRType {
27
+ psrType?: string[];
28
+ PowerSystemResources?: PowerSystemResource[];
29
+ }
30
+ export interface EntsoePoint {
31
+ position: string[];
32
+ quantity?: string[];
33
+ 'price.amount'?: string[];
34
+ }
35
+ export interface PowerSystemResource {
36
+ mRID: mRID[];
37
+ name: string[];
38
+ }
39
+ export interface mRID {
40
+ _: string;
41
+ }
42
+ export interface ErrorDocument {
43
+ mRID: string;
44
+ Reason: Reason[];
45
+ }
46
+ interface Reason {
47
+ code: string[];
48
+ text: string[];
49
+ }
50
+ export {};
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entsoe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entsoe.js","sourceRoot":"","sources":["../../src/router/interfaces/entsoe.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export interface QueryOptions {
2
+ reload?: boolean;
3
+ format?: Format;
4
+ posneg?: PosNeg;
5
+ }
6
+ export declare enum Format {
7
+ EDIFACT = "edifact",
8
+ EDIJSON = "edijson",
9
+ SOURCES = "sources",
10
+ KEYVALUE = "keyvalue"
11
+ }
12
+ export declare enum PosNeg {
13
+ POS = "pos",
14
+ NEG = "neg"
15
+ }
@@ -0,0 +1,13 @@
1
+ export var Format;
2
+ (function (Format) {
3
+ Format["EDIFACT"] = "edifact";
4
+ Format["EDIJSON"] = "edijson";
5
+ Format["SOURCES"] = "sources";
6
+ Format["KEYVALUE"] = "keyvalue";
7
+ })(Format || (Format = {}));
8
+ export var PosNeg;
9
+ (function (PosNeg) {
10
+ PosNeg["POS"] = "pos";
11
+ PosNeg["NEG"] = "neg";
12
+ })(PosNeg || (PosNeg = {}));
13
+ //# sourceMappingURL=queryoptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryoptions.js","sourceRoot":"","sources":["../../src/router/interfaces/queryoptions.ts"],"names":[],"mappings":"AAMA,MAAM,CAAN,IAAY,MAKX;AALD,WAAY,MAAM;IACd,6BAAmB,CAAA;IACnB,6BAAmB,CAAA;IACnB,6BAAmB,CAAA;IACnB,+BAAqB,CAAA;AACzB,CAAC,EALW,MAAM,KAAN,MAAM,QAKjB;AACD,MAAM,CAAN,IAAY,MAGX;AAHD,WAAY,MAAM;IACd,qBAAW,CAAA;IACX,qBAAW,CAAA;AACf,CAAC,EAHW,MAAM,KAAN,MAAM,QAGjB"}
@@ -0,0 +1,12 @@
1
+ export interface Types {
2
+ [key: string]: Type;
3
+ }
4
+ export interface Type {
5
+ name: string;
6
+ psrType: string;
7
+ co2Footprint: number;
8
+ color: string;
9
+ abbr: string;
10
+ yAxis: string;
11
+ stack: string;
12
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/router/interfaces/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { AllInResulotions, DataPoint, DataPointResolutions } from "./ParseEdifact";
2
+ export interface Result {
3
+ [key: string]: (number | null)[];
4
+ }
5
+ export declare class CommonTimestamps {
6
+ static transform(all: AllInResulotions, startMonth: string, endMonth: string): Result;
7
+ static makeCommonTimeBase(all: DataPointResolutions, newTimes: number[], best: string): (number | null)[] | undefined;
8
+ static shouldMerge(all: DataPointResolutions): boolean;
9
+ static interpolate(all: DataPointResolutions, newTimes: number[]): (number | null)[] | undefined;
10
+ private static findTime;
11
+ static makeNumbers(all: DataPoint[], newTimes: number[]): (number | null)[];
12
+ static makeTimeArray(startIsoString: string, endIsoString: string, resolution: string): number[];
13
+ static best(all: any): string;
14
+ static bestResolution(all: any): string;
15
+ }
@@ -0,0 +1,173 @@
1
+ import { DateTime, Duration } from "luxon";
2
+ export class CommonTimestamps {
3
+ static transform(all, startMonth, endMonth) {
4
+ const best = this.bestResolution(all);
5
+ const time = this.makeTimeArray(startMonth, endMonth, best);
6
+ const result = {
7
+ time: time,
8
+ };
9
+ Object.keys(all).forEach((key) => {
10
+ const item = all[key];
11
+ const interpolated = this.makeCommonTimeBase(item, time, best);
12
+ if (interpolated) {
13
+ result[key] = interpolated;
14
+ }
15
+ if (key === "price") {
16
+ if (item["PT15M"] && item["PT60M"]) {
17
+ result["price15m"] = result['price'];
18
+ delete item['PT15M'];
19
+ const price60 = this.makeCommonTimeBase(item, time, best);
20
+ if (price60) {
21
+ result['price'] = price60;
22
+ }
23
+ }
24
+ }
25
+ });
26
+ // console.log(Object.keys(result))
27
+ return result;
28
+ }
29
+ static makeCommonTimeBase(all, newTimes, best) {
30
+ const haveToMerge = this.shouldMerge(all);
31
+ if (haveToMerge) {
32
+ const all2 = {};
33
+ all2[best] = [];
34
+ const keys = Object.keys(all);
35
+ keys.forEach((key) => {
36
+ all2[best] = all2[best].concat(all[key]);
37
+ });
38
+ all2[best] = all2[best].sort((a, b) => a.time - b.time);
39
+ return this.interpolate(all2, newTimes);
40
+ }
41
+ const data = all[best];
42
+ if (data) {
43
+ return this.makeNumbers(data, newTimes);
44
+ }
45
+ else {
46
+ return this.interpolate(all, newTimes);
47
+ }
48
+ }
49
+ static shouldMerge(all) {
50
+ let start = 0;
51
+ let end = 0;
52
+ const keys = Object.keys(all);
53
+ if (keys.length < 2) {
54
+ return false;
55
+ }
56
+ let shouldMerge = true;
57
+ keys.forEach((key) => {
58
+ const times = all[key].map((item) => item.time);
59
+ if (start && end && start > times[0] && end < times[times.length - 1]) {
60
+ shouldMerge = false;
61
+ }
62
+ start = times[0];
63
+ end = times[times.length - 1];
64
+ });
65
+ return shouldMerge;
66
+ }
67
+ static interpolate(all, newTimes) {
68
+ const best = this.best(all);
69
+ const dur = Duration.fromISO(best).as("milliseconds");
70
+ const data = all[best];
71
+ const sourceTimes = data.map((item) => item.time);
72
+ const result = new Array(newTimes.length);
73
+ newTimes.forEach((time, i) => {
74
+ if (time > data[data.length - 1].time) {
75
+ return true; //break
76
+ }
77
+ const lohi = this.findTime(sourceTimes, time);
78
+ const lo = data[lohi[0]];
79
+ const hi = data[lohi[1]];
80
+ const delta = hi.value - lo.value;
81
+ const timeDelta = hi.time - lo.time;
82
+ const timeFactor = (time - lo.time) / timeDelta;
83
+ if (timeDelta > 3600000 && dur * 1.5 < timeDelta) {
84
+ // interpolate everything that's smaller than 61 minutes
85
+ result[i] = null;
86
+ }
87
+ else {
88
+ result[i] = lo.value + delta * timeFactor;
89
+ }
90
+ });
91
+ return result;
92
+ }
93
+ static findTime(arr, num) {
94
+ let lo = 0;
95
+ let hi = arr.length - 1;
96
+ if (arr.length === 1) {
97
+ return [0, 0];
98
+ }
99
+ if (arr[lo] > num) {
100
+ return [lo, lo + 1];
101
+ }
102
+ if (arr[hi] < num) {
103
+ return [hi - 1, hi];
104
+ }
105
+ while (hi - lo > 1) {
106
+ const mid = Math.trunc((lo + hi) / 2);
107
+ if (arr[mid] < num) {
108
+ lo = mid;
109
+ }
110
+ else {
111
+ hi = mid;
112
+ }
113
+ }
114
+ return [lo, hi];
115
+ }
116
+ static makeNumbers(all, newTimes) {
117
+ const result = [];
118
+ newTimes.forEach((time) => {
119
+ var _a;
120
+ const num = ((_a = all.find((item) => item.time === time)) === null || _a === void 0 ? void 0 : _a.value) || null;
121
+ result.push(num);
122
+ });
123
+ return result;
124
+ }
125
+ static makeTimeArray(startIsoString, endIsoString, resolution) {
126
+ const duration = Duration.fromISO(resolution).toMillis();
127
+ const localStartTime = DateTime.fromISO(startIsoString);
128
+ const localEndTime = DateTime.fromISO(endIsoString);
129
+ // Convert start and end time to UTC time using Luxon
130
+ const utcStartTime = localStartTime.toUTC();
131
+ const utcEndTime = localEndTime.toUTC();
132
+ // Calculate time distance in milliseconds
133
+ const timeDistance = utcEndTime.toMillis() - utcStartTime.toMillis();
134
+ // Create an array with time distance duration in UTC time using Luxon
135
+ const timeSteps = [];
136
+ for (let i = 0; i <= timeDistance; i += duration) {
137
+ const dur = utcStartTime.plus({ milliseconds: i });
138
+ timeSteps.push(dur.toUnixInteger() * 1000);
139
+ }
140
+ if (timeSteps.length > 1) {
141
+ timeSteps.pop();
142
+ }
143
+ return timeSteps;
144
+ }
145
+ static best(all) {
146
+ let min = Infinity;
147
+ let minPeriod = "";
148
+ const keys = Object.keys(all);
149
+ keys.forEach((period) => {
150
+ const dur = Duration.fromISO(period);
151
+ if (dur.as("minutes") < min) {
152
+ min = dur.as("minutes");
153
+ minPeriod = period;
154
+ }
155
+ });
156
+ return minPeriod;
157
+ }
158
+ static bestResolution(all) {
159
+ let min = Infinity;
160
+ let minPeriod = "";
161
+ Object.keys(all).forEach((key) => {
162
+ Object.keys(all[key]).forEach((period) => {
163
+ const dur = Duration.fromISO(period);
164
+ if (dur.as("minutes") < min) {
165
+ min = dur.as("minutes");
166
+ minPeriod = period;
167
+ }
168
+ });
169
+ });
170
+ return minPeriod;
171
+ }
172
+ }
173
+ //# sourceMappingURL=CommonTimestamps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonTimestamps.js","sourceRoot":"","sources":["../../src/router/services/CommonTimestamps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAW3C,MAAM,OAAO,gBAAgB;IAC3B,MAAM,CAAC,SAAS,CACd,GAAqB,EACrB,UAAkB,EAClB,QAAgB;QAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAW;YACrB,IAAI,EAAE,IAAI;SACX,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/D,IAAI,YAAY,EAAE;gBAChB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;aAC5B;YACD,IAAI,GAAG,KAAK,OAAO,EAAE;gBACnB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;oBAClC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;oBACrC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;oBACrB,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC1D,IAAI,OAAO,EAAE;wBACX,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;qBAC3B;iBACF;aACF;QACH,CAAC,CAAC,CAAC;QACH,mCAAmC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,kBAAkB,CACvB,GAAyB,EACzB,QAAkB,EAClB,IAAY;QAEZ,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,WAAW,EAAE;YACf,MAAM,IAAI,GAAyB,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;SACzC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;SACzC;aAAM;YACL,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;SACxC;IACH,CAAC;IACD,MAAM,CAAC,WAAW,CAAC,GAAyB;QAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,WAAW,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;gBACrE,WAAW,GAAG,KAAK,CAAC;aACrB;YACD,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,CAAC,WAAW,CAChB,GAAyB,EACzB,QAAkB;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,IAAI,GAAgB,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE1C,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;gBACrC,OAAO,IAAI,CAAC,CAAC,OAAO;aACrB;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;YAClC,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;YACpC,MAAM,UAAU,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YAChD,IAAI,SAAS,GAAG,OAAO,IAAI,GAAG,GAAG,GAAG,GAAG,SAAS,EAAE;gBAChD,wDAAwD;gBACxD,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;aAClB;iBAAM;gBACL,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;aAC3C;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,QAAQ,CAAC,GAAa,EAAE,GAAW;QAChD,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACpB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACf;QACD,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE;YACjB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;SACrB;QACD,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE;YACjB,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;SACrB;QACD,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;gBAClB,EAAE,GAAG,GAAG,CAAC;aACV;iBAAM;gBACL,EAAE,GAAG,GAAG,CAAC;aACV;SACF;QACD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,WAAW,CAAC,GAAgB,EAAE,QAAkB;QACrD,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;;YACxB,MAAM,GAAG,GAAG,CAAA,MAAA,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,0CAAE,KAAK,KAAI,IAAI,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,aAAa,CAClB,cAAsB,EACtB,YAAoB,EACpB,UAAkB;QAElB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAEpD,qDAAqD;QACrD,MAAM,YAAY,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC;QAExC,0CAA0C;QAC1C,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACrE,sEAAsE;QACtE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,IAAI,QAAQ,EAAE;YAChD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;SAC5C;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,SAAS,CAAC,GAAG,EAAE,CAAC;SACjB;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAQ;QAClB,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE;gBAC3B,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;gBACxB,SAAS,GAAG,MAAM,CAAC;aACpB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,cAAc,CAAC,GAAQ;QAC5B,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE;oBAC3B,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;oBACxB,SAAS,GAAG,MAAM,CAAC;iBACpB;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import { Country } from "./Loader";
2
+ export declare class EurostatAPI {
3
+ countries: Country[];
4
+ constructor();
5
+ private fuels;
6
+ private energyConversionFactors;
7
+ convertToMWh(value: number, unit: string): number;
8
+ private fetchData;
9
+ load(countryCode: string): Promise<any>;
10
+ }
@@ -0,0 +1,65 @@
1
+ import { readFileSync } from "fs";
2
+ import { join } from "path";
3
+ process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = '0';
4
+ export class EurostatAPI {
5
+ constructor() {
6
+ this.countries = [];
7
+ this.fuels = {
8
+ gas: { chartType: 'NRG_CB_GASM', siec: 'G3000', nrg_bal: 'IC_OBS', unit: 'TJ_GCV', freq: 'M' },
9
+ gas4electricity: { chartType: 'NRG_CB_GASM', siec: 'G3000', nrg_bal: 'TI_EHG_MAP', unit: 'TJ_GCV', freq: 'M' },
10
+ gasoline: { chartType: 'NRG_CB_OILM', siec: 'O4652', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' },
11
+ diesel: { chartType: 'NRG_CB_OILM', siec: 'O46711', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' },
12
+ kerosin: { chartType: 'NRG_CB_OILM', siec: 'O4661', nrg_bal: 'GID_OBS', unit: 'THS_T', freq: 'M' }
13
+ };
14
+ this.energyConversionFactors = new Map([
15
+ ['KG_EQ', 12988.48],
16
+ ['TJ_GCV', 10 ** 12],
17
+ ['THS_T', 41868000000000], // joules per thousand metric tons of oil equivalent
18
+ ]);
19
+ const countryPath = join(__dirname, '..', 'config/countries.json');
20
+ const countriesString = readFileSync(countryPath, 'utf-8');
21
+ this.countries = JSON.parse(countriesString);
22
+ }
23
+ convertToMWh(value, unit) {
24
+ const MWh = value * (this.energyConversionFactors.get(unit) || 0) / 3600 / 10 ** 6;
25
+ return Math.round(MWh);
26
+ }
27
+ async fetchData(url, type, unit) {
28
+ const response = await fetch(url);
29
+ const data = await response.json();
30
+ try {
31
+ const time = Object.keys(data.dimension.time.category.index);
32
+ return {
33
+ time: time.map(item => new Date(item).getTime()),
34
+ [type]: Object.values(data.value).map((item) => this.convertToMWh(item, unit))
35
+ };
36
+ }
37
+ catch (e) {
38
+ return {
39
+ [type]: [],
40
+ time: []
41
+ };
42
+ }
43
+ }
44
+ async load(countryCode) {
45
+ var _a;
46
+ const countryShort = (_a = this.countries.find(item => item.code === countryCode)) === null || _a === void 0 ? void 0 : _a.short;
47
+ const baseUrl = 'https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/data/';
48
+ const geo = `.${countryShort}`;
49
+ const promises = [];
50
+ for (const [type, fuel] of Object.entries(this.fuels)) {
51
+ const { chartType, siec, nrg_bal, unit, freq } = fuel;
52
+ const select = `${chartType}/${freq}.${nrg_bal}.${siec}.${unit}`;
53
+ const rest = `?format=JSON&lang=en&startPeriod=2015-01&endPeriod=2050-12`;
54
+ const url = `${baseUrl}${select}${geo}${rest}`;
55
+ promises.push(this.fetchData(url, type, unit));
56
+ }
57
+ const res = await Promise.all(promises);
58
+ let merged = {};
59
+ res.forEach(item => {
60
+ merged = { ...merged, ...item };
61
+ });
62
+ return merged; // this.removeElGas(merged);
63
+ }
64
+ }
65
+ //# sourceMappingURL=Eurostat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Eurostat.js","sourceRoot":"","sources":["../../src/router/services/Eurostat.ts"],"names":[],"mappings":"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"}