@sebbo2002/fitness-first-ical-proxy 4.0.2-develop.3 → 5.0.0-develop.2

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 b=Object.create;var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var C=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var T=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _(e))!R.call(i,s)&&s!==t&&m(i,s,{get:()=>e[s],enumerable:!(r=y(e,s))||r.enumerable});return i};var u=(i,e,t)=>(t=i!=null?b(C(i)):{},T(e||!i||!i.__esModule?m(t,"default",{value:i,enumerable:!0}):t,i));var l=(i,e,t)=>new Promise((r,s)=>{var n=c=>{try{a(t.next(c))}catch(p){s(p)}},o=c=>{try{a(t.throw(c))}catch(p){s(p)}},a=c=>c.done?r(c.value):Promise.resolve(c.value).then(n,o);a((t=t.apply(i,e)).next())});var w=u(require("express"),1);var h=require("https"),g=u(require("ical-generator"),1);var f=class{static request(e){return l(this,null,function*(){let t=yield this.getCourses(e);return this.createCalendar(t)})}static getCourses(e){return l(this,null,function*(){let t="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),r=yield this.miniGet(t);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(r.data.classes).forEach(([s,n])=>{if(s.split("_",2)[1]==="sa"){let o={id:`kinderschwimmen-${s}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(n)?r.data.classes[s]={before_noon:[o]}:(n.before_noon=n.before_noon||[],n.before_noon.push(o))}if(s.split("_",2)[1]==="th"){let o={id:`kinderschwimmen-${s}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(n)?r.data.classes[s]={before_noon:[o]}:(n.before_noon=n.before_noon||[],n.before_noon.push(o))}}),r.data.classes})}static createCalendar(e){let t=(0,g.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([r,s])=>{let n=r.split("_")[0];(Array.isArray(s)?s:Object.values(s)).forEach(o=>{o.forEach(a=>{if(a.is_cancelled)return;let c=new Date(n+"T"+a.time.from+"Z"),p=new Date(n+"T"+a.time.to+"Z");t.createEvent({id:a.id,start:c,end:p,floating:!0,summary:a.title,location:a.club,url:a.url})})})}),t}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(t=>t.toString()).join("-")}static miniGet(e){return l(this,null,function*(){return new Promise((t,r)=>{(0,h.get)(e,s=>{let n=[];s.on("data",o=>{n.push(o)}),s.on("end",()=>{let o=String(Buffer.concat(n));if(s.statusCode!==200){r(new Error("Unable to get data: "+o));return}let a=JSON.parse(o);t(a)})}).on("error",s=>{r(s)})})})}};var d=class i{static run(){new i}constructor(){this.app=(0,w.default)(),this.setupRoutes(),this.server=this.app.listen(process.env.PORT||8080),process.on("SIGINT",()=>this.stop()),process.on("SIGTERM",()=>this.stop())}setupRoutes(){this.app.get("/ping",(e,t)=>{t.send("pong")}),this.app.get("/ical",(e,t)=>{f.request(e.query).then(r=>r.serve(t))})}stop(){return l(this,null,function*(){yield new Promise(e=>this.server.close(e)),process.exit()})}};d.run();
2
+ "use strict";var y=Object.create;var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,T=Object.prototype.hasOwnProperty;var S=(t,s,e,i)=>{if(s&&typeof s=="object"||typeof s=="function")for(let r of R(s))!T.call(t,r)&&r!==e&&d(t,r,{get:()=>s[r],enumerable:!(i=C(s,r))||i.enumerable});return t};var f=(t,s,e)=>(e=t!=null?y(w(t)):{},S(s||!t||!t.__esModule?d(e,"default",{value:t,enumerable:!0}):e,t));var p=(t,s,e)=>new Promise((i,r)=>{var l=n=>{try{a(e.next(n))}catch(o){r(o)}},m=n=>{try{a(e.throw(n))}catch(o){r(o)}},a=n=>n.done?i(n.value):Promise.resolve(n.value).then(l,m);a((e=e.apply(t,s)).next())});var g=f(require("express"),1);var h=f(require("ical-generator"),1);var c=class{static request(s){return p(this,null,function*(){let e=yield this.getCourses(s);return this.createCalendar(e)})}static getCourses(s){return p(this,null,function*(){let e="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(s.club_id)+"/"+this.paramToString(s.category_id)+"/"+this.paramToString(s.class_id)+"/"+this.paramToString(s.daytime_id);return(yield(yield fetch(e)).json()).classes})}static createCalendar(s){let e=(0,h.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(s).forEach(([i,r])=>{let l=i.split("_")[0];(Array.isArray(r)?r:Object.values(r)).forEach(m=>{m.forEach(a=>{let n=new Date(l+"T"+a.time.from+"Z"),o=new Date(l+"T"+a.time.to+"Z");e.createEvent({id:a.id,start:n,end:o,floating:!0,summary:a.title,location:a.club,url:a.url})})})}),e}static paramToString(s){return typeof s=="string"?s:typeof s=="undefined"||s.length===0?"all":s.map(e=>e.toString()).join("-")}};var u=class t{static run(){new t}constructor(){this.app=(0,g.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",(s,e)=>{e.send("pong")}),this.app.get("/ical",(s,e)=>{c.request(s.query).then(i=>i.serve(e))})}stop(){return p(this,null,function*(){yield new Promise(s=>this.server.close(s)),process.exit()})}};u.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 => calendar.serve(res));\n });\n }\n\n async stop() {\n await new Promise(cb => this.server.close(cb));\n\n process.exit();\n }\n}\n\nAppServer.run();\n","import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["import_express","import_https","import_ical_generator","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","res","data","chunk","text","json","err","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","__async","cb"]}
1
+ {"version":3,"sources":["../../src/bin/start.ts","../../src/lib/index.ts"],"sourcesContent":["#!/usr/bin/env node\n'use strict';\n\nimport express, {Express} from 'express';\nimport {Server} from 'http';\nimport FitnessFirstIcalProxy from '../lib/index.js';\n\n\nclass AppServer {\n static run() {\n new AppServer();\n }\n\n private app: Express;\n private server: Server;\n\n constructor() {\n this.app = express();\n\n this.setupRoutes();\n this.server = this.app.listen(process.env.PORT || 8080);\n\n process.on('SIGINT', () => this.stop());\n process.on('SIGTERM', () => this.stop());\n }\n\n setupRoutes() {\n this.app.get('/ping', (req, res) => {\n res.send('pong');\n });\n\n this.app.get('/ical', (req, res) => {\n FitnessFirstIcalProxy.request(req.query)\n .then(calendar => calendar.serve(res));\n });\n }\n\n async stop() {\n await new Promise(cb => this.server.close(cb));\n\n process.exit();\n }\n}\n\nAppServer.run();\n","import { 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 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":";qqBAGA,IAAAA,EAA+B,wBCD/B,IAAAC,EAAiB,+BAEjB,IAAqBC,EAArB,KAA2C,CACvC,OAAa,QAAQC,EAA8C,QAAAC,EAAA,sBAC/D,IAAMC,EAAU,MAAM,KAAK,WAAWF,CAAM,EAC5C,OAAO,KAAK,eAAeE,CAAO,CACtC,GAEA,OAAa,WAAWF,EAAiD,QAAAC,EAAA,sBACrE,IAAME,EAAM,2DACR,KAAK,cAAcH,EAAO,OAAO,EAAI,IACrC,KAAK,cAAcA,EAAO,WAAW,EAAI,IACzC,KAAK,cAAcA,EAAO,QAAQ,EAAI,IACtC,KAAK,cAAcA,EAAO,UAAU,EAIxC,OADiB,MADL,MAAM,MAAMG,CAAG,GACA,KAAK,GAChB,OACpB,GAEA,OAAO,eAAeD,EAAwC,CAC1D,IAAME,KAAM,EAAAC,SAAK,CACb,KAAM,gBACN,IAAK,MACL,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,CACJ,CAAC,EAED,cAAO,QAAQH,CAAO,EAAE,QAAQ,CAAC,CAACI,EAAKC,CAAO,IAAM,CAChD,IAAMC,EAAMF,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QAAQL,GAAW,CAC3EA,EAAQ,QAASO,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KAAKF,EAAM,IAAMC,EAAO,KAAK,KAAO,GAAG,EACnDE,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDL,EAAI,YAAY,CACZ,GAAIK,EAAO,GACX,MAAAC,EACA,IAAAC,EACA,SAAU,GACV,QAASF,EAAO,MAChB,SAAUA,EAAO,KACjB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAAC,EAEML,CACX,CAEA,OAAO,cAAcQ,EAA4D,CAC7E,OAAI,OAAOA,GAAU,SACVA,EAER,OAAOA,GAAU,aAAeA,EAAM,SAAW,EACzC,MAGJA,EACF,IAAIC,GAAKA,EAAE,SAAS,CAAC,EACrB,KAAK,GAAG,CACjB,CACJ,ED5DA,IAAMC,EAAN,MAAMC,CAAU,CACZ,OAAO,KAAM,CACT,IAAIA,CACR,CAKA,aAAc,CACV,KAAK,OAAM,EAAAC,SAAQ,EAEnB,KAAK,YAAY,EACjB,KAAK,OAAS,KAAK,IAAI,OAAO,QAAQ,IAAI,MAAQ,IAAI,EAEtD,QAAQ,GAAG,SAAU,IAAM,KAAK,KAAK,CAAC,EACtC,QAAQ,GAAG,UAAW,IAAM,KAAK,KAAK,CAAC,CAC3C,CAEA,aAAc,CACV,KAAK,IAAI,IAAI,QAAS,CAACC,EAAKC,IAAQ,CAChCA,EAAI,KAAK,MAAM,CACnB,CAAC,EAED,KAAK,IAAI,IAAI,QAAS,CAACD,EAAKC,IAAQ,CAChCC,EAAsB,QAAQF,EAAI,KAAK,EAClC,KAAKG,GAAYA,EAAS,MAAMF,CAAG,CAAC,CAC7C,CAAC,CACL,CAEM,MAAO,QAAAG,EAAA,sBACT,MAAM,IAAI,QAAQC,GAAM,KAAK,OAAO,MAAMA,CAAE,CAAC,EAE7C,QAAQ,KAAK,CACjB,GACJ,EAEAR,EAAU,IAAI","names":["import_express","import_ical_generator","FitnessFirstIcalProxy","params","__async","courses","url","cal","ical","key","classes","day","course","start","end","value","v","AppServer","_AppServer","express","req","res","FitnessFirstIcalProxy","calendar","__async","cb"]}
package/dist/bin/start.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as t,b as p}from"../chunk-W72UDYJ6.js";import n from"express";var r=class i{static run(){new i}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",(s,e)=>{e.send("pong")}),this.app.get("/ical",(s,e)=>{p.request(s.query).then(o=>o.serve(e))})}stop(){return t(this,null,function*(){yield new Promise(s=>this.server.close(s)),process.exit()})}};r.run();
2
+ import{a as t,b as p}from"../chunk-R3IXB24A.js";import n from"express";var r=class i{static run(){new i}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",(s,e)=>{e.send("pong")}),this.app.get("/ical",(s,e)=>{p.request(s.query).then(o=>o.serve(e))})}stop(){return t(this,null,function*(){yield new Promise(s=>this.server.close(s)),process.exit()})}};r.run();
3
3
  //# sourceMappingURL=start.js.map
@@ -0,0 +1,2 @@
1
+ var l=(d,t,e)=>new Promise((i,a)=>{var o=r=>{try{s(e.next(r))}catch(n){a(n)}},c=r=>{try{s(e.throw(r))}catch(n){a(n)}},s=r=>r.done?i(r.value):Promise.resolve(r.value).then(o,c);s((e=e.apply(d,t)).next())});import m from"ical-generator";var p=class{static request(t){return l(this,null,function*(){let e=yield this.getCourses(t);return this.createCalendar(e)})}static getCourses(t){return l(this,null,function*(){let e="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(t.club_id)+"/"+this.paramToString(t.category_id)+"/"+this.paramToString(t.class_id)+"/"+this.paramToString(t.daytime_id);return(yield(yield fetch(e)).json()).classes})}static createCalendar(t){let e=m({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(t).forEach(([i,a])=>{let o=i.split("_")[0];(Array.isArray(a)?a:Object.values(a)).forEach(c=>{c.forEach(s=>{let r=new Date(o+"T"+s.time.from+"Z"),n=new Date(o+"T"+s.time.to+"Z");e.createEvent({id:s.id,start:r,end:n,floating:!0,summary:s.title,location:s.club,url:s.url})})})}),e}static paramToString(t){return typeof t=="string"?t:typeof t=="undefined"||t.length===0?"all":t.map(e=>e.toString()).join("-")}};export{l as a,p as b};
2
+ //# sourceMappingURL=chunk-R3IXB24A.js.map
@@ -0,0 +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 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":"6MAEA,OAAOA,MAAU,iBAEjB,IAAqBC,EAArB,KAA2C,CACvC,OAAa,QAAQC,EAA8C,QAAAC,EAAA,sBAC/D,IAAMC,EAAU,MAAM,KAAK,WAAWF,CAAM,EAC5C,OAAO,KAAK,eAAeE,CAAO,CACtC,GAEA,OAAa,WAAWF,EAAiD,QAAAC,EAAA,sBACrE,IAAME,EAAM,2DACR,KAAK,cAAcH,EAAO,OAAO,EAAI,IACrC,KAAK,cAAcA,EAAO,WAAW,EAAI,IACzC,KAAK,cAAcA,EAAO,QAAQ,EAAI,IACtC,KAAK,cAAcA,EAAO,UAAU,EAIxC,OADiB,MADL,MAAM,MAAMG,CAAG,GACA,KAAK,GAChB,OACpB,GAEA,OAAO,eAAeD,EAAwC,CAC1D,IAAME,EAAMC,EAAK,CACb,KAAM,gBACN,IAAK,MACL,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,CACJ,CAAC,EAED,cAAO,QAAQH,CAAO,EAAE,QAAQ,CAAC,CAACI,EAAKC,CAAO,IAAM,CAChD,IAAMC,EAAMF,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QAAQL,GAAW,CAC3EA,EAAQ,QAASO,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KAAKF,EAAM,IAAMC,EAAO,KAAK,KAAO,GAAG,EACnDE,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDL,EAAI,YAAY,CACZ,GAAIK,EAAO,GACX,MAAAC,EACA,IAAAC,EACA,SAAU,GACV,QAASF,EAAO,MAChB,SAAUA,EAAO,KACjB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAAC,EAEML,CACX,CAEA,OAAO,cAAcQ,EAA4D,CAC7E,OAAI,OAAOA,GAAU,SACVA,EAER,OAAOA,GAAU,aAAeA,EAAM,SAAW,EACzC,MAGJA,EACF,IAAIC,GAAKA,EAAE,SAAS,CAAC,EACrB,KAAK,GAAG,CACjB,CACJ","names":["ical","FitnessFirstIcalProxy","params","__async","courses","url","cal","ical","key","classes","day","course","start","end","value","v"]}
@@ -1,2 +1,2 @@
1
- var h=Object.create;var f=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var C=(n,e)=>{for(var r in e)f(n,r,{get:e[r],enumerable:!0})},u=(n,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of _(e))!y.call(n,t)&&t!==r&&f(n,t,{get:()=>e[t],enumerable:!(i=w(e,t))||i.enumerable});return n};var A=(n,e,r)=>(r=n!=null?h(b(n)):{},u(e||!n||!n.__esModule?f(r,"default",{value:n,enumerable:!0}):r,n)),R=n=>u(f({},"__esModule",{value:!0}),n);var d=(n,e,r)=>new Promise((i,t)=>{var s=l=>{try{o(r.next(l))}catch(c){t(c)}},a=l=>{try{o(r.throw(l))}catch(c){t(c)}},o=l=>l.done?i(l.value):Promise.resolve(l.value).then(s,a);o((r=r.apply(n,e)).next())});var T={};C(T,{default:()=>m});module.exports=R(T);var p=require("https"),g=A(require("ical-generator"),1);var m=class{static request(e){return d(this,null,function*(){let r=yield this.getCourses(e);return this.createCalendar(r)})}static getCourses(e){return d(this,null,function*(){let r="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),i=yield this.miniGet(r);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(i.data.classes).forEach(([t,s])=>{if(t.split("_",2)[1]==="sa"){let a={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(s)?i.data.classes[t]={before_noon:[a]}:(s.before_noon=s.before_noon||[],s.before_noon.push(a))}if(t.split("_",2)[1]==="th"){let a={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(s)?i.data.classes[t]={before_noon:[a]}:(s.before_noon=s.before_noon||[],s.before_noon.push(a))}}),i.data.classes})}static createCalendar(e){let r=(0,g.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([i,t])=>{let s=i.split("_")[0];(Array.isArray(t)?t:Object.values(t)).forEach(a=>{a.forEach(o=>{if(o.is_cancelled)return;let l=new Date(s+"T"+o.time.from+"Z"),c=new Date(s+"T"+o.time.to+"Z");r.createEvent({id:o.id,start:l,end:c,floating:!0,summary:o.title,location:o.club,url:o.url})})})}),r}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(r=>r.toString()).join("-")}static miniGet(e){return d(this,null,function*(){return new Promise((r,i)=>{(0,p.get)(e,t=>{let s=[];t.on("data",a=>{s.push(a)}),t.on("end",()=>{let a=String(Buffer.concat(s));if(t.statusCode!==200){i(new Error("Unable to get data: "+a));return}let o=JSON.parse(a);r(o)})}).on("error",t=>{i(t)})})})}};
1
+ var g=Object.create;var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var w=(s,t)=>{for(var e in t)l(s,e,{get:t[e],enumerable:!0})},f=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of h(t))!R.call(s,r)&&r!==e&&l(s,r,{get:()=>t[r],enumerable:!(i=C(t,r))||i.enumerable});return s};var b=(s,t,e)=>(e=s!=null?g(y(s)):{},f(t||!s||!s.__esModule?l(e,"default",{value:s,enumerable:!0}):e,s)),T=s=>f(l({},"__esModule",{value:!0}),s);var m=(s,t,e)=>new Promise((i,r)=>{var c=n=>{try{a(e.next(n))}catch(o){r(o)}},d=n=>{try{a(e.throw(n))}catch(o){r(o)}},a=n=>n.done?i(n.value):Promise.resolve(n.value).then(c,d);a((e=e.apply(s,t)).next())});var S={};w(S,{default:()=>p});module.exports=T(S);var u=b(require("ical-generator"),1);var p=class{static request(t){return m(this,null,function*(){let e=yield this.getCourses(t);return this.createCalendar(e)})}static getCourses(t){return m(this,null,function*(){let e="https://www.fitnessfirst.de/magicline/api/class-shedule/"+this.paramToString(t.club_id)+"/"+this.paramToString(t.category_id)+"/"+this.paramToString(t.class_id)+"/"+this.paramToString(t.daytime_id);return(yield(yield fetch(e)).json()).classes})}static createCalendar(t){let e=(0,u.default)({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(t).forEach(([i,r])=>{let c=i.split("_")[0];(Array.isArray(r)?r:Object.values(r)).forEach(d=>{d.forEach(a=>{let n=new Date(c+"T"+a.time.from+"Z"),o=new Date(c+"T"+a.time.to+"Z");e.createEvent({id:a.id,start:n,end:o,floating:!0,summary:a.title,location:a.club,url:a.url})})})}),e}static paramToString(t){return typeof t=="string"?t:typeof t=="undefined"||t.length===0?"all":t.map(e=>e.toString()).join("-")}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["lib_exports","__export","FitnessFirstIcalProxy","__toCommonJS","import_https","import_ical_generator","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","res","data","chunk","text","json","err"]}
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 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":"0vBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAAiB,+BAEjB,IAAqBC,EAArB,KAA2C,CACvC,OAAa,QAAQC,EAA8C,QAAAC,EAAA,sBAC/D,IAAMC,EAAU,MAAM,KAAK,WAAWF,CAAM,EAC5C,OAAO,KAAK,eAAeE,CAAO,CACtC,GAEA,OAAa,WAAWF,EAAiD,QAAAC,EAAA,sBACrE,IAAME,EAAM,2DACR,KAAK,cAAcH,EAAO,OAAO,EAAI,IACrC,KAAK,cAAcA,EAAO,WAAW,EAAI,IACzC,KAAK,cAAcA,EAAO,QAAQ,EAAI,IACtC,KAAK,cAAcA,EAAO,UAAU,EAIxC,OADiB,MADL,MAAM,MAAMG,CAAG,GACA,KAAK,GAChB,OACpB,GAEA,OAAO,eAAeD,EAAwC,CAC1D,IAAME,KAAM,EAAAC,SAAK,CACb,KAAM,gBACN,IAAK,MACL,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,CACJ,CAAC,EAED,cAAO,QAAQH,CAAO,EAAE,QAAQ,CAAC,CAACI,EAAKC,CAAO,IAAM,CAChD,IAAMC,EAAMF,EAAI,MAAM,GAAG,EAAE,CAAC,GAE3B,MAAM,QAAQC,CAAO,EAAIA,EAAU,OAAO,OAAOA,CAAO,GAAG,QAAQL,GAAW,CAC3EA,EAAQ,QAASO,GAA2B,CACxC,IAAMC,EAAQ,IAAI,KAAKF,EAAM,IAAMC,EAAO,KAAK,KAAO,GAAG,EACnDE,EAAM,IAAI,KAAKH,EAAM,IAAMC,EAAO,KAAK,GAAK,GAAG,EAErDL,EAAI,YAAY,CACZ,GAAIK,EAAO,GACX,MAAAC,EACA,IAAAC,EACA,SAAU,GACV,QAASF,EAAO,MAChB,SAAUA,EAAO,KACjB,IAAKA,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAAC,EAEML,CACX,CAEA,OAAO,cAAcQ,EAA4D,CAC7E,OAAI,OAAOA,GAAU,SACVA,EAER,OAAOA,GAAU,aAAeA,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","__async","courses","url","cal","ical","key","classes","day","course","start","end","value","v"]}
@@ -17,11 +17,8 @@ interface ResponseCourse {
17
17
  title: string;
18
18
  time: ResponseCourseTime;
19
19
  category: string;
20
- level: string;
21
20
  club: string;
22
21
  url: string | null;
23
- is_cancelled: boolean;
24
- is_changed: boolean;
25
22
  }
26
23
  interface ResponseCourseTime {
27
24
  from: string;
@@ -33,7 +30,6 @@ declare class FitnessFirstIcalProxy {
33
30
  static getCourses(params: RequestParams): Promise<ResponseClasses>;
34
31
  static createCalendar(courses: ResponseClasses): ICalCalendar;
35
32
  static paramToString(value: string | Array<string | number> | undefined): string;
36
- static miniGet<T>(url: string): Promise<T>;
37
33
  }
38
34
 
39
35
  export { FitnessFirstIcalProxy as default };
@@ -17,11 +17,8 @@ interface ResponseCourse {
17
17
  title: string;
18
18
  time: ResponseCourseTime;
19
19
  category: string;
20
- level: string;
21
20
  club: string;
22
21
  url: string | null;
23
- is_cancelled: boolean;
24
- is_changed: boolean;
25
22
  }
26
23
  interface ResponseCourseTime {
27
24
  from: string;
@@ -33,7 +30,6 @@ declare class FitnessFirstIcalProxy {
33
30
  static getCourses(params: RequestParams): Promise<ResponseClasses>;
34
31
  static createCalendar(courses: ResponseClasses): ICalCalendar;
35
32
  static paramToString(value: string | Array<string | number> | undefined): string;
36
- static miniGet<T>(url: string): Promise<T>;
37
33
  }
38
34
 
39
35
  export { FitnessFirstIcalProxy as default };
package/dist/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{b as a}from"../chunk-W72UDYJ6.js";export{a as default};
1
+ import{b as a}from"../chunk-R3IXB24A.js";export{a as default};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -13,19 +13,19 @@
13
13
  "description": "Small proxy that provides the course schedule from fitnessfirst.de/kurse as an iCal calendar.",
14
14
  "devDependencies": {
15
15
  "@qiwi/semantic-release-gh-pages-plugin": "^5.2.8",
16
- "@sebbo2002/semantic-release-docker": "^4.0.0",
16
+ "@sebbo2002/semantic-release-docker": "^4.0.1",
17
17
  "@semantic-release/changelog": "^6.0.3",
18
18
  "@semantic-release/exec": "^6.0.3",
19
19
  "@semantic-release/git": "^10.0.1",
20
- "@semantic-release/npm": "^10.0.4",
21
- "@types/express": "^4.17.17",
22
- "@types/mocha": "^10.0.1",
23
- "@types/node": "^20.5.1",
24
- "@typescript-eslint/eslint-plugin": "^6.2.1",
25
- "@typescript-eslint/parser": "^6.2.1",
20
+ "@semantic-release/npm": "^11.0.0",
21
+ "@types/express": "^4.17.18",
22
+ "@types/mocha": "^10.0.2",
23
+ "@types/node": "^20.6.3",
24
+ "@typescript-eslint/eslint-plugin": "^6.7.0",
25
+ "@typescript-eslint/parser": "^6.7.0",
26
26
  "c8": "^8.0.1",
27
- "eslint": "^8.47.0",
28
- "eslint-plugin-jsonc": "^2.9.0",
27
+ "eslint": "^8.51.0",
28
+ "eslint-plugin-jsonc": "^2.10.0",
29
29
  "esm": "^3.2.25",
30
30
  "license-checker": "^25.0.1",
31
31
  "mocha": "^10.2.0",
@@ -35,11 +35,11 @@
35
35
  "source-map-support": "^0.5.21",
36
36
  "ts-node": "^10.9.1",
37
37
  "tsup": "^7.2.0",
38
- "typedoc": "^0.24.8",
39
- "typescript": "^5.1.5"
38
+ "typedoc": "^0.25.2",
39
+ "typescript": "^5.2.2"
40
40
  },
41
41
  "engines": {
42
- "node": "^16.0.0 || >=18.0.0"
42
+ "node": ">=18.0.0"
43
43
  },
44
44
  "exports": {
45
45
  "import": "./dist/lib/index.js",
@@ -68,5 +68,5 @@
68
68
  "test": "mocha"
69
69
  },
70
70
  "type": "module",
71
- "version": "4.0.2-develop.3"
71
+ "version": "5.0.0-develop.2"
72
72
  }
@@ -1,2 +0,0 @@
1
- var c=(d,e,n)=>new Promise((a,t)=>{var r=o=>{try{i(n.next(o))}catch(l){t(l)}},s=o=>{try{i(n.throw(o))}catch(l){t(l)}},i=o=>o.done?a(o.value):Promise.resolve(o.value).then(r,s);i((n=n.apply(d,e)).next())});import{get as m}from"https";import u from"ical-generator";var f=class{static request(e){return c(this,null,function*(){let n=yield this.getCourses(e);return this.createCalendar(n)})}static getCourses(e){return c(this,null,function*(){let n="https://www.fitnessfirst.de/kurse/kursplan/search/"+this.paramToString(e.club_id)+"/"+this.paramToString(e.category_id)+"/"+this.paramToString(e.class_id)+"/"+this.paramToString(e.daytime_id),a=yield this.miniGet(n);return e.club_id==="0115"&&(e.category_id==="431"||!e.category_id)&&Object.entries(a.data.classes).forEach(([t,r])=>{if(t.split("_",2)[1]==="sa"){let s={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"09:00:00",to:"12:15:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(r)?a.data.classes[t]={before_noon:[s]}:(r.before_noon=r.before_noon||[],r.before_noon.push(s))}if(t.split("_",2)[1]==="th"){let s={id:`kinderschwimmen-${t}`,title:"Kinderschwimmen",time:{from:"15:00:00",to:"16:30:00"},category:"Aqua",categoryIcon:"https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png",level:"Alle",club:"Berlin - Gendarmenmarkt",url:"https://www.fitnessfirst.de/news/kinderschwimmen-1635593849",calendarUrl:null,is_cancelled:!1,is_changed:!1};Array.isArray(r)?a.data.classes[t]={before_noon:[s]}:(r.before_noon=r.before_noon||[],r.before_noon.push(s))}}),a.data.classes})}static createCalendar(e){let n=u({name:"Fitness First",ttl:21600,prodId:{company:"sebbo.net",product:"fitness-first-ical-proxy"}});return Object.entries(e).forEach(([a,t])=>{let r=a.split("_")[0];(Array.isArray(t)?t:Object.values(t)).forEach(s=>{s.forEach(i=>{if(i.is_cancelled)return;let o=new Date(r+"T"+i.time.from+"Z"),l=new Date(r+"T"+i.time.to+"Z");n.createEvent({id:i.id,start:o,end:l,floating:!0,summary:i.title,location:i.club,url:i.url})})})}),n}static paramToString(e){return typeof e=="string"?e:typeof e=="undefined"||e.length===0?"all":e.map(n=>n.toString()).join("-")}static miniGet(e){return c(this,null,function*(){return new Promise((n,a)=>{m(e,t=>{let r=[];t.on("data",s=>{r.push(s)}),t.on("end",()=>{let s=String(Buffer.concat(r));if(t.statusCode!==200){a(new Error("Unable to get data: "+s));return}let i=JSON.parse(s);n(i)})}).on("error",t=>{a(t)})})})}};export{c as a,f as b};
2
- //# sourceMappingURL=chunk-W72UDYJ6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/index.ts"],"sourcesContent":["import { get } from 'https';\nimport { RequestParams, Response, ResponseClasses, ResponseCourse } from './types.js';\nimport type { ICalCalendar } from 'ical-generator';\nimport ical from 'ical-generator';\n\nexport default class FitnessFirstIcalProxy {\n static async request(params: RequestParams): Promise<ICalCalendar> {\n const courses = await this.getCourses(params);\n return this.createCalendar(courses);\n }\n\n static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n const url = 'https://www.fitnessfirst.de/kurse/kursplan/search/' +\n this.paramToString(params.club_id) + '/' +\n this.paramToString(params.category_id) + '/' +\n this.paramToString(params.class_id) + '/' +\n this.paramToString(params.daytime_id);\n\n const response = await this.miniGet<Response>(url);\n\n // Kinderschwimmen @ Gendarmenmarkt\n if (params.club_id === '0115' && (params.category_id === '431' || !params.category_id)) {\n Object.entries(response.data.classes).forEach(([key, classes]) => {\n if (key.split('_', 2)[1] === 'sa') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '09:00:00',\n to: '12:15:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n if (key.split('_', 2)[1] === 'th') {\n const event = {\n id: `kinderschwimmen-${key}`,\n title: 'Kinderschwimmen',\n time: {\n from: '15:00:00',\n to: '16:30:00'\n },\n category: 'Aqua',\n categoryIcon: 'https://www.fitnessfirst.de/sites/g/files/tbchtk201/files/2020-10/fitness-first-kurse-special.png',\n level: 'Alle',\n club: 'Berlin - Gendarmenmarkt',\n url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n calendarUrl: null,\n is_cancelled: false,\n is_changed: false\n };\n\n if (Array.isArray(classes)) {\n response.data.classes[key] = {\n before_noon: [\n event\n ]\n };\n } else {\n classes.before_noon = classes.before_noon || [];\n classes.before_noon.push(event);\n }\n }\n });\n }\n\n return response.data.classes;\n }\n\n static createCalendar(courses: ResponseClasses): ICalCalendar {\n const cal = ical({\n name: 'Fitness First',\n ttl: 60 * 60 * 6,\n prodId: {\n company: 'sebbo.net',\n product: 'fitness-first-ical-proxy'\n }\n });\n\n Object.entries(courses).forEach(([key, classes]) => {\n const day = key.split('_')[0];\n\n (Array.isArray(classes) ? classes : Object.values(classes)).forEach(courses => {\n courses.forEach((course: ResponseCourse) => {\n if (course.is_cancelled) {\n return;\n }\n\n const start = new Date(day + 'T' + course.time.from + 'Z');\n const end = new Date(day + 'T' + course.time.to + 'Z');\n\n cal.createEvent({\n id: course.id,\n start,\n end,\n floating: true,\n summary: course.title,\n location: course.club,\n url: course.url\n });\n });\n });\n });\n\n return cal;\n }\n\n static paramToString(value: string | Array<string | number> | undefined): string {\n if (typeof value === 'string') {\n return value;\n }\n if(typeof value === 'undefined' || value.length === 0) {\n return 'all';\n }\n\n return value\n .map(v => v.toString())\n .join('-');\n }\n\n static async miniGet<T>(url: string): Promise<T> {\n return new Promise((resolve, reject) => {\n get(url, res => {\n const data: Uint8Array[] = [];\n\n res.on('data', chunk => {\n data.push(chunk);\n });\n\n res.on('end', () => {\n const text = String(Buffer.concat(data));\n if (res.statusCode !== 200) {\n reject(new Error('Unable to get data: ' + text));\n return;\n }\n\n const json = JSON.parse(text) as T;\n resolve(json);\n });\n }).on('error', err => {\n reject(err);\n });\n });\n }\n}\n"],"mappings":"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","names":["get","ical","FitnessFirstIcalProxy","params","__async","courses","url","response","key","classes","event","cal","ical","day","course","start","end","value","v","resolve","reject","get","res","data","chunk","text","json","err"]}