@sebbo2002/fitness-first-ical-proxy 6.0.5-develop.9 → 7.0.0-develop.1

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/README.md CHANGED
@@ -4,10 +4,9 @@
4
4
 
5
5
  Small proxy that provides the course schedule from fitnessfirst.de/kurse as an iCal calendar. Using the filters that are also available on the website, the schedule can also be filtered, for example, to deliver only all aqua courses.
6
6
 
7
-
8
7
  ## 📦 Installation
9
8
 
10
- npm i -g @sebbo2002/fitness-fitst-ical-proxy
9
+ npm i -g @sebbo2002/fitness-fitst-ical-proxy
11
10
  fitness-first-ical-proxy
12
11
 
13
12
  ## 📑 Example
@@ -16,7 +15,6 @@ Small proxy that provides the course schedule from fitnessfirst.de/kurse as an i
16
15
  http://localhost:8080/ical?club_id=0024&category_id=436
17
16
  ```
18
17
 
19
-
20
18
  ## 🙆🏼‍♂️ Copyright and license
21
19
 
22
20
  Copyright (c) Sebastian Pekarek under the [MIT license](LICENSE).
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var g=Object.create;var m=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var _=(s,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!C.call(s,r)&&r!==t&&m(s,r,{get:()=>e[r],enumerable:!(a=w(e,r))||a.enumerable});return s};var l=(s,e,t)=>(t=s!=null?g(b(s)):{},_(e||!s||!s.__esModule?m(t,"default",{value:s,enumerable:!0}):t,s));var f=l(require("express"),1);var d=l(require("ical-generator"),1),c=class{static async request(e){let t=await this.getCourses(e);return this.createCalendar(t)}static async getCourses(e){let t="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),r=await(await fetch(t)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(r.classes).forEach(([o,i])=>{if(o.split("_",2)[1]==="sa"){let n={id:`kinderschwimmen-${o}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(i)?r.classes[o]={before_noon:[n]}:(i.before_noon=i.before_noon||[],i.before_noon.push(n))}if(o.split("_",2)[1]==="th"){let n={id:`kinderschwimmen-${o}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"17:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(i)?r.classes[o]={before_noon:[n]}:(i.before_noon=i.before_noon||[],i.before_noon.push(n))}}),r.classes}static createCalendar(e){let t=(0,d.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([a,r])=>{let o=a.split("_")[0];(Array.isArray(r)?r:Object.values(r)).forEach(i=>{i.forEach(n=>{let u=new Date(o+"T"+n.time.from+"Z"),h=new Date(o+"T"+n.time.to+"Z");t.createEvent({id:n.id,start:u,end:h,floating:!0,summary:n.title,location:n.club,url:n.url})})})}),t}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(t=>t.toString()).join("-")}};var p=class s{static run(){new s}app;server;constructor(){this.app=(0,f.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)=>{c.request(e.query).then(a=>{t.writeHead(200,{"Content-Type":"text/calendar; charset=utf-8","Content-Disposition":'attachment; filename="calendar.ics"'}),t.end(a.toString())})})}async stop(){await new Promise(e=>this.server.close(e)),process.exit()}};p.run();
2
+ "use strict";var g=Object.create;var m=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var _=(s,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of y(e))!C.call(s,r)&&r!==t&&m(s,r,{get:()=>e[r],enumerable:!(a=w(e,r))||a.enumerable});return s};var l=(s,e,t)=>(t=s!=null?g(b(s)):{},_(e||!s||!s.__esModule?m(t,"default",{value:s,enumerable:!0}):t,s));var f=l(require("express"),1);var d=l(require("ical-generator"),1);var c=class{static createCalendar(e){let t=(0,d.default)({name:"Fitness First",prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"},ttl:21600});return Object.entries(e).forEach(([a,r])=>{let o=a.split("_")[0];(Array.isArray(r)?r:Object.values(r)).forEach(i=>{i.forEach(n=>{let u=new Date(o+"T"+n.time.from+"Z"),h=new Date(o+"T"+n.time.to+"Z");t.createEvent({end:h,floating:!0,id:n.id,location:n.club,start:u,summary:n.title,url:n.url})})})}),t}static async getCourses(e){let t="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),r=await(await fetch(t)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(r.classes).forEach(([o,i])=>{if(o.split("_",2)[1]==="sa"){let n={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${o}`,time:{from:"09:00:00",to:"12:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(i)?r.classes[o]={before_noon:[n]}:(i.before_noon=i.before_noon||[],i.before_noon.push(n))}if(o.split("_",2)[1]==="th"){let n={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${o}`,time:{from:"15:00:00",to:"17:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(i)?r.classes[o]={before_noon:[n]}:(i.before_noon=i.before_noon||[],i.before_noon.push(n))}}),r.classes}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(t=>t.toString()).join("-")}static async request(e){let t=await this.getCourses(e);return this.createCalendar(t)}};var p=class s{app;server;constructor(){this.app=(0,f.default)(),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}static run(){new s}setupRoutes(){this.app.get("/ping",(e,t)=>{t.send("pong")}),this.app.get("/ical",(e,t)=>{c.request(e.query).then(a=>{t.writeHead(200,{"Content-Disposition":'attachment; filename="calendar.ics"',"Content-Type":"text/calendar; charset=utf-8"}),t.end(a.toString())})})}async stop(){await new Promise(e=>this.server.close(e)),process.exit()}};p.run();
3
3
  //# sourceMappingURL=start.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/start.ts","../../src/lib/index.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, {type 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 => {\n res.writeHead(200, {\n 'Content-Type': 'text/calendar; charset=utf-8',\n 'Content-Disposition': 'attachment; filename=\"calendar.ics\"'\n });\n\n res.end(calendar.toString());\n });\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 {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData\n} 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/magicline/api/class-shedule/' +\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 res = await fetch(url);\n const response = await res.json() as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '96' && (params.category_id === 'aqua' || !params.category_id)) {\n Object.entries(response.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 club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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: '17:15:00'\n },\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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.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 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"],"mappings":"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","names":["import_express","import_ical_generator","FitnessFirstIcalProxy","params","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","cb"]}
