Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Hilfe bei Strukturierung von Klassen in TypeScript

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

Hilfe bei Strukturierung von Klassen in TypeScript

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
29 Beiträge 6 Kommentatoren 1.9k Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • U Offline
    U Offline
    uwe72
    schrieb am zuletzt editiert von uwe72
    #1

    Angenommen ich habe in common 2 Dateien:

    Datei 1:

    class A {
    }
    

    Datei 2:

    class B {
    }
    

    Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann. Das möchte ich aber nicht. Möchte auf gleicher Ebene Klassen referenzieren, so wie dies z.B. in Java möglich ist.

    Datei 3:

    var myArray = [];
    myArray.push(new A());
    myArray.push(new B());
    

    Kann mir hier bitte jemand helfen?

    AlCalzoneA 1 Antwort Letzte Antwort
    0
    • U uwe72

      Angenommen ich habe in common 2 Dateien:

      Datei 1:

      class A {
      }
      

      Datei 2:

      class B {
      }
      

      Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann. Das möchte ich aber nicht. Möchte auf gleicher Ebene Klassen referenzieren, so wie dies z.B. in Java möglich ist.

      Datei 3:

      var myArray = [];
      myArray.push(new A());
      myArray.push(new B());
      

      Kann mir hier bitte jemand helfen?

      AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #2

      @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

      Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann.

      Geht nicht direkt im Skript-Editor wenn du global vermeiden willst. Packe alles in ein einzelnes Skript oder lagere die gemeinsamen Dinge wie die Klassen in externe Module (Dateien) aus, die du auf der Platte in einem Ordner ablegst, der für den Nutzer iobroker lesbar ist. Die kannst du dann per require("/pfad/zur/datei.js") laden.

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      U ScroungerS 3 Antworten Letzte Antwort
      0
      • AlCalzoneA AlCalzone

        @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

        Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann.

        Geht nicht direkt im Skript-Editor wenn du global vermeiden willst. Packe alles in ein einzelnes Skript oder lagere die gemeinsamen Dinge wie die Klassen in externe Module (Dateien) aus, die du auf der Platte in einem Ordner ablegst, der für den Nutzer iobroker lesbar ist. Die kannst du dann per require("/pfad/zur/datei.js") laden.

        U Offline
        U Offline
        uwe72
        schrieb am zuletzt editiert von
        #3

        @alcalzone Perfekt, danke erst einmal. Werde ich heute Abend ausprobieren!

        1 Antwort Letzte Antwort
        0
        • AlCalzoneA AlCalzone

          @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

          Wie kann ich in einer dritten Datei die Klassen A und B einbinden? Ich weiß, dass ich A und B in global verschieben kann.

          Geht nicht direkt im Skript-Editor wenn du global vermeiden willst. Packe alles in ein einzelnes Skript oder lagere die gemeinsamen Dinge wie die Klassen in externe Module (Dateien) aus, die du auf der Platte in einem Ordner ablegst, der für den Nutzer iobroker lesbar ist. Die kannst du dann per require("/pfad/zur/datei.js") laden.

          U Offline
          U Offline
          uwe72
          schrieb am zuletzt editiert von
          #4

          @alcalzone Darf ich nachfragen, ob Du eine Idee hast was ich falsch mache?

          Eine Test-Klasse habe ich den Datei test.ts abgelegt:
          7bf80605-84f5-4b2d-9096-8fb248e7a10e-image.png

          Fehlermeldung kommt dann, dass Datei nicht gefunden werden kann:
          8e80e1d2-3d15-4b32-8ca0-fa91f134f083-image.png

          F 1 Antwort Letzte Antwort
          0
          • U uwe72

            @alcalzone Darf ich nachfragen, ob Du eine Idee hast was ich falsch mache?

            Eine Test-Klasse habe ich den Datei test.ts abgelegt:
            7bf80605-84f5-4b2d-9096-8fb248e7a10e-image.png

            Fehlermeldung kommt dann, dass Datei nicht gefunden werden kann:
            8e80e1d2-3d15-4b32-8ca0-fa91f134f083-image.png

            F Offline
            F Offline
            fastfoot
            schrieb am zuletzt editiert von
            #5

            @uwe72 absolute Pfade funktionieren nicht, mache es so: ../my-scripts/test.ts

            iobroker läuft unter Docker auf QNAP TS-451+
            SkriptRecovery: https://forum.iobroker.net/post/930558

            U 1 Antwort Letzte Antwort
            1
            • F fastfoot

              @uwe72 absolute Pfade funktionieren nicht, mache es so: ../my-scripts/test.ts

              U Offline
              U Offline
              uwe72
              schrieb am zuletzt editiert von
              #6

              @fastfoot sieht besser aus:
              d0fd4228-b29f-47f9-96f0-4cc377c193f3-image.png

              Aber irgendwie kann nichts geladen werden?

              F 1 Antwort Letzte Antwort
              0
              • U uwe72

                @fastfoot sieht besser aus:
                d0fd4228-b29f-47f9-96f0-4cc377c193f3-image.png

                Aber irgendwie kann nichts geladen werden?

                F Offline
                F Offline
                fastfoot
                schrieb am zuletzt editiert von
                #7

                @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                Aber irgendwie kann nichts geladen werden?

                heißt deine Function nicht getResult()?

                iobroker läuft unter Docker auf QNAP TS-451+
                SkriptRecovery: https://forum.iobroker.net/post/930558

                U 1 Antwort Letzte Antwort
                0
                • F fastfoot

                  @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                  Aber irgendwie kann nichts geladen werden?

                  heißt deine Function nicht getResult()?

                  U Offline
                  U Offline
                  uwe72
                  schrieb am zuletzt editiert von uwe72
                  #8

                  @fastfoot

                  Ja, meine Funktion heißt schon so. Meiner Meinung nach komme ich leider gar nicht so weit diese Funktion/Methode aufzurufen.

                  require liefert irgendwie nichts zurück. Das File (test.ts) wird aber nun grundsätzlich gefunden.

                  Als ehemaliger Java-Entwickler 😉 würde ich so was in der Art schreiben:

                  634d028b-2be0-4e0c-9b4a-f6885dfaa9be-image.png

                  Kommen aber viele Fehler:
                  d73c6751-1e1a-44b7-bc8c-d56d87fc14ff-image.png

                  F AlCalzoneA 2 Antworten Letzte Antwort
                  0
                  • U uwe72

                    @fastfoot

                    Ja, meine Funktion heißt schon so. Meiner Meinung nach komme ich leider gar nicht so weit diese Funktion/Methode aufzurufen.

                    require liefert irgendwie nichts zurück. Das File (test.ts) wird aber nun grundsätzlich gefunden.

                    Als ehemaliger Java-Entwickler 😉 würde ich so was in der Art schreiben:

                    634d028b-2be0-4e0c-9b4a-f6885dfaa9be-image.png

                    Kommen aber viele Fehler:
                    d73c6751-1e1a-44b7-bc8c-d56d87fc14ff-image.png

                    F Offline
                    F Offline
                    fastfoot
                    schrieb am zuletzt editiert von
                    #9

                    @uwe72 wenn du ein js importierst dann klappt es, allerdings fehlen ja dann die Vorteile von Typescript. Ich denke das importierte ts Modul wird als js behandelt, was dann natürlich fehlschlägt. Es wird aber schon Zeile 2 des imports moniert, ohne weitere Hinweise

                    Sind aber Mutmaßungen, kenne TS nicht wirklich. Mit importierter js ist aber getestet

                    iobroker läuft unter Docker auf QNAP TS-451+
                    SkriptRecovery: https://forum.iobroker.net/post/930558

                    U 1 Antwort Letzte Antwort
                    0
                    • F fastfoot

                      @uwe72 wenn du ein js importierst dann klappt es, allerdings fehlen ja dann die Vorteile von Typescript. Ich denke das importierte ts Modul wird als js behandelt, was dann natürlich fehlschlägt. Es wird aber schon Zeile 2 des imports moniert, ohne weitere Hinweise

                      Sind aber Mutmaßungen, kenne TS nicht wirklich. Mit importierter js ist aber getestet

                      U Offline
                      U Offline
                      uwe72
                      schrieb am zuletzt editiert von uwe72
                      #10

                      @fastfoot Danke dir für deine Unterstützung. Denke dafür ist iobroker nicht ausgelegt. Es geht ja definitiv auch ohne! Werde alles in einer TypeScript-Datei lassen und gut ist es.

                      Komme halt aus der Java-Welt und da sehne ich mich nach ein wenig nach mehr Struktur 🙂

                      Danke nochmals und Grüße!
                      Uwe

                      F 1 Antwort Letzte Antwort
                      0
                      • U uwe72

                        @fastfoot Danke dir für deine Unterstützung. Denke dafür ist iobroker nicht ausgelegt. Es geht ja definitiv auch ohne! Werde alles in einer TypeScript-Datei lassen und gut ist es.

                        Komme halt aus der Java-Welt und da sehne ich mich nach ein wenig nach mehr Struktur 🙂

                        Danke nochmals und Grüße!
                        Uwe

                        F Offline
                        F Offline
                        fastfoot
                        schrieb am zuletzt editiert von
                        #11

                        @uwe72 Schnupper halt rein, und wenn dir die Möglichkeiten nicht ausreichen dann kannst Du dich ja an einen Adapter wagen, da geht dann alles 🙂 Die Scriptumgebung ist schon sehr cool, aber Anwendungen wie Deine finden sich hier tatsächlich sehr, sehr wenige. Ist wohl mit ein Grund warum das nicht zu 100% klappt mit den Imports. Mir persönlich reicht da auch pure JS, mich hat bei den require tests schon die compilation time für TS genervt 🙂 Und bei den imports muss die Instanz neu gestartet werden damit Änderungen erkannt werden, auch das ist lästig weshalb ich es auch mit JS gar nicht nutze. Das ist aber kein Manko des iobroker, finde ich, schließlich ist das ein iot System.

                        iobroker läuft unter Docker auf QNAP TS-451+
                        SkriptRecovery: https://forum.iobroker.net/post/930558

                        U 1 Antwort Letzte Antwort
                        1
                        • F fastfoot

                          @uwe72 Schnupper halt rein, und wenn dir die Möglichkeiten nicht ausreichen dann kannst Du dich ja an einen Adapter wagen, da geht dann alles 🙂 Die Scriptumgebung ist schon sehr cool, aber Anwendungen wie Deine finden sich hier tatsächlich sehr, sehr wenige. Ist wohl mit ein Grund warum das nicht zu 100% klappt mit den Imports. Mir persönlich reicht da auch pure JS, mich hat bei den require tests schon die compilation time für TS genervt 🙂 Und bei den imports muss die Instanz neu gestartet werden damit Änderungen erkannt werden, auch das ist lästig weshalb ich es auch mit JS gar nicht nutze. Das ist aber kein Manko des iobroker, finde ich, schließlich ist das ein iot System.

                          U Offline
                          U Offline
                          uwe72
                          schrieb am zuletzt editiert von
                          #12

                          @fastfoot richtig, kein Manko des iobrokers. Iobroker ist richtig klasse!

                          1 Antwort Letzte Antwort
                          0
                          • XenonX Offline
                            XenonX Offline
                            Xenon
                            Forum Testing Developer
                            schrieb am zuletzt editiert von
                            #13

                            ich häng mich mal dran:

                            Bei mir findet er nicht mal das Modul, obwohl ich keinen relativen Pfad nutze, er sucht auch wieder im node_modules Ordner...
                            Datei liegt unter : /opt/test/class.js

                            const test = require ('../test/class.js')
                            
                            	error	javascript.2 (24913) script.js.common.test.importTest: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../../test/class.js'
                            

                            wenn euch mein Beitrag geholfen hat, bewertet ihn bitte unten rechts :)

                            U 1 Antwort Letzte Antwort
                            0
                            • XenonX Xenon

                              ich häng mich mal dran:

                              Bei mir findet er nicht mal das Modul, obwohl ich keinen relativen Pfad nutze, er sucht auch wieder im node_modules Ordner...
                              Datei liegt unter : /opt/test/class.js

                              const test = require ('../test/class.js')
                              
                              	error	javascript.2 (24913) script.js.common.test.importTest: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../../test/class.js'
                              
                              U Offline
                              U Offline
                              uwe72
                              schrieb am zuletzt editiert von
                              #14

                              @xenon bei mir war dies auch lange so, trotz relativem Pfad. Mir ist bis heute nicht klar, warum dann die Fehlermeldung auf einmal weg war. Ggf. musst Du den Adapter neu starten? Ich weiß es nicht.

                              Mir ist bei dir auch nicht klar: Du hast ein TypeScript oder ein JS? Da Dateiname (class) auf TS hinweist und die Endung der Datei auf JS. Wie sieht der Inhalt von class.js aus?

                              1 Antwort Letzte Antwort
                              0
                              • U uwe72

                                @fastfoot

                                Ja, meine Funktion heißt schon so. Meiner Meinung nach komme ich leider gar nicht so weit diese Funktion/Methode aufzurufen.

                                require liefert irgendwie nichts zurück. Das File (test.ts) wird aber nun grundsätzlich gefunden.

                                Als ehemaliger Java-Entwickler 😉 würde ich so was in der Art schreiben:

                                634d028b-2be0-4e0c-9b4a-f6885dfaa9be-image.png

                                Kommen aber viele Fehler:
                                d73c6751-1e1a-44b7-bc8c-d56d87fc14ff-image.png

                                AlCalzoneA Offline
                                AlCalzoneA Offline
                                AlCalzone
                                Developer
                                schrieb am zuletzt editiert von
                                #15

                                @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                                Da Dateiname (class) auf TS hinweist

                                Wieso weist das auf TS hin? class ist seit ES6 ein JS-Feature.

                                Ich blicke nicht ganz ob ihr das Problem schon gelöst habt, aber hast du schon die import-Syntax versucht?

                                import { Test } from "../pfad/zum/skript";
                                const myInstance = new Test(3, 5);
                                //...
                                

                                Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in /opt/iobroker/node_modules/iobroker.javascript/lib liegt. Deshalb zeigt @Xenon's Import auch auf /opt/iobroker/test/class.js und nicht dahin wo die Datei wirklich liegt.

                                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                XenonX 1 Antwort Letzte Antwort
                                0
                                • AlCalzoneA AlCalzone

                                  @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                                  Da Dateiname (class) auf TS hinweist

                                  Wieso weist das auf TS hin? class ist seit ES6 ein JS-Feature.

                                  Ich blicke nicht ganz ob ihr das Problem schon gelöst habt, aber hast du schon die import-Syntax versucht?

                                  import { Test } from "../pfad/zum/skript";
                                  const myInstance = new Test(3, 5);
                                  //...
                                  

                                  Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in /opt/iobroker/node_modules/iobroker.javascript/lib liegt. Deshalb zeigt @Xenon's Import auch auf /opt/iobroker/test/class.js und nicht dahin wo die Datei wirklich liegt.

                                  XenonX Offline
                                  XenonX Offline
                                  Xenon
                                  Forum Testing Developer
                                  schrieb am zuletzt editiert von
                                  #16

                                  @alcalzone sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                                  Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in /opt/iobroker/node_modules/iobroker.javascript/lib liegt. Deshalb zeigt @Xenon's Import auch auf /opt/iobroker/test/class.js und nicht dahin wo die Datei wirklich liegt.

                                  Das bedeutet nun genau? Wenn die Datei unter opt/iobroker/test/class.js liegt, was muss ich dann im import angeben, damit er nicht in den node_modules sucht?

                                  wenn euch mein Beitrag geholfen hat, bewertet ihn bitte unten rechts :)

                                  AlCalzoneA 1 Antwort Letzte Antwort
                                  0
                                  • XenonX Xenon

                                    @alcalzone sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                                    Abgesehen davon müssen relative Pfade relativ zum sandbox.js-Modul vom Adapter sein, welches in /opt/iobroker/node_modules/iobroker.javascript/lib liegt. Deshalb zeigt @Xenon's Import auch auf /opt/iobroker/test/class.js und nicht dahin wo die Datei wirklich liegt.

                                    Das bedeutet nun genau? Wenn die Datei unter opt/iobroker/test/class.js liegt, was muss ich dann im import angeben, damit er nicht in den node_modules sucht?

                                    AlCalzoneA Offline
                                    AlCalzoneA Offline
                                    AlCalzone
                                    Developer
                                    schrieb am zuletzt editiert von
                                    #17

                                    @xenon Von /opt/iobroker/node_modules/iobroker.javascript/lib ausgehend ist /opt/test/class.js unter dem relativen Pfad ../../../../test/class.js zu finden.

                                    Hier als Beispiel mal mit /home/iobroker/test.js:
                                    11e3f836-55c6-47bb-8089-9656b5d8dd46-grafik.png

                                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                    U XenonX 2 Antworten Letzte Antwort
                                    1
                                    • AlCalzoneA AlCalzone

                                      @xenon Von /opt/iobroker/node_modules/iobroker.javascript/lib ausgehend ist /opt/test/class.js unter dem relativen Pfad ../../../../test/class.js zu finden.

                                      Hier als Beispiel mal mit /home/iobroker/test.js:
                                      11e3f836-55c6-47bb-8089-9656b5d8dd46-grafik.png

                                      U Offline
                                      U Offline
                                      uwe72
                                      schrieb am zuletzt editiert von uwe72
                                      #18

                                      @alcalzone said in Hilfe bei Strukturierung von Klassen in TypeScript:

                                      /opt/iobroker/node_modules/iobroker.javascript/lib

                                      Ich bin zu doof dafür 😞

                                      599e4971-29f5-4966-ab10-2b0772ee3c27-image.png

                                      Update: Habe nun das Mirror-Verzeichnis rausgenommen (weiß nicht ob es wirklich damit zusammen hängt), funktioniert nun aber:
                                      8d4a7a6e-935f-4f18-9d21-60c8dbfe3e8e-image.png

                                      F 1 Antwort Letzte Antwort
                                      0
                                      • U uwe72

                                        @alcalzone said in Hilfe bei Strukturierung von Klassen in TypeScript:

                                        /opt/iobroker/node_modules/iobroker.javascript/lib

                                        Ich bin zu doof dafür 😞

                                        599e4971-29f5-4966-ab10-2b0772ee3c27-image.png

                                        Update: Habe nun das Mirror-Verzeichnis rausgenommen (weiß nicht ob es wirklich damit zusammen hängt), funktioniert nun aber:
                                        8d4a7a6e-935f-4f18-9d21-60c8dbfe3e8e-image.png

                                        F Offline
                                        F Offline
                                        fastfoot
                                        schrieb am zuletzt editiert von
                                        #19

                                        @uwe72 sagte in Hilfe bei Strukturierung von Klassen in TypeScript:

                                        Update: Habe nun das Mirror-Verzeichnis rausgenommen (weiß nicht ob es wirklich damit zusammen hängt), funktioniert nun aber:

                                        upps, das ist mir gar nicht aufgefallen dass da ein Unterschied ist. Aber an der Fehlermeldung kannst du es auch sehen, da stehen 5 x ../, also brauchst du im require nur 1x ../ so wie ich es schon mal gepostet hatte. Mir war es aber früher mal nicht gelungen unterhalb von /opt/iobroker zu kommen, das werde ich mal noch ohne mirror probieren

                                        iobroker läuft unter Docker auf QNAP TS-451+
                                        SkriptRecovery: https://forum.iobroker.net/post/930558

                                        1 Antwort Letzte Antwort
                                        0
                                        • AlCalzoneA Offline
                                          AlCalzoneA Offline
                                          AlCalzone
                                          Developer
                                          schrieb am zuletzt editiert von
                                          #20

                                          Ich bin mir nicht sicher, was Mirror damit zu tun haben soll. Alle Skripte laufen in einer Sandbox, die sich in /opt/iobroker/node_modules/iobroker.javascript/lib befindet. Von dort aus werden alle requires aufgelöst.

                                          Aber an der Fehlermeldung kannst du es auch sehen, da stehen 5 x ../, also brauchst du im require nur 1x ../ so wie ich es schon mal gepostet hatte

                                          Die Fehlermeldung ist irreführend. Der JS-Adapter versucht erst den gegebenen Pfad und wenn das schief läuft hängt er vorne noch ../../ an. Das wird dann geloggt.

                                          @uwe72 Du scheinst Docker zu verwenden. Welchen (absoluten) Pfad hat denn dein Test-Skript innerhalb Docker?

                                          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          298

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe