@sebbo2002/fitness-first-ical-proxy 3.0.0-develop.2 → 3.0.0-develop.3
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.
- package/dist/bin/start.cjs +3 -0
- package/dist/bin/start.cjs.map +1 -0
- package/dist/bin/start.d.ts +0 -1
- package/dist/bin/start.js +1 -40
- package/dist/bin/start.js.map +1 -1
- package/dist/chunk-FYXTGIF4.js +2 -0
- package/dist/chunk-FYXTGIF4.js.map +1 -0
- package/dist/lib/index.cjs +2 -0
- package/dist/lib/index.cjs.map +1 -0
- package/dist/lib/index.d.cts +39 -0
- package/dist/lib/index.d.ts +33 -3
- package/dist/lib/index.js +1 -159
- package/dist/lib/index.js.map +1 -1
- package/package.json +19 -13
- package/dist/lib/types.d.ts +0 -33
- package/dist/lib/types.js +0 -2
- package/dist/lib/types.js.map +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";var b=Object.create;var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var T=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _(e))!R.call(o,s)&&s!==t&&m(o,s,{get:()=>e[s],enumerable:!(r=y(e,s))||r.enumerable});return o};var u=(o,e,t)=>(t=o!=null?b(C(o)):{},T(e||!o||!o.__esModule?m(t,"default",{value:o,enumerable:!0}):t,o));var l=(o,e,t)=>new Promise((r,s)=>{var n=c=>{try{a(t.next(c))}catch(f){s(f)}},i=c=>{try{a(t.throw(c))}catch(f){s(f)}},a=c=>c.done?r(c.value):Promise.resolve(c.value).then(n,i);a((t=t.apply(o,e)).next())});var w=u(require("express"),1);var h=require("https"),g=u(require("ical-generator"),1);var p=class{static request(e){return l(this,null,function*(){let t=yield this.getCourses(e);return this.createCalendar(t)})}static getCourses(e){return l(this,null,function*(){let t="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),r=yield this.miniGet(t);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(r.data.classes).forEach(([s,n])=>{if(s.split("_",2)[1]==="sa"){let i={id:`kinderschwimmen-${s}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(n)?r.data.classes[s]={before_noon:[i]}:(n.before_noon=n.before_noon||[],n.before_noon.push(i))}if(s.split("_",2)[1]==="th"){let i={id:`kinderschwimmen-${s}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(n)?r.data.classes[s]={before_noon:[i]}:(n.before_noon=n.before_noon||[],n.before_noon.push(i))}}),r.data.classes})}static createCalendar(e){let t=(0,g.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([r,s])=>{let n=r.split("_")[0];(Array.isArray(s)?s:Object.values(s)).forEach(i=>{i.forEach(a=>{if(a.is_cancelled)return;let c=new Date(n+"T"+a.time.from+"Z"),f=new Date(n+"T"+a.time.to+"Z");t.createEvent({id:a.id,start:c,end:f,floating:!0,summary:a.title,location:a.club,url:a.url})})})}),t}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(t=>t.toString()).join("-")}static miniGet(e){return l(this,null,function*(){return new Promise((t,r)=>{(0,h.get)(e,s=>{let n=[];s.on("data",i=>{n.push(i)}),s.on("end",()=>{let i=String(Buffer.concat(n));if(s.statusCode!==200){r(new Error("Unable to get data: "+i));return}let a=JSON.parse(i);t(a)})}).on("error",s=>{r(s)})})})}};var d=class{static run(){new d}constructor(){this.app=(0,w.default)(),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}setupRoutes(){this.app.get("/ping",(e,t)=>{t.send("pong")}),this.app.get("/ical",(e,t)=>{p.request(e.query).then(r=>r.serve(t))})}stop(){return l(this,null,function*(){yield new Promise(e=>this.server.close(e)),process.exit()})}};d.run();
|
|
3
|
+
//# sourceMappingURL=start.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bin/start.ts","../../src/lib/index.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, {Express} from 'express';\nimport {Server} from 'http';\nimport FitnessFirstIcalProxy from '../lib/index.js';\n\n\nclass AppServer {\n static run() {\n new AppServer();\n }\n\n private app: Express;\n private server: Server;\n\n constructor() {\n this.app = express();\n\n this.setupRoutes();\n this.server = this.app.listen(process.env.PORT || 8080);\n\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n setupRoutes() {\n this.app.get('/ping', (req, res) => {\n res.send('pong');\n });\n\n this.app.get('/ical', (req, res) => {\n FitnessFirstIcalProxy.request(req.query)\n .then(calendar => calendar.serve(res));\n });\n }\n\n async stop() {\n await new Promise(cb => this.server.close(cb));\n\n process.exit();\n }\n}\n\nAppServer.run();\n","import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["import_express","import_https","import_ical_generator","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","res","data","chunk","text","json","err","AppServer","express","req","res","FitnessFirstIcalProxy","calendar","__async","cb"]}
|
package/dist/bin/start.d.ts
CHANGED
package/dist/bin/start.js
CHANGED
|
@@ -1,42 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
6
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
7
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
8
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
9
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
-
});
|
|
11
|
-
};
|
|
12
|
-
import express from 'express';
|
|
13
|
-
import FitnessFirstIcalProxy from '../lib/index.js';
|
|
14
|
-
class AppServer {
|
|
15
|
-
static run() {
|
|
16
|
-
new AppServer();
|
|
17
|
-
}
|
|
18
|
-
constructor() {
|
|
19
|
-
this.app = express();
|
|
20
|
-
this.setupRoutes();
|
|
21
|
-
this.server = this.app.listen(process.env.PORT || 8080);
|
|
22
|
-
process.on('SIGINT', () => this.stop());
|
|
23
|
-
process.on('SIGTERM', () => this.stop());
|
|
24
|
-
}
|
|
25
|
-
setupRoutes() {
|
|
26
|
-
this.app.get('/ping', (req, res) => {
|
|
27
|
-
res.send('pong');
|
|
28
|
-
});
|
|
29
|
-
this.app.get('/ical', (req, res) => {
|
|
30
|
-
FitnessFirstIcalProxy.request(req.query)
|
|
31
|
-
.then(calendar => calendar.serve(res));
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
stop() {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
yield new Promise(cb => this.server.close(cb));
|
|
37
|
-
process.exit();
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
AppServer.run();
|
|
2
|
+
import{a as r,b as i}from"../chunk-FYXTGIF4.js";import o from"express";var s=class{static run(){new s}constructor(){this.app=o(),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}setupRoutes(){this.app.get("/ping",(e,t)=>{t.send("pong")}),this.app.get("/ical",(e,t)=>{i.request(e.query).then(p=>p.serve(t))})}stop(){return r(this,null,function*(){yield new Promise(e=>this.server.close(e)),process.exit()})}};s.run();
|
|
42
3
|
//# sourceMappingURL=start.js.map
|
package/dist/bin/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/bin/start.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, {Express} from 'express';\nimport {Server} from 'http';\nimport FitnessFirstIcalProxy from '../lib/index.js';\n\n\nclass AppServer {\n static run() {\n new AppServer();\n }\n\n private app: Express;\n private server: Server;\n\n constructor() {\n this.app = express();\n\n this.setupRoutes();\n this.server = this.app.listen(process.env.PORT || 8080);\n\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n setupRoutes() {\n this.app.get('/ping', (req, res) => {\n res.send('pong');\n });\n\n this.app.get('/ical', (req, res) => {\n FitnessFirstIcalProxy.request(req.query)\n .then(calendar => calendar.serve(res));\n });\n }\n\n async stop() {\n await new Promise(cb => this.server.close(cb));\n\n process.exit();\n }\n}\n\nAppServer.run();\n"],"mappings":";gDAGA,OAAOA,MAAwB,UAK/B,IAAMC,EAAN,KAAgB,CACZ,OAAO,KAAM,CACT,IAAIA,CACR,CAKA,aAAc,CACV,KAAK,IAAMC,EAAQ,EAEnB,KAAK,YAAY,EACjB,KAAK,OAAS,KAAK,IAAI,OAAO,QAAQ,IAAI,MAAQ,IAAI,EAEtD,QAAQ,GAAG,SAAU,IAAM,KAAK,KAAK,CAAC,EACtC,QAAQ,GAAG,UAAW,IAAM,KAAK,KAAK,CAAC,CAC3C,CAEA,aAAc,CACV,KAAK,IAAI,IAAI,QAAS,CAACC,EAAKC,IAAQ,CAChCA,EAAI,KAAK,MAAM,CACnB,CAAC,EAED,KAAK,IAAI,IAAI,QAAS,CAACD,EAAKC,IAAQ,CAChCC,EAAsB,QAAQF,EAAI,KAAK,EAClC,KAAKG,GAAYA,EAAS,MAAMF,CAAG,CAAC,CAC7C,CAAC,CACL,CAEM,MAAO,QAAAG,EAAA,sBACT,MAAM,IAAI,QAAQC,GAAM,KAAK,OAAO,MAAMA,CAAE,CAAC,EAE7C,QAAQ,KAAK,CACjB,GACJ,EAEAP,EAAU,IAAI","names":["express","AppServer","express","req","res","FitnessFirstIcalProxy","calendar","__async","cb"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var c=(d,e,n)=>new Promise((a,t)=>{var r=o=>{try{i(n.next(o))}catch(l){t(l)}},s=o=>{try{i(n.throw(o))}catch(l){t(l)}},i=o=>o.done?a(o.value):Promise.resolve(o.value).then(r,s);i((n=n.apply(d,e)).next())});import{get as m}from"https";import u from"ical-generator";var f=class{static request(e){return c(this,null,function*(){let n=yield this.getCourses(e);return this.createCalendar(n)})}static getCourses(e){return c(this,null,function*(){let n="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),a=yield this.miniGet(n);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(a.data.classes).forEach(([t,r])=>{if(t.split("_",2)[1]==="sa"){let s={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(r)?a.data.classes[t]={before_noon:[s]}:(r.before_noon=r.before_noon||[],r.before_noon.push(s))}if(t.split("_",2)[1]==="th"){let s={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(r)?a.data.classes[t]={before_noon:[s]}:(r.before_noon=r.before_noon||[],r.before_noon.push(s))}}),a.data.classes})}static createCalendar(e){let n=u({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([a,t])=>{let r=a.split("_")[0];(Array.isArray(t)?t:Object.values(t)).forEach(s=>{s.forEach(i=>{if(i.is_cancelled)return;let o=new Date(r+"T"+i.time.from+"Z"),l=new Date(r+"T"+i.time.to+"Z");n.createEvent({id:i.id,start:o,end:l,floating:!0,summary:i.title,location:i.club,url:i.url})})})}),n}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(n=>n.toString()).join("-")}static miniGet(e){return c(this,null,function*(){return new Promise((n,a)=>{m(e,t=>{let r=[];t.on("data",s=>{r.push(s)}),t.on("end",()=>{let s=String(Buffer.concat(r));if(t.statusCode!==200){a(new Error("Unable to get data: "+s));return}let i=JSON.parse(s);n(i)})}).on("error",t=>{a(t)})})})}};export{c as a,f as b};
|
|
2
|
+
//# sourceMappingURL=chunk-FYXTGIF4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/index.ts"],"sourcesContent":["import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["get","ical","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","get","res","data","chunk","text","json","err"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var h=Object.create;var f=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var r in e)f(n,r,{get:e[r],enumerable:!0})},u=(n,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of _(e))!y.call(n,t)&&t!==r&&f(n,t,{get:()=>e[t],enumerable:!(i=w(e,t))||i.enumerable});return n};var A=(n,e,r)=>(r=n!=null?h(b(n)):{},u(e||!n||!n.__esModule?f(r,"default",{value:n,enumerable:!0}):r,n)),R=n=>u(f({},"__esModule",{value:!0}),n);var d=(n,e,r)=>new Promise((i,t)=>{var s=l=>{try{o(r.next(l))}catch(c){t(c)}},a=l=>{try{o(r.throw(l))}catch(c){t(c)}},o=l=>l.done?i(l.value):Promise.resolve(l.value).then(s,a);o((r=r.apply(n,e)).next())});var T={};C(T,{default:()=>m});module.exports=R(T);var p=require("https"),g=A(require("ical-generator"),1);var m=class{static request(e){return d(this,null,function*(){let r=yield this.getCourses(e);return this.createCalendar(r)})}static getCourses(e){return d(this,null,function*(){let r="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),i=yield this.miniGet(r);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(i.data.classes).forEach(([t,s])=>{if(t.split("_",2)[1]==="sa"){let a={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(s)?i.data.classes[t]={before_noon:[a]}:(s.before_noon=s.before_noon||[],s.before_noon.push(a))}if(t.split("_",2)[1]==="th"){let a={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(s)?i.data.classes[t]={before_noon:[a]}:(s.before_noon=s.before_noon||[],s.before_noon.push(a))}}),i.data.classes})}static createCalendar(e){let r=(0,g.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([i,t])=>{let s=i.split("_")[0];(Array.isArray(t)?t:Object.values(t)).forEach(a=>{a.forEach(o=>{if(o.is_cancelled)return;let l=new Date(s+"T"+o.time.from+"Z"),c=new Date(s+"T"+o.time.to+"Z");r.createEvent({id:o.id,start:l,end:c,floating:!0,summary:o.title,location:o.club,url:o.url})})})}),r}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(r=>r.toString()).join("-")}static miniGet(e){return d(this,null,function*(){return new Promise((r,i)=>{(0,p.get)(e,t=>{let s=[];t.on("data",a=>{s.push(a)}),t.on("end",()=>{let a=String(Buffer.concat(s));if(t.statusCode!==200){i(new Error("Unable to get data: "+a));return}let o=JSON.parse(a);r(o)})}).on("error",t=>{i(t)})})})}};0&&(module.exports={});
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["lib_exports","__export","FitnessFirstIcalProxy","__toCommonJS","import_https","import_ical_generator","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","res","data","chunk","text","json","err"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ICalCalendar } from 'ical-generator';
|
|
2
|
+
|
|
3
|
+
interface RequestParams {
|
|
4
|
+
club_id?: string | number[] | string[];
|
|
5
|
+
category_id?: string | number[] | string[];
|
|
6
|
+
class_id?: string | number[];
|
|
7
|
+
daytime_id?: string | string[];
|
|
8
|
+
}
|
|
9
|
+
interface ResponseClasses {
|
|
10
|
+
[key: string]: [] | ResponseDay;
|
|
11
|
+
}
|
|
12
|
+
interface ResponseDay {
|
|
13
|
+
[key: string]: ResponseCourse[];
|
|
14
|
+
}
|
|
15
|
+
interface ResponseCourse {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
time: ResponseCourseTime;
|
|
19
|
+
category: string;
|
|
20
|
+
level: string;
|
|
21
|
+
club: string;
|
|
22
|
+
url: string | null;
|
|
23
|
+
is_cancelled: boolean;
|
|
24
|
+
is_changed: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface ResponseCourseTime {
|
|
27
|
+
from: string;
|
|
28
|
+
to: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
declare class FitnessFirstIcalProxy {
|
|
32
|
+
static request(params: RequestParams): Promise<ICalCalendar>;
|
|
33
|
+
static getCourses(params: RequestParams): Promise<ResponseClasses>;
|
|
34
|
+
static createCalendar(courses: ResponseClasses): ICalCalendar;
|
|
35
|
+
static paramToString(value: string | Array<string | number> | undefined): string;
|
|
36
|
+
static miniGet<T>(url: string): Promise<T>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { FitnessFirstIcalProxy as default };
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,9 +1,39 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { ICalCalendar } from 'ical-generator';
|
|
2
|
+
|
|
3
|
+
interface RequestParams {
|
|
4
|
+
club_id?: string | number[] | string[];
|
|
5
|
+
category_id?: string | number[] | string[];
|
|
6
|
+
class_id?: string | number[];
|
|
7
|
+
daytime_id?: string | string[];
|
|
8
|
+
}
|
|
9
|
+
interface ResponseClasses {
|
|
10
|
+
[key: string]: [] | ResponseDay;
|
|
11
|
+
}
|
|
12
|
+
interface ResponseDay {
|
|
13
|
+
[key: string]: ResponseCourse[];
|
|
14
|
+
}
|
|
15
|
+
interface ResponseCourse {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
time: ResponseCourseTime;
|
|
19
|
+
category: string;
|
|
20
|
+
level: string;
|
|
21
|
+
club: string;
|
|
22
|
+
url: string | null;
|
|
23
|
+
is_cancelled: boolean;
|
|
24
|
+
is_changed: boolean;
|
|
25
|
+
}
|
|
26
|
+
interface ResponseCourseTime {
|
|
27
|
+
from: string;
|
|
28
|
+
to: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
declare class FitnessFirstIcalProxy {
|
|
4
32
|
static request(params: RequestParams): Promise<ICalCalendar>;
|
|
5
33
|
static getCourses(params: RequestParams): Promise<ResponseClasses>;
|
|
6
34
|
static createCalendar(courses: ResponseClasses): ICalCalendar;
|
|
7
35
|
static paramToString(value: string | Array<string | number> | undefined): string;
|
|
8
36
|
static miniGet<T>(url: string): Promise<T>;
|
|
9
37
|
}
|
|
38
|
+
|
|
39
|
+
export { FitnessFirstIcalProxy as default };
|
package/dist/lib/index.js
CHANGED
|
@@ -1,160 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { get } from 'https';
|
|
11
|
-
import ical from 'ical-generator';
|
|
12
|
-
export default class FitnessFirstIcalProxy {
|
|
13
|
-
static request(params) {
|
|
14
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
-
const courses = yield this.getCourses(params);
|
|
16
|
-
return this.createCalendar(courses);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
static getCourses(params) {
|
|
20
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
-
const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +
|
|
22
|
-
this.paramToString(params.club_id) + '/' +
|
|
23
|
-
this.paramToString(params.category_id) + '/' +
|
|
24
|
-
this.paramToString(params.class_id) + '/' +
|
|
25
|
-
this.paramToString(params.daytime_id);
|
|
26
|
-
const response = yield this.miniGet(url);
|
|
27
|
-
// Kinderschwimmen @ Gendarmenmarkt
|
|
28
|
-
if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {
|
|
29
|
-
Object.entries(response.data.classes).forEach(([key, classes]) => {
|
|
30
|
-
if (key.split('_', 2)[1] === 'sa') {
|
|
31
|
-
const event = {
|
|
32
|
-
id: `kinderschwimmen-${key}`,
|
|
33
|
-
title: 'Kinderschwimmen',
|
|
34
|
-
time: {
|
|
35
|
-
from: '09:00:00',
|
|
36
|
-
to: '12:15:00'
|
|
37
|
-
},
|
|
38
|
-
category: 'Aqua',
|
|
39
|
-
categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',
|
|
40
|
-
level: 'Alle',
|
|
41
|
-
club: 'Berlin - Gendarmenmarkt',
|
|
42
|
-
url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',
|
|
43
|
-
calendarUrl: null,
|
|
44
|
-
is_cancelled: false,
|
|
45
|
-
is_changed: false
|
|
46
|
-
};
|
|
47
|
-
if (Array.isArray(classes)) {
|
|
48
|
-
response.data.classes[key] = {
|
|
49
|
-
before_noon: [
|
|
50
|
-
event
|
|
51
|
-
]
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
classes.before_noon = classes.before_noon || [];
|
|
56
|
-
classes.before_noon.push(event);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (key.split('_', 2)[1] === 'th') {
|
|
60
|
-
const event = {
|
|
61
|
-
id: `kinderschwimmen-${key}`,
|
|
62
|
-
title: 'Kinderschwimmen',
|
|
63
|
-
time: {
|
|
64
|
-
from: '15:00:00',
|
|
65
|
-
to: '16:30:00'
|
|
66
|
-
},
|
|
67
|
-
category: 'Aqua',
|
|
68
|
-
categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',
|
|
69
|
-
level: 'Alle',
|
|
70
|
-
club: 'Berlin - Gendarmenmarkt',
|
|
71
|
-
url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',
|
|
72
|
-
calendarUrl: null,
|
|
73
|
-
is_cancelled: false,
|
|
74
|
-
is_changed: false
|
|
75
|
-
};
|
|
76
|
-
if (Array.isArray(classes)) {
|
|
77
|
-
response.data.classes[key] = {
|
|
78
|
-
before_noon: [
|
|
79
|
-
event
|
|
80
|
-
]
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
classes.before_noon = classes.before_noon || [];
|
|
85
|
-
classes.before_noon.push(event);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
return response.data.classes;
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
static createCalendar(courses) {
|
|
94
|
-
const cal = ical.default({
|
|
95
|
-
name: 'Fitness First',
|
|
96
|
-
ttl: 60 * 60 * 6,
|
|
97
|
-
prodId: {
|
|
98
|
-
company: 'sebbo.net',
|
|
99
|
-
product: 'fitness-first-ical-proxy'
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
Object.entries(courses).forEach(([key, classes]) => {
|
|
103
|
-
const day = key.split('_')[0];
|
|
104
|
-
(Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {
|
|
105
|
-
courses.forEach((course) => {
|
|
106
|
-
if (course.is_cancelled) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
const start = new Date(day + 'T' + course.time.from + 'Z');
|
|
110
|
-
const end = new Date(day + 'T' + course.time.to + 'Z');
|
|
111
|
-
cal.createEvent({
|
|
112
|
-
id: course.id,
|
|
113
|
-
start,
|
|
114
|
-
end,
|
|
115
|
-
floating: true,
|
|
116
|
-
summary: course.title,
|
|
117
|
-
location: course.club,
|
|
118
|
-
url: course.url
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
return cal;
|
|
124
|
-
}
|
|
125
|
-
static paramToString(value) {
|
|
126
|
-
if (typeof value === 'string') {
|
|
127
|
-
return value;
|
|
128
|
-
}
|
|
129
|
-
if (typeof value === 'undefined' || value.length === 0) {
|
|
130
|
-
return 'all';
|
|
131
|
-
}
|
|
132
|
-
return value
|
|
133
|
-
.map(v => v.toString())
|
|
134
|
-
.join('-');
|
|
135
|
-
}
|
|
136
|
-
static miniGet(url) {
|
|
137
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
138
|
-
return new Promise((resolve, reject) => {
|
|
139
|
-
get(url, res => {
|
|
140
|
-
const data = [];
|
|
141
|
-
res.on('data', chunk => {
|
|
142
|
-
data.push(chunk);
|
|
143
|
-
});
|
|
144
|
-
res.on('end', () => {
|
|
145
|
-
const text = String(Buffer.concat(data));
|
|
146
|
-
if (res.statusCode !== 200) {
|
|
147
|
-
reject(new Error('Unable to get data: ' + text));
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const json = JSON.parse(text);
|
|
151
|
-
resolve(json);
|
|
152
|
-
});
|
|
153
|
-
}).on('error', err => {
|
|
154
|
-
reject(err);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
1
|
+
import{b as a}from"../chunk-FYXTGIF4.js";export{a as default};
|
|
160
2
|
//# sourceMappingURL=index.js.map
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -8,24 +8,24 @@
|
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"express": "^4.18.2",
|
|
11
|
-
"ical-generator": "^
|
|
11
|
+
"ical-generator": "^4.0.0"
|
|
12
12
|
},
|
|
13
13
|
"description": "Small proxy that provides the course schedule from fitnessfirst.de/kurse as an iCal calendar.",
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@qiwi/semantic-release-gh-pages-plugin": "^5.2.5",
|
|
16
|
-
"@sebbo2002/semantic-release-docker": "^
|
|
17
|
-
"@semantic-release/changelog": "^6.0.
|
|
16
|
+
"@sebbo2002/semantic-release-docker": "^3.0.0",
|
|
17
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
18
18
|
"@semantic-release/exec": "^6.0.3",
|
|
19
19
|
"@semantic-release/git": "^10.0.1",
|
|
20
|
-
"@semantic-release/npm": "^
|
|
20
|
+
"@semantic-release/npm": "^10.0.2",
|
|
21
21
|
"@types/express": "^4.17.17",
|
|
22
22
|
"@types/mocha": "^10.0.1",
|
|
23
|
-
"@types/node": "^18.15.
|
|
24
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
25
|
-
"@typescript-eslint/parser": "^5.
|
|
23
|
+
"@types/node": "^18.15.11",
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^5.57.0",
|
|
25
|
+
"@typescript-eslint/parser": "^5.57.0",
|
|
26
26
|
"c8": "^7.13.0",
|
|
27
|
-
"eslint": "^8.
|
|
28
|
-
"eslint-plugin-jsonc": "^2.
|
|
27
|
+
"eslint": "^8.37.0",
|
|
28
|
+
"eslint-plugin-jsonc": "^2.7.0",
|
|
29
29
|
"esm": "^3.2.25",
|
|
30
30
|
"license-checker": "^25.0.1",
|
|
31
31
|
"mocha": "^10.2.0",
|
|
@@ -34,25 +34,31 @@
|
|
|
34
34
|
"semantic-release-license": "^1.0.3",
|
|
35
35
|
"source-map-support": "^0.5.21",
|
|
36
36
|
"ts-node": "^10.9.1",
|
|
37
|
+
"tsup": "^6.7.0",
|
|
37
38
|
"typedoc": "^0.23.26",
|
|
38
|
-
"typescript": "^
|
|
39
|
+
"typescript": "^5.0.3"
|
|
39
40
|
},
|
|
40
41
|
"engines": {
|
|
41
42
|
"node": "^14.8.0 || >=16.0.0"
|
|
42
43
|
},
|
|
43
|
-
"exports":
|
|
44
|
+
"exports": {
|
|
45
|
+
"import": "./dist/lib/index.js",
|
|
46
|
+
"require": "./dist/lib/index.cjs"
|
|
47
|
+
},
|
|
44
48
|
"files": [
|
|
45
49
|
"/dist"
|
|
46
50
|
],
|
|
47
51
|
"homepage": "https://github.com/sebbo2002/fitness-first-ical-proxy#readme",
|
|
48
52
|
"license": "MIT",
|
|
53
|
+
"main": "./dist/lib/index.cjs",
|
|
54
|
+
"module": "./dist/lib/index.js",
|
|
49
55
|
"name": "@sebbo2002/fitness-first-ical-proxy",
|
|
50
56
|
"repository": {
|
|
51
57
|
"type": "git",
|
|
52
58
|
"url": "git+https://github.com/sebbo2002/fitness-first-ical-proxy.git"
|
|
53
59
|
},
|
|
54
60
|
"scripts": {
|
|
55
|
-
"build": "
|
|
61
|
+
"build": "tsup && cp ./dist/lib/index.d.ts ./dist/lib/index.d.cts",
|
|
56
62
|
"build-all": "./.github/workflows/build.sh",
|
|
57
63
|
"coverage": "c8 mocha",
|
|
58
64
|
"develop": "ts-node ./src/bin/start.ts",
|
|
@@ -62,5 +68,5 @@
|
|
|
62
68
|
"test": "mocha"
|
|
63
69
|
},
|
|
64
70
|
"type": "module",
|
|
65
|
-
"version": "3.0.0-develop.
|
|
71
|
+
"version": "3.0.0-develop.3"
|
|
66
72
|
}
|
package/dist/lib/types.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
export interface RequestParams {
|
|
2
|
-
club_id?: string | number[] | string[];
|
|
3
|
-
category_id?: string | number[] | string[];
|
|
4
|
-
class_id?: string | number[];
|
|
5
|
-
daytime_id?: string | string[];
|
|
6
|
-
}
|
|
7
|
-
export interface Response {
|
|
8
|
-
data: ResponseData;
|
|
9
|
-
}
|
|
10
|
-
export interface ResponseData {
|
|
11
|
-
classes: ResponseClasses;
|
|
12
|
-
}
|
|
13
|
-
export interface ResponseClasses {
|
|
14
|
-
[key: string]: [] | ResponseDay;
|
|
15
|
-
}
|
|
16
|
-
export interface ResponseDay {
|
|
17
|
-
[key: string]: ResponseCourse[];
|
|
18
|
-
}
|
|
19
|
-
export interface ResponseCourse {
|
|
20
|
-
id: string;
|
|
21
|
-
title: string;
|
|
22
|
-
time: ResponseCourseTime;
|
|
23
|
-
category: string;
|
|
24
|
-
level: string;
|
|
25
|
-
club: string;
|
|
26
|
-
url: string | null;
|
|
27
|
-
is_cancelled: boolean;
|
|
28
|
-
is_changed: boolean;
|
|
29
|
-
}
|
|
30
|
-
export interface ResponseCourseTime {
|
|
31
|
-
from: string;
|
|
32
|
-
to: string;
|
|
33
|
-
}
|
package/dist/lib/types.js
DELETED
package/dist/lib/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
|