1
+ {"version":3,"sources":["../../src/bin/start.ts","../../src/lib/index.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, { type Express } from 'express';\nimport { Server } from 'http';\n\nimport FitnessFirstIcalProxy from '../lib/index.js';\n\nclass AppServer {\n private app: Express;\n\n private server: Server;\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 static run() {\n new AppServer();\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).then((calendar) => {\n res.writeHead(200, {\n 'Content-Disposition':\n 'attachment; filename=\"calendar.ics\"',\n 'Content-Type': 'text/calendar; charset=utf-8',\n });\n\n res.end(calendar.toString());\n });\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 type { ICalCalendar } from 'ical-generator';\n\nimport ical from 'ical-generator';\n\nimport {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData,\n} from './types.js';\n\nexport default class FitnessFirstIcalProxy {\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy',\n },\n ttl: 60 * 60 * 6,\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(\n (courses) => {\n courses.forEach((course: ResponseCourse) => {\n const start = new Date(\n day + 'T' + course.time.from + 'Z',\n );\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n end,\n floating: true,\n id: course.id,\n location: course.club,\n start,\n summary: course.title,\n url: course.url,\n });\n });\n },\n );\n });\n\n return cal;\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url =\n 'https://www.fitnessfirst.de/magicline/api/class-shedule/' +\n this.paramToString(params.club_id) +\n '/' +\n this.paramToString(params.category_id) +\n '/' +\n this.paramToString(params.class_id) +\n '/' +\n this.paramToString(params.daytime_id);\n\n const res = await fetch(url);\n const response = (await res.json()) as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (\n params.club_id === '96' &&\n (params.category_id === 'aqua' || !params.category_id)\n ) {\n Object.entries(response.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '09:00:00',\n to: '12:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\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 category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '15:00:00',\n to: '17:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.classes;\n }\n\n static paramToString(\n value: Array<number | string> | string | undefined,\n ): 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.map((v) => v.toString()).join('-');\n }\n\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n}\n"],"mappings":"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","names":["import_express","import_ical_generator","FitnessFirstIcalProxy","courses","cal","ical","key","classes","day","course","start","end","params","url","response","event","value","v","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","cb"]}
package/dist/bin/start.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as r}from"../chunk-GBH4JMAN.js";import n from"express";var t=class i{static run(){new i}app;server;constructor(){this.app=n(),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,s)=>{s.send("pong")}),this.app.get("/ical",(e,s)=>{r.request(e.query).then(p=>{s.writeHead(200,{"Content-Type":"text/calendar; charset=utf-8","Content-Disposition":'attachment; filename="calendar.ics"'}),s.end(p.toString())})})}async stop(){await new Promise(e=>this.server.close(e)),process.exit()}};t.run();
2
+ import{a as r}from"../chunk-MSMAVS6L.js";import n from"express";var t=class i{app;server;constructor(){this.app=n(),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}static run(){new i}setupRoutes(){this.app.get("/ping",(e,s)=>{s.send("pong")}),this.app.get("/ical",(e,s)=>{r.request(e.query).then(p=>{s.writeHead(200,{"Content-Disposition":'attachment; filename="calendar.ics"',"Content-Type":"text/calendar; charset=utf-8"}),s.end(p.toString())})})}async stop(){await new Promise(e=>this.server.close(e)),process.exit()}};t.run();
3
3
  //# sourceMappingURL=start.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/start.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, {type 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 => {\n res.writeHead(200, {\n 'Content-Type': 'text/calendar; charset=utf-8',\n 'Content-Disposition': 'attachment; filename=\"calendar.ics\"'\n });\n\n res.end(calendar.toString());\n });\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":";yCAGA,OAAOA,MAA6B,UAKpC,IAAMC,EAAN,MAAMC,CAAU,CACZ,OAAO,KAAM,CACT,IAAIA,CACR,CAEQ,IACA,OAER,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,GAAY,CACdF,EAAI,UAAU,IAAK,CACf,eAAgB,+BAChB,sBAAuB,qCAC3B,CAAC,EAEDA,EAAI,IAAIE,EAAS,SAAS,CAAC,CAC/B,CAAC,CACT,CAAC,CACL,CAEA,MAAM,MAAO,CACT,MAAM,IAAI,QAAQC,GAAM,KAAK,OAAO,MAAMA,CAAE,CAAC,EAE7C,QAAQ,KAAK,CACjB,CACJ,EAEAP,EAAU,IAAI","names":["express","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","cb"]}
