@sebbo2002/fitness-first-ical-proxy 5.0.4-develop.3 → 6.0.0

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.
@@ -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 b=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var _=(s,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of b(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(y(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),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();
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, {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 { RequestParams, ResponseClasses, ResponseCourse, ResponseData } 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';\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"]}
package/dist/bin/start.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as r}from"../chunk-BPMYKCU7.js";import o from"express";var t=class i{static run(){new i}app;server;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,s)=>{s.send("pong")}),this.app.get("/ical",(e,s)=>{r.request(e.query).then(n=>{s.writeHead(200,{"Content-Type":"text/calendar; charset=utf-8","Content-Disposition":'attachment; filename="calendar.ics"'}),s.end(n.toString())})})}async stop(){await new Promise(e=>this.server.close(e)),process.exit()}};t.run();
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();
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, {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,MAAwB,UAK/B,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';\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,2 +1,2 @@
1
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-BPMYKCU7.js.map
2
+ //# sourceMappingURL=chunk-GBH4JMAN.js.map
@@ -0,0 +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":"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"]}
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.create;var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,b=Object.prototype.hasOwnProperty;var _=(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))!b.call(r,n)&&n!==t&&c(r,n,{get:()=>e[n],enumerable:!(a=h(e,n))||a.enumerable});return r};var y=(r,e,t)=>(t=r!=null?p(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={};_(R,{default:()=>m});module.exports=C(R);var d=y(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"),u=new Date(o+"T"+i.time.to+"Z");t.createEvent({id:i.id,start:l,end:u,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),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("-")}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import { RequestParams, ResponseClasses, ResponseCourse, ResponseData } 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,GAEA,IAAAI,EAAiB,+BAEIF,EAArB,KAA2C,CACvC,aAAa,QAAQG,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","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 {\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"]}
package/dist/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-BPMYKCU7.js";export{a as default};
1
+ import{a}from"../chunk-GBH4JMAN.js";export{a as default};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -22,9 +22,9 @@
22
22
  "@types/eslint__js": "^8.42.3",
23
23
  "@types/express": "^4.17.21",
24
24
  "@types/mocha": "^10.0.7",
25
- "@types/node": "^22.1.0",
25
+ "@types/node": "^22.5.0",
26
26
  "c8": "^10.1.2",
27
- "eslint": "^9.8.0",
27
+ "eslint": "^9.9.0",
28
28
  "eslint-plugin-jsonc": "^2.16.0",
29
29
  "esm": "^3.2.25",
30
30
  "license-checker": "^25.0.1",
@@ -33,14 +33,14 @@
33
33
  "nyc": "^17.0.0",
34
34
  "semantic-release-license": "^1.0.3",
35
35
  "source-map-support": "^0.5.21",
36
- "ts-node": "^10.9.2",
37
36
  "tsup": "^8.1.0",
38
- "typedoc": "^0.26.3",
37
+ "tsx": "^4.16.2",
38
+ "typedoc": "^0.26.6",
39
39
  "typescript": "^5.5.4",
40
- "typescript-eslint": "^8.0.0-alpha.62"
40
+ "typescript-eslint": "^8.2.0"
41
41
  },
42
42
  "engines": {
43
- "node": ">=18.0.0"
43
+ "node": "18 || 20 || >=22.0.0"
44
44
  },
45
45
  "exports": {
46
46
  "import": "./dist/lib/index.js",
@@ -62,12 +62,12 @@
62
62
  "build": "tsup && cp ./dist/lib/index.d.ts ./dist/lib/index.d.cts",
63
63
  "build-all": "./.github/workflows/build.sh",
64
64
  "coverage": "c8 mocha",
65
- "develop": "TS_NODE_TRANSPILE_ONLY=true node --no-warnings --enable-source-maps --loader ts-node/esm src/bin/start.ts",
65
+ "develop": "tsx src/bin/start.ts",
66
66
  "license-check": "license-checker --production --summary",
67
67
  "lint": "eslint .",
68
68
  "start": "node ./dist/bin/start.js",
69
69
  "test": "mocha"
70
70
  },
71
71
  "type": "module",
72
- "version": "5.0.4-develop.3"
72
+ "version": "6.0.0"
73
73
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/index.ts"],"sourcesContent":["import { RequestParams, ResponseClasses, ResponseCourse, ResponseData } 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":"AAEA,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"]}