@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.
- package/dist/bin/start.cjs +1 -1
- package/dist/bin/start.cjs.map +1 -1
- package/dist/bin/start.js +1 -1
- package/dist/chunk-R3IXB24A.js +2 -0
- package/dist/chunk-R3IXB24A.js.map +1 -0
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.d.cts +0 -4
- package/dist/lib/index.d.ts +0 -4
- package/dist/lib/index.js +1 -1
- package/package.json +13 -13
- package/dist/chunk-W72UDYJ6.js +0 -2
- package/dist/chunk-W72UDYJ6.js.map +0 -1
package/dist/bin/start.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
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
|
package/dist/bin/start.cjs.map
CHANGED
|
@@ -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-
|
|
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"]}
|
package/dist/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
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
|
package/dist/lib/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["import {
|
|
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"]}
|
package/dist/lib/index.d.cts
CHANGED
|
@@ -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.d.ts
CHANGED
|
@@ -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-
|
|
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.
|
|
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": "^
|
|
21
|
-
"@types/express": "^4.17.
|
|
22
|
-
"@types/mocha": "^10.0.
|
|
23
|
-
"@types/node": "^20.
|
|
24
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
25
|
-
"@typescript-eslint/parser": "^6.
|
|
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.
|
|
28
|
-
"eslint-plugin-jsonc": "^2.
|
|
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.
|
|
39
|
-
"typescript": "^5.
|
|
38
|
+
"typedoc": "^0.25.2",
|
|
39
|
+
"typescript": "^5.2.2"
|
|
40
40
|
},
|
|
41
41
|
"engines": {
|
|
42
|
-
"node": "
|
|
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": "
|
|
71
|
+
"version": "5.0.0-develop.2"
|
|
72
72
|
}
|
package/dist/chunk-W72UDYJ6.js
DELETED
|
@@ -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"]}
|