1
+ {"version":3,"sources":["../../src/bin/start.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, { type Express } from 'express';\nimport { Server } from 'http';\n\nimport FitnessFirstIcalProxy from '../lib/index.js';\n\nclass AppServer {\n private app: Express;\n\n private server: Server;\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 static run() {\n new AppServer();\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).then((calendar) => {\n res.writeHead(200, {\n 'Content-Disposition':\n 'attachment; filename=\"calendar.ics\"',\n 'Content-Type': 'text/calendar; charset=utf-8',\n });\n\n res.end(calendar.toString());\n });\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":";yCAGA,OAAOA,MAA+B,UAKtC,IAAMC,EAAN,MAAMC,CAAU,CACJ,IAEA,OACR,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,OAAO,KAAM,CACT,IAAID,CACR,CAEA,aAAc,CACV,KAAK,IAAI,IAAI,QAAS,CAACE,EAAKC,IAAQ,CAChCA,EAAI,KAAK,MAAM,CACnB,CAAC,EAED,KAAK,IAAI,IAAI,QAAS,CAACD,EAAKC,IAAQ,CAChCC,EAAsB,QAAQF,EAAI,KAAK,EAAE,KAAMG,GAAa,CACxDF,EAAI,UAAU,IAAK,CACf,sBACI,sCACJ,eAAgB,8BACpB,CAAC,EAEDA,EAAI,IAAIE,EAAS,SAAS,CAAC,CAC/B,CAAC,CACL,CAAC,CACL,CAEA,MAAM,MAAO,CACT,MAAM,IAAI,QAASC,GAAO,KAAK,OAAO,MAAMA,CAAE,CAAC,EAE/C,QAAQ,KAAK,CACjB,CACJ,EAEAP,EAAU,IAAI","names":["express","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","cb"]}
@@ -0,0 +1,2 @@
1
+ import f from"ical-generator";var o=class{static createCalendar(e){let i=f({name:"Fitness First",prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"},ttl:21600});return Object.entries(e).forEach(([a,s])=>{let n=a.split("_")[0];(Array.isArray(s)?s:Object.values(s)).forEach(r=>{r.forEach(t=>{let c=new Date(n+"T"+t.time.from+"Z"),m=new Date(n+"T"+t.time.to+"Z");i.createEvent({end:m,floating:!0,id:t.id,location:t.club,start:c,summary:t.title,url:t.url})})})}),i}static async getCourses(e){let i="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),s=await(await fetch(i)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(s.classes).forEach(([n,r])=>{if(n.split("_",2)[1]==="sa"){let t={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${n}`,time:{from:"09:00:00",to:"12:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(r)?s.classes[n]={before_noon:[t]}:(r.before_noon=r.before_noon||[],r.before_noon.push(t))}if(n.split("_",2)[1]==="th"){let t={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${n}`,time:{from:"15:00:00",to:"17:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(r)?s.classes[n]={before_noon:[t]}:(r.before_noon=r.before_noon||[],r.before_noon.push(t))}}),s.classes}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(i=>i.toString()).join("-")}static async request(e){let i=await this.getCourses(e);return this.createCalendar(i)}};export{o as a};
2
+ //# sourceMappingURL=chunk-MSMAVS6L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/index.ts"],"sourcesContent":["import type { ICalCalendar } from 'ical-generator';\n\nimport ical from 'ical-generator';\n\nimport {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData,\n} from './types.js';\n\nexport default class FitnessFirstIcalProxy {\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy',\n },\n ttl: 60 * 60 * 6,\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(\n (courses) => {\n courses.forEach((course: ResponseCourse) => {\n const start = new Date(\n day + 'T' + course.time.from + 'Z',\n );\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n end,\n floating: true,\n id: course.id,\n location: course.club,\n start,\n summary: course.title,\n url: course.url,\n });\n });\n },\n );\n });\n\n return cal;\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url =\n 'https://www.fitnessfirst.de/magicline/api/class-shedule/' +\n this.paramToString(params.club_id) +\n '/' +\n this.paramToString(params.category_id) +\n '/' +\n this.paramToString(params.class_id) +\n '/' +\n this.paramToString(params.daytime_id);\n\n const res = await fetch(url);\n const response = (await res.json()) as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (\n params.club_id === '96' &&\n (params.category_id === 'aqua' || !params.category_id)\n ) {\n Object.entries(response.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '09:00:00',\n to: '12:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\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 category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '15:00:00',\n to: '17:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.classes;\n }\n\n static paramToString(\n value: Array<number | string> | string | undefined,\n ): 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.map((v) => v.toString()).join('-');\n }\n\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n}\n"],"mappings":"AAEA,OAAOA,MAAU,iBASjB,IAAqBC,EAArB,KAA2C,CACvC,OAAO,eAAeC,EAAwC,CAC1D,IAAMC,EAAMC,EAAK,CACb,KAAM,gBACN,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,EACA,IAAK,KACT,CAAC,EAED,cAAO,QAAQF,CAAO,EAAE,QAAQ,CAAC,CAACG,EAAKC,CAAO,IAAM,CAChD,IAAMC,EAAMF,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QACvDJ,GAAY,CACTA,EAAQ,QAASM,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KACdF,EAAM,IAAMC,EAAO,KAAK,KAAO,GACnC,EACME,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDL,EAAI,YAAY,CACZ,IAAAO,EACA,SAAU,GACV,GAAIF,EAAO,GACX,SAAUA,EAAO,KACjB,MAAAC,EACA,QAASD,EAAO,MAChB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CACJ,CACJ,CAAC,EAEML,CACX,CAEA,aAAa,WAAWQ,EAAiD,CACrE,IAAMC,EACF,2DACA,KAAK,cAAcD,EAAO,OAAO,EACjC,IACA,KAAK,cAAcA,EAAO,WAAW,EACrC,IACA,KAAK,cAAcA,EAAO,QAAQ,EAClC,IACA,KAAK,cAAcA,EAAO,UAAU,EAGlCE,EAAY,MADN,MAAM,MAAMD,CAAG,GACC,KAAK,EAGjC,OACID,EAAO,UAAY,OAClBA,EAAO,cAAgB,QAAU,CAACA,EAAO,cAE1C,OAAO,QAAQE,EAAS,OAAO,EAAE,QAAQ,CAAC,CAACR,EAAKC,CAAO,IAAM,CACzD,GAAID,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAMS,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmBT,CAAG,GAC1B,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBO,EAAS,QAAQR,CAAG,EAAI,CACpB,YAAa,CAACS,CAAK,CACvB,GAEAR,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKQ,CAAK,EAEtC,CACA,GAAIT,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAMS,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmBT,CAAG,GAC1B,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBO,EAAS,QAAQR,CAAG,EAAI,CACpB,YAAa,CAACS,CAAK,CACvB,GAEAR,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKQ,CAAK,EAEtC,CACJ,CAAC,EAGED,EAAS,OACpB,CAEA,OAAO,cACHE,EACM,CACN,OAAI,OAAOA,GAAU,SACVA,EAEP,OAAOA,EAAU,KAAeA,EAAM,SAAW,EAC1C,MAGJA,EAAM,IAAKC,GAAMA,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,CAClD,CAEA,aAAa,QAAQL,EAA8C,CAC/D,IAAMT,EAAU,MAAM,KAAK,WAAWS,CAAM,EAC5C,OAAO,KAAK,eAAeT,CAAO,CACtC,CACJ","names":["ical","FitnessFirstIcalProxy","courses","cal","ical","key","classes","day","course","start","end","params","url","response","event","value","v"]}
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.create;var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var b=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},f=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of w(e))!y.call(r,n)&&n!==t&&c(r,n,{get:()=>e[n],enumerable:!(a=h(e,n))||a.enumerable});return r};var _=(r,e,t)=>(t=r!=null?u(g(r)):{},f(e||!r||!r.__esModule?c(t,"default",{value:r,enumerable:!0}):t,r)),C=r=>f(c({},"__esModule",{value:!0}),r);var R={};b(R,{default:()=>m});module.exports=C(R);var d=_(require("ical-generator"),1),m=class{static async request(e){let t=await this.getCourses(e);return this.createCalendar(t)}static async getCourses(e){let t="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),n=await(await fetch(t)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(n.classes).forEach(([o,s])=>{if(o.split("_",2)[1]==="sa"){let i={id:`kinderschwimmen-${o}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(s)?n.classes[o]={before_noon:[i]}:(s.before_noon=s.before_noon||[],s.before_noon.push(i))}if(o.split("_",2)[1]==="th"){let i={id:`kinderschwimmen-${o}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"17:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(s)?n.classes[o]={before_noon:[i]}:(s.before_noon=s.before_noon||[],s.before_noon.push(i))}}),n.classes}static createCalendar(e){let t=(0,d.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([a,n])=>{let o=a.split("_")[0];(Array.isArray(n)?n:Object.values(n)).forEach(s=>{s.forEach(i=>{let l=new Date(o+"T"+i.time.from+"Z"),p=new Date(o+"T"+i.time.to+"Z");t.createEvent({id:i.id,start:l,end:p,floating:!0,summary:i.title,location:i.club,url:i.url})})})}),t}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(t=>t.toString()).join("-")}};
1
+ "use strict";var u=Object.create;var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var b=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},f=(r,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of w(e))!y.call(r,n)&&n!==t&&c(r,n,{get:()=>e[n],enumerable:!(a=h(e,n))||a.enumerable});return r};var _=(r,e,t)=>(t=r!=null?u(g(r)):{},f(e||!r||!r.__esModule?c(t,"default",{value:r,enumerable:!0}):t,r)),C=r=>f(c({},"__esModule",{value:!0}),r);var R={};b(R,{default:()=>m});module.exports=C(R);var d=_(require("ical-generator"),1);var m=class{static createCalendar(e){let t=(0,d.default)({name:"Fitness First",prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"},ttl:21600});return Object.entries(e).forEach(([a,n])=>{let o=a.split("_")[0];(Array.isArray(n)?n:Object.values(n)).forEach(s=>{s.forEach(i=>{let l=new Date(o+"T"+i.time.from+"Z"),p=new Date(o+"T"+i.time.to+"Z");t.createEvent({end:p,floating:!0,id:i.id,location:i.club,start:l,summary:i.title,url:i.url})})})}),t}static async getCourses(e){let t="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),n=await(await fetch(t)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(n.classes).forEach(([o,s])=>{if(o.split("_",2)[1]==="sa"){let i={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${o}`,time:{from:"09:00:00",to:"12:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(s)?n.classes[o]={before_noon:[i]}:(s.before_noon=s.before_noon||[],s.before_noon.push(i))}if(o.split("_",2)[1]==="th"){let i={category:"Aqua",club:"Berlin - Gendarmenmarkt",id:`kinderschwimmen-${o}`,time:{from:"15:00:00",to:"17:15:00"},title:"Kinderschwimmen",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(s)?n.classes[o]={before_noon:[i]}:(s.before_noon=s.before_noon||[],s.before_noon.push(i))}}),n.classes}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(t=>t.toString()).join("-")}static async request(e){let t=await this.getCourses(e);return this.createCalendar(t)}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData\n} 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/magicline/api/class-shedule/' +\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 res = await fetch(url);\n const response = await res.json() as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '96' && (params.category_id === 'aqua' || !params.category_id)) {\n Object.entries(response.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 club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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: '17:15:00'\n },\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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.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 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"],"mappings":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAOA,IAAAI,EAAiB,+BAEIC,EAArB,KAA2C,CACvC,aAAa,QAAQC,EAA8C,CAC/D,IAAMC,EAAU,MAAM,KAAK,WAAWD,CAAM,EAC5C,OAAO,KAAK,eAAeC,CAAO,CACtC,CAEA,aAAa,WAAWD,EAAiD,CACrE,IAAME,EAAM,2DACR,KAAK,cAAcF,EAAO,OAAO,EAAI,IACrC,KAAK,cAAcA,EAAO,WAAW,EAAI,IACzC,KAAK,cAAcA,EAAO,QAAQ,EAAI,IACtC,KAAK,cAAcA,EAAO,UAAU,EAGlCG,EAAW,MADL,MAAM,MAAMD,CAAG,GACA,KAAK,EAGhC,OAAIF,EAAO,UAAY,OAASA,EAAO,cAAgB,QAAU,CAACA,EAAO,cACrE,OAAO,QAAQG,EAAS,OAAO,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAO,IAAM,CACzD,GAAID,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAME,EAAQ,CACV,GAAI,mBAAmBF,CAAG,GAC1B,MAAO,kBACP,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,SAAU,OACV,KAAM,0BACN,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBF,EAAS,QAAQC,CAAG,EAAI,CACpB,YAAa,CACTE,CACJ,CACJ,GAEAD,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKC,CAAK,EAEtC,CACA,GAAIF,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAME,EAAQ,CACV,GAAI,mBAAmBF,CAAG,GAC1B,MAAO,kBACP,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,SAAU,OACV,KAAM,0BACN,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBF,EAAS,QAAQC,CAAG,EAAI,CACpB,YAAa,CACTE,CACJ,CACJ,GAEAD,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKC,CAAK,EAEtC,CACJ,CAAC,EAGEH,EAAS,OACpB,CAEA,OAAO,eAAeF,EAAwC,CAC1D,IAAMM,KAAM,EAAAC,SAAK,CACb,KAAM,gBACN,IAAK,MACL,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,CACJ,CAAC,EAED,cAAO,QAAQP,CAAO,EAAE,QAAQ,CAAC,CAACG,EAAKC,CAAO,IAAM,CAChD,IAAMI,EAAML,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QAAQJ,GAAW,CAC3EA,EAAQ,QAASS,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KAAKF,EAAM,IAAMC,EAAO,KAAK,KAAO,GAAG,EACnDE,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDH,EAAI,YAAY,CACZ,GAAIG,EAAO,GACX,MAAAC,EACA,IAAAC,EACA,SAAU,GACV,QAASF,EAAO,MAChB,SAAUA,EAAO,KACjB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAAC,EAEMH,CACX,CAEA,OAAO,cAAcM,EAA4D,CAC7E,OAAI,OAAOA,GAAU,SACVA,EAER,OAAOA,EAAU,KAAeA,EAAM,SAAW,EACzC,MAGJA,EACF,IAAIC,GAAKA,EAAE,SAAS,CAAC,EACrB,KAAK,GAAG,CACjB,CACJ","names":["lib_exports","__export","FitnessFirstIcalProxy","__toCommonJS","import_ical_generator","FitnessFirstIcalProxy","params","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v"]}
1
+ {"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import type { ICalCalendar } from 'ical-generator';\n\nimport ical from 'ical-generator';\n\nimport {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData,\n} from './types.js';\n\nexport default class FitnessFirstIcalProxy {\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy',\n },\n ttl: 60 * 60 * 6,\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(\n (courses) => {\n courses.forEach((course: ResponseCourse) => {\n const start = new Date(\n day + 'T' + course.time.from + 'Z',\n );\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n end,\n floating: true,\n id: course.id,\n location: course.club,\n start,\n summary: course.title,\n url: course.url,\n });\n });\n },\n );\n });\n\n return cal;\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url =\n 'https://www.fitnessfirst.de/magicline/api/class-shedule/' +\n this.paramToString(params.club_id) +\n '/' +\n this.paramToString(params.category_id) +\n '/' +\n this.paramToString(params.class_id) +\n '/' +\n this.paramToString(params.daytime_id);\n\n const res = await fetch(url);\n const response = (await res.json()) as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (\n params.club_id === '96' &&\n (params.category_id === 'aqua' || !params.category_id)\n ) {\n Object.entries(response.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '09:00:00',\n to: '12:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\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 category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n id: `kinderschwimmen-${key}`,\n time: {\n from: '15:00:00',\n to: '17:15:00',\n },\n title: 'Kinderschwimmen',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n };\n\n if (Array.isArray(classes)) {\n response.classes[key] = {\n before_noon: [event],\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.classes;\n }\n\n static paramToString(\n value: Array<number | string> | string | undefined,\n ): 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.map((v) => v.toString()).join('-');\n }\n\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n}\n"],"mappings":"0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAAiB,+BASjB,IAAqBC,EAArB,KAA2C,CACvC,OAAO,eAAeC,EAAwC,CAC1D,IAAMC,KAAM,EAAAC,SAAK,CACb,KAAM,gBACN,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,EACA,IAAK,KACT,CAAC,EAED,cAAO,QAAQF,CAAO,EAAE,QAAQ,CAAC,CAACG,EAAKC,CAAO,IAAM,CAChD,IAAMC,EAAMF,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QACvDJ,GAAY,CACTA,EAAQ,QAASM,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KACdF,EAAM,IAAMC,EAAO,KAAK,KAAO,GACnC,EACME,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDL,EAAI,YAAY,CACZ,IAAAO,EACA,SAAU,GACV,GAAIF,EAAO,GACX,SAAUA,EAAO,KACjB,MAAAC,EACA,QAASD,EAAO,MAChB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CACJ,CACJ,CAAC,EAEML,CACX,CAEA,aAAa,WAAWQ,EAAiD,CACrE,IAAMC,EACF,2DACA,KAAK,cAAcD,EAAO,OAAO,EACjC,IACA,KAAK,cAAcA,EAAO,WAAW,EACrC,IACA,KAAK,cAAcA,EAAO,QAAQ,EAClC,IACA,KAAK,cAAcA,EAAO,UAAU,EAGlCE,EAAY,MADN,MAAM,MAAMD,CAAG,GACC,KAAK,EAGjC,OACID,EAAO,UAAY,OAClBA,EAAO,cAAgB,QAAU,CAACA,EAAO,cAE1C,OAAO,QAAQE,EAAS,OAAO,EAAE,QAAQ,CAAC,CAACR,EAAKC,CAAO,IAAM,CACzD,GAAID,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAMS,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmBT,CAAG,GAC1B,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBO,EAAS,QAAQR,CAAG,EAAI,CACpB,YAAa,CAACS,CAAK,CACvB,GAEAR,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKQ,CAAK,EAEtC,CACA,GAAIT,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAMS,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmBT,CAAG,GAC1B,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBO,EAAS,QAAQR,CAAG,EAAI,CACpB,YAAa,CAACS,CAAK,CACvB,GAEAR,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKQ,CAAK,EAEtC,CACJ,CAAC,EAGED,EAAS,OACpB,CAEA,OAAO,cACHE,EACM,CACN,OAAI,OAAOA,GAAU,SACVA,EAEP,OAAOA,EAAU,KAAeA,EAAM,SAAW,EAC1C,MAGJA,EAAM,IAAKC,GAAMA,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,CAClD,CAEA,aAAa,QAAQL,EAA8C,CAC/D,IAAMT,EAAU,MAAM,KAAK,WAAWS,CAAM,EAC5C,OAAO,KAAK,eAAeT,CAAO,CACtC,CACJ","names":["lib_exports","__export","FitnessFirstIcalProxy","__toCommonJS","import_ical_generator","FitnessFirstIcalProxy","courses","cal","ical","key","classes","day","course","start","end","params","url","response","event","value","v"]}
@@ -1,35 +1,35 @@
1
1
  import { ICalCalendar } from 'ical-generator';
2
2
 
3
3
  interface RequestParams {
4
- club_id?: string | number[] | string[];
5
- category_id?: string | number[] | string[];
6
- class_id?: string | number[];
4
+ category_id?: number[] | string | string[];
5
+ class_id?: number[] | string;
6
+ club_id?: number[] | string | string[];
7
7
  daytime_id?: string | string[];
8
8
  }
9
9
  interface ResponseClasses {
10
10
  [key: string]: [] | ResponseDay;
11
11
  }
12
- interface ResponseDay {
13
- [key: string]: ResponseCourse[];
14
- }
15
12
  interface ResponseCourse {
16
- id: string;
17
- title: string;
18
- time: ResponseCourseTime;
19
13
  category: string;
20
14
  club: string;
21
- url: string | null;
15
+ id: string;
16
+ time: ResponseCourseTime;
17
+ title: string;
18
+ url: null | string;
22
19
  }
23
20
  interface ResponseCourseTime {
24
21
  from: string;
25
22
  to: string;
26
23
  }
24
+ interface ResponseDay {
25
+ [key: string]: ResponseCourse[];
26
+ }
27
27
 
28
28
  declare class FitnessFirstIcalProxy {
29
- static request(params: RequestParams): Promise<ICalCalendar>;
30
- static getCourses(params: RequestParams): Promise<ResponseClasses>;
31
29
  static createCalendar(courses: ResponseClasses): ICalCalendar;
32
- static paramToString(value: string | Array<string | number> | undefined): string;
30
+ static getCourses(params: RequestParams): Promise<ResponseClasses>;
31
+ static paramToString(value: Array<number | string> | string | undefined): string;
32
+ static request(params: RequestParams): Promise<ICalCalendar>;
33
33
  }
34
34
 
35
35
  export { FitnessFirstIcalProxy as default };
@@ -1,35 +1,35 @@
1
1
  import { ICalCalendar } from 'ical-generator';
2
2
 
3
3
  interface RequestParams {
4
- club_id?: string | number[] | string[];
5
- category_id?: string | number[] | string[];
6
- class_id?: string | number[];
4
+ category_id?: number[] | string | string[];
5
+ class_id?: number[] | string;
6
+ club_id?: number[] | string | string[];
7
7
  daytime_id?: string | string[];
8
8
  }
9
9
  interface ResponseClasses {
10
10
  [key: string]: [] | ResponseDay;
11
11
  }
12
- interface ResponseDay {
13
- [key: string]: ResponseCourse[];
14
- }
15
12
  interface ResponseCourse {
16
- id: string;
17
- title: string;
18
- time: ResponseCourseTime;
19
13
  category: string;
20
14
  club: string;
21
- url: string | null;
15
+ id: string;
16
+ time: ResponseCourseTime;
17
+ title: string;
18
+ url: null | string;
22
19
  }
23
20
  interface ResponseCourseTime {
24
21
  from: string;
25
22
  to: string;
26
23
  }
24
+ interface ResponseDay {
25
+ [key: string]: ResponseCourse[];
26
+ }
27
27
 
28
28
  declare class FitnessFirstIcalProxy {
29
- static request(params: RequestParams): Promise<ICalCalendar>;
30
- static getCourses(params: RequestParams): Promise<ResponseClasses>;
31
29
  static createCalendar(courses: ResponseClasses): ICalCalendar;
32
- static paramToString(value: string | Array<string | number> | undefined): string;
30
+ static getCourses(params: RequestParams): Promise<ResponseClasses>;
31
+ static paramToString(value: Array<number | string> | string | undefined): string;
32
+ static request(params: RequestParams): Promise<ICalCalendar>;
33
33
  }
34
34
 
35
35
  export { FitnessFirstIcalProxy as default };
package/dist/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-GBH4JMAN.js";export{a as default};
1
+ import{a}from"../chunk-MSMAVS6L.js";export{a as default};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,72 +1,76 @@
1
1
  {
2
- "author": "Sebastian Pekarek <mail@sebbo.net>",
3
- "bin": {
4
- "fitness-first-ical-proxy": "./dist/bin/start.js"
5
- },
6
- "bugs": {
7
- "url": "https://github.com/sebbo2002/fitness-first-ical-proxy/issues"
8
- },
9
- "dependencies": {
10
- "express": "^5.1.0",
11
- "ical-generator": "^8.1.1"
12
- },
13
- "description": "Small proxy that provides the course schedule from fitnessfirst.de/kurse as an iCal calendar.",
14
- "devDependencies": {
15
- "@eslint/js": "^9.23.0",
16
- "@qiwi/semantic-release-gh-pages-plugin": "^5.4.3",
17
- "@sebbo2002/semantic-release-docker": "^5.0.4",
18
- "@semantic-release/changelog": "^6.0.3",
19
- "@semantic-release/exec": "^7.0.3",
20
- "@semantic-release/git": "^10.0.1",
21
- "@semantic-release/npm": "^12.0.1",
22
- "@types/express": "^5.0.1",
23
- "@types/mocha": "^10.0.10",
24
- "@types/node": "^22.14.0",
25
- "c8": "^10.1.3",
26
- "eslint": "^9.24.0",
27
- "eslint-plugin-jsonc": "^2.20.0",
28
- "esm": "^3.2.25",
29
- "license-checker": "^25.0.1",
30
- "mocha": "^11.1.0",
31
- "mochawesome": "^7.1.3",
32
- "nyc": "^17.1.0",
33
- "semantic-release-license": "^1.0.3",
34
- "source-map-support": "^0.5.21",
35
- "tsup": "^8.4.0",
36
- "tsx": "^4.19.3",
37
- "typedoc": "^0.28.2",
38
- "typescript": "^5.8.3",
39
- "typescript-eslint": "^8.29.0"
40
- },
41
- "engines": {
42
- "node": "18 || 20 || >=22.0.0"
43
- },
44
- "exports": {
45
- "import": "./dist/lib/index.js",
46
- "require": "./dist/lib/index.cjs"
47
- },
48
- "files": [
49
- "/dist"
50
- ],
51
- "homepage": "https://github.com/sebbo2002/fitness-first-ical-proxy#readme",
52
- "license": "MIT",
53
- "main": "./dist/lib/index.cjs",
54
- "module": "./dist/lib/index.js",
55
- "name": "@sebbo2002/fitness-first-ical-proxy",
56
- "repository": {
57
- "type": "git",
58
- "url": "git+https://github.com/sebbo2002/fitness-first-ical-proxy.git"
59
- },
60
- "scripts": {
61
- "build": "tsup && cp ./dist/lib/index.d.ts ./dist/lib/index.d.cts",
62
- "build-all": "./.github/workflows/build.sh",
63
- "coverage": "c8 mocha",
64
- "develop": "tsx src/bin/start.ts",
65
- "license-check": "license-checker --production --summary",
66
- "lint": "eslint .",
67
- "start": "node ./dist/bin/start.js",
68
- "test": "mocha"
69
- },
70
- "type": "module",
71
- "version": "6.0.5-develop.9"
2
+ "author": "Sebastian Pekarek <mail@sebbo.net>",
3
+ "bin": {
4
+ "fitness-first-ical-proxy": "./dist/bin/start.js"
5
+ },
6
+ "bugs": {
7
+ "url": "https://github.com/sebbo2002/fitness-first-ical-proxy/issues"
8
+ },
9
+ "dependencies": {
10
+ "express": "^5.1.0",
11
+ "ical-generator": "^8.1.1"
12
+ },
13
+ "description": "Small proxy that provides the course schedule from fitnessfirst.de/kurse as an iCal calendar.",
14
+ "devDependencies": {
15
+ "@eslint/js": "^9.25.0",
16
+ "@qiwi/semantic-release-gh-pages-plugin": "^5.4.3",
17
+ "@sebbo2002/semantic-release-docker": "^5.0.4",
18
+ "@semantic-release/changelog": "^6.0.3",
19
+ "@semantic-release/exec": "^7.0.3",
20
+ "@semantic-release/git": "^10.0.1",
21
+ "@semantic-release/npm": "^12.0.1",
22
+ "@types/express": "^5.0.1",
23
+ "@types/mocha": "^10.0.10",
24
+ "@types/node": "^22.14.0",
25
+ "c8": "^10.1.3",
26
+ "eslint": "^9.25.1",
27
+ "eslint-config-prettier": "^10.1.2",
28
+ "eslint-plugin-jsonc": "^2.20.0",
29
+ "eslint-plugin-perfectionist": "^4.12.3",
30
+ "esm": "^3.2.25",
31
+ "husky": "^9.1.7",
32
+ "license-checker": "^25.0.1",
33
+ "mocha": "^11.1.0",
34
+ "mochawesome": "^7.1.3",
35
+ "nyc": "^17.1.0",
36
+ "prettier": "^3.5.3",
37
+ "semantic-release-license": "^1.0.3",
38
+ "source-map-support": "^0.5.21",
39
+ "tsup": "^8.4.0",
40
+ "tsx": "^4.19.3",
41
+ "typedoc": "^0.28.2",
42
+ "typescript": "^5.8.3",
43
+ "typescript-eslint": "^8.31.1"
44
+ },
45
+ "engines": {
46
+ "node": "20 || >=22.0.0"
47
+ },
48
+ "exports": {
49
+ "import": "./dist/lib/index.js",
50
+ "require": "./dist/lib/index.cjs"
51
+ },
52
+ "files": [
53
+ "/dist"
54
+ ],
55
+ "homepage": "https://github.com/sebbo2002/fitness-first-ical-proxy#readme",
56
+ "license": "MIT",
57
+ "main": "./dist/lib/index.cjs",
58
+ "module": "./dist/lib/index.js",
59
+ "name": "@sebbo2002/fitness-first-ical-proxy",
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "git+https://github.com/sebbo2002/fitness-first-ical-proxy.git"
63
+ },
64
+ "scripts": {
65
+ "build": "tsup && cp ./dist/lib/index.d.ts ./dist/lib/index.d.cts",
66
+ "build-all": "./.github/workflows/build.sh",
67
+ "coverage": "c8 mocha",
68
+ "develop": "tsx src/bin/start.ts",
69
+ "license-check": "license-checker --production --summary",
70
+ "lint": "npx eslint . --fix && npx prettier . --write",
71
+ "start": "node ./dist/bin/start.js",
72
+ "test": "mocha"
73
+ },
74
+ "type": "module",
75
+ "version": "7.0.0-develop.1"
72
76
  }
@@ -1,2 +0,0 @@
1
- import f from"ical-generator";var o=class{static async request(e){let i=await this.getCourses(e);return this.createCalendar(i)}static async getCourses(e){let i="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),s=await(await fetch(i)).json();return e.club_id==="96"&&(e.category_id==="aqua"||!e.category_id)&&Object.entries(s.classes).forEach(([n,r])=>{if(n.split("_",2)[1]==="sa"){let t={id:`kinderschwimmen-${n}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(r)?s.classes[n]={before_noon:[t]}:(r.before_noon=r.before_noon||[],r.before_noon.push(t))}if(n.split("_",2)[1]==="th"){let t={id:`kinderschwimmen-${n}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"17:15:00"},category:"Aqua",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849"};Array.isArray(r)?s.classes[n]={before_noon:[t]}:(r.before_noon=r.before_noon||[],r.before_noon.push(t))}}),s.classes}static createCalendar(e){let i=f({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([a,s])=>{let n=a.split("_")[0];(Array.isArray(s)?s:Object.values(s)).forEach(r=>{r.forEach(t=>{let c=new Date(n+"T"+t.time.from+"Z"),m=new Date(n+"T"+t.time.to+"Z");i.createEvent({id:t.id,start:c,end:m,floating:!0,summary:t.title,location:t.club,url:t.url})})})}),i}static paramToString(e){return typeof e=="string"?e:typeof e>"u"||e.length===0?"all":e.map(i=>i.toString()).join("-")}};export{o as a};
2
- //# sourceMappingURL=chunk-GBH4JMAN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/index.ts"],"sourcesContent":["import {\n type RequestParams,\n type ResponseClasses,\n type ResponseCourse,\n type ResponseData\n} 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/magicline/api/class-shedule/' +\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 res = await fetch(url);\n const response = await res.json() as ResponseData;\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '96' && (params.category_id === 'aqua' || !params.category_id)) {\n Object.entries(response.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 club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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: '17:15:00'\n },\n category: 'Aqua',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849'\n };\n\n if (Array.isArray(classes)) {\n response.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.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 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"],"mappings":"AAOA,OAAOA,MAAU,iBAEjB,IAAqBC,EAArB,KAA2C,CACvC,aAAa,QAAQC,EAA8C,CAC/D,IAAMC,EAAU,MAAM,KAAK,WAAWD,CAAM,EAC5C,OAAO,KAAK,eAAeC,CAAO,CACtC,CAEA,aAAa,WAAWD,EAAiD,CACrE,IAAME,EAAM,2DACR,KAAK,cAAcF,EAAO,OAAO,EAAI,IACrC,KAAK,cAAcA,EAAO,WAAW,EAAI,IACzC,KAAK,cAAcA,EAAO,QAAQ,EAAI,IACtC,KAAK,cAAcA,EAAO,UAAU,EAGlCG,EAAW,MADL,MAAM,MAAMD,CAAG,GACA,KAAK,EAGhC,OAAIF,EAAO,UAAY,OAASA,EAAO,cAAgB,QAAU,CAACA,EAAO,cACrE,OAAO,QAAQG,EAAS,OAAO,EAAE,QAAQ,CAAC,CAACC,EAAKC,CAAO,IAAM,CACzD,GAAID,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAME,EAAQ,CACV,GAAI,mBAAmBF,CAAG,GAC1B,MAAO,kBACP,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,SAAU,OACV,KAAM,0BACN,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBF,EAAS,QAAQC,CAAG,EAAI,CACpB,YAAa,CACTE,CACJ,CACJ,GAEAD,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKC,CAAK,EAEtC,CACA,GAAIF,EAAI,MAAM,IAAK,CAAC,EAAE,CAAC,IAAM,KAAM,CAC/B,IAAME,EAAQ,CACV,GAAI,mBAAmBF,CAAG,GAC1B,MAAO,kBACP,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,SAAU,OACV,KAAM,0BACN,IAAK,6DACT,EAEI,MAAM,QAAQC,CAAO,EACrBF,EAAS,QAAQC,CAAG,EAAI,CACpB,YAAa,CACTE,CACJ,CACJ,GAEAD,EAAQ,YAAcA,EAAQ,aAAe,CAAC,EAC9CA,EAAQ,YAAY,KAAKC,CAAK,EAEtC,CACJ,CAAC,EAGEH,EAAS,OACpB,CAEA,OAAO,eAAeF,EAAwC,CAC1D,IAAMM,EAAMT,EAAK,CACb,KAAM,gBACN,IAAK,MACL,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,CACJ,CAAC,EAED,cAAO,QAAQG,CAAO,EAAE,QAAQ,CAAC,CAACG,EAAKC,CAAO,IAAM,CAChD,IAAMG,EAAMJ,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QAAQJ,GAAW,CAC3EA,EAAQ,QAASQ,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KAAKF,EAAM,IAAMC,EAAO,KAAK,KAAO,GAAG,EACnDE,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDF,EAAI,YAAY,CACZ,GAAIE,EAAO,GACX,MAAAC,EACA,IAAAC,EACA,SAAU,GACV,QAASF,EAAO,MAChB,SAAUA,EAAO,KACjB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAAC,EAEMF,CACX,CAEA,OAAO,cAAcK,EAA4D,CAC7E,OAAI,OAAOA,GAAU,SACVA,EAER,OAAOA,EAAU,KAAeA,EAAM,SAAW,EACzC,MAGJA,EACF,IAAIC,GAAKA,EAAE,SAAS,CAAC,EACrB,KAAK,GAAG,CACjB,CACJ","names":["ical","FitnessFirstIcalProxy","params","courses","url","response","key","classes","event","cal","day","course","start","end","value","v"]}