From b0e29ddf59501c545fe8c2c967e010ccc721b787 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 30 Aug 2022 23:59:52 +0100 Subject: [PATCH 001/286] Nicer implementation of application start/stop --- nas.yml | 7 -- roles/airsonic/handlers/main.yml | 9 -- roles/airsonic/tasks/main.yml | 66 +++++++------ roles/bazarr/handlers/main.yml | 9 -- roles/bazarr/tasks/main.yml | 70 +++++++------ roles/bitwarden/handlers/main.yml | 18 ---- roles/bitwarden/tasks/main.yml | 113 +++++++++++---------- roles/booksonic/handlers/main.yml | 9 -- roles/booksonic/tasks/main.yml | 76 +++++++------- roles/calibre/handlers/main.yml | 9 -- roles/calibre/tasks/main.yml | 70 +++++++------ roles/cloudcmd/handlers/main.yml | 9 -- roles/cloudcmd/tasks/main.yml | 66 +++++++------ roles/cloudflare_ddns/handlers/main.yml | 9 -- roles/cloudflare_ddns/tasks/main.yml | 56 ++++++----- roles/code-server/handlers/main.yml | 9 -- roles/code-server/tasks/main.yml | 58 ++++++----- roles/gitea/handlers/main.yml | 18 ---- roles/gitea/tasks/main.yml | 125 +++++++++++++----------- 19 files changed, 391 insertions(+), 415 deletions(-) delete mode 100644 roles/airsonic/handlers/main.yml delete mode 100644 roles/bazarr/handlers/main.yml delete mode 100644 roles/bitwarden/handlers/main.yml delete mode 100644 roles/booksonic/handlers/main.yml delete mode 100644 roles/calibre/handlers/main.yml delete mode 100644 roles/cloudcmd/handlers/main.yml delete mode 100644 roles/cloudflare_ddns/handlers/main.yml delete mode 100644 roles/code-server/handlers/main.yml diff --git a/nas.yml b/nas.yml index e7401f9773..58920e26f1 100644 --- a/nas.yml +++ b/nas.yml @@ -451,10 +451,3 @@ tags: - znc when: (znc_enabled | default(False)) - - post_tasks: - - name: Clean up stopped applications # noqa no-changed-when - command: /bin/true - notify: "stop disabled applications" - tags: - - stop_disabled_applications diff --git a/roles/airsonic/handlers/main.yml b/roles/airsonic/handlers/main.yml deleted file mode 100644 index 69dbec17f1..0000000000 --- a/roles/airsonic/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Airsonic - docker_container: - name: "{{ airsonic_container_name }}" - state: absent - when: airsonic_enabled is false - listen: - - "stop airsonic" - - "stop disabled applications" diff --git a/roles/airsonic/tasks/main.yml b/roles/airsonic/tasks/main.yml index 34e3e1f2e1..cb89902633 100644 --- a/roles/airsonic/tasks/main.yml +++ b/roles/airsonic/tasks/main.yml @@ -1,33 +1,41 @@ --- -- name: Airsonic +- name: Start Airsonic block: - - name: Create Airsonic Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ airsonic_data_directory }}/data" - - "{{ airsonic_data_directory }}/playlists" + - name: Create Airsonic Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ airsonic_data_directory }}/data" + - "{{ airsonic_data_directory }}/playlists" - - name: Airsonic Docker Container - docker_container: - name: "{{ airsonic_container_name }}" - image: airsonic/airsonic:latest - pull: true - volumes: - - "{{ airsonic_data_directory }}/data:/airsonic/data:rw" - - "{{ airsonic_data_directory }}/playlists:/airsonic/playlists:rw" - - "{{ airsonic_music_directory }}:/airsonic/music:rw" - - "{{ airsonic_podcasts_directory }}:/airsonic/podcasts:rw" - ports: - - "{{ airsonic_port }}:4040" - restart_policy: unless-stopped - memory: "{{ airsonic_memory }}" - labels: - traefik.enable: "{{ airsonic_available_externally | string }}" - traefik.http.routers.airsonic.rule: "Host(`{{ airsonic_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.airsonic.tls.certresolver: "letsencrypt" - traefik.http.routers.airsonic.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.airsonic.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.airsonic.loadbalancer.server.port: "4040" + - name: Airsonic Docker Container + docker_container: + name: "{{ airsonic_container_name }}" + image: airsonic/airsonic:latest + pull: true + volumes: + - "{{ airsonic_data_directory }}/data:/airsonic/data:rw" + - "{{ airsonic_data_directory }}/playlists:/airsonic/playlists:rw" + - "{{ airsonic_music_directory }}:/airsonic/music:rw" + - "{{ airsonic_podcasts_directory }}:/airsonic/podcasts:rw" + ports: + - "{{ airsonic_port }}:4040" + restart_policy: unless-stopped + memory: "{{ airsonic_memory }}" + labels: + traefik.enable: "{{ airsonic_available_externally | string }}" + traefik.http.routers.airsonic.rule: "Host(`{{ airsonic_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.airsonic.tls.certresolver: "letsencrypt" + traefik.http.routers.airsonic.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.airsonic.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.airsonic.loadbalancer.server.port: "4040" when: airsonic_enabled is true + +- name: Stop Airsonic + block: + - name: Stop Airsonic + docker_container: + name: "{{ airsonic_container_name }}" + state: absent + when: airsonic_enabled is false diff --git a/roles/bazarr/handlers/main.yml b/roles/bazarr/handlers/main.yml deleted file mode 100644 index 65ea469fb5..0000000000 --- a/roles/bazarr/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Bazarr - docker_container: - name: "{{ bazarr_container_name }}" - state: absent - when: bazarr_enabled is false - listen: - - "stop bazarr" - - "stop disabled applications" diff --git a/roles/bazarr/tasks/main.yml b/roles/bazarr/tasks/main.yml index 92a7d0d223..71d838c1e5 100644 --- a/roles/bazarr/tasks/main.yml +++ b/roles/bazarr/tasks/main.yml @@ -1,35 +1,43 @@ --- -- name: Bazarr +- name: Start Bazarr block: - - name: Create Bazarr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ bazarr_data_directory }}" + - name: Create Bazarr Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ bazarr_data_directory }}" - - name: Bazarr - docker_container: - name: "{{ bazarr_container_name }}" - image: linuxserver/bazarr - pull: true - volumes: - - "{{ bazarr_tv_directory }}:/tv:rw" - - "{{ bazarr_movies_directory }}:/movies:rw" - - "{{ bazarr_data_directory }}:/config:rw" - ports: - - "{{ bazarr_port }}:6767" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ bazarr_user_id }}" - PGID: "{{ bazarr_group_id }}" - restart_policy: unless-stopped - memory: "{{ bazarr_memory }}" - labels: - traefik.enable: "{{ bazarr_available_externally | string }}" - traefik.http.routers.bazarr.rule: "Host(`{{ bazarr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.bazarr.tls.certresolver: "letsencrypt" - traefik.http.routers.bazarr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.bazarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.bazarr.loadbalancer.server.port: "6767" + - name: Bazarr + docker_container: + name: "{{ bazarr_container_name }}" + image: linuxserver/bazarr + pull: true + volumes: + - "{{ bazarr_tv_directory }}:/tv:rw" + - "{{ bazarr_movies_directory }}:/movies:rw" + - "{{ bazarr_data_directory }}:/config:rw" + ports: + - "{{ bazarr_port }}:6767" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ bazarr_user_id }}" + PGID: "{{ bazarr_group_id }}" + restart_policy: unless-stopped + memory: "{{ bazarr_memory }}" + labels: + traefik.enable: "{{ bazarr_available_externally | string }}" + traefik.http.routers.bazarr.rule: "Host(`{{ bazarr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.bazarr.tls.certresolver: "letsencrypt" + traefik.http.routers.bazarr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.bazarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.bazarr.loadbalancer.server.port: "6767" when: bazarr_enabled is true + +- name: Stop Bazarr + block: + - name: Stop Bazarr + docker_container: + name: "{{ bazarr_container_name }}" + state: absent + when: bazarr_enabled is false diff --git a/roles/bitwarden/handlers/main.yml b/roles/bitwarden/handlers/main.yml deleted file mode 100644 index abbf674480..0000000000 --- a/roles/bitwarden/handlers/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Stop Bitwarden - docker_container: - name: "{{ bitwarden_container_name }}" - state: absent - when: bitwarden_enabled is false - listen: - - "stop bitwarden" - - "stop disabled applications" - -- name: Stop Bitwarden Backup - docker_container: - name: "{{ bitwarden_backup_container_name }}" - state: absent - when: bitwarden_enabled is false - listen: - - "stop bitwarden" - - "stop disabled applications" diff --git a/roles/bitwarden/tasks/main.yml b/roles/bitwarden/tasks/main.yml index ec8b6aac9f..fec7588818 100644 --- a/roles/bitwarden/tasks/main.yml +++ b/roles/bitwarden/tasks/main.yml @@ -1,55 +1,68 @@ --- -- name: Bitwarden +- name: Start Bitwarden block: - - name: Create Bitwarden Directories - file: - path: "{{ item }}" - state: directory - mode: "0755" - with_items: - - "{{ bitwarden_data_directory }}" + - name: Create Bitwarden Directories + file: + path: "{{ item }}" + state: directory + mode: "0755" + with_items: + - "{{ bitwarden_data_directory }}" - - name: Bitwarden Docker Container - docker_container: - name: "{{ bitwarden_container_name }}" - image: bitwardenrs/server:latest - pull: true - ports: - - "{{ bitwarden_port_a }}:80" - - "{{ bitwarden_port_b }}:3012" - volumes: - - "{{ bitwarden_data_directory }}:/data:rw" - env: - SIGNUPS_ALLOWED: "{{ bitwarden_allow_signups }}" - ADMIN_TOKEN: "{{ bitwarden_admin_token }}" - LOG_FILE: "/data/bitwarden.log" - WEBSOCKET_ENABLED: "true" - labels: - traefik.enable: "{{ bitwarden_available_externally | string }}" - traefik.http.routers.bitwarden.rule: "Host(`{{ bitwarden_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.bitwarden.tls.certresolver: "letsencrypt" - traefik.http.routers.bitwarden.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.bitwarden.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.routers.bitwarden.service: "bitwarden" - traefik.http.routers.bitwarden.middlewares: "bitwarden-ipwhitelist@docker" - traefik.http.services.bitwarden.loadbalancer.server.port: "80" - traefik.http.routers.bitwarden-ws.rule: "Host(`{{ bitwarden_hostname }}.{{ ansible_nas_domain }}`) && Path(`/notifications/hub`)" - traefik.http.routers.bitwarden-ws.tls.certresolver: "letsencrypt" - traefik.http.routers.bitwarden-ws.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.bitwarden-ws.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.routers.bitwarden-ws.service: "bitwarden-ws" - traefik.http.routers.bitwarden-ws.middlewares: "bitwarden-ipwhitelist@docker" - traefik.http.services.bitwarden-ws.loadbalancer.server.port: "3012" - traefik.http.middlewares.bitwarden-ipwhitelist.ipwhitelist.sourcerange: "{{ bitwarden_ip_whitelist }}" - memory: "{{ bitwarden_memory }}" - restart_policy: unless-stopped + - name: Bitwarden Docker Container + docker_container: + name: "{{ bitwarden_container_name }}" + image: bitwardenrs/server:latest + pull: true + ports: + - "{{ bitwarden_port_a }}:80" + - "{{ bitwarden_port_b }}:3012" + volumes: + - "{{ bitwarden_data_directory }}:/data:rw" + env: + SIGNUPS_ALLOWED: "{{ bitwarden_allow_signups }}" + ADMIN_TOKEN: "{{ bitwarden_admin_token }}" + LOG_FILE: "/data/bitwarden.log" + WEBSOCKET_ENABLED: "true" + labels: + traefik.enable: "{{ bitwarden_available_externally | string }}" + traefik.http.routers.bitwarden.rule: "Host(`{{ bitwarden_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.bitwarden.tls.certresolver: "letsencrypt" + traefik.http.routers.bitwarden.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.bitwarden.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.routers.bitwarden.service: "bitwarden" + traefik.http.routers.bitwarden.middlewares: "bitwarden-ipwhitelist@docker" + traefik.http.services.bitwarden.loadbalancer.server.port: "80" + traefik.http.routers.bitwarden-ws.rule: "Host(`{{ bitwarden_hostname }}.{{ ansible_nas_domain }}`) && Path(`/notifications/hub`)" + traefik.http.routers.bitwarden-ws.tls.certresolver: "letsencrypt" + traefik.http.routers.bitwarden-ws.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.bitwarden-ws.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.routers.bitwarden-ws.service: "bitwarden-ws" + traefik.http.routers.bitwarden-ws.middlewares: "bitwarden-ipwhitelist@docker" + traefik.http.services.bitwarden-ws.loadbalancer.server.port: "3012" + traefik.http.middlewares.bitwarden-ipwhitelist.ipwhitelist.sourcerange: "{{ bitwarden_ip_whitelist }}" + memory: "{{ bitwarden_memory }}" + restart_policy: unless-stopped - - name: Bitwarden Backup Container - docker_container: - name: "{{ bitwarden_backup_container_name }}" - image: bruceforce/bw_backup:latest - pull: true - restart_policy: unless-stopped - volumes_from: bitwarden - memory: "{{ bitwarden_backup_memory }}" + - name: Bitwarden Backup Container + docker_container: + name: "{{ bitwarden_backup_container_name }}" + image: bruceforce/bw_backup:latest + pull: true + restart_policy: unless-stopped + volumes_from: bitwarden + memory: "{{ bitwarden_backup_memory }}" when: bitwarden_enabled is true + +- name: Stop Bitwarden + block: + - name: Stop Bitwarden + docker_container: + name: "{{ bitwarden_container_name }}" + state: absent + + - name: Stop Bitwarden Backup + docker_container: + name: "{{ bitwarden_backup_container_name }}" + state: absent + when: bitwarden_enabled is false diff --git a/roles/booksonic/handlers/main.yml b/roles/booksonic/handlers/main.yml deleted file mode 100644 index ae6bd79cd4..0000000000 --- a/roles/booksonic/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Booksonic - docker_container: - name: "{{ booksonic_container_name }}" - state: absent - when: booksonic_enabled is false - listen: - - "stop booksonic" - - "stop disabled applications" diff --git a/roles/booksonic/tasks/main.yml b/roles/booksonic/tasks/main.yml index f419684a53..34bf2b4dcf 100644 --- a/roles/booksonic/tasks/main.yml +++ b/roles/booksonic/tasks/main.yml @@ -1,38 +1,46 @@ --- -- name: Booksonic +- name: Start Booksonic block: - - name: Create Booksonic Directories - file: - path: "{{ item }}" - state: directory - mode: 0755 - with_items: - - "{{ booksonic_data_directory }}/data" - - "{{ booksonic_data_directory }}/playlists" + - name: Create Booksonic Directories + file: + path: "{{ item }}" + state: directory + mode: 0755 + with_items: + - "{{ booksonic_data_directory }}/data" + - "{{ booksonic_data_directory }}/playlists" - - name: Booksonic Docker Container - docker_container: - name: "{{ booksonic_container_name }}" - image: linuxserver/booksonic-air:latest - pull: true - volumes: - - "{{ booksonic_data_directory }}/data:/booksonic/data:rw" - - "{{ booksonic_data_directory }}/playlists:/booksonic/playlists:rw" - - "{{ booksonic_audiobooks_directory }}:/booksonic/audiobooks:rw" - - "{{ booksonic_podcasts_directory }}:/booksonic/podcasts:rw" - ports: - - "{{ booksonic_port }}:4040" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ booksonic_user_id }}" - PGID: "{{ booksonic_group_id }}" - restart_policy: unless-stopped - memory: "{{ booksonic_memory }}" - labels: - traefik.enable: "{{ booksonic_available_externally | string }}" - traefik.http.routers.booksonic.rule: "Host(`{{ booksonic_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.booksonic.tls.certresolver: "letsencrypt" - traefik.http.routers.booksonic.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.booksonic.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.booksonic.loadbalancer.server.port: "4040" + - name: Booksonic Docker Container + docker_container: + name: "{{ booksonic_container_name }}" + image: linuxserver/booksonic-air:latest + pull: true + volumes: + - "{{ booksonic_data_directory }}/data:/booksonic/data:rw" + - "{{ booksonic_data_directory }}/playlists:/booksonic/playlists:rw" + - "{{ booksonic_audiobooks_directory }}:/booksonic/audiobooks:rw" + - "{{ booksonic_podcasts_directory }}:/booksonic/podcasts:rw" + ports: + - "{{ booksonic_port }}:4040" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ booksonic_user_id }}" + PGID: "{{ booksonic_group_id }}" + restart_policy: unless-stopped + memory: "{{ booksonic_memory }}" + labels: + traefik.enable: "{{ booksonic_available_externally | string }}" + traefik.http.routers.booksonic.rule: "Host(`{{ booksonic_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.booksonic.tls.certresolver: "letsencrypt" + traefik.http.routers.booksonic.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.booksonic.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.booksonic.loadbalancer.server.port: "4040" when: booksonic_enabled is true + +- name: Stop Booksonic + block: + - name: Stop Booksonic + docker_container: + name: "{{ booksonic_container_name }}" + state: absent + when: booksonic_enabled is false diff --git a/roles/calibre/handlers/main.yml b/roles/calibre/handlers/main.yml deleted file mode 100644 index 7498fd3613..0000000000 --- a/roles/calibre/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Calibre - docker_container: - name: "{{ calibre_container_name }}" - state: absent - when: calibre_enabled is false - listen: - - "stop calibre" - - "stop disabled applications" diff --git a/roles/calibre/tasks/main.yml b/roles/calibre/tasks/main.yml index 906ab21360..0a98a5c4d0 100644 --- a/roles/calibre/tasks/main.yml +++ b/roles/calibre/tasks/main.yml @@ -1,35 +1,43 @@ --- -- name: Calibre +- name: Start Calibre block: - - name: Create Calibre-web Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ calibre_data_directory }}/config" + - name: Create Calibre-web Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ calibre_data_directory }}/config" - - name: Calibre-web Docker Container - docker_container: - name: "{{ calibre_container_name }}" - image: linuxserver/calibre-web:latest - pull: true - volumes: - - "{{ calibre_data_directory }}/config:/config" - - "{{ calibre_books_root }}:/books" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ calibre_user_id }}" - PGID: "{{ calibre_group_id }}" - DOCKER_MODS: "{{ calibre_ebook_conversion }}" - ports: - - "{{ calibre_port }}:8083" - restart_policy: unless-stopped - memory: "{{ calibre_memory }}" - labels: - traefik.enable: "{{ calibre_available_externally | string }}" - traefik.http.routers.calibre.rule: "Host(`calibre.{{ ansible_nas_domain }}`)" - traefik.http.routers.calibre.tls.certresolver: "letsencrypt" - traefik.http.routers.calibre.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.calibre.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.calibre.loadbalancer.server.port: "8083" + - name: Calibre-web Docker Container + docker_container: + name: "{{ calibre_container_name }}" + image: linuxserver/calibre-web:latest + pull: true + volumes: + - "{{ calibre_data_directory }}/config:/config" + - "{{ calibre_books_root }}:/books" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ calibre_user_id }}" + PGID: "{{ calibre_group_id }}" + DOCKER_MODS: "{{ calibre_ebook_conversion }}" + ports: + - "{{ calibre_port }}:8083" + restart_policy: unless-stopped + memory: "{{ calibre_memory }}" + labels: + traefik.enable: "{{ calibre_available_externally | string }}" + traefik.http.routers.calibre.rule: "Host(`calibre.{{ ansible_nas_domain }}`)" + traefik.http.routers.calibre.tls.certresolver: "letsencrypt" + traefik.http.routers.calibre.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.calibre.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.calibre.loadbalancer.server.port: "8083" when: calibre_enabled is true + +- name: Stop Calibre + block: + - name: Stop Calibre + docker_container: + name: "{{ calibre_container_name }}" + state: absent + when: calibre_enabled is false diff --git a/roles/cloudcmd/handlers/main.yml b/roles/cloudcmd/handlers/main.yml deleted file mode 100644 index fa524b7246..0000000000 --- a/roles/cloudcmd/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Cloudcmd - docker_container: - name: "{{ cloudcmd_container_name }}" - state: absent - when: cloudcmd_enabled is false - listen: - - "stop cloudcmd" - - "stop disabled applications" diff --git a/roles/cloudcmd/tasks/main.yml b/roles/cloudcmd/tasks/main.yml index ad0bb8c935..e67b49fe3f 100644 --- a/roles/cloudcmd/tasks/main.yml +++ b/roles/cloudcmd/tasks/main.yml @@ -1,34 +1,42 @@ --- - name: Cloudcmd block: - - name: Create Cloudcmd Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ cloudcmd_data_directory }}" + - name: Create Cloudcmd Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ cloudcmd_data_directory }}" - - name: Create Cloudcmd Docker Container - docker_container: - name: "{{ cloudcmd_container_name }}" - image: coderaiser/cloudcmd - pull: true - volumes: - - "{{ cloudcmd_data_directory }}:/config:rw" - - "{{ cloudcmd_browse_directory }}:/mnt/fs" - ports: - - "{{ cloudcmd_port }}:8000" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ cloudcmd_user_id }}" - PGID: "{{ cloudcmd_group_id }}" - restart_policy: unless-stopped - memory: "{{ cloudcmd_memory }}" - labels: - traefik.enable: "{{ cloudcmd_available_externally | string }}" - traefik.http.routers.cloudcmd.rule: "Host(`{{ cloudcmd_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.cloudcmd.tls.certresolver: "letsencrypt" - traefik.http.routers.cloudcmd.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.cloudcmd.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.cloudcmd.loadbalancer.server.port: "8000" + - name: Create Cloudcmd Docker Container + docker_container: + name: "{{ cloudcmd_container_name }}" + image: coderaiser/cloudcmd + pull: true + volumes: + - "{{ cloudcmd_data_directory }}:/config:rw" + - "{{ cloudcmd_browse_directory }}:/mnt/fs" + ports: + - "{{ cloudcmd_port }}:8000" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ cloudcmd_user_id }}" + PGID: "{{ cloudcmd_group_id }}" + restart_policy: unless-stopped + memory: "{{ cloudcmd_memory }}" + labels: + traefik.enable: "{{ cloudcmd_available_externally | string }}" + traefik.http.routers.cloudcmd.rule: "Host(`{{ cloudcmd_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.cloudcmd.tls.certresolver: "letsencrypt" + traefik.http.routers.cloudcmd.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.cloudcmd.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.cloudcmd.loadbalancer.server.port: "8000" when: cloudcmd_enabled is true + +- name: Stop Cloudcmd + block: + - name: Stop Cloudcmd + docker_container: + name: "{{ cloudcmd_container_name }}" + state: absent + when: cloudcmd_enabled is false diff --git a/roles/cloudflare_ddns/handlers/main.yml b/roles/cloudflare_ddns/handlers/main.yml deleted file mode 100644 index 971fdb2a22..0000000000 --- a/roles/cloudflare_ddns/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Cloudflare DDNS - docker_container: - name: "{{ cloudflare_container_name }}" - state: absent - when: cloudflare_ddns_enabled is false - listen: - - "stop cloudflare_ddns" - - "stop disabled applications" diff --git a/roles/cloudflare_ddns/tasks/main.yml b/roles/cloudflare_ddns/tasks/main.yml index b81aed1115..d400bb94a2 100644 --- a/roles/cloudflare_ddns/tasks/main.yml +++ b/roles/cloudflare_ddns/tasks/main.yml @@ -1,30 +1,38 @@ --- -- name: Cloudflare DDNS +- name: Start Cloudflare DDNS block: - - name: Check for deprecated API key - fail: - msg: "Using a Cloudflare global API key is no longer supported. Please unset cloudflare_api_key and set cloudflare_token" - when: cloudflare_api_key is defined + - name: Check for deprecated API key + fail: + msg: "Using a Cloudflare global API key is no longer supported. Please unset cloudflare_api_key and set cloudflare_token" + when: cloudflare_api_key is defined - - name: Create cloudflare Dynamic DNS Directories - file: - path: "{{ cloudflare_data_directory }}" - state: directory + - name: Create cloudflare Dynamic DNS Directories + file: + path: "{{ cloudflare_data_directory }}" + state: directory - - name: Template Cloudflare Dynamic DNS config.yml with scoped token - template: - src: config.yml - dest: "{{ cloudflare_data_directory }}/config.yml" - register: template_files_result + - name: Template Cloudflare Dynamic DNS config.yml with scoped token + template: + src: config.yml + dest: "{{ cloudflare_data_directory }}/config.yml" + register: template_files_result - - name: Cloudflare Dynamic DNS Container - docker_container: - name: "{{ cloudflare_container_name }}" - image: joshava/cloudflare-ddns:latest - pull: true - volumes: - - "{{ cloudflare_data_directory }}/config.yml:/app/config.yaml" - restart_policy: unless-stopped - memory: "{{ cloudflare_memory }}" - recreate: "{{ template_files_result is changed }}" + - name: Cloudflare Dynamic DNS Container + docker_container: + name: "{{ cloudflare_container_name }}" + image: joshava/cloudflare-ddns:latest + pull: true + volumes: + - "{{ cloudflare_data_directory }}/config.yml:/app/config.yaml" + restart_policy: unless-stopped + memory: "{{ cloudflare_memory }}" + recreate: "{{ template_files_result is changed }}" when: cloudflare_ddns_enabled is true + +- name: Stop Cloudflare DDNS + block: + - name: Stop Cloudflare DDNS + docker_container: + name: "{{ cloudflare_container_name }}" + state: absent + when: cloudflare_ddns_enabled is false diff --git a/roles/code-server/handlers/main.yml b/roles/code-server/handlers/main.yml deleted file mode 100644 index a134902d62..0000000000 --- a/roles/code-server/handlers/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Stop Code Server - docker_container: - name: "{{ code_server_container_name }}" - state: absent - when: code_server_enabled is false - listen: - - "stop code_server" - - "stop disabled applications" diff --git a/roles/code-server/tasks/main.yml b/roles/code-server/tasks/main.yml index 8087efc1cc..f2cfbf4c7c 100644 --- a/roles/code-server/tasks/main.yml +++ b/roles/code-server/tasks/main.yml @@ -1,28 +1,36 @@ --- -- name: Code Server +- name: Start Code Server block: - - name: Code Server Docker Container - docker_container: - name: "{{ code_server_container_name }}" - image: linuxserver/code-server - pull: true - volumes: - - "{{ code_server_config_directory }}:/config" - - "{{ code_server_projects_directory }}:/code:rw" - ports: - - "{{ code_server_port }}:8443" - env: - TZ: "{{ ansible_nas_timezone }}" - DEFAULT_WORKSPACE: "/code" - PUID: "{{ code_server_user_id }}" - PGID: "{{ code_server_group_id }}" - restart_policy: unless-stopped - memory: "{{ code_server_memory }}" - labels: - traefik.enable: "{{ code_server_available_externally | string }}" - traefik.http.routers.code_server.rule: "Host(`{{ code_server_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.code_server.tls.certresolver: "letsencrypt" - traefik.http.routers.code_server.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.code_server.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.code_server.loadbalancer.server.port: "8443" + - name: Code Server Docker Container + docker_container: + name: "{{ code_server_container_name }}" + image: linuxserver/code-server + pull: true + volumes: + - "{{ code_server_config_directory }}:/config" + - "{{ code_server_projects_directory }}:/code:rw" + ports: + - "{{ code_server_port }}:8443" + env: + TZ: "{{ ansible_nas_timezone }}" + DEFAULT_WORKSPACE: "/code" + PUID: "{{ code_server_user_id }}" + PGID: "{{ code_server_group_id }}" + restart_policy: unless-stopped + memory: "{{ code_server_memory }}" + labels: + traefik.enable: "{{ code_server_available_externally | string }}" + traefik.http.routers.code_server.rule: "Host(`{{ code_server_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.code_server.tls.certresolver: "letsencrypt" + traefik.http.routers.code_server.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.code_server.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.code_server.loadbalancer.server.port: "8443" when: code_server_enabled is true + +- name: Stop Code Server + block: + - name: Stop Code Server + docker_container: + name: "{{ code_server_container_name }}" + state: absent + when: code_server_enabled is false diff --git a/roles/gitea/handlers/main.yml b/roles/gitea/handlers/main.yml index 34b9ad75ce..9901f9847f 100644 --- a/roles/gitea/handlers/main.yml +++ b/roles/gitea/handlers/main.yml @@ -4,21 +4,3 @@ name: "{{ gitea_container_name }}" restart: true listen: "restart gitea" - -- name: Stop Gitea - docker_container: - name: "{{ gitea_container_name }}" - state: absent - when: gitea_enabled is false - listen: - - "stop gitea" - - "stop disabled applications" - -- name: Stop Gitea Mysql - docker_container: - name: "{{ gitea_mysql_container_name }}" - state: absent - when: gitea_enabled is false - listen: - - "stop gitea" - - "stop disabled applications" diff --git a/roles/gitea/tasks/main.yml b/roles/gitea/tasks/main.yml index 48fbfa0f9b..0da9f2322e 100644 --- a/roles/gitea/tasks/main.yml +++ b/roles/gitea/tasks/main.yml @@ -1,61 +1,74 @@ --- -- name: Gitea +- name: Start Gitea block: - - name: Create Gitea Directories - file: - path: "{{ item }}" - state: directory - recurse: yes - with_items: - - "{{ gitea_data_directory }}/gitea" - - "{{ gitea_data_directory }}/mysql" + - name: Create Gitea Directories + file: + path: "{{ item }}" + state: directory + recurse: yes + with_items: + - "{{ gitea_data_directory }}/gitea" + - "{{ gitea_data_directory }}/mysql" - - name: Create MySQL container for Gitea - docker_container: - name: "{{ gitea_mysql_container_name }}" - image: mysql:5.7 - pull: true - volumes: - - "{{ gitea_data_directory }}/mysql:/var/lib/mysql:rw" - env: - MYSQL_DATABASE: "gitea" - MYSQL_USER: "gitea" - MYSQL_PASSWORD: "gitea" - MYSQL_ROOT_PASSWORD: "gitea" - restart_policy: unless-stopped - memory: "{{ gitea_mysql_memory }}" + - name: Create MySQL container for Gitea + docker_container: + name: "{{ gitea_mysql_container_name }}" + image: mysql:5.7 + pull: true + volumes: + - "{{ gitea_data_directory }}/mysql:/var/lib/mysql:rw" + env: + MYSQL_DATABASE: "gitea" + MYSQL_USER: "gitea" + MYSQL_PASSWORD: "gitea" + MYSQL_ROOT_PASSWORD: "gitea" + restart_policy: unless-stopped + memory: "{{ gitea_mysql_memory }}" - - name: Create Gitea container - docker_container: - name: gitea - image: gitea/gitea:latest - pull: true - links: - - gitea-mysql:db - volumes: - - "{{ gitea_data_directory }}/gitea:/data:rw" - ports: - - "{{ gitea_port_http }}:3000" - - "{{ gitea_port_ssh }}:22" - env: - DB_TYPE: "mysql" - DB_HOST: "db:3306" - DB_NAME: "gitea" - DB_USER: "gitea" - DB_PASSWD: "gitea" - RUN_MODE: "prod" - SSH_DOMAIN: "{{ ansible_nas_hostname }}" - SSH_PORT: "{{ gitea_port_ssh }}" - ROOT_URL: "http://{{ gitea_hostname }}:{{ gitea_port_http }}/" - USER_UID: "1000" - USER_GID: "1000" - restart_policy: unless-stopped - memory: "{{ gitea_memory }}" - labels: - traefik.enable: "{{ gitea_available_externally | string }}" - traefik.http.routers.gitea.rule: "Host(`{{ gitea_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.gitea.tls.certresolver: "letsencrypt" - traefik.http.routers.gitea.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.gitea.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.gitea.loadbalancer.server.port: "3000" + - name: Create Gitea container + docker_container: + name: gitea + image: gitea/gitea:latest + pull: true + links: + - gitea-mysql:db + volumes: + - "{{ gitea_data_directory }}/gitea:/data:rw" + ports: + - "{{ gitea_port_http }}:3000" + - "{{ gitea_port_ssh }}:22" + env: + DB_TYPE: "mysql" + DB_HOST: "db:3306" + DB_NAME: "gitea" + DB_USER: "gitea" + DB_PASSWD: "gitea" + RUN_MODE: "prod" + SSH_DOMAIN: "{{ ansible_nas_hostname }}" + SSH_PORT: "{{ gitea_port_ssh }}" + ROOT_URL: "http://{{ gitea_hostname }}:{{ gitea_port_http }}/" + USER_UID: "1000" + USER_GID: "1000" + restart_policy: unless-stopped + memory: "{{ gitea_memory }}" + labels: + traefik.enable: "{{ gitea_available_externally | string }}" + traefik.http.routers.gitea.rule: "Host(`{{ gitea_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.gitea.tls.certresolver: "letsencrypt" + traefik.http.routers.gitea.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.gitea.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.gitea.loadbalancer.server.port: "3000" when: gitea_enabled is true + +- name: Stop Gitea + block: + - name: Stop Gitea + docker_container: + name: "{{ gitea_container_name }}" + state: absent + + - name: Stop Gitea Mysql + docker_container: + name: "{{ gitea_mysql_container_name }}" + state: absent + when: gitea_enabled is false From 79c9040c64ea859d918d226d4505fb30779d2620 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 31 Aug 2022 00:16:31 +0100 Subject: [PATCH 002/286] Correct block name --- roles/cloudcmd/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/cloudcmd/tasks/main.yml b/roles/cloudcmd/tasks/main.yml index e67b49fe3f..f2bbc9f7fa 100644 --- a/roles/cloudcmd/tasks/main.yml +++ b/roles/cloudcmd/tasks/main.yml @@ -1,5 +1,5 @@ --- -- name: Cloudcmd +- name: Start Cloudcmd block: - name: Create Cloudcmd Directories file: From dafd55e076cb54e03f53ccf0d23c0ab9e604e5ca Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 31 Aug 2022 00:29:40 +0100 Subject: [PATCH 003/286] Couchpotato start and stop --- roles/couchpotato/defaults/main.yml | 3 ++ roles/couchpotato/tasks/main.yml | 75 +++++++++++++++++------------ 2 files changed, 46 insertions(+), 32 deletions(-) diff --git a/roles/couchpotato/defaults/main.yml b/roles/couchpotato/defaults/main.yml index bc9a9023a9..5355995751 100644 --- a/roles/couchpotato/defaults/main.yml +++ b/roles/couchpotato/defaults/main.yml @@ -17,3 +17,6 @@ couchpotato_port: "5050" # specs couchpotato_memory: 1g + +# docker +couchpotato_container_name: couchpotato diff --git a/roles/couchpotato/tasks/main.yml b/roles/couchpotato/tasks/main.yml index 0528147c37..11366552b9 100644 --- a/roles/couchpotato/tasks/main.yml +++ b/roles/couchpotato/tasks/main.yml @@ -1,34 +1,45 @@ --- -- name: Create Couchpotato Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ docker_home }}/couchpotato/config" +- name: Start Couchpotato + block: + - name: Create Couchpotato Directories + file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ docker_home }}/couchpotato/config" -- name: Couchpotato Docker Container - docker_container: - name: couchpotato - image: linuxserver/couchpotato - pull: true - volumes: - - "{{ couchpotato_config_directory }}:/config:rw" - - "{{ couchpotato_downloads_directory }}:/downloads:rw" - - "{{ couchpotato_movies_directory }}:/movies:rw" - - "{{ couchpotato_torrents_directory }}:/torrents:rw" - ports: - - "{{ couchpotato_port }}:5050" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ couchpotato_user_id }}" - PGID: "{{ couchpotato_group_id }}" - restart_policy: unless-stopped - memory: "{{ couchpotato_memory }}" - labels: - traefik.enable: "{{ couchpotato_available_externally | string }}" - traefik.http.routers.couchpotato.rule: "Host(`couchpotato.{{ ansible_nas_domain }}`)" - traefik.http.routers.couchpotato.tls.certresolver: "letsencrypt" - traefik.http.routers.couchpotato.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.couchpotato.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.couchpotato.loadbalancer.server.port: "5050" + - name: Couchpotato Docker Container + docker_container: + name: "{{ couchpotato_container_name }}" + image: linuxserver/couchpotato + pull: true + volumes: + - "{{ couchpotato_config_directory }}:/config:rw" + - "{{ couchpotato_downloads_directory }}:/downloads:rw" + - "{{ couchpotato_movies_directory }}:/movies:rw" + - "{{ couchpotato_torrents_directory }}:/torrents:rw" + ports: + - "{{ couchpotato_port }}:5050" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ couchpotato_user_id }}" + PGID: "{{ couchpotato_group_id }}" + restart_policy: unless-stopped + memory: "{{ couchpotato_memory }}" + labels: + traefik.enable: "{{ couchpotato_available_externally | string }}" + traefik.http.routers.couchpotato.rule: "Host(`couchpotato.{{ ansible_nas_domain }}`)" + traefik.http.routers.couchpotato.tls.certresolver: "letsencrypt" + traefik.http.routers.couchpotato.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.couchpotato.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.couchpotato.loadbalancer.server.port: "5050" + when: couchpotato_enabled is true + +- name: Stop Couchpotato + block: + - name: Stop Couchpotato + docker_container: + name: "{{ couchpotato_container_name }}" + state: absent + when: couchpotato_enabled is false From 7714a557406afd1e0cc46deffbca41d6fc760674 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 31 Aug 2022 21:48:39 +0100 Subject: [PATCH 004/286] Couchpotato start/stop fix --- nas.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/nas.yml b/nas.yml index 58920e26f1..bfb1e3455c 100644 --- a/nas.yml +++ b/nas.yml @@ -76,7 +76,6 @@ - role: couchpotato tags: - couchpotato - when: (couchpotato_enabled | default(False)) - role: dashy tags: From 7025a892285492c2d15dd66b3d8eaad1e39aab39 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Wed, 31 Aug 2022 20:57:56 -0600 Subject: [PATCH 005/286] fix variable name The Ubooquity role contained a variable 'ubooquity' which is supposed to be 'ubooquity_hostname'. Fix it. --- roles/ubooquity/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/ubooquity/tasks/main.yml b/roles/ubooquity/tasks/main.yml index c8f5f1eff8..8e254a4dde 100644 --- a/roles/ubooquity/tasks/main.yml +++ b/roles/ubooquity/tasks/main.yml @@ -28,7 +28,7 @@ memory: "{{ ubooquity_memory }}" labels: traefik.enable: "{{ ubooquity_available_externally | string }}" - traefik.http.routers.ubooquity.rule: "Host(`{{ ubooquity }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.ubooquity.rule: "Host(`{{ ubooquity_hostname }}.{{ ansible_nas_domain }}`)" traefik.http.routers.ubooquity.tls.certresolver: "letsencrypt" traefik.http.routers.ubooquity.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.ubooquity.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" From 90a4eacad688dce3c33d8428555414c71a5da329 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 7 Sep 2022 22:37:47 +0100 Subject: [PATCH 006/286] More apps start/stop --- nas.yml | 7 --- roles/dashy/defaults/main.yml | 3 + roles/dashy/tasks/main.yml | 43 ++++++++----- roles/deluge/defaults/main.yml | 2 + roles/deluge/tasks/main.yml | 72 ++++++++++++--------- roles/dokuwiki/defaults/main.yml | 3 + roles/dokuwiki/tasks/main.yml | 67 +++++++++++--------- roles/duplicacy/defaults/main.yml | 3 + roles/duplicacy/tasks/main.yml | 81 +++++++++++++----------- roles/duplicati/defaults/main.yml | 3 + roles/duplicati/tasks/main.yml | 73 ++++++++++++--------- roles/emby/defaults/main.yml | 3 + roles/emby/tasks/main.yml | 73 ++++++++++++--------- roles/esphome/defaults/main.yml | 3 + roles/esphome/tasks/main.yml | 69 +++++++++++--------- roles/heimdall/defaults/main.yml | 4 +- roles/heimdall/tasks/main.yml | 101 +++++++++++++++++------------- 17 files changed, 356 insertions(+), 254 deletions(-) diff --git a/nas.yml b/nas.yml index bfb1e3455c..8a47f28e58 100644 --- a/nas.yml +++ b/nas.yml @@ -80,37 +80,30 @@ - role: dashy tags: - dashy - when: (dashy_enabled | default(False)) - role: deluge tags: - deluge - when: (deluge_enabled | default(False)) - role: dokuwiki tags: - dokuwiki - when: (dokuwiki_enabled | default(False)) - role: duplicacy tags: - duplicacy - when: (duplicacy_enabled | default(False)) - role: duplicati tags: - duplicati - when: (duplicati_enabled | default(False)) - role: emby tags: - emby - when: (emby_enabled | default(False)) - role: esphome tags: - esphome - when: (esphome_enabled | default(False)) - role: firefly tags: diff --git a/roles/dashy/defaults/main.yml b/roles/dashy/defaults/main.yml index cfcc9dd38d..1a7edc1113 100644 --- a/roles/dashy/defaults/main.yml +++ b/roles/dashy/defaults/main.yml @@ -8,3 +8,6 @@ dashy_hostname: "dashy" # specs dashy_memory: 2g + +# docker +dashy_container_name: dashy diff --git a/roles/dashy/tasks/main.yml b/roles/dashy/tasks/main.yml index 1d2786d2d2..2e6605ceb1 100644 --- a/roles/dashy/tasks/main.yml +++ b/roles/dashy/tasks/main.yml @@ -1,17 +1,28 @@ --- -- name: Dashy Docker Container - docker_container: - name: dashy - image: lissy93/dashy:latest - pull: true - ports: - - "{{ dashy_port }}:80" - restart_policy: unless-stopped - memory: "{{ dashy_memory }}" - labels: - traefik.enable: "{{ dashy_available_externally | string }}" - traefik.http.routers.dashy.rule: "Host(`{{ dashy_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.dashy.tls.certresolver: "letsencrypt" - traefik.http.routers.dashy.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.dashy.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.dashy.loadbalancer.server.port: "80" +- name: Start Dashy + block: + - name: Dashy Docker Container + docker_container: + name: "{{ dashy_container_name }}" + image: lissy93/dashy:latest + pull: true + ports: + - "{{ dashy_port }}:80" + restart_policy: unless-stopped + memory: "{{ dashy_memory }}" + labels: + traefik.enable: "{{ dashy_available_externally | string }}" + traefik.http.routers.dashy.rule: "Host(`{{ dashy_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.dashy.tls.certresolver: "letsencrypt" + traefik.http.routers.dashy.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.dashy.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.dashy.loadbalancer.server.port: "80" + when: dashy_enabled is true + +- name: Stop Dashy + block: + - name: Stop Dashy + docker_container: + name: "{{ dashy_container_name }}" + state: absent + when: dashy_enabled is false diff --git a/roles/deluge/defaults/main.yml b/roles/deluge/defaults/main.yml index f86f415121..e6c588d1bb 100644 --- a/roles/deluge/defaults/main.yml +++ b/roles/deluge/defaults/main.yml @@ -22,3 +22,5 @@ deluge_timezone: "{{ ansible_nas_timezone }}" # specs deluge_memory: 1g + +deluge_container_name: deluge diff --git a/roles/deluge/tasks/main.yml b/roles/deluge/tasks/main.yml index b482e5bb71..78c0cb7f4e 100644 --- a/roles/deluge/tasks/main.yml +++ b/roles/deluge/tasks/main.yml @@ -1,33 +1,43 @@ --- -- name: Create Deluge Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ deluge_config_directory }}" - - "{{ deluge_download_directory }}" +- name: Start Deluge + block: + - name: Create Deluge Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ deluge_config_directory }}" + - "{{ deluge_download_directory }}" -- name: Deluge Docker Container - docker_container: - name: deluge - image: linuxserver/deluge - pull: true - volumes: - - "{{ deluge_config_directory }}:/config:rw" - - "{{ deluge_download_directory }}:/root/Downloads:rw" - ports: - - "{{ deluge_port }}:8112" - env: - TZ: "{{ deluge_timezone }}" - PUID: "{{ deluge_user_id }}" - PGID: "{{ deluge_group_id }}" - restart_policy: unless-stopped - memory: "{{ deluge_memory }}" - labels: - traefik.enable: "{{ deluge_available_externally | string }}" - traefik.http.routers.deluge.rule: "Host(`{{ deluge_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.deluge.tls.certresolver: "letsencrypt" - traefik.http.routers.deluge.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.deluge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.deluge.loadbalancer.server.port: "8112" + - name: Deluge Docker Container + docker_container: + name: deluge + image: linuxserver/deluge + pull: true + volumes: + - "{{ deluge_config_directory }}:/config:rw" + - "{{ deluge_download_directory }}:/root/Downloads:rw" + ports: + - "{{ deluge_port }}:8112" + env: + TZ: "{{ deluge_timezone }}" + PUID: "{{ deluge_user_id }}" + PGID: "{{ deluge_group_id }}" + restart_policy: unless-stopped + memory: "{{ deluge_memory }}" + labels: + traefik.enable: "{{ deluge_available_externally | string }}" + traefik.http.routers.deluge.rule: "Host(`{{ deluge_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.deluge.tls.certresolver: "letsencrypt" + traefik.http.routers.deluge.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.deluge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.deluge.loadbalancer.server.port: "8112" + when: when deluge_enabled is true + +- name: Stop Deluge + block: + - name: Stop Deluge + docker_container: + name: "{{ deluge_container_name }}" + state: absent + when: deluge_enabled is false diff --git a/roles/dokuwiki/defaults/main.yml b/roles/dokuwiki/defaults/main.yml index 6f355336a7..9019822833 100644 --- a/roles/dokuwiki/defaults/main.yml +++ b/roles/dokuwiki/defaults/main.yml @@ -15,3 +15,6 @@ dokuwiki_port: "8085" # specs dokuwiki_memory: 1g + +# docker +docuwiki_container_name: docuwiki diff --git a/roles/dokuwiki/tasks/main.yml b/roles/dokuwiki/tasks/main.yml index a39a9ea934..4f47df6cfd 100644 --- a/roles/dokuwiki/tasks/main.yml +++ b/roles/dokuwiki/tasks/main.yml @@ -1,30 +1,41 @@ --- -- name: Create DokuWiki Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ dokuwiki_data_directory }}/data" +- name: Start Docuwiki + block: + - name: Create DokuWiki Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ dokuwiki_data_directory }}/data" -- name: DokuWiki Docker Container - docker_container: - name: dokuwiki - image: linuxserver/dokuwiki:latest - pull: true - volumes: - - "{{ dokuwiki_data_directory }}:/config/dokuwiki/data:rw" - ports: - - "{{ dokuwiki_port }}:80" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ dokuwiki_user_id }}" - PGID: "{{ dokuwiki_group_id }}" - restart_policy: unless-stopped - memory: "{{ dokuwiki_memory }}" - labels: - traefik.enable: "{{ dokuwiki_available_externally | string }}" - traefik.http.routers.dokuwiki.rule: "Host(`{{ dokuwiki_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.dokuwiki.tls.certresolver: "letsencrypt" - traefik.http.routers.dokuwiki.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.dokuwiki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.dokuwiki.loadbalancer.server.port: "80" + - name: DokuWiki Docker Container + docker_container: + name: "{{ docuwiki_container_name }}" + image: linuxserver/dokuwiki:latest + pull: true + volumes: + - "{{ dokuwiki_data_directory }}:/config/dokuwiki/data:rw" + ports: + - "{{ dokuwiki_port }}:80" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ dokuwiki_user_id }}" + PGID: "{{ dokuwiki_group_id }}" + restart_policy: unless-stopped + memory: "{{ dokuwiki_memory }}" + labels: + traefik.enable: "{{ dokuwiki_available_externally | string }}" + traefik.http.routers.dokuwiki.rule: "Host(`{{ dokuwiki_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.dokuwiki.tls.certresolver: "letsencrypt" + traefik.http.routers.dokuwiki.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.dokuwiki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.dokuwiki.loadbalancer.server.port: "80" + when: docuwiki_enabled is true + +- name: Stop Docuwiki + block: + - name: Stop Docuwiki + docker_container: + name: "{{ docuwiki_container_name }}" + state: absent + when: docuwiki_enabled is false diff --git a/roles/duplicacy/defaults/main.yml b/roles/duplicacy/defaults/main.yml index b1ad2ae8aa..e5ca87134f 100644 --- a/roles/duplicacy/defaults/main.yml +++ b/roles/duplicacy/defaults/main.yml @@ -22,3 +22,6 @@ duplicacy_port: "3875" duplicacy_hostname: "duplicacy" duplicacy_memory: 1g + +# docker +duplicacy_container_name: duplicacy diff --git a/roles/duplicacy/tasks/main.yml b/roles/duplicacy/tasks/main.yml index cd9fc15db0..832b2315d9 100644 --- a/roles/duplicacy/tasks/main.yml +++ b/roles/duplicacy/tasks/main.yml @@ -1,37 +1,48 @@ --- -- name: Create Duplicacy Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ duplicacy_config_directory }}" - - "{{ duplicacy_logs_directory }}" - - "{{ duplicacy_cache_directory }}" +- name: Start Duplicacy + block: + - name: Create Duplicacy Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ duplicacy_config_directory }}" + - "{{ duplicacy_logs_directory }}" + - "{{ duplicacy_cache_directory }}" -- name: Duplicacy Docker Container - docker_container: - name: duplicacy - image: saspus/duplicacy-web:mini - hostname: "{{ duplicacy_hostname }}" - pull: true - ports: - - "{{ duplicacy_port }}:3875" - volumes: - - "{{ duplicacy_config_directory }}:/config:rw" - - "{{ duplicacy_logs_directory }}:/logs:rw" - - "{{ duplicacy_cache_directory }}:/cache:rw" - - "{{ samba_shares_root }}:/backuproot:{{ duplicacy_data_permissions }}" - env: - DUPLICACY_WEB_VERSION: "{{ duplicacy_web_version }}" - TZ: "{{ ansible_nas_timezone }}" - USR_ID: "{{ duplicacy_user_id }}" - GRP_ID: "{{ duplicacy_group_id }}" - restart_policy: unless-stopped - memory: "{{ duplicacy_memory }}" - labels: - traefik.enable: "{{ duplicacy_available_externally | string }}" - traefik.http.routers.duplicacy.rule: "Host(`{{ duplicacy_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.duplicacy.tls.certresolver: "letsencrypt" - traefik.http.routers.duplicacy.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.duplicacy.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.duplicacy.loadbalancer.server.port: "3875" + - name: Duplicacy Docker Container + docker_container: + name: "{{ duplicacy_container_name }}" + image: saspus/duplicacy-web:mini + hostname: "{{ duplicacy_hostname }}" + pull: true + ports: + - "{{ duplicacy_port }}:3875" + volumes: + - "{{ duplicacy_config_directory }}:/config:rw" + - "{{ duplicacy_logs_directory }}:/logs:rw" + - "{{ duplicacy_cache_directory }}:/cache:rw" + - "{{ samba_shares_root }}:/backuproot:{{ duplicacy_data_permissions }}" + env: + DUPLICACY_WEB_VERSION: "{{ duplicacy_web_version }}" + TZ: "{{ ansible_nas_timezone }}" + USR_ID: "{{ duplicacy_user_id }}" + GRP_ID: "{{ duplicacy_group_id }}" + restart_policy: unless-stopped + memory: "{{ duplicacy_memory }}" + labels: + traefik.enable: "{{ duplicacy_available_externally | string }}" + traefik.http.routers.duplicacy.rule: "Host(`{{ duplicacy_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.duplicacy.tls.certresolver: "letsencrypt" + traefik.http.routers.duplicacy.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.duplicacy.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.duplicacy.loadbalancer.server.port: "3875" + when: duplicacy_enabled is true + +- name: Stop Duplicacy + block: + - name: Stop Duplicacy + docker_container: + name: "{{ duplicacy_container_name }}" + state: absent + when: duplicacy_enabled is false diff --git a/roles/duplicati/defaults/main.yml b/roles/duplicati/defaults/main.yml index 285100b744..555523c5de 100644 --- a/roles/duplicati/defaults/main.yml +++ b/roles/duplicati/defaults/main.yml @@ -17,3 +17,6 @@ duplicati_port: "8200" duplicati_hostname: "duplicati" duplicati_memory: 1g + +# docker +duplicati_container_name: duplicati diff --git a/roles/duplicati/tasks/main.yml b/roles/duplicati/tasks/main.yml index 291fe15e45..4794f2e56b 100644 --- a/roles/duplicati/tasks/main.yml +++ b/roles/duplicati/tasks/main.yml @@ -1,33 +1,44 @@ --- -- name: Create Duplicati Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ duplicati_data_directory }}" +- name: Start Duplicati + block: + - name: Create Duplicati Directory + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ duplicati_data_directory }}" -- name: Dupicati Docker Container - docker_container: - name: duplicati - image: linuxserver/duplicati - pull: true - ports: - - "{{ duplicati_port }}:8200" - volumes: - - "{{ duplicati_data_directory }}:/config:rw" - - "{{ samba_shares_root }}:/source/shares:{{ duplicati_data_permissions }}" - - "{{ docker_home }}:/source/docker:{{ duplicati_data_permissions }}" - - "/etc/timezone:/etc/timezone:ro" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ duplicati_user_id }}" - PGID: "{{ duplicati_group_id }}" - restart_policy: unless-stopped - memory: "{{ duplicati_memory }}" - labels: - traefik.enable: "{{ duplicati_available_externally | string }}" - traefik.http.routers.duplicati.rule: "Host(`{{ duplicati_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.duplicati.tls.certresolver: "letsencrypt" - traefik.http.routers.duplicati.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.duplicati.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.duplicati.loadbalancer.server.port: "8200" + - name: Dupicati Docker Container + docker_container: + name: "{{ duplicati_container_name }}" + image: linuxserver/duplicati + pull: true + ports: + - "{{ duplicati_port }}:8200" + volumes: + - "{{ duplicati_data_directory }}:/config:rw" + - "{{ samba_shares_root }}:/source/shares:{{ duplicati_data_permissions }}" + - "{{ docker_home }}:/source/docker:{{ duplicati_data_permissions }}" + - "/etc/timezone:/etc/timezone:ro" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ duplicati_user_id }}" + PGID: "{{ duplicati_group_id }}" + restart_policy: unless-stopped + memory: "{{ duplicati_memory }}" + labels: + traefik.enable: "{{ duplicati_available_externally | string }}" + traefik.http.routers.duplicati.rule: "Host(`{{ duplicati_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.duplicati.tls.certresolver: "letsencrypt" + traefik.http.routers.duplicati.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.duplicati.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.duplicati.loadbalancer.server.port: "8200" + when: duplicati_enabled is true + +- name: Stop Duplicati + block: + - name: Stop Duplicati + docker_container: + name: "{{ duplicati_container_name }}" + state: absent + when: duplicati_enabled is false diff --git a/roles/emby/defaults/main.yml b/roles/emby/defaults/main.yml index 4954b6b85b..72121a9a36 100644 --- a/roles/emby/defaults/main.yml +++ b/roles/emby/defaults/main.yml @@ -23,3 +23,6 @@ emby_hostname: "emby" # specs emby_memory: 1g + +# docker +emby_container_name: emby diff --git a/roles/emby/tasks/main.yml b/roles/emby/tasks/main.yml index 7aff7bf5c9..f7afc68163 100644 --- a/roles/emby/tasks/main.yml +++ b/roles/emby/tasks/main.yml @@ -1,33 +1,44 @@ --- -- name: Create Emby Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ emby_config_directory }}" +- name: Start Emby + block: + - name: Create Emby Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ emby_config_directory }}" -- name: Emby Docker Container - docker_container: - name: emby - image: emby/embyserver - pull: true - volumes: - - "{{ emby_config_directory }}:/config:rw" - - "{{ emby_movies_directory }}:/movies:{{ emby_movies_permissions }}" - - "{{ emby_tv_directory }}:/tv:{{ emby_tv_permissions }}" - ports: - - "{{ emby_port_http }}:8096" - - "{{ emby_port_https }}:8920" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ emby_user_id }}" - PGID: "{{ emby_group_id }}" - restart_policy: unless-stopped - memory: "{{ emby_memory }}" - labels: - traefik.enable: "{{ emby_available_externally | string }}" - traefik.http.routers.emby.rule: "Host(`{{ emby_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.emby.tls.certresolver: "letsencrypt" - traefik.http.routers.emby.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.emby.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.emby.loadbalancer.server.port: "8096" + - name: Emby Docker Container + docker_container: + name: "{{ emby_container_name }}" + image: emby/embyserver + pull: true + volumes: + - "{{ emby_config_directory }}:/config:rw" + - "{{ emby_movies_directory }}:/movies:{{ emby_movies_permissions }}" + - "{{ emby_tv_directory }}:/tv:{{ emby_tv_permissions }}" + ports: + - "{{ emby_port_http }}:8096" + - "{{ emby_port_https }}:8920" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ emby_user_id }}" + PGID: "{{ emby_group_id }}" + restart_policy: unless-stopped + memory: "{{ emby_memory }}" + labels: + traefik.enable: "{{ emby_available_externally | string }}" + traefik.http.routers.emby.rule: "Host(`{{ emby_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.emby.tls.certresolver: "letsencrypt" + traefik.http.routers.emby.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.emby.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.emby.loadbalancer.server.port: "8096" + when: emby_enabled is true + +- name: Stop Emby + block: + - name: Stop Emby + docker_container: + name: "{{ emby_container_name }}" + state: absent + when: emby_enabled is false diff --git a/roles/esphome/defaults/main.yml b/roles/esphome/defaults/main.yml index c407a2b527..5269369a35 100644 --- a/roles/esphome/defaults/main.yml +++ b/roles/esphome/defaults/main.yml @@ -15,3 +15,6 @@ esphome_port: "6052" # specs esphome_memory: 1g + +# docker +esphome_container_name: esphome diff --git a/roles/esphome/tasks/main.yml b/roles/esphome/tasks/main.yml index 6d678fc746..37c8871eb2 100644 --- a/roles/esphome/tasks/main.yml +++ b/roles/esphome/tasks/main.yml @@ -1,31 +1,42 @@ --- -- name: Create EspHome Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ esphome_data_directory }}/data" +- name: Start EspHome + block: + - name: Create EspHome Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ esphome_data_directory }}/data" -- name: EspHome Docker Container - docker_container: - name: esphome - image: esphome/esphome:latest - pull: true - volumes: - - "{{ esphome_data_directory }}:/config:rw" - - "/etc/localtime:/etc/localtime:ro" - ports: - - "{{ esphome_port }}:6052" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ esphome_user_id }}" - PGID: "{{ esphome_group_id }}" - restart_policy: unless-stopped - memory: "{{ esphome_memory }}" - labels: - traefik.enable: "{{ esphome_available_externally | string }}" - traefik.http.routers.esphome.rule: "Host(`{{ esphome_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.esphome.tls.certresolver: "letsencrypt" - traefik.http.routers.esphome.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.esphome.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.esphome.loadbalancer.server.port: "80" + - name: EspHome Docker Container + docker_container: + name: "{{ esphome_container_name }}" + image: esphome/esphome:latest + pull: true + volumes: + - "{{ esphome_data_directory }}:/config:rw" + - "/etc/localtime:/etc/localtime:ro" + ports: + - "{{ esphome_port }}:6052" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ esphome_user_id }}" + PGID: "{{ esphome_group_id }}" + restart_policy: unless-stopped + memory: "{{ esphome_memory }}" + labels: + traefik.enable: "{{ esphome_available_externally | string }}" + traefik.http.routers.esphome.rule: "Host(`{{ esphome_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.esphome.tls.certresolver: "letsencrypt" + traefik.http.routers.esphome.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.esphome.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.esphome.loadbalancer.server.port: "80" + when: esphome_enabled is true + +- name: Stop EspHome + block: + - name: Stop EspHome + docker_container: + name: "{{ esphome_container_name }}" + state: absent + when: esphome_enabled is false diff --git a/roles/heimdall/defaults/main.yml b/roles/heimdall/defaults/main.yml index bc4f1d4e2a..c1cc657c41 100644 --- a/roles/heimdall/defaults/main.yml +++ b/roles/heimdall/defaults/main.yml @@ -1,5 +1,5 @@ --- -heimdall_enabled: true +heimdall_enabled: false heimdall_available_externally: false # directories @@ -17,3 +17,5 @@ heimdall_group_id: "1310" # specs heimdall_memory: 1g + +heimdall_container_name: heimdall diff --git a/roles/heimdall/tasks/main.yml b/roles/heimdall/tasks/main.yml index da2bd423e3..31d133910c 100644 --- a/roles/heimdall/tasks/main.yml +++ b/roles/heimdall/tasks/main.yml @@ -1,49 +1,60 @@ --- -- name: Create Heimdall group - group: - name: heimdall - gid: "{{ heimdall_group_id }}" - state: present +- name: Start Heimdall + block: + - name: Create Heimdall group + group: + name: heimdall + gid: "{{ heimdall_group_id }}" + state: present -- name: Create Heimdall user - user: - name: heimdall - uid: "{{ heimdall_user_id }}" - state: present - system: yes - update_password: on_create - create_home: no - group: heimdall + - name: Create Heimdall user + user: + name: heimdall + uid: "{{ heimdall_user_id }}" + state: present + system: yes + update_password: on_create + create_home: no + group: heimdall -- name: Create Heimdall Directories - file: - path: "{{ item }}" - state: directory - owner: heimdall - group: heimdall - with_items: - - "{{ heimdall_data_directory }}" + - name: Create Heimdall Directories + file: + path: "{{ item }}" + state: directory + owner: heimdall + group: heimdall + with_items: + - "{{ heimdall_data_directory }}" -- name: Create Heimdall container - docker_container: - name: heimdall - image: "{{ heimdall_docker_image }}" - pull: true - volumes: - - "{{ heimdall_data_directory }}:/config:rw" - env: - PUID: "{{ heimdall_user_id }}" - PGID: "{{ heimdall_group_id }}" - TZ: "{{ ansible_nas_timezone }}" - ports: - - "{{ heimdall_port_http }}:80" - - "{{ heimdall_port_https }}:443" - restart_policy: unless-stopped - memory: "{{ heimdall_memory }}" - labels: - traefik.enable: "{{ heimdall_available_externally | string }}" - traefik.http.routers.heimdall.rule: "Host(`{{ heimdall_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.heimdall.tls.certresolver: "letsencrypt" - traefik.http.routers.heimdall.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.heimdall.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.heimdall.loadbalancer.server.port: "80" + - name: Create Heimdall container + docker_container: + name: "{{ heimdall_container_name }}" + image: "{{ heimdall_docker_image }}" + pull: true + volumes: + - "{{ heimdall_data_directory }}:/config:rw" + env: + PUID: "{{ heimdall_user_id }}" + PGID: "{{ heimdall_group_id }}" + TZ: "{{ ansible_nas_timezone }}" + ports: + - "{{ heimdall_port_http }}:80" + - "{{ heimdall_port_https }}:443" + restart_policy: unless-stopped + memory: "{{ heimdall_memory }}" + labels: + traefik.enable: "{{ heimdall_available_externally | string }}" + traefik.http.routers.heimdall.rule: "Host(`{{ heimdall_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.heimdall.tls.certresolver: "letsencrypt" + traefik.http.routers.heimdall.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.heimdall.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.heimdall.loadbalancer.server.port: "80" + when: heimdall_enabled is true + +- name: Stop Heimdall + block: + - name: Stop Heimdall + docker_container: + name: "{{ heimdall_container_name }}" + state: absent + when: heimdall_enabled is false From 0bc58c39bc4aa6161e8a914eaba405365f9be40f Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 7 Sep 2022 23:50:45 +0100 Subject: [PATCH 007/286] Start and stop firefly --- nas.yml | 1 - roles/firefly/defaults/main.yml | 4 + roles/firefly/tasks/main.yml | 128 ++++++++++++++++++-------------- 3 files changed, 76 insertions(+), 57 deletions(-) diff --git a/nas.yml b/nas.yml index 8a47f28e58..e9f88d0848 100644 --- a/nas.yml +++ b/nas.yml @@ -108,7 +108,6 @@ - role: firefly tags: - firefly - when: (firefly_enabled | default(False)) - role: freshrss tags: diff --git a/roles/firefly/defaults/main.yml b/roles/firefly/defaults/main.yml index 6a5217dd12..d63d7e9ed2 100644 --- a/roles/firefly/defaults/main.yml +++ b/roles/firefly/defaults/main.yml @@ -13,3 +13,7 @@ firefly_port: "8066" # specs firefly_memory: "1g" firefly_mysql_memory: "1g" + +# docker +firefly_container_name: firefly +firefly_mysql_container_name: firefly-mysql diff --git a/roles/firefly/tasks/main.yml b/roles/firefly/tasks/main.yml index f87a0cb79f..9a4db60064 100644 --- a/roles/firefly/tasks/main.yml +++ b/roles/firefly/tasks/main.yml @@ -1,60 +1,76 @@ --- -- name: Create Firefly III Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ firefly_data_directory }}/postgresql" - - "{{ firefly_data_directory }}/mysql" - - "{{ firefly_data_directory }}/upload" - - "{{ firefly_data_directory }}/export" +- name: Start Firefly + block: + - name: Create Firefly III Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ firefly_data_directory }}/postgresql" + - "{{ firefly_data_directory }}/mysql" + - "{{ firefly_data_directory }}/upload" + - "{{ firefly_data_directory }}/export" -- name: Create MySQL container for Firefly - docker_container: - name: firefly-mysql - image: mysql:5.7 - pull: true - volumes: - - "{{ firefly_data_directory }}/mysql:/var/lib/mysql:rw" - env: - MYSQL_DATABASE: "firefly" - MYSQL_USER: "firefly" - MYSQL_PASSWORD: "firefly" - MYSQL_ROOT_PASSWORD: "firefly" - restart_policy: unless-stopped - memory: "{{ firefly_mysql_memory }}" + - name: Create MySQL container for Firefly + docker_container: + name: "{{ firefly_mysql_container_name }}" + image: mysql:5.7 + pull: true + volumes: + - "{{ firefly_data_directory }}/mysql:/var/lib/mysql:rw" + env: + MYSQL_DATABASE: "firefly" + MYSQL_USER: "firefly" + MYSQL_PASSWORD: "firefly" + MYSQL_ROOT_PASSWORD: "firefly" + restart_policy: unless-stopped + memory: "{{ firefly_mysql_memory }}" -- name: Wait for MySQL to init - pause: - seconds: 30 + - name: Wait for MySQL to init + pause: + seconds: 30 -- name: Create Firefly III container - docker_container: - name: firefly - image: fireflyiii/core:latest - pull: true - volumes: - - "{{ firefly_data_directory }}/export:/var/www/firefly-iii/storage/export:rw" - - "{{ firefly_data_directory }}/upload:/var/www/firefly-iii/storage/upload:rw" - links: - - firefly-mysql:db - ports: - - "{{ firefly_port }}:8080" - env: - APP_ENV: "local" - APP_KEY: "S0m3R@nd0mString0f32Ch@rsEx@ct1y" - DB_CONNECTION: "mysql" - DB_HOST: "db" - DB_DATABASE: "firefly" - DB_USERNAME: "firefly" - DB_PASSWORD: "firefly" - TZ: "{{ ansible_nas_timezone }}" - restart_policy: unless-stopped - memory: "{{ firefly_memory }}" - labels: - traefik.enable: "{{ firefly_available_externally | string }}" - traefik.http.routers.firefly.rule: "Host(`{{ firefly_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.firefly.tls.certresolver: "letsencrypt" - traefik.http.routers.firefly.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.firefly.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.firefly.loadbalancer.server.port: "8080" + - name: Create Firefly III container + docker_container: + name: "{{ firefly_container_name }}" + image: fireflyiii/core:latest + pull: true + volumes: + - "{{ firefly_data_directory }}/export:/var/www/firefly-iii/storage/export:rw" + - "{{ firefly_data_directory }}/upload:/var/www/firefly-iii/storage/upload:rw" + links: + - firefly-mysql:db + ports: + - "{{ firefly_port }}:8080" + env: + APP_ENV: "local" + APP_KEY: "S0m3R@nd0mString0f32Ch@rsEx@ct1y" + DB_CONNECTION: "mysql" + DB_HOST: "db" + DB_DATABASE: "firefly" + DB_USERNAME: "firefly" + DB_PASSWORD: "firefly" + TZ: "{{ ansible_nas_timezone }}" + restart_policy: unless-stopped + memory: "{{ firefly_memory }}" + labels: + traefik.enable: "{{ firefly_available_externally | string }}" + traefik.http.routers.firefly.rule: "Host(`{{ firefly_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.firefly.tls.certresolver: "letsencrypt" + traefik.http.routers.firefly.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.firefly.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.firefly.loadbalancer.server.port: "8080" + when: firefly_enabled is true + +- name: Stop Firefly + block: + - name: Stop Firefly + docker_container: + name: "{{ firefly_container_name }}" + state: absent + + - name: Stop Firefly MySQL + docker_container: + name: "{{ firefly_mysql_container_name }}" + state: absent + when: firefly_enabled is false From 3ff1f4662d2b3931b182b1ba997f8972d6f2e9c6 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Thu, 8 Sep 2022 18:33:41 -0600 Subject: [PATCH 008/286] fix conditional The `when:` clause had an additional`when` which needs removal to avoid failure. --- roles/deluge/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/deluge/tasks/main.yml b/roles/deluge/tasks/main.yml index 78c0cb7f4e..9c475d75a0 100644 --- a/roles/deluge/tasks/main.yml +++ b/roles/deluge/tasks/main.yml @@ -32,7 +32,7 @@ traefik.http.routers.deluge.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.deluge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" traefik.http.services.deluge.loadbalancer.server.port: "8112" - when: when deluge_enabled is true + when: deluge_enabled is true - name: Stop Deluge block: From 1784f5663b20caa2c17f841331788e1e09e7db07 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Fri, 9 Sep 2022 22:23:16 +0100 Subject: [PATCH 009/286] Add start of molecule role testing --- .ansible-lint | 4 + requirements-dev.txt | 4 +- tests/molecule/base.yml | 42 ++++++++++ .../molecule/resources/playbooks/converge.yml | 8 ++ .../molecule/resources/playbooks/prepare.yml | 7 ++ tests/test.sh | 82 ++----------------- 6 files changed, 72 insertions(+), 75 deletions(-) create mode 100644 tests/molecule/base.yml create mode 100644 tests/molecule/resources/playbooks/converge.yml create mode 100644 tests/molecule/resources/playbooks/prepare.yml diff --git a/.ansible-lint b/.ansible-lint index 8976e5bf61..f20ec6c000 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -8,3 +8,7 @@ exclude_paths: - roles/bertvv.samba - roles/geerlingguy.docker - roles/geerlingguy.nfs + +mock_modules: + - docker_container + - docker_container_info diff --git a/requirements-dev.txt b/requirements-dev.txt index e42b23c12b..0a24a90064 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1 +1,3 @@ -pre-commit \ No newline at end of file +pre-commit +molecule==4.0.1 +molecule[docker]==4.0.1 \ No newline at end of file diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml new file mode 100644 index 0000000000..5c3f198d04 --- /dev/null +++ b/tests/molecule/base.yml @@ -0,0 +1,42 @@ +--- +dependency: + name: galaxy +driver: + name: docker +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + privileged: true +provisioner: + name: ansible + config_options: + defaults: + stdout_callback: dense + inventory: + group_vars: + all: + docker_home: /ansible-nas + ansible_nas_timezone: Europe/London + ansible_nas_domain: ansible-nas.io + playbooks: + prepare: ../../../../tests/molecule/resources/playbooks/prepare.yml + converge: ../../../../tests/molecule/resources/playbooks/converge.yml +verifier: + name: ansible +scenario: + test_sequence: + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - verify + - side_effect + - verify verify_stopped.yml + - cleanup + - destroy diff --git a/tests/molecule/resources/playbooks/converge.yml b/tests/molecule/resources/playbooks/converge.yml new file mode 100644 index 0000000000..0f30720677 --- /dev/null +++ b/tests/molecule/resources/playbooks/converge.yml @@ -0,0 +1,8 @@ +--- +- name: Converge + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" diff --git a/tests/molecule/resources/playbooks/prepare.yml b/tests/molecule/resources/playbooks/prepare.yml new file mode 100644 index 0000000000..ba2469e445 --- /dev/null +++ b/tests/molecule/resources/playbooks/prepare.yml @@ -0,0 +1,7 @@ +--- +- name: Prepare + hosts: all + tasks: + - name: Install docker python module + pip: + name: docker diff --git a/tests/test.sh b/tests/test.sh index 7c890a9430..8da09d7070 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -1,16 +1,7 @@ #!/bin/bash # -# Ansible playbook tester. -# Based on geerlingguy's Ansible role tester. +# Ansible-NAS role tester # -# Usage: [OPTIONS] .tests/test.sh -# - distro: a supported Docker distro version (default = "ubuntu1604") -# - playbook: a playbook in the tests directory (default = "test.yml") -# - cleanup: whether to remove the Docker container (default = true) -# - container_id: the --name to set for the container (default = timestamp) -# - test_idempotence: whether to test playbook's idempotence (default = true) -# -# License: MIT # Exit on any individual command failure. set -e @@ -22,68 +13,11 @@ neutral='\033[0m' timestamp=$(date +%s) -# Allow environment variables to override defaults. -distro=${distro:-"ubuntu2004"} -docker_owner=${docker_owner:-"geerlingguy"} -playbook=${playbook:-"nas.yml"} -cleanup=${cleanup:-"true"} -container_id=${container_id:-$timestamp} -test_syntax=${test_syntax:-"true"} -test_playbook=${test_playbook:-"false"} -test_idempotence=${test_idempotence:-"false"} -init="/lib/systemd/systemd" -opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" - -# Run the container using the supplied OS. -printf ${green}"Starting Docker container: $docker_owner/docker-$distro-ansible."${neutral}"\n" -docker pull $docker_owner/docker-$distro-ansible:latest -docker run --detach --volume="$PWD":/etc/ansible/playbooks/playbook_under_test:rw --name $container_id $opts $docker_owner/docker-$distro-ansible:latest $init - -printf "\n" - -# Install requirements if `requirements.yml` is present. -if [ -f "$PWD/requirements.yml" ]; then - printf ${green}"Requirements file detected; installing dependencies."${neutral}"\n" - docker exec --tty $container_id env TERM=xterm ansible-galaxy install -r /etc/ansible/playbooks/playbook_under_test/requirements.yml -fi - -printf "\n" - -# Output Ansible version -printf ${green}"Checking Ansible version."${neutral}"\n" -docker exec --tty $container_id env TERM=xterm ansible-playbook --version - -printf "\n" - -if [ "$test_syntax" = true ]; then - # Test Ansible syntax. - printf ${green}"Checking Ansible playbook syntax."${neutral}"\n" - docker exec --tty $container_id env TERM=xterm ansible-playbook /etc/ansible/playbooks/playbook_under_test/$playbook --syntax-check -fi - -printf "\n" - -if [ "$test_playbook" = true ]; then - # Run Ansible playbook. - printf ${green}"Running command: docker exec $container_id env TERM=xterm ansible-playbook /etc/ansible/playbooks/playbook_under_test/$playbook"${neutral}"\n" - docker exec $container_id env TERM=xterm env ANSIBLE_FORCE_COLOR=1 ansible-playbook /etc/ansible/playbooks/playbook_under_test/$playbook -fi - -printf "\n" - -if [ "$test_idempotence" = true ]; then - # Run Ansible playbook again (idempotence test). - printf ${green}"Running playbook again: idempotence test"${neutral} - idempotence=$(mktemp) - docker exec $container_id ansible-playbook /etc/ansible/playbooks/playbook_under_test/$playbook | tee -a $idempotence - tail $idempotence \ - | grep -q 'changed=0.*failed=0' \ - && (printf ${green}'Idempotence test: pass'${neutral}"\n") \ - || (printf ${red}'Idempotence test: fail'${neutral}"\n" && exit 1) -fi -# Remove the Docker container (if configured). -if [ "$cleanup" = true ]; then - printf "Removing Docker container...\n" - docker rm -f $container_id -fi +for f in ./roles/*; do + if [[ -d "$f/molecule" ]]; then + pushd "$f" + molecule -c ../../tests/molecule/base.yml test + popd + fi +done From f1ce3537b9b8e717be96e3c64eb09a2c53c96436 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Fri, 9 Sep 2022 22:24:34 +0100 Subject: [PATCH 010/286] Add reference hello_world role --- nas.yml | 4 ++ roles/hello_world/defaults/main.yml | 16 ++++++++ roles/hello_world/docs/hello_world.md | 15 ++++++++ .../hello_world/molecule/default/molecule.yml | 6 +++ .../molecule/default/side_effect.yml | 10 +++++ roles/hello_world/molecule/default/verify.yml | 17 +++++++++ .../molecule/default/verify_stopped.yml | 17 +++++++++ roles/hello_world/tasks/main.yml | 37 +++++++++++++++++++ 8 files changed, 122 insertions(+) create mode 100644 roles/hello_world/defaults/main.yml create mode 100644 roles/hello_world/docs/hello_world.md create mode 100644 roles/hello_world/molecule/default/molecule.yml create mode 100644 roles/hello_world/molecule/default/side_effect.yml create mode 100644 roles/hello_world/molecule/default/verify.yml create mode 100644 roles/hello_world/molecule/default/verify_stopped.yml create mode 100644 roles/hello_world/tasks/main.yml diff --git a/nas.yml b/nas.yml index e9f88d0848..da82bc9acf 100644 --- a/nas.yml +++ b/nas.yml @@ -153,6 +153,10 @@ - heimdall when: (heimdall_enabled | default(False)) + - role: hello_world + tags: + - hello_world + - role: homeassistant tags: - homeassistant diff --git a/roles/hello_world/defaults/main.yml b/roles/hello_world/defaults/main.yml new file mode 100644 index 0000000000..b80326a375 --- /dev/null +++ b/roles/hello_world/defaults/main.yml @@ -0,0 +1,16 @@ +--- +hello_world_enabled: false +hello_world_available_externally: false + +# directories +hello_world_data_directory: "{{ docker_home }}/hello_world" + +# network +hello_world_port: "9999" +hello_world_hostname: "hello_world" + +# specs +hello_world_memory: 1g + +# docker +hello_world_container_name: hello_world diff --git a/roles/hello_world/docs/hello_world.md b/roles/hello_world/docs/hello_world.md new file mode 100644 index 0000000000..b5d0eec913 --- /dev/null +++ b/roles/hello_world/docs/hello_world.md @@ -0,0 +1,15 @@ +# Hello World + +Homepage: + +A few sentences here about what the application does. + +## Usage + +Set `hello_world_enabled: true` in your `inventories//nas.yml` file. + +The Hello World web interface can be found at . + +## Specific Configuration + +Detail any information here about user setup steps once Ansible-NAS has started the application. \ No newline at end of file diff --git a/roles/hello_world/molecule/default/molecule.yml b/roles/hello_world/molecule/default/molecule.yml new file mode 100644 index 0000000000..4312939c17 --- /dev/null +++ b/roles/hello_world/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + hello_world_enabled: true diff --git a/roles/hello_world/molecule/default/side_effect.yml b/roles/hello_world/molecule/default/side_effect.yml new file mode 100644 index 0000000000..1809f50827 --- /dev/null +++ b/roles/hello_world/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + hello_world_enabled: false diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml new file mode 100644 index 0000000000..7ce894dc49 --- /dev/null +++ b/roles/hello_world/molecule/default/verify.yml @@ -0,0 +1,17 @@ +--- +# This is an example playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Get container state + docker_container_info: + name: hello_world + register: result + + - name: Check Hello World is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..239f66073e --- /dev/null +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -0,0 +1,17 @@ +--- +# This is a Hello World playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Try and stop and remove Hello World + docker_container: + name: hello_world + state: absent + register: result + + - name: Check Hello World is stopped + assert: + that: + - not result.changed diff --git a/roles/hello_world/tasks/main.yml b/roles/hello_world/tasks/main.yml new file mode 100644 index 0000000000..7fbec768b7 --- /dev/null +++ b/roles/hello_world/tasks/main.yml @@ -0,0 +1,37 @@ +--- +- name: Start Hello World + block: + - name: Create Hello World Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ hello_world_data_directory }}" + + - name: Hello World Docker Container + docker_container: + name: "{{ hello_world_container_name }}" + image: crccheck/hello-world + pull: true + volumes: + - "{{ hello_world_data_directory }}:/hello_world:rw" + ports: + - "{{ hello_world_port }}:8000" + restart_policy: unless-stopped + memory: "{{ hello_world_memory }}" + labels: + traefik.enable: "{{ hello_world_available_externally | string }}" + traefik.http.routers.hello_world.rule: "Host(`{{ hello_world_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.hello_world.tls.certresolver: "letsencrypt" + traefik.http.routers.hello_world.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.hello_world.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.hello_world.loadbalancer.server.port: "4040" + when: hello_world_enabled is true + +- name: Stop Hello World + block: + - name: Stop Hello World + docker_container: + name: "{{ hello_world_container_name }}" + state: absent + when: hello_world_enabled is false From 5c797997c085d73c9db8dc4f16ed4f6d4d23aa55 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Fri, 9 Sep 2022 23:51:38 +0100 Subject: [PATCH 011/286] Add GitHub test matrix script --- tests/github-test-matrix.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100755 tests/github-test-matrix.sh diff --git a/tests/github-test-matrix.sh b/tests/github-test-matrix.sh new file mode 100755 index 0000000000..178713462f --- /dev/null +++ b/tests/github-test-matrix.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +# Creates a matrix of roles testable by Molecule for GitHub Actions to use + +for f in ./roles/*; do + if [[ -d "$f/molecule" ]]; then + test_matrix="${test_matrix} $f" + fi +done + +echo "::set-output name=matrix::$(echo $test_matrix | jq -R -s -c 'sub("\n"; " ") | split(" ")[:-1]')" From 0e46133f697bc85a55f493220affe963eabcc20f Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 09:23:20 +0100 Subject: [PATCH 012/286] Fix docs --- roles/hello_world/docs/hello_world.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/hello_world/docs/hello_world.md b/roles/hello_world/docs/hello_world.md index b5d0eec913..0c9509e342 100644 --- a/roles/hello_world/docs/hello_world.md +++ b/roles/hello_world/docs/hello_world.md @@ -12,4 +12,4 @@ The Hello World web interface can be found at Date: Sat, 10 Sep 2022 09:27:16 +0100 Subject: [PATCH 013/286] First stab at matrix CI testing --- .github/workflows/integration.yml | 41 ++++++++++++++++++------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index c82ea030ba..48696fc43d 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -7,23 +7,30 @@ on: workflow_dispatch: jobs: - test: - name: Test - runs-on: ubuntu-22.04 + generate-matrix: + name: Generate test matrix + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - name: Check out the codebase - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + - id: set-matrix + shell: bash + run: "tests/github-test-matrix.sh" - - name: Set up Python 3 - uses: actions/setup-python@v2 + test: + name: Test + needs: generate-matrix + runs-on: ubuntu-latest + strategy: + matrix: + role: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} + steps: + - name: Molecule + uses: gofrolist/molecule-action@v2 with: - python-version: '3.x' - - - name: Install Ansible - run: pip3 install ansible - - - name: Install roles - run: ansible-galaxy install -r requirements.yml - - - name: Run playbook - run: ansible-playbook -i tests/inventories/integration_testing/inventory nas.yml -b \ No newline at end of file + molecule_options: --base-config ../../tests/molecule/base.yml + molecule_command: test + molecule_working_dir: ./roles/${{ matrix.role }} + env: + ANSIBLE_FORCE_COLOR: '1' From 8571db9fbba2996650c700d32855090d72a51db7 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 09:34:11 +0100 Subject: [PATCH 014/286] Integration testing --- .github/workflows/integration.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 48696fc43d..bb81db92fa 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -19,18 +19,18 @@ jobs: run: "tests/github-test-matrix.sh" test: - name: Test + name: "Test ${{ matrix.role }}" needs: generate-matrix runs-on: ubuntu-latest strategy: matrix: role: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} - steps: + steps: - name: Molecule uses: gofrolist/molecule-action@v2 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test - molecule_working_dir: ./roles/${{ matrix.role }} + molecule_working_dir: ./${{ matrix.role }} env: ANSIBLE_FORCE_COLOR: '1' From e23d196f3b838b128bb8727e42f2c48fa44a417c Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 09:40:32 +0100 Subject: [PATCH 015/286] More integration testing --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index bb81db92fa..2f49dcfd0d 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,6 +31,6 @@ jobs: with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test - molecule_working_dir: ./${{ matrix.role }} + molecule_working_dir: ${{ matrix.role }} env: ANSIBLE_FORCE_COLOR: '1' From bb015752636f8f6c74727cd6babcda17fffc74c9 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 10:22:57 +0100 Subject: [PATCH 016/286] Integration testing again... --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 2f49dcfd0d..d2a8807c31 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,6 +31,6 @@ jobs: with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test - molecule_working_dir: ${{ matrix.role }} + molecule_working_dir: ${GITHUB_REPOSITORY}/${{ matrix.role }} env: ANSIBLE_FORCE_COLOR: '1' From c10fde5a5c02983759990f3657ff653582e31844 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 10:32:58 +0100 Subject: [PATCH 017/286] Integration testing --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index d2a8807c31..f6382c2f81 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,6 +31,6 @@ jobs: with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test - molecule_working_dir: ${GITHUB_REPOSITORY}/${{ matrix.role }} + molecule_working_dir: /github/workspace/${{ matrix.role }} env: ANSIBLE_FORCE_COLOR: '1' From 69264a72565083db84accef41f0f4d2944642288 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 10:54:48 +0100 Subject: [PATCH 018/286] Integration testing --- .github/workflows/integration.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f6382c2f81..b318bc55c7 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -26,6 +26,12 @@ jobs: matrix: role: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} steps: + - name: Dump env context + id: env_context_step + run: echo '${{ toJSON(env) }}' + - name: Dump GitHub context + id: github_context_step + run: echo '${{ toJSON(github) }}' - name: Molecule uses: gofrolist/molecule-action@v2 with: From 29260a59d310597cd9f9211943d724ffbb3eb91e Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 10:59:06 +0100 Subject: [PATCH 019/286] integraiton testing --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index b318bc55c7..f9a421e944 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Dump env context id: env_context_step - run: echo '${{ toJSON(env) }}' + run: env - name: Dump GitHub context id: github_context_step run: echo '${{ toJSON(github) }}' From 2854182c840bfa16a98f748115bb84dd44615b74 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 12:32:33 +0100 Subject: [PATCH 020/286] Integration testing --- .github/workflows/integration.yml | 12 ++++-------- tests/molecule/base.yml | 6 +++--- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f9a421e944..2f6b04da73 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -13,7 +13,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - id: set-matrix shell: bash run: "tests/github-test-matrix.sh" @@ -26,17 +26,13 @@ jobs: matrix: role: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} steps: - - name: Dump env context - id: env_context_step - run: env - - name: Dump GitHub context - id: github_context_step - run: echo '${{ toJSON(github) }}' + - uses: actions/checkout@v3 - name: Molecule uses: gofrolist/molecule-action@v2 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test - molecule_working_dir: /github/workspace/${{ matrix.role }} + molecule_working_dir: ${{ matrix.role }} env: + PY_COLORS: '1' ANSIBLE_FORCE_COLOR: '1' diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index 5c3f198d04..067168bb0a 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -12,9 +12,9 @@ platforms: privileged: true provisioner: name: ansible - config_options: - defaults: - stdout_callback: dense + # config_options: + # defaults: + # stdout_callback: dense inventory: group_vars: all: From bf8c84f883c5cd3c2bb549df502a72f4de353ada Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 12:37:41 +0100 Subject: [PATCH 021/286] Don't build image when testing with molecule --- tests/molecule/base.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index 067168bb0a..f940991c20 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -10,6 +10,7 @@ platforms: - /sys/fs/cgroup:/sys/fs/cgroup:ro - /var/run/docker.sock:/var/run/docker.sock privileged: true + pre_build_image: true provisioner: name: ansible # config_options: From 1206c56185ea9a02d74a28006e361dee76008a3d Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 12:38:26 +0100 Subject: [PATCH 022/286] Integration tests for Heimdall --- roles/heimdall/molecule/default/molecule.yml | 6 ++++++ roles/heimdall/molecule/default/side_effect.yml | 10 ++++++++++ roles/heimdall/molecule/default/verify.yml | 17 +++++++++++++++++ .../molecule/default/verify_stopped.yml | 17 +++++++++++++++++ 4 files changed, 50 insertions(+) create mode 100644 roles/heimdall/molecule/default/molecule.yml create mode 100644 roles/heimdall/molecule/default/side_effect.yml create mode 100644 roles/heimdall/molecule/default/verify.yml create mode 100644 roles/heimdall/molecule/default/verify_stopped.yml diff --git a/roles/heimdall/molecule/default/molecule.yml b/roles/heimdall/molecule/default/molecule.yml new file mode 100644 index 0000000000..d914709da4 --- /dev/null +++ b/roles/heimdall/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + heimdall_enabled: true diff --git a/roles/heimdall/molecule/default/side_effect.yml b/roles/heimdall/molecule/default/side_effect.yml new file mode 100644 index 0000000000..3677a4db24 --- /dev/null +++ b/roles/heimdall/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + heimdall_enabled: false diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml new file mode 100644 index 0000000000..9801d22afa --- /dev/null +++ b/roles/heimdall/molecule/default/verify.yml @@ -0,0 +1,17 @@ +--- +# This is an example playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Get container state + docker_container_info: + name: heimdall + register: result + + - name: Check Heimdall is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..5950f6abb6 --- /dev/null +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -0,0 +1,17 @@ +--- +# This is an example playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Try and stop and remove Heimdall + docker_container: + name: heimdall + state: absent + register: result + + - name: Check Heimdall is stopped + assert: + that: + - not result.changed From af4f74f966801ab239ada79b9fe19a5b1c559ce6 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 12:52:22 +0100 Subject: [PATCH 023/286] Run integration tests daily --- .github/workflows/integration.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 2f6b04da73..d1e407e3ca 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -3,9 +3,11 @@ name: Integration # Controls when the action will run. on: - # Allows you to run this workflow manually from the Actions tab + schedule: + - cron: '0 23 * * *' workflow_dispatch: + jobs: generate-matrix: name: Generate test matrix @@ -14,7 +16,8 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v3 - - id: set-matrix + - name: Generate Test Matrix + id: set-matrix shell: bash run: "tests/github-test-matrix.sh" @@ -27,7 +30,7 @@ jobs: role: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} steps: - uses: actions/checkout@v3 - - name: Molecule + - name: Molecule Test uses: gofrolist/molecule-action@v2 with: molecule_options: --base-config ../../tests/molecule/base.yml From a2035c972323874106fd0a2c8d58a42e6c6dd53f Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 12:57:47 +0100 Subject: [PATCH 024/286] Update README.md --- README.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 56f240e25b..a16547f5b5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Ansible NAS [![CI](https://github.com/davestephens/ansible-nas/workflows/CI/badge.svg)](https://github.com/davestephens/ansible-nas/actions?query=workflow%3ACI) +[![Integration](https://github.com/davestephens/ansible-nas/workflows/Integration/badge.svg)](https://github.com/davestephens/ansible-nas/actions?query=workflow%3AIntegration) [![Gitter chat](https://img.shields.io/gitter/room/ansible-nas/chat.svg?logo=gitter&style=flat-square)](https://gitter.im/Ansible-NAS/Chat) [![license](https://img.shields.io/github/license/DAVFoundation/api_doc.svg?style=flat-square)](https://github.com/davestephens/ansible-nas/blob/master/LICENSE) [![Ko-fi](https://img.shields.io/static/v1.svg?label=ko-fi&message=Buy%20Me%20A%20Coffee&color=orange&style=flat-square&logo=buy-me-a-coffee)](https://ko-fi.com/davestephens) @@ -115,10 +116,6 @@ Ansible NAS doesn't set up your disk partitions, primarily because getting it wr See [Installation](https://davestephens.github.io/ansible-nas/installation/). -## Upgrading - -**The way Ansible-NAS configuration is structured has changed!** See [Upgrading](https://davestephens.github.io/ansible-nas/upgrading/) for more information. See the **Getting Help** section if you get stuck. - ## Documentation You can read the docs [here](https://davestephens.github.io/ansible-nas). PRs for more documentation always welcome! @@ -137,7 +134,7 @@ Assuming that your Ubuntu system disk is separate from your storage (it should b ## Requirements * Ansible NAS targets the latest Ubuntu LTS release, which is currently Ubuntu Server 22.04 LTS. -* You can run Ansible-NAS on whatever you like, read the docs for more info. I use an HP Microserver. +* You can run Ansible-NAS on whatever hardware you like, read the docs for more info. I use an HP Microserver. ## Getting Help @@ -160,4 +157,4 @@ If you've enjoyed Ansible-NAS as much as I do working on it, please consider [bu The awesome dudes at [JetBrains](https://www.jetbrains.com/?from=Ansible-NAS) for supplying core contributors with JetBrains Open Source licenses! -All of the awesome contributors to Ansible-NAS: ![All of the awesome contributors to Ansible-NAS](https://contrib.rocks/image?repo=davestephens/ansible-nas) +All of the awesome contributors to Ansible-NAS! From 812edd196fdfa797de187c63b27ed52d1574c4b4 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 15:28:41 +0100 Subject: [PATCH 025/286] Update contributing docs --- CONTRIBUTING.md | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7ccd1b892f..d17c85957d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,28 +2,22 @@ Contributing to Ansible-NAS is easy! Add your functionality, then raise a pull request on GitHub. A few things to bear in mind: -* **Restrict pull requests to one piece of functionality or bugfix at a time.** -* Test your new functionality or bugfix using the included `tests/test-vagrant.sh` script to spin up a test VM. -* Run `ansible-lint` against the playbook before committing. (There is a VSCode task set up to run the right command for you) -* Ensure that your PR only changes files required for your functionality or bugfix. Random changes in other files will result in your PR being rejected - -If you're adding a new application: +## Development Environment -* It must be structured in an [Ansible role](https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html). -* Ensure that the new application is disabled by default. -* Add a documentation page to `docs/applications/` - use an existing application as an example. -* Add to the list of Available Applications in `README.md` -* Add the frontend port to `docs/configuration/application_ports.md`, ensuring you've not clashed with an existing application. +* Development of Ansible-NAS is carried out in [Visual Studio Code](https://code.visualstudio.com/) on Linux - you'll get some nice recommended extensions and task setups if you do the same. +* You'll need a working Python 3 environment, Docker (to run tests) and [pre-commit](https://pre-commit.com) installed - `pip install -r requirements-dev.txt`. -## Things to bear in mind +## General Stuff -* If you break the build with your PR, it'll need to be fixed before it's merged. -* Pull requests that unintentionally touch files, or that show files as removed then re-added will be rejected. -* Don't mess with line endings, or tabs vs. spaces. +* **Restrict pull requests to one piece of functionality or bugfix at a time.** +* Ensure that your changes aren't going to break the GitHub builds. You can run the Pre-commit checks manually (it's not yet configured to run on every commit) using the VSCode task. +* Ensure that your PR only changes files required for your functionality or bugfix. Random changes in other files will result in your PR being rejected. +* Don't mess with line endings, or change spaces for tabs. They're fine how they are. * Please know that your efforts are appreciated, thanks! :+1: -## Development Environment +## Adding a new application -* Development of Ansible-NAS is carried out in [Visual Studio Code](https://code.visualstudio.com/) - you'll get some nice -recommended extensions and task setups if you do the same. -* You'll need a working Python 3 environment, and [pre-commit](https://pre-commit.com) installed - `pip install -r requirements-dev.txt`. +So you want to add a new application. Great! + +* Start by looking at the `hello_world` example. Following this structure is the most likely way of getting your PR approved. Leaving out things the `hello_world` example includes (ie docs, tests) will definitely result in your PR being rejected. +* Add to the list of Available Applications in `README.md` From ab5ada943d741120c5a76e7eda54037d0d3502e8 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 10 Sep 2022 19:38:00 +0100 Subject: [PATCH 026/286] airsonic tests --- roles/airsonic/molecule/default/molecule.yml | 6 ++++++ roles/airsonic/molecule/default/side_effect.yml | 10 ++++++++++ roles/airsonic/molecule/default/verify.yml | 17 +++++++++++++++++ .../molecule/default/verify_stopped.yml | 17 +++++++++++++++++ tests/molecule/base.yml | 16 ++++++++++++++-- 5 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 roles/airsonic/molecule/default/molecule.yml create mode 100644 roles/airsonic/molecule/default/side_effect.yml create mode 100644 roles/airsonic/molecule/default/verify.yml create mode 100644 roles/airsonic/molecule/default/verify_stopped.yml diff --git a/roles/airsonic/molecule/default/molecule.yml b/roles/airsonic/molecule/default/molecule.yml new file mode 100644 index 0000000000..87cc0f0ce1 --- /dev/null +++ b/roles/airsonic/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + airsonic_enabled: true diff --git a/roles/airsonic/molecule/default/side_effect.yml b/roles/airsonic/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5f7e409e40 --- /dev/null +++ b/roles/airsonic/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + airsonic_enabled: false diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml new file mode 100644 index 0000000000..c77e5525d2 --- /dev/null +++ b/roles/airsonic/molecule/default/verify.yml @@ -0,0 +1,17 @@ +--- +# This is an example playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Get container state + docker_container_info: + name: airsonic + register: result + + - name: Check Airsonic is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..971391201e --- /dev/null +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -0,0 +1,17 @@ +--- +# This is an example playbook to execute Ansible tests. + +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Try and stop and remove Airsonic + docker_container: + name: airsonic + state: absent + register: result + + - name: Check Airsonic is stopped + assert: + that: + - not result.changed diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index f940991c20..5749049879 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -19,9 +19,21 @@ provisioner: inventory: group_vars: all: - docker_home: /ansible-nas - ansible_nas_timezone: Europe/London ansible_nas_domain: ansible-nas.io + ansible_nas_timezone: Europe/London + audiobooks_root: /audiobooks + books_root: /books + code_root: /code + comics_root: /comics + docker_home: /ansible-nas + documents_root: /documents + downloads_root: /downloads + movies_root: /movies + music_root: /music + photos_root: /photos + podcasts_root: /podcasts + torrents_root: /torrents + tv_root: /tv playbooks: prepare: ../../../../tests/molecule/resources/playbooks/prepare.yml converge: ../../../../tests/molecule/resources/playbooks/converge.yml From 8120c719a95195b78a88d8361819cae50ef54f74 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 16:30:26 +0100 Subject: [PATCH 027/286] Remove commented out Molecule config --- tests/molecule/base.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index 5749049879..a57f3296e4 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -13,9 +13,6 @@ platforms: pre_build_image: true provisioner: name: ansible - # config_options: - # defaults: - # stdout_callback: dense inventory: group_vars: all: From 268bfb0d3dba2e5c0afdddb4bb7c7f517f4e87fd Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:07:18 +0100 Subject: [PATCH 028/286] Include role vars for cleaner tests --- roles/hello_world/molecule/default/verify.yml | 5 ++++- roles/hello_world/molecule/default/verify_stopped.yml | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml index 7ce894dc49..1cf221a3a3 100644 --- a/roles/hello_world/molecule/default/verify.yml +++ b/roles/hello_world/molecule/default/verify.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Get container state docker_container_info: - name: hello_world + name: "{{ hello_world_container_name }}" register: result - name: Check Hello World is running diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml index 239f66073e..4f4cc4dd44 100644 --- a/roles/hello_world/molecule/default/verify_stopped.yml +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Try and stop and remove Hello World docker_container: - name: hello_world + name: "{{ hello_world_container_name }}" state: absent register: result From 3529d4ecd62a54cdd8fa50cc91e2857bf28d98dd Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:16:45 +0100 Subject: [PATCH 029/286] Add redhat.vscode-yaml as recommended extension --- .vscode/extensions.json | 1 + .vscode/settings.json | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json index d5afc6647b..4586e1a484 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,7 @@ { "recommendations": [ "redhat.ansible", + "redhat.vscode-yaml", "ybaumes.highlight-trailing-white-spaces", "bungcip.better-toml" ] diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..e785022733 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "yaml.schemaStore.enable": false +} \ No newline at end of file From 9440b75dbf0b6dea9411dd07046c251982fc2cf8 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:17:01 +0100 Subject: [PATCH 030/286] Useful Ansible snippets for Ansible-NAS --- .vscode/ansible-nas.json.code-snippets | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .vscode/ansible-nas.json.code-snippets diff --git a/.vscode/ansible-nas.json.code-snippets b/.vscode/ansible-nas.json.code-snippets new file mode 100644 index 0000000000..b470b1922d --- /dev/null +++ b/.vscode/ansible-nas.json.code-snippets @@ -0,0 +1,39 @@ +{ + // Place your ansible-nas workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + // "Print to console": { + // "scope": "javascript,typescript", + // "prefix": "log", + // "body": [ + // "console.log('$1');", + // "$2" + // ], + // "description": "Log output to console" + // } + + "Block When": { + "prefix": ["bw"], + "body": [ + "- name: ${1:name}", + "\tblock:", + "\t\t$0", + "\twhen: ${2:condition}" + ], + "description": "block with when condition" + }, + "Assert That": { + "prefix": ["at"], + "body": [ + "- name: ${1:name}", + "\tassert:", + "\t\tthat:", + "\t\t\t- $0" + ], + "description": "assert that" + } +} \ No newline at end of file From 0af3d5b26516ba7cbd27454db582568af5bfedde Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:22:03 +0100 Subject: [PATCH 031/286] pytest and pytest-molecule for easy test kickoff --- requirements-dev.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 0a24a90064..6ed693e439 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,5 @@ pre-commit molecule==4.0.1 -molecule[docker]==4.0.1 \ No newline at end of file +molecule[docker]==4.0.1 +pytest>=7.0.0 +pytest_molecule>=2.0.0 \ No newline at end of file From 0a2d4d94bed0153b3292e9a4b43e0b2d630cf4a4 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:33:19 +0100 Subject: [PATCH 032/286] Use variables from role for testing --- roles/airsonic/molecule/default/verify.yml | 5 ++++- roles/airsonic/molecule/default/verify_stopped.yml | 5 ++++- roles/heimdall/molecule/default/verify.yml | 5 ++++- roles/heimdall/molecule/default/verify_stopped.yml | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index c77e5525d2..19adf1cad3 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Get container state docker_container_info: - name: airsonic + name: "{{ airsonic_container_name }}" register: result - name: Check Airsonic is running diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index 971391201e..7113b00a4e 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Try and stop and remove Airsonic docker_container: - name: airsonic + name: "{{ airsonic_container_name }}" state: absent register: result diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml index 9801d22afa..fbeb602193 100644 --- a/roles/heimdall/molecule/default/verify.yml +++ b/roles/heimdall/molecule/default/verify.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Get container state docker_container_info: - name: heimdall + name: "{{ heimdall_container_name }}" register: result - name: Check Heimdall is running diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml index 5950f6abb6..2be7a52dce 100644 --- a/roles/heimdall/molecule/default/verify_stopped.yml +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -5,9 +5,12 @@ hosts: all gather_facts: false tasks: + - include_vars: + file: ../../defaults/main.yml + - name: Try and stop and remove Heimdall docker_container: - name: heimdall + name: "{{ heimdall_container_name }}" state: absent register: result From 8a2b24f08d07e856a0f1f03cd1e05b09a8e7fbbf Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:58:26 +0100 Subject: [PATCH 033/286] Remove pointless comments --- roles/airsonic/molecule/default/verify.yml | 2 -- roles/airsonic/molecule/default/verify_stopped.yml | 2 -- 2 files changed, 4 deletions(-) diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index 19adf1cad3..5dc0a7c49e 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -1,6 +1,4 @@ --- -# This is an example playbook to execute Ansible tests. - - name: Verify hosts: all gather_facts: false diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index 7113b00a4e..a642055718 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -1,6 +1,4 @@ --- -# This is an example playbook to execute Ansible tests. - - name: Verify hosts: all gather_facts: false From 6058a4157ba0f8d7a2bd6f6e6510de21a200ebba Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:58:39 +0100 Subject: [PATCH 034/286] Bazarr tests --- roles/bazarr/molecule/default/molecule.yml | 6 ++++++ roles/bazarr/molecule/default/side_effect.yml | 10 ++++++++++ .../bazarr/molecule/default/verify_stopped.yml | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 roles/bazarr/molecule/default/molecule.yml create mode 100644 roles/bazarr/molecule/default/side_effect.yml create mode 100644 roles/bazarr/molecule/default/verify_stopped.yml diff --git a/roles/bazarr/molecule/default/molecule.yml b/roles/bazarr/molecule/default/molecule.yml new file mode 100644 index 0000000000..4b173dac49 --- /dev/null +++ b/roles/bazarr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + bazarr_enabled: true diff --git a/roles/bazarr/molecule/default/side_effect.yml b/roles/bazarr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..de729e02cb --- /dev/null +++ b/roles/bazarr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + bazarr_enabled: false diff --git a/roles/bazarr/molecule/default/verify_stopped.yml b/roles/bazarr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..7b316fdbb3 --- /dev/null +++ b/roles/bazarr/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Bazarr + docker_container: + name: "{{ bazarr_container_name }}" + state: absent + register: result + + - name: Check Bazarr is stopped + assert: + that: + - not result.changed From 81da82de8fcb3b11a6ceb76f22fe958c042c9700 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 17:58:53 +0100 Subject: [PATCH 035/286] Bazarr tests --- roles/bazarr/molecule/default/verify.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 roles/bazarr/molecule/default/verify.yml diff --git a/roles/bazarr/molecule/default/verify.yml b/roles/bazarr/molecule/default/verify.yml new file mode 100644 index 0000000000..b29244084d --- /dev/null +++ b/roles/bazarr/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ bazarr_container_name }}" + register: result + + - name: Check Bazarr is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false From 1759c79b676c45512c7c3745e9cdd50e2ebe7638 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 18:23:58 +0100 Subject: [PATCH 036/286] Bitwarden tests and tasks fix --- roles/bitwarden/molecule/default/molecule.yml | 6 +++++ .../molecule/default/side_effect.yml | 10 ++++++++ roles/bitwarden/molecule/default/verify.yml | 25 +++++++++++++++++++ .../molecule/default/verify_stopped.yml | 25 +++++++++++++++++++ roles/bitwarden/tasks/main.yml | 2 +- 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 roles/bitwarden/molecule/default/molecule.yml create mode 100644 roles/bitwarden/molecule/default/side_effect.yml create mode 100644 roles/bitwarden/molecule/default/verify.yml create mode 100644 roles/bitwarden/molecule/default/verify_stopped.yml diff --git a/roles/bitwarden/molecule/default/molecule.yml b/roles/bitwarden/molecule/default/molecule.yml new file mode 100644 index 0000000000..b2c6c4a8c3 --- /dev/null +++ b/roles/bitwarden/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + bitwarden_enabled: true diff --git a/roles/bitwarden/molecule/default/side_effect.yml b/roles/bitwarden/molecule/default/side_effect.yml new file mode 100644 index 0000000000..9d5716db66 --- /dev/null +++ b/roles/bitwarden/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + bitwarden_enabled: false diff --git a/roles/bitwarden/molecule/default/verify.yml b/roles/bitwarden/molecule/default/verify.yml new file mode 100644 index 0000000000..c62702be65 --- /dev/null +++ b/roles/bitwarden/molecule/default/verify.yml @@ -0,0 +1,25 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ bitwarden_container_name }}" + register: result + + - name: Get container state + docker_container_info: + name: "{{ bitwarden_backup_container_name }}" + register: result_backup + + - name: Check Bitwarden is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false + - result_backup.container['State']['Status'] == "running" + - result_backup.container['State']['Restarting'] == false diff --git a/roles/bitwarden/molecule/default/verify_stopped.yml b/roles/bitwarden/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..debe83588a --- /dev/null +++ b/roles/bitwarden/molecule/default/verify_stopped.yml @@ -0,0 +1,25 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Bitwarden + docker_container: + name: "{{ bitwarden_container_name }}" + state: absent + register: result + + - name: Try and stop and remove Bitwarden Backup + docker_container: + name: "{{ bitwarden_backup_container_name }}" + state: absent + register: result_backup + + - name: Check Bitwarden is stopped + assert: + that: + - not result.changed + - not result_backup.changed diff --git a/roles/bitwarden/tasks/main.yml b/roles/bitwarden/tasks/main.yml index fec7588818..e89d682a19 100644 --- a/roles/bitwarden/tasks/main.yml +++ b/roles/bitwarden/tasks/main.yml @@ -20,7 +20,7 @@ volumes: - "{{ bitwarden_data_directory }}:/data:rw" env: - SIGNUPS_ALLOWED: "{{ bitwarden_allow_signups }}" + SIGNUPS_ALLOWED: "{{ bitwarden_allow_signups | string }}" ADMIN_TOKEN: "{{ bitwarden_admin_token }}" LOG_FILE: "/data/bitwarden.log" WEBSOCKET_ENABLED: "true" From 03454fd592589d3baf2199bcb38f58acad26bd90 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 18:37:29 +0100 Subject: [PATCH 037/286] Booksonic tests --- roles/booksonic/molecule/default/molecule.yml | 6 ++++++ .../booksonic/molecule/default/side_effect.yml | 10 ++++++++++ roles/booksonic/molecule/default/verify.yml | 18 ++++++++++++++++++ .../molecule/default/verify_stopped.yml | 18 ++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 roles/booksonic/molecule/default/molecule.yml create mode 100644 roles/booksonic/molecule/default/side_effect.yml create mode 100644 roles/booksonic/molecule/default/verify.yml create mode 100644 roles/booksonic/molecule/default/verify_stopped.yml diff --git a/roles/booksonic/molecule/default/molecule.yml b/roles/booksonic/molecule/default/molecule.yml new file mode 100644 index 0000000000..b88f7089a4 --- /dev/null +++ b/roles/booksonic/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + booksonic_enabled: true diff --git a/roles/booksonic/molecule/default/side_effect.yml b/roles/booksonic/molecule/default/side_effect.yml new file mode 100644 index 0000000000..d5621f450b --- /dev/null +++ b/roles/booksonic/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + booksonic_enabled: false diff --git a/roles/booksonic/molecule/default/verify.yml b/roles/booksonic/molecule/default/verify.yml new file mode 100644 index 0000000000..98400317b7 --- /dev/null +++ b/roles/booksonic/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ booksonic_container_name }}" + register: result + + - name: Check Booksonic is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/booksonic/molecule/default/verify_stopped.yml b/roles/booksonic/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..7b68fe984a --- /dev/null +++ b/roles/booksonic/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Booksonic + docker_container: + name: "{{ booksonic_container_name }}" + state: absent + register: result + + - name: Check Booksonic is stopped + assert: + that: + - not result.changed From 4581e480c10c717c8aeef4a5aedf24a36e63eacb Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 11 Sep 2022 18:46:55 +0100 Subject: [PATCH 038/286] Calibre testing --- roles/calibre/molecule/default/molecule.yml | 6 ++++++ roles/calibre/molecule/default/side_effect.yml | 10 ++++++++++ roles/calibre/molecule/default/verify.yml | 18 ++++++++++++++++++ .../molecule/default/verify_stopped.yml | 18 ++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 roles/calibre/molecule/default/molecule.yml create mode 100644 roles/calibre/molecule/default/side_effect.yml create mode 100644 roles/calibre/molecule/default/verify.yml create mode 100644 roles/calibre/molecule/default/verify_stopped.yml diff --git a/roles/calibre/molecule/default/molecule.yml b/roles/calibre/molecule/default/molecule.yml new file mode 100644 index 0000000000..ba7b4d59c5 --- /dev/null +++ b/roles/calibre/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + calibre_enabled: true diff --git a/roles/calibre/molecule/default/side_effect.yml b/roles/calibre/molecule/default/side_effect.yml new file mode 100644 index 0000000000..3c802a9d02 --- /dev/null +++ b/roles/calibre/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + calibre_enabled: false diff --git a/roles/calibre/molecule/default/verify.yml b/roles/calibre/molecule/default/verify.yml new file mode 100644 index 0000000000..77267b9d52 --- /dev/null +++ b/roles/calibre/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ calibre_container_name }}" + register: result + + - name: Check Calibre is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/calibre/molecule/default/verify_stopped.yml b/roles/calibre/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..bd3ccf6e30 --- /dev/null +++ b/roles/calibre/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Calibre + docker_container: + name: "{{ calibre_container_name }}" + state: absent + register: result + + - name: Check Calibre is stopped + assert: + that: + - not result.changed From e8c3dea1363338c8e72fd07e9d1580726390f1ae Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 12 Sep 2022 10:07:07 +0100 Subject: [PATCH 039/286] Update code of conduct --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 0bb3e49818..e40bf96e96 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -10,7 +10,7 @@ Contributions of every kind have far-ranging consequences. Just as your work dep ## Patient -Asynchronous communication can come with its own frustrations, even in the most responsive of communities. Please remember that our community is largely built on volunteered time, and that questions, contributions, and requests for support may take some time to receive a response. Repeated "bumps" or "reminders" in rapid succession are not good displays of patience. Additionally, it is considered poor manners to ping a specific person with general questions. Pose your question to the community as a whole, and wait patiently for a response. +Asynchronous communication can come with its own frustrations, even in the most responsive of communities. Please remember that our community is totally built on volunteered time, and that questions, contributions, and requests for support may take some time to receive a response. Repeated "bumps" or "reminders" in rapid succession are not good displays of patience. Additionally, it is considered poor manners to ping a specific person with general questions. Pose your question to the community as a whole, and wait patiently for a response. ## Respectful From b743a1e3aeb9d0154bb53300aa5e8e9d7fd2c32f Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 12 Sep 2022 23:14:45 +0100 Subject: [PATCH 040/286] Flip Firefly to MariaDB 10.9 --- roles/firefly/tasks/main.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/roles/firefly/tasks/main.yml b/roles/firefly/tasks/main.yml index 9a4db60064..a1a2d185dc 100644 --- a/roles/firefly/tasks/main.yml +++ b/roles/firefly/tasks/main.yml @@ -6,18 +6,17 @@ path: "{{ item }}" state: directory with_items: - - "{{ firefly_data_directory }}/postgresql" - - "{{ firefly_data_directory }}/mysql" + - "{{ firefly_data_directory }}/mariadb" - "{{ firefly_data_directory }}/upload" - "{{ firefly_data_directory }}/export" - name: Create MySQL container for Firefly docker_container: name: "{{ firefly_mysql_container_name }}" - image: mysql:5.7 + image: mariadb:10.9 pull: true volumes: - - "{{ firefly_data_directory }}/mysql:/var/lib/mysql:rw" + - "{{ firefly_data_directory }}/mariadb:/var/lib/mysql:rw" env: MYSQL_DATABASE: "firefly" MYSQL_USER: "firefly" From 4bf13d78fe49225480c5d619ec200abc6b7c25fa Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 12 Sep 2022 23:26:39 +0100 Subject: [PATCH 041/286] Fix Dokuwiki start/stop --- roles/dokuwiki/defaults/main.yml | 2 +- roles/dokuwiki/tasks/main.yml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/roles/dokuwiki/defaults/main.yml b/roles/dokuwiki/defaults/main.yml index 9019822833..94029b0431 100644 --- a/roles/dokuwiki/defaults/main.yml +++ b/roles/dokuwiki/defaults/main.yml @@ -17,4 +17,4 @@ dokuwiki_port: "8085" dokuwiki_memory: 1g # docker -docuwiki_container_name: docuwiki +dokuwiki_container_name: dokuwiki diff --git a/roles/dokuwiki/tasks/main.yml b/roles/dokuwiki/tasks/main.yml index 4f47df6cfd..b0ba0546ef 100644 --- a/roles/dokuwiki/tasks/main.yml +++ b/roles/dokuwiki/tasks/main.yml @@ -1,5 +1,5 @@ --- -- name: Start Docuwiki +- name: Start Dokuwiki block: - name: Create DokuWiki Directories file: @@ -10,7 +10,7 @@ - name: DokuWiki Docker Container docker_container: - name: "{{ docuwiki_container_name }}" + name: "{{ dokuwiki_container_name }}" image: linuxserver/dokuwiki:latest pull: true volumes: @@ -30,12 +30,12 @@ traefik.http.routers.dokuwiki.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.dokuwiki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" traefik.http.services.dokuwiki.loadbalancer.server.port: "80" - when: docuwiki_enabled is true + when: dokuwiki_enabled is true -- name: Stop Docuwiki +- name: Stop Dokuwiki block: - - name: Stop Docuwiki + - name: Stop Dokuwiki docker_container: - name: "{{ docuwiki_container_name }}" + name: "{{ dokuwiki_container_name }}" state: absent - when: docuwiki_enabled is false + when: dokuwiki_enabled is false From 10b69f33f0c8fa31a522679a8b04bc2f415ca88f Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 12 Sep 2022 23:27:44 +0100 Subject: [PATCH 042/286] Add more role tests --- roles/cloudcmd/molecule/default/molecule.yml | 6 +++++ .../cloudcmd/molecule/default/side_effect.yml | 10 ++++++++ roles/cloudcmd/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ .../molecule/default/molecule.yml | 6 +++++ .../molecule/default/side_effect.yml | 10 ++++++++ .../molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ .../code-server/molecule/default/molecule.yml | 6 +++++ .../molecule/default/side_effect.yml | 10 ++++++++ roles/code-server/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ .../couchpotato/molecule/default/molecule.yml | 6 +++++ .../molecule/default/side_effect.yml | 10 ++++++++ roles/couchpotato/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/dashy/molecule/default/molecule.yml | 6 +++++ roles/dashy/molecule/default/side_effect.yml | 10 ++++++++ roles/dashy/molecule/default/verify.yml | 18 +++++++++++++ .../dashy/molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/deluge/molecule/default/molecule.yml | 6 +++++ roles/deluge/molecule/default/side_effect.yml | 10 ++++++++ roles/deluge/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/dokuwiki/molecule/default/molecule.yml | 6 +++++ .../dokuwiki/molecule/default/side_effect.yml | 10 ++++++++ roles/dokuwiki/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/duplicacy/molecule/default/molecule.yml | 6 +++++ .../molecule/default/side_effect.yml | 10 ++++++++ roles/duplicacy/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/emby/molecule/default/molecule.yml | 6 +++++ roles/emby/molecule/default/side_effect.yml | 10 ++++++++ roles/emby/molecule/default/verify.yml | 18 +++++++++++++ .../emby/molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/esphome/molecule/default/molecule.yml | 6 +++++ .../esphome/molecule/default/side_effect.yml | 10 ++++++++ roles/esphome/molecule/default/verify.yml | 18 +++++++++++++ .../molecule/default/verify_stopped.yml | 18 +++++++++++++ roles/firefly/molecule/default/molecule.yml | 6 +++++ .../firefly/molecule/default/side_effect.yml | 10 ++++++++ roles/firefly/molecule/default/verify.yml | 25 +++++++++++++++++++ .../molecule/default/verify_stopped.yml | 25 +++++++++++++++++++ 44 files changed, 586 insertions(+) create mode 100644 roles/cloudcmd/molecule/default/molecule.yml create mode 100644 roles/cloudcmd/molecule/default/side_effect.yml create mode 100644 roles/cloudcmd/molecule/default/verify.yml create mode 100644 roles/cloudcmd/molecule/default/verify_stopped.yml create mode 100644 roles/cloudflare_ddns/molecule/default/molecule.yml create mode 100644 roles/cloudflare_ddns/molecule/default/side_effect.yml create mode 100644 roles/cloudflare_ddns/molecule/default/verify.yml create mode 100644 roles/cloudflare_ddns/molecule/default/verify_stopped.yml create mode 100644 roles/code-server/molecule/default/molecule.yml create mode 100644 roles/code-server/molecule/default/side_effect.yml create mode 100644 roles/code-server/molecule/default/verify.yml create mode 100644 roles/code-server/molecule/default/verify_stopped.yml create mode 100644 roles/couchpotato/molecule/default/molecule.yml create mode 100644 roles/couchpotato/molecule/default/side_effect.yml create mode 100644 roles/couchpotato/molecule/default/verify.yml create mode 100644 roles/couchpotato/molecule/default/verify_stopped.yml create mode 100644 roles/dashy/molecule/default/molecule.yml create mode 100644 roles/dashy/molecule/default/side_effect.yml create mode 100644 roles/dashy/molecule/default/verify.yml create mode 100644 roles/dashy/molecule/default/verify_stopped.yml create mode 100644 roles/deluge/molecule/default/molecule.yml create mode 100644 roles/deluge/molecule/default/side_effect.yml create mode 100644 roles/deluge/molecule/default/verify.yml create mode 100644 roles/deluge/molecule/default/verify_stopped.yml create mode 100644 roles/dokuwiki/molecule/default/molecule.yml create mode 100644 roles/dokuwiki/molecule/default/side_effect.yml create mode 100644 roles/dokuwiki/molecule/default/verify.yml create mode 100644 roles/dokuwiki/molecule/default/verify_stopped.yml create mode 100644 roles/duplicacy/molecule/default/molecule.yml create mode 100644 roles/duplicacy/molecule/default/side_effect.yml create mode 100644 roles/duplicacy/molecule/default/verify.yml create mode 100644 roles/duplicacy/molecule/default/verify_stopped.yml create mode 100644 roles/emby/molecule/default/molecule.yml create mode 100644 roles/emby/molecule/default/side_effect.yml create mode 100644 roles/emby/molecule/default/verify.yml create mode 100644 roles/emby/molecule/default/verify_stopped.yml create mode 100644 roles/esphome/molecule/default/molecule.yml create mode 100644 roles/esphome/molecule/default/side_effect.yml create mode 100644 roles/esphome/molecule/default/verify.yml create mode 100644 roles/esphome/molecule/default/verify_stopped.yml create mode 100644 roles/firefly/molecule/default/molecule.yml create mode 100644 roles/firefly/molecule/default/side_effect.yml create mode 100644 roles/firefly/molecule/default/verify.yml create mode 100644 roles/firefly/molecule/default/verify_stopped.yml diff --git a/roles/cloudcmd/molecule/default/molecule.yml b/roles/cloudcmd/molecule/default/molecule.yml new file mode 100644 index 0000000000..fafb9404e3 --- /dev/null +++ b/roles/cloudcmd/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + cloudcmd_enabled: true diff --git a/roles/cloudcmd/molecule/default/side_effect.yml b/roles/cloudcmd/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a8be3526e6 --- /dev/null +++ b/roles/cloudcmd/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + cloudcmd_enabled: false diff --git a/roles/cloudcmd/molecule/default/verify.yml b/roles/cloudcmd/molecule/default/verify.yml new file mode 100644 index 0000000000..abef5b4ac7 --- /dev/null +++ b/roles/cloudcmd/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ cloudcmd_container_name }}" + register: result + + - name: Check Cloudcmd is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/cloudcmd/molecule/default/verify_stopped.yml b/roles/cloudcmd/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..68ad0d3b93 --- /dev/null +++ b/roles/cloudcmd/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Cloudcmd + docker_container: + name: "{{ cloudcmd_container_name }}" + state: absent + register: result + + - name: Check Cloudcmd is stopped + assert: + that: + - not result.changed diff --git a/roles/cloudflare_ddns/molecule/default/molecule.yml b/roles/cloudflare_ddns/molecule/default/molecule.yml new file mode 100644 index 0000000000..6db8afe10f --- /dev/null +++ b/roles/cloudflare_ddns/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + cloudflare_ddns_enabled: true diff --git a/roles/cloudflare_ddns/molecule/default/side_effect.yml b/roles/cloudflare_ddns/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a43eaa62c7 --- /dev/null +++ b/roles/cloudflare_ddns/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + cloudflare_ddns_enabled: false diff --git a/roles/cloudflare_ddns/molecule/default/verify.yml b/roles/cloudflare_ddns/molecule/default/verify.yml new file mode 100644 index 0000000000..0e92e82ee9 --- /dev/null +++ b/roles/cloudflare_ddns/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ cloudflare_container_name }}" + register: result + + - name: Check Cloudflare DDNS is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e2273930e4 --- /dev/null +++ b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Cloudflare DDNS + docker_container: + name: "{{ cloudflare_container_name }}" + state: absent + register: result + + - name: Check Cloudflare DDNS is stopped + assert: + that: + - not result.changed diff --git a/roles/code-server/molecule/default/molecule.yml b/roles/code-server/molecule/default/molecule.yml new file mode 100644 index 0000000000..bcd85fdf80 --- /dev/null +++ b/roles/code-server/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + code_server_enabled: true diff --git a/roles/code-server/molecule/default/side_effect.yml b/roles/code-server/molecule/default/side_effect.yml new file mode 100644 index 0000000000..788fea61bf --- /dev/null +++ b/roles/code-server/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + code_server_enabled: false diff --git a/roles/code-server/molecule/default/verify.yml b/roles/code-server/molecule/default/verify.yml new file mode 100644 index 0000000000..970070c650 --- /dev/null +++ b/roles/code-server/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ code_server_container_name }}" + register: result + + - name: Check Code Server is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/code-server/molecule/default/verify_stopped.yml b/roles/code-server/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..5cba43ccf5 --- /dev/null +++ b/roles/code-server/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Code Server + docker_container: + name: "{{ code_server_container_name }}" + state: absent + register: result + + - name: Check Code Server is stopped + assert: + that: + - not result.changed diff --git a/roles/couchpotato/molecule/default/molecule.yml b/roles/couchpotato/molecule/default/molecule.yml new file mode 100644 index 0000000000..cbafe9a08a --- /dev/null +++ b/roles/couchpotato/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + couchpotato_enabled: true diff --git a/roles/couchpotato/molecule/default/side_effect.yml b/roles/couchpotato/molecule/default/side_effect.yml new file mode 100644 index 0000000000..462d24100d --- /dev/null +++ b/roles/couchpotato/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + couchpotato_enabled: false diff --git a/roles/couchpotato/molecule/default/verify.yml b/roles/couchpotato/molecule/default/verify.yml new file mode 100644 index 0000000000..3031e9025e --- /dev/null +++ b/roles/couchpotato/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ couchpotato_container_name }}" + register: result + + - name: Check Couchpotato is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/couchpotato/molecule/default/verify_stopped.yml b/roles/couchpotato/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..213afef491 --- /dev/null +++ b/roles/couchpotato/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Couchpotato + docker_container: + name: "{{ couchpotato_container_name }}" + state: absent + register: result + + - name: Check Couchpotato is stopped + assert: + that: + - not result.changed diff --git a/roles/dashy/molecule/default/molecule.yml b/roles/dashy/molecule/default/molecule.yml new file mode 100644 index 0000000000..e9b374274a --- /dev/null +++ b/roles/dashy/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + dashy_enabled: true diff --git a/roles/dashy/molecule/default/side_effect.yml b/roles/dashy/molecule/default/side_effect.yml new file mode 100644 index 0000000000..de8025c38c --- /dev/null +++ b/roles/dashy/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + dashy_enabled: false diff --git a/roles/dashy/molecule/default/verify.yml b/roles/dashy/molecule/default/verify.yml new file mode 100644 index 0000000000..6c1bc594eb --- /dev/null +++ b/roles/dashy/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ dashy_container_name }}" + register: result + + - name: Check Dashy is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/dashy/molecule/default/verify_stopped.yml b/roles/dashy/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..1748897f7c --- /dev/null +++ b/roles/dashy/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Dashy + docker_container: + name: "{{ dashy_container_name }}" + state: absent + register: result + + - name: Check Dashy is stopped + assert: + that: + - not result.changed diff --git a/roles/deluge/molecule/default/molecule.yml b/roles/deluge/molecule/default/molecule.yml new file mode 100644 index 0000000000..0991f2ed17 --- /dev/null +++ b/roles/deluge/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + deluge_enabled: true diff --git a/roles/deluge/molecule/default/side_effect.yml b/roles/deluge/molecule/default/side_effect.yml new file mode 100644 index 0000000000..7a856d78b3 --- /dev/null +++ b/roles/deluge/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + deluge_enabled: false diff --git a/roles/deluge/molecule/default/verify.yml b/roles/deluge/molecule/default/verify.yml new file mode 100644 index 0000000000..6d815a897f --- /dev/null +++ b/roles/deluge/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ deluge_container_name }}" + register: result + + - name: Check Deluge is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/deluge/molecule/default/verify_stopped.yml b/roles/deluge/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..9d4abcbe0a --- /dev/null +++ b/roles/deluge/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Deluge + docker_container: + name: "{{ deluge_container_name }}" + state: absent + register: result + + - name: Check Deluge is stopped + assert: + that: + - not result.changed diff --git a/roles/dokuwiki/molecule/default/molecule.yml b/roles/dokuwiki/molecule/default/molecule.yml new file mode 100644 index 0000000000..fd3041c61e --- /dev/null +++ b/roles/dokuwiki/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + dokuwiki_enabled: true diff --git a/roles/dokuwiki/molecule/default/side_effect.yml b/roles/dokuwiki/molecule/default/side_effect.yml new file mode 100644 index 0000000000..d161636ca3 --- /dev/null +++ b/roles/dokuwiki/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + dokuwiki_enabled: false diff --git a/roles/dokuwiki/molecule/default/verify.yml b/roles/dokuwiki/molecule/default/verify.yml new file mode 100644 index 0000000000..676a5e79c2 --- /dev/null +++ b/roles/dokuwiki/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ dokuwiki_container_name }}" + register: result + + - name: Check Dokuwiki is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/dokuwiki/molecule/default/verify_stopped.yml b/roles/dokuwiki/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..60151b02c4 --- /dev/null +++ b/roles/dokuwiki/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Dokuwiki + docker_container: + name: "{{ dokuwiki_container_name }}" + state: absent + register: result + + - name: Check Dokuwiki is stopped + assert: + that: + - not result.changed diff --git a/roles/duplicacy/molecule/default/molecule.yml b/roles/duplicacy/molecule/default/molecule.yml new file mode 100644 index 0000000000..3daa1fe1f5 --- /dev/null +++ b/roles/duplicacy/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + duplicacy_enabled: true diff --git a/roles/duplicacy/molecule/default/side_effect.yml b/roles/duplicacy/molecule/default/side_effect.yml new file mode 100644 index 0000000000..c29bfa3632 --- /dev/null +++ b/roles/duplicacy/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + duplicacy_enabled: false diff --git a/roles/duplicacy/molecule/default/verify.yml b/roles/duplicacy/molecule/default/verify.yml new file mode 100644 index 0000000000..7eaee192b0 --- /dev/null +++ b/roles/duplicacy/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ duplicacy_container_name }}" + register: result + + - name: Check Duplicacy is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/duplicacy/molecule/default/verify_stopped.yml b/roles/duplicacy/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..487edf7010 --- /dev/null +++ b/roles/duplicacy/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Duplicacy + docker_container: + name: "{{ duplicacy_container_name }}" + state: absent + register: result + + - name: Check Duplicacy is stopped + assert: + that: + - not result.changed diff --git a/roles/emby/molecule/default/molecule.yml b/roles/emby/molecule/default/molecule.yml new file mode 100644 index 0000000000..76844f58b6 --- /dev/null +++ b/roles/emby/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + emby_enabled: true diff --git a/roles/emby/molecule/default/side_effect.yml b/roles/emby/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a45266bda6 --- /dev/null +++ b/roles/emby/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + emby_enabled: false diff --git a/roles/emby/molecule/default/verify.yml b/roles/emby/molecule/default/verify.yml new file mode 100644 index 0000000000..ce3037bff7 --- /dev/null +++ b/roles/emby/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ emby_container_name }}" + register: result + + - name: Check Emby is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/emby/molecule/default/verify_stopped.yml b/roles/emby/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..ab61e9bcbc --- /dev/null +++ b/roles/emby/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Emby + docker_container: + name: "{{ emby_container_name }}" + state: absent + register: result + + - name: Check Emby is stopped + assert: + that: + - not result.changed diff --git a/roles/esphome/molecule/default/molecule.yml b/roles/esphome/molecule/default/molecule.yml new file mode 100644 index 0000000000..b9baaaf4d3 --- /dev/null +++ b/roles/esphome/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + esphome_enabled: true diff --git a/roles/esphome/molecule/default/side_effect.yml b/roles/esphome/molecule/default/side_effect.yml new file mode 100644 index 0000000000..4dd8c64a35 --- /dev/null +++ b/roles/esphome/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + esphome_enabled: false diff --git a/roles/esphome/molecule/default/verify.yml b/roles/esphome/molecule/default/verify.yml new file mode 100644 index 0000000000..a80b586783 --- /dev/null +++ b/roles/esphome/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ esphome_container_name }}" + register: result + + - name: Check EspHome is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/esphome/molecule/default/verify_stopped.yml b/roles/esphome/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..dad14d096a --- /dev/null +++ b/roles/esphome/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove EspHome + docker_container: + name: "{{ esphome_container_name }}" + state: absent + register: result + + - name: Check EspHome is stopped + assert: + that: + - not result.changed diff --git a/roles/firefly/molecule/default/molecule.yml b/roles/firefly/molecule/default/molecule.yml new file mode 100644 index 0000000000..ff6a6a3106 --- /dev/null +++ b/roles/firefly/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + firefly_enabled: true diff --git a/roles/firefly/molecule/default/side_effect.yml b/roles/firefly/molecule/default/side_effect.yml new file mode 100644 index 0000000000..4071c141ec --- /dev/null +++ b/roles/firefly/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + firefly_enabled: false diff --git a/roles/firefly/molecule/default/verify.yml b/roles/firefly/molecule/default/verify.yml new file mode 100644 index 0000000000..7da64ee713 --- /dev/null +++ b/roles/firefly/molecule/default/verify.yml @@ -0,0 +1,25 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ firefly_container_name }}" + register: result + + - name: Get container state + docker_container_info: + name: "{{ firefly_mysql_container_name }}" + register: result_mysql + + - name: Check Firefly is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false + - result_mysql.container['State']['Status'] == "running" + - result_mysql.container['State']['Restarting'] == false diff --git a/roles/firefly/molecule/default/verify_stopped.yml b/roles/firefly/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..eecb620322 --- /dev/null +++ b/roles/firefly/molecule/default/verify_stopped.yml @@ -0,0 +1,25 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Firefly + docker_container: + name: "{{ firefly_container_name }}" + state: absent + register: result + + - name: Try and stop and remove Firefly MySql + docker_container: + name: "{{ firefly_mysql_container_name }}" + state: absent + register: result_mysql + + - name: Check Firefly is stopped + assert: + that: + - not result.changed + - not result_mysql.changed From 40148b3e3f8c3c7a8c75c883b1212dad46840d37 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 12 Sep 2022 23:36:14 +0100 Subject: [PATCH 043/286] Add samba_shares_root to base Molecule config --- tests/molecule/base.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index a57f3296e4..575034f17d 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -16,6 +16,7 @@ provisioner: inventory: group_vars: all: + samba_shares_root: /shares ansible_nas_domain: ansible-nas.io ansible_nas_timezone: Europe/London audiobooks_root: /audiobooks From 26c13d8f7f932ce6856f0efdacbb84ee26b771d8 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 14 Sep 2022 23:19:19 +0100 Subject: [PATCH 044/286] Change calibre port for testing --- roles/calibre/molecule/default/molecule.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/calibre/molecule/default/molecule.yml b/roles/calibre/molecule/default/molecule.yml index ba7b4d59c5..cf3b28768f 100644 --- a/roles/calibre/molecule/default/molecule.yml +++ b/roles/calibre/molecule/default/molecule.yml @@ -4,3 +4,4 @@ provisioner: group_vars: all: calibre_enabled: true + calibre_port: "8085" # 8084 is used by github actions From 5d835ba566a9a383daad1fc10893b07add76fea7 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Thu, 15 Sep 2022 00:12:28 +0100 Subject: [PATCH 045/286] Lint --- roles/calibre/molecule/default/molecule.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/calibre/molecule/default/molecule.yml b/roles/calibre/molecule/default/molecule.yml index cf3b28768f..bc8274e36c 100644 --- a/roles/calibre/molecule/default/molecule.yml +++ b/roles/calibre/molecule/default/molecule.yml @@ -4,4 +4,4 @@ provisioner: group_vars: all: calibre_enabled: true - calibre_port: "8085" # 8084 is used by github actions + calibre_port: "8085" # 8084 is used by github actions From fa97774d0f21148dc4f1009b8a2ce16b6574b23c Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 20 Sep 2022 23:00:57 +0100 Subject: [PATCH 046/286] Flip to Docusaurus :crocodile: --- .github/workflows/docs-deploy.yml | 33 + .github/workflows/docs-test.yml | 32 + README.md | 11 +- docs/configuration/application_ports.md | 106 - docs/configuration/custom_applications.md | 11 - docs/hardware.md | 21 - docs/index.md | 11 - docs/installation.md | 47 - docs/overview.md | 33 - docs/post_installation.md | 11 - docs/testing.md | 21 - docs/upgrading.md | 24 - docs/zfs/zfs_configuration.md | 244 - docs/zfs/zfs_overview.md | 110 - website/.gitignore | 20 + website/README.md | 41 + website/babel.config.js | 3 + website/blog/2022-09-19-welcome/index.md | 10 + website/blog/authors.yml | 6 + website/docs/applications/_category_.json | 8 + .../content-management/_category_.json | 7 + .../content-management}/dokuwiki.md | 5 +- .../content-management}/joomla.md | 5 +- .../content-management}/tiddlywiki.md | 5 +- .../applications/dashboards/_category_.json | 7 + .../docs/applications/dashboards}/dashy.md | 5 +- .../docs/applications/dashboards}/heimdall.md | 5 +- .../docs/applications/dashboards}/organizr.md | 5 +- .../development-tools/_category_.json | 7 + .../development-tools}/code-server.md | 4 +- .../applications/development-tools}/gitea.md | 5 +- .../applications/development-tools}/gitlab.md | 4 +- .../development-tools}/woodpecker_ci.md | 4 +- .../download-tools/_category_.json | 7 + .../applications/download-tools}/bazarr.md | 4 +- .../download-tools}/couchpotato.md | 5 +- .../applications/download-tools}/deluge.md | 4 +- .../download-tools}/get_iplayer.md | 4 +- .../applications/download-tools}/jackett.md | 4 +- .../applications/download-tools}/lidarr.md | 4 +- .../applications/download-tools}/mylar.md | 5 +- .../applications/download-tools}/nzbget.md | 4 +- .../docs/applications/download-tools}/ombi.md | 4 +- .../applications/download-tools}/overseerr.md | 4 +- .../applications/download-tools}/prowlarr.md | 4 +- .../applications/download-tools}/pyload.md | 6 +- .../applications/download-tools}/radarr.md | 4 +- .../applications/download-tools}/sabnzbd.md | 4 +- .../applications/download-tools}/sonarr.md | 6 +- .../download-tools}/transmission.md | 4 +- .../applications/download-tools}/utorrent.md | 5 +- .../download-tools}/youtubedlmaterial.md | 5 +- .../docs/applications/gaming/_category_.json | 7 + .../applications/gaming}/minecraft-server.md | 4 +- .../home-automation/_category_.json | 7 + .../applications/home-automation}/esphome.md | 4 +- .../home-automation}/homeassistant.md | 4 +- .../home-automation}/homebridge.md | 4 +- .../home-automation}/mosquitto.md | 4 +- .../docs/applications/home-automation}/n8n.md | 4 +- .../applications/home-automation}/openhab.md | 4 +- .../media-serving/_category_.json | 7 + .../applications/media-serving}/airsonic.md | 4 +- .../applications/media-serving}/booksonic.md | 4 +- .../applications/media-serving}/calibre.md | 4 +- .../docs/applications/media-serving}/emby.md | 11 +- .../applications/media-serving}/jellyfin.md | 11 +- .../docs/applications/media-serving}/komga.md | 4 +- .../applications/media-serving}/minidlna.md | 4 +- .../media-serving}/mymediaforalexa.md | 4 +- .../applications/media-serving}/navidrome.md | 4 +- .../docs/applications/media-serving}/plex.md | 4 +- .../applications/media-serving}/pytivo.md | 5 +- .../applications/media-serving}/tautulli.md | 5 +- .../applications/media-serving}/ubooquity.md | 4 +- .../applications/monitoring/_category_.json | 7 + .../docs/applications/monitoring}/glances.md | 4 +- .../applications/monitoring}/speedtest.md | 5 +- .../docs/applications/monitoring}/stats.md | 4 +- .../applications/monitoring}/wireshark.md | 4 +- .../docs/applications/news/_category_.json | 7 + .../docs/applications/news}/freshrss.md | 5 +- .../docs/applications/news}/miniflux.md | 0 .../docs/applications/news}/rssbridge.md | 5 +- .../docs/applications/other/_category_.json | 7 + .../docs/applications/other}/bitwarden.md | 4 +- .../docs/applications/other}/firefly.md | 4 +- .../docs/applications/other}/gotify.md | 4 +- .../docs/applications/other}/guacamole.md | 4 +- .../docs/applications/other/hello_world.md | 17 + .../docs/applications/other}/mealie.md | 4 +- .../docs/applications/other}/nextcloud.md | 4 +- .../docs/applications/other}/octoprint.md | 5 +- .../docs/applications/other}/paperless_ng.md | 4 +- .../docs/applications/other}/piwigo.md | 4 +- .../docs/applications/other}/thelounge.md | 4 +- .../docs/applications/other}/traefik.md | 6 +- .../applications/other}/virtual_desktop.md | 4 +- .../docs/applications/other}/wallabag.md | 4 +- .../applications/system-tools/_category_.json | 7 + .../applications/system-tools}/cloudcmd.md | 4 +- .../system-tools}/cloudflare_ddns.md | 4 +- .../applications/system-tools}/duplicacy.md | 4 +- .../applications/system-tools}/duplicati.md | 5 +- .../system-tools}/healthchecks.io.md | 4 +- .../applications/system-tools}/krusader.md | 5 +- .../applications/system-tools}/netbootxyz.md | 5 +- .../applications/system-tools/portainer.md | 6 + .../system-tools}/route53_ddns.md | 4 +- .../applications/system-tools}/syncthing.md | 4 +- .../applications/system-tools}/timemachine.md | 4 +- .../applications/system-tools}/watchtower.md | 4 +- website/docs/contributing/_category_.json | 8 + .../docs/contributing/add-an-application.md | 13 + .../contributing/development-environment.md | 25 + .../further-configuration/_category_.json | 8 + .../docs/further-configuration/hardware.md | 21 + .../migrating-from-freenas.md | 13 + .../docs/further-configuration/nfs-exports.md | 2 - .../further-configuration/samba-shares.md | 4 +- website/docs/getting-started/_category_.json | 8 + .../getting-started/configure-dashboard.md | 9 + .../getting-started/enabling-applications.md | 17 + .../docs/getting-started/external-access.md | 28 +- website/docs/getting-started/installation.md | 42 + website/docs/index.md | 11 + {docs => website/docs}/support.md | 8 +- website/docs/upgrading.md | 19 + website/docusaurus.config.js | 145 + website/package-lock.json | 21190 ++++++++++++++++ website/package.json | 44 + website/sidebars.js | 33 + .../src/components/HomepageFeatures/index.js | 61 + .../HomepageFeatures/styles.module.css | 11 + website/src/css/custom.css | 30 + website/src/pages/index.js | 34 + website/src/pages/index.module.css | 23 + website/static/.nojekyll | 0 website/static/CNAME | 1 + website/static/img/docusaurus.png | Bin 0 -> 5142 bytes website/static/img/favicon.ico | Bin 0 -> 3626 bytes website/static/img/logo.svg | 1 + .../static/img/undraw_docusaurus_mountain.svg | 171 + .../static/img/undraw_docusaurus_react.svg | 170 + website/static/img/undraw_docusaurus_tree.svg | 40 + 145 files changed, 22667 insertions(+), 778 deletions(-) create mode 100644 .github/workflows/docs-deploy.yml create mode 100644 .github/workflows/docs-test.yml delete mode 100644 docs/configuration/application_ports.md delete mode 100644 docs/configuration/custom_applications.md delete mode 100644 docs/hardware.md delete mode 100644 docs/index.md delete mode 100644 docs/installation.md delete mode 100644 docs/overview.md delete mode 100644 docs/post_installation.md delete mode 100644 docs/testing.md delete mode 100644 docs/upgrading.md delete mode 100644 docs/zfs/zfs_configuration.md delete mode 100644 docs/zfs/zfs_overview.md create mode 100644 website/.gitignore create mode 100644 website/README.md create mode 100644 website/babel.config.js create mode 100644 website/blog/2022-09-19-welcome/index.md create mode 100644 website/blog/authors.yml create mode 100644 website/docs/applications/_category_.json create mode 100644 website/docs/applications/content-management/_category_.json rename {docs/applications => website/docs/applications/content-management}/dokuwiki.md (87%) rename {docs/applications => website/docs/applications/content-management}/joomla.md (90%) rename {docs/applications => website/docs/applications/content-management}/tiddlywiki.md (93%) create mode 100644 website/docs/applications/dashboards/_category_.json rename {docs/applications => website/docs/applications/dashboards}/dashy.md (96%) rename {docs/applications => website/docs/applications/dashboards}/heimdall.md (95%) rename {docs/applications => website/docs/applications/dashboards}/organizr.md (94%) create mode 100644 website/docs/applications/development-tools/_category_.json rename {docs/applications => website/docs/applications/development-tools}/code-server.md (95%) rename {docs/applications => website/docs/applications/development-tools}/gitea.md (91%) rename {docs/applications => website/docs/applications/development-tools}/gitlab.md (96%) rename {docs/applications => website/docs/applications/development-tools}/woodpecker_ci.md (95%) create mode 100644 website/docs/applications/download-tools/_category_.json rename {docs/applications => website/docs/applications/download-tools}/bazarr.md (94%) rename {docs/applications => website/docs/applications/download-tools}/couchpotato.md (92%) rename {docs/applications => website/docs/applications/download-tools}/deluge.md (96%) rename {docs/applications => website/docs/applications/download-tools}/get_iplayer.md (90%) rename {docs/applications => website/docs/applications/download-tools}/jackett.md (96%) rename {docs/applications => website/docs/applications/download-tools}/lidarr.md (92%) rename {docs/applications => website/docs/applications/download-tools}/mylar.md (95%) rename {docs/applications => website/docs/applications/download-tools}/nzbget.md (95%) rename {docs/applications => website/docs/applications/download-tools}/ombi.md (94%) rename {docs/applications => website/docs/applications/download-tools}/overseerr.md (94%) rename {docs/applications => website/docs/applications/download-tools}/prowlarr.md (96%) rename {docs/applications => website/docs/applications/download-tools}/pyload.md (90%) rename {docs/applications => website/docs/applications/download-tools}/radarr.md (98%) rename {docs/applications => website/docs/applications/download-tools}/sabnzbd.md (94%) rename {docs/applications => website/docs/applications/download-tools}/sonarr.md (96%) rename {docs/applications => website/docs/applications/download-tools}/transmission.md (96%) rename {docs/applications => website/docs/applications/download-tools}/utorrent.md (94%) rename {docs/applications => website/docs/applications/download-tools}/youtubedlmaterial.md (95%) create mode 100644 website/docs/applications/gaming/_category_.json rename {docs/applications => website/docs/applications/gaming}/minecraft-server.md (95%) create mode 100644 website/docs/applications/home-automation/_category_.json rename {docs/applications => website/docs/applications/home-automation}/esphome.md (95%) rename {docs/applications => website/docs/applications/home-automation}/homeassistant.md (94%) rename {docs/applications => website/docs/applications/home-automation}/homebridge.md (95%) rename {docs/applications => website/docs/applications/home-automation}/mosquitto.md (87%) rename {docs/applications => website/docs/applications/home-automation}/n8n.md (94%) rename {docs/applications => website/docs/applications/home-automation}/openhab.md (96%) create mode 100644 website/docs/applications/media-serving/_category_.json rename {docs/applications => website/docs/applications/media-serving}/airsonic.md (96%) rename {docs/applications => website/docs/applications/media-serving}/booksonic.md (96%) rename {docs/applications => website/docs/applications/media-serving}/calibre.md (96%) rename {docs/applications => website/docs/applications/media-serving}/emby.md (88%) rename {docs/applications => website/docs/applications/media-serving}/jellyfin.md (89%) rename {docs/applications => website/docs/applications/media-serving}/komga.md (84%) rename {docs/applications => website/docs/applications/media-serving}/minidlna.md (95%) rename {docs/applications => website/docs/applications/media-serving}/mymediaforalexa.md (92%) rename {docs/applications => website/docs/applications/media-serving}/navidrome.md (94%) rename {docs/applications => website/docs/applications/media-serving}/plex.md (96%) rename {docs/applications => website/docs/applications/media-serving}/pytivo.md (97%) rename {docs/applications => website/docs/applications/media-serving}/tautulli.md (91%) rename {docs/applications => website/docs/applications/media-serving}/ubooquity.md (97%) create mode 100644 website/docs/applications/monitoring/_category_.json rename {docs/applications => website/docs/applications/monitoring}/glances.md (93%) rename {docs/applications => website/docs/applications/monitoring}/speedtest.md (93%) rename {docs/applications => website/docs/applications/monitoring}/stats.md (97%) rename {docs/applications => website/docs/applications/monitoring}/wireshark.md (96%) create mode 100644 website/docs/applications/news/_category_.json rename {docs/applications => website/docs/applications/news}/freshrss.md (97%) rename {docs/applications => website/docs/applications/news}/miniflux.md (100%) rename {docs/applications => website/docs/applications/news}/rssbridge.md (95%) create mode 100644 website/docs/applications/other/_category_.json rename {docs/applications => website/docs/applications/other}/bitwarden.md (96%) rename {docs/applications => website/docs/applications/other}/firefly.md (94%) rename {docs/applications => website/docs/applications/other}/gotify.md (96%) rename {docs/applications => website/docs/applications/other}/guacamole.md (94%) create mode 100644 website/docs/applications/other/hello_world.md rename {docs/applications => website/docs/applications/other}/mealie.md (94%) rename {docs/applications => website/docs/applications/other}/nextcloud.md (97%) rename {docs/applications => website/docs/applications/other}/octoprint.md (97%) rename {docs/applications => website/docs/applications/other}/paperless_ng.md (96%) rename {docs/applications => website/docs/applications/other}/piwigo.md (97%) rename {docs/applications => website/docs/applications/other}/thelounge.md (92%) rename {docs/applications => website/docs/applications/other}/traefik.md (87%) rename {docs/applications => website/docs/applications/other}/virtual_desktop.md (96%) rename {docs/applications => website/docs/applications/other}/wallabag.md (96%) create mode 100644 website/docs/applications/system-tools/_category_.json rename {docs/applications => website/docs/applications/system-tools}/cloudcmd.md (95%) rename {docs/applications => website/docs/applications/system-tools}/cloudflare_ddns.md (97%) rename {docs/applications => website/docs/applications/system-tools}/duplicacy.md (94%) rename {docs/applications => website/docs/applications/system-tools}/duplicati.md (92%) rename {docs/applications => website/docs/applications/system-tools}/healthchecks.io.md (95%) rename {docs/applications => website/docs/applications/system-tools}/krusader.md (93%) rename {docs/applications => website/docs/applications/system-tools}/netbootxyz.md (96%) create mode 100644 website/docs/applications/system-tools/portainer.md rename {docs/applications => website/docs/applications/system-tools}/route53_ddns.md (97%) rename {docs/applications => website/docs/applications/system-tools}/syncthing.md (92%) rename {docs/applications => website/docs/applications/system-tools}/timemachine.md (98%) rename {docs/applications => website/docs/applications/system-tools}/watchtower.md (96%) create mode 100644 website/docs/contributing/_category_.json create mode 100644 website/docs/contributing/add-an-application.md create mode 100644 website/docs/contributing/development-environment.md create mode 100644 website/docs/further-configuration/_category_.json create mode 100644 website/docs/further-configuration/hardware.md create mode 100644 website/docs/further-configuration/migrating-from-freenas.md rename docs/configuration/nfs_exports.md => website/docs/further-configuration/nfs-exports.md (87%) rename docs/configuration/samba_shares.md => website/docs/further-configuration/samba-shares.md (60%) create mode 100644 website/docs/getting-started/_category_.json create mode 100644 website/docs/getting-started/configure-dashboard.md create mode 100644 website/docs/getting-started/enabling-applications.md rename docs/configuration/external_access.md => website/docs/getting-started/external-access.md (84%) create mode 100644 website/docs/getting-started/installation.md create mode 100644 website/docs/index.md rename {docs => website/docs}/support.md (100%) create mode 100644 website/docs/upgrading.md create mode 100644 website/docusaurus.config.js create mode 100644 website/package-lock.json create mode 100644 website/package.json create mode 100644 website/sidebars.js create mode 100644 website/src/components/HomepageFeatures/index.js create mode 100644 website/src/components/HomepageFeatures/styles.module.css create mode 100644 website/src/css/custom.css create mode 100644 website/src/pages/index.js create mode 100644 website/src/pages/index.module.css create mode 100644 website/static/.nojekyll create mode 100644 website/static/CNAME create mode 100644 website/static/img/docusaurus.png create mode 100644 website/static/img/favicon.ico create mode 100644 website/static/img/logo.svg create mode 100644 website/static/img/undraw_docusaurus_mountain.svg create mode 100644 website/static/img/undraw_docusaurus_react.svg create mode 100644 website/static/img/undraw_docusaurus_tree.svg diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml new file mode 100644 index 0000000000..002167b89d --- /dev/null +++ b/.github/workflows/docs-deploy.yml @@ -0,0 +1,33 @@ +--- +name: Deploy to GitHub Pages + +on: + push: + branches: + - master + +jobs: + deploy: + name: Deploy to GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build website + run: npm run build + + # Popular action to deploy to GitHub Pages: + # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Build output to publish to the `gh-pages` branch: + publish_dir: ./build diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml new file mode 100644 index 0000000000..b28de87445 --- /dev/null +++ b/.github/workflows/docs-test.yml @@ -0,0 +1,32 @@ +--- +name: Test Website Deployment + +on: + pull_request: + branches: + - master + +jobs: + lint: + name: Lint Docs + runs-on: ubuntu-latest + steps: + - name: Lint docs + uses: articulate/actions-markdownlint@v1 + with: + version: 0.32.2 + + test-deploy: + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Test build website + run: yarn build \ No newline at end of file diff --git a/README.md b/README.md index a16547f5b5..38a939a2a7 100644 --- a/README.md +++ b/README.md @@ -118,18 +118,11 @@ See [Installation](https://davestephens.github.io/ansible-nas/installation/). ## Documentation -You can read the docs [here](https://davestephens.github.io/ansible-nas). PRs for more documentation always welcome! +You can read the docs [here](https://ansible-nas.io). PRs for more documentation always welcome! ## Migrating from FreeNAS -Assuming that your Ubuntu system disk is separate from your storage (it should be!): - -1. Ensure you have a working backup of your data. -2. Check that the working backup you think you have actually works. -3. SSH to the server and run `zpool list` to determine available ZFS pools. -4. `zpool import ` against each of the pools you want to attach. -5. `chown -R root:root /mnt/` to fix the ownership of the data. -6. Follow the Quick Start instructions above. +Read the [migrating from FreeNAS](https://ansible-nas.io/docs/further-configuration/migrating-from-freenas/) docs. ## Requirements diff --git a/docs/configuration/application_ports.md b/docs/configuration/application_ports.md deleted file mode 100644 index eedfcaf8fc..0000000000 --- a/docs/configuration/application_ports.md +++ /dev/null @@ -1,106 +0,0 @@ -# Application Ports - -By default, applications can be found on the ports listed below. - -## Default application ports - -By default, applications can be found on the ports listed below. - -| Application | Port | Mode | Notes | -|------------------|---------|---------|----------------| -| Airsonic | 4040 | Bridge | HTTP | -| Bazarr | 6767 | Bridge | HTTP | -| Bitwarden "hub" | 3012 | Bridge | Web Not. | -| Bitwarden | 19080 | Bridge | HTTP | -| Booksonic | 4041 | Bridge | HTTP | -| Calibre-web | 8084 | Bridge | HTTP | -| Cloud Commander | 7373 | Bridge | HTTP | -| Code Server | 8443 | Bridge | HTTP | -| Couchpotato | 5050 | Bridge | HTTP | -| Dashy | 8082 | Bridge | HTTP | -| DokuWiki | 8085 | Bridge | HTTP | -| Duplicacy | 3875 | Bridge | HTTP | -| Duplicati | 8200 | Bridge | HTTP | -| Emby | 8096 | Bridge | HTTP | -| Emby | 8096 | Bridge | HTTP | -| Emby | 8920 | Bridge | HTTPS | -| EspHome | 6052 | Bridge | HTTP | -| Firefly III | 8066 | Bridge | HTTP | -| Fresh RSS | 8089 | Bridge | HTTP | -| get_iplayer | 8182 | Bridge | HTTP | -| Gitea | 3001 | Bridge | HTTP | -| Gitea | 222 | Bridge | SSH | -| GitLab | 4080 | Bridge | HTTP | -| GitLab | 4443 | Bridge | HTTPS | -| GitLab | 422 | Bridge | SSH | -| Glances | 61208 | Bridge | HTTP | -| Gotify | 2346 | Bridge | HTTP | -| Grafana | 3000 | Bridge | HTTP | -| Guacamole | 8090 | Bridge | HTTP | -| Heimdall | 10080 | Bridge | HTTP | -| Heimdall | 10443 | Bridge | HTTPS | -| Home Assistant | 8123 | Host | HTTP | -| Homebridge | 8087 | Host | HTTP | -| InfluxDB | 8086 | Bridge | HTTP | -| Jackett | 9117 | Bridge | HTTP | -| Jellyfin | 8896 | Bridge | HTTP | -| Jellyfin | 8928 | Bridge | HTTPS | -| Komga | 8088 | Bridge | HTTPS | -| Krusader | 5800 | Bridge | HTTP | -| Krusader | 5900 | Bridge | VNC | -| Lidarr | 8686 | Bridge | HTTP | -| Mealie | 9925 | Host | HTTP | -| Minecraft Server | 25565 | Host | TCP | -| MiniDLNA | 8201 | Host | HTTP | -| Miniflux | 8070 | Bridge | HTTP | -| Mosquitto | 1883 | Bridge | Websocket | -| Mosquitto | 9001 | Bridge | HTTP | -| Mylar | 8585 | Bridge | HTTP | -| MyMediaForAlexa | 52051 | Host | HTTP | -| n8n | 5678 | Bridge | HTTP | -| navidrome | 4533 | Bridge | HTTP | -| Netdata | 19999 | Bridge | HTTP | -| Nextcloud | 8080 | Bridge | HTTP | -| netbootxyz | 3002 | Bridge | HTTP | -| netbootxyz | 5803 | Bridge | HTTP | -| netbootxyz | 69 | Bridge | TFTP | -| NZBGet | 6789 | Bridge | HTTP | -| Ombi | 3579 | Bridge | HTTP | -| openHAB | 7777 | Host | HTTP | -| openHAB | 7778 | Host | HTTPS | -| Organizr | 10081 | Bridge | HTTP | -| Organizr | 10444 | Bridge | HTTPS | -| Overseerr | 5055 | Bridge | HTTP | -| Paperless_ng | 16922 | Bridge | HTTP | -| Piwigo | 16923 | Bridge | HTTP | -| Plex | 32400 | Bridge | HTTP | -| Portainer | 9000 | Bridge | HTTP | -| Prowlarr | 9696 | Bridge | HTTP | -| pyload | 8000 | Bridge | HTTP | -| PyTivo | 9032 | Bridge | HTTP | -| PyTivo | 2190 | Bridge | UDP | -| Radarr | 7878 | Bridge | HTTP | -| RSS-Bridge | 8091 | Bridge | HTTP | -| Sabnzbd | 18080 | Bridge | HTTP | -| Sickchill | 8081 | Bridge | HTTP | -| Sonarr | 8989 | Bridge | HTTP | -| Speedtest-Trk | 8765 | HTTP | | -| Syncthing admin | 8384 | Host | HTTP | -| Syncthing P2P | 22000 | Host | | -| Tautulli | 8185 | Bridge | HTTP | -| The Lounge | 9000 | Bridge | HTTP | -| TiddlyWiki | 8092 | Bridge | HTTP | -| Time Machine | 10445 | Bridge | SMB | -| Traefik | 8083 | Host | HTTP Admin | -| Transmission | 9091 | Bridge | HTTP w/VPN | -| Transmission | 3128 | Bridge | HTTP Proxy | -| Transmission | 9092 | Bridge | HTTP Internal | -| Ubooquity | 2202 | Bridge | HTTP Internal | -| Ubooquity | 2203 | Bridge | HTTP Admin | -| uTorrent | 8111 | Bridge | HTTP | -| uTorrent | 6881 | Bridge | BT | -| uTorrent | 6881 | Bridge | UDP | -| Wallabag | 7780 | Bridge | HTTP | -| Wireshark | 3000 | Host | HTTP | -| YouTubeDL-Mater | 8998 | Bridge | HTTP | -| ZNC | 6677 | Bridge | | diff --git a/docs/configuration/custom_applications.md b/docs/configuration/custom_applications.md deleted file mode 100644 index d4a8ed4733..0000000000 --- a/docs/configuration/custom_applications.md +++ /dev/null @@ -1,11 +0,0 @@ -# Custom Applications - -## Using Portainer - -Ensure that you have `portainer_enabled: true` in your `group_vars/all.yml` file, and have run the playbook so that Portainer is up and running. - -Hit Portainer on . You can now deploy an 'App Template' or head to 'Containers' and manually enter container configuration. - -## Using a Custom Ansible Task - -TODO: Needs to be docced diff --git a/docs/hardware.md b/docs/hardware.md deleted file mode 100644 index 51fda07ad2..0000000000 --- a/docs/hardware.md +++ /dev/null @@ -1,21 +0,0 @@ -# Hardware - -Ansible-NAS will run against any x64 Ubuntu box (i.e. not a Raspberry Pi or other ARM hardware), or even a VM if you're just testing things out. The hardware you pick for Ansible-NAS depends largely on what you intend to do with your server - and is very much a "how long is a piece of string" type question. - -The [homeserver Reddit](https://www.reddit.com/r/HomeServer/) has lots of good information. [ServerBuilds.net](https://www.serverbuilds.net/) is also kept up to date with cheap and decent quality builds known as "NAS Killers". - -## Questions To Think About - -1. What will be taxing the CPU(s) on your Ansible-NAS box? Are you intending to transcode video? How many users will be hitting it? - -2. How many applications do you intend to run in parallel? How much memory do these applications require? - -3. Are you going to run the [ZFS](zfs/zfs_overview.md) file system? (you should!) - -4. What are you intending to store on your Ansible-NAS? Is it data you can download again, or is it important to you that you don't lose it? Do you need mirrored disks? - -## HP Microserver - -Ansible-NAS development is tested against an HP Microserver N54L, with 16GB of memory, a 60GB SSD for the OS and 4x2TB WD Red NAS drives for storage. It works great :-) - -This is obviously not the only solution but a reasonable one if you just want a single box to buy, and many different models are available on eBay for varying costs. diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index da94c28c51..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,11 +0,0 @@ -# Home - -![Ansible-NAS Logo](https://raw.githubusercontent.com/davestephens/ansible-nas/master/misc/ansible-nas.png "Ansible-NAS Logo") - -After getting burned by broken FreeNAS updates one too many times, I figured I could do a much better job myself using just a stock Ubuntu install, some clever Ansible config and a bunch of Docker containers. Ansible-NAS was born! - -## Getting Started - -Head to [installation](installation.md) if you're ready to roll, or to [testing](testing.md) if you want to spin up a test Virtual Machine first. Once you're done, check out the [post-installation](post_installation.md) steps. - -If this is all very confusing, there is also an [overview](overview.md) of the project and what is required for complete beginners. If you're only confused about ZFS, we'll help you [get started](zfs/zfs_overview.md) as well. diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100644 index 23bac7ecb7..0000000000 --- a/docs/installation.md +++ /dev/null @@ -1,47 +0,0 @@ -# Installation - -💀 💀 💀 - -Before running anything, check out the playbook and understand what it does. Run it against a VM and make sure you're happy. ***Do not*** blindly download code from the internet and trust that it's going to work as you expect. - -💀 💀 💀 - -## Read This First - -Calling this page "installation" is a bit of a misnomer. Ansible-NAS isn't *installed* per-se, it is a bunch of automation that installs other software onto your server. Ansible-NAS relies heavily on Ansible's [variable prescedence](https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable) to do its job. Ansible-NAS defines its installable software with roles with (mostly) sane defaults, these can then be enabled and the settings overridden in your inventory `nas.yml` file. - -A basic level of understanding of Ansible is required, or you're going to have a confusing time setting up your NAS. If you're willing to learn then great, but please don't raise issues because this is the first time you've looked at Ansible and you don't understand why it's doing what it's doing. I'd love to teach the world Ansible...but I have a day job. - -## Running Ansible-NAS - -You can run Ansible-NAS from the computer you plan to use for your NAS, or from a remote controlling machine. The steps for deployment are exactly the same, just pay attention to editing the inventory file in step 6. - -1. Enable the Ubuntu Universe repository: - - `sudo add-apt-repository universe` - -2. Install Ansible: - - `sudo apt update` - - `sudo apt install software-properties-common` - - `sudo apt-add-repository --yes --update ppa:ansible/ansible` - - `sudo apt install ansible` - -3. Clone Ansible-NAS: - - `git clone https://github.com/davestephens/ansible-nas.git && cd ansible-nas` - -4. Create your own inventory and config files by copying `inventories/sample` to your own directory: - - `cp -rfp inventories/sample inventories/my-ansible-nas` - -5. Review `group_vars/all.yml` for general settings and `roles/[application]/defaults/main.yml` for individual applications. Change settings by overriding them in `inventories/my-ansible-nas/group_vars/nas.yml`. - -6. Update `inventories/my-ansible-nas/inventory`. - -7. Install the dependent roles: `ansible-galaxy install -r requirements.yml` (you might need `sudo` to install Ansible roles). - -8. Run the playbook - something like `ansible-playbook -i inventories/my-ansible-nas/inventory nas.yml -b -K` should do you nicely. diff --git a/docs/overview.md b/docs/overview.md deleted file mode 100644 index 6ae1381ddf..0000000000 --- a/docs/overview.md +++ /dev/null @@ -1,33 +0,0 @@ -# Overview - -Ansible-NAS currently assumes you know your way around a server. This page is an overview for absolute NAS beginners so they can decide if it is right for them. - -## The big picture - -To start off _really_ simple: A NAS ([Network Attached Storage](https://en.wikipedia.org/wiki/Network-attached_storage)) is a server mostly for home or other small networks that offers file storage. It's usually a small box that sits in the corner and runs 24/7. These days, a NAS doesn't just only handle files, but also offers other services, for instance video streaming with [Plex](https://www.plex.tv/) or [Emby](https://emby.media/index.html). You can buy consumer NAS boxes from [various manufacturers](https://en.wikipedia.org/wiki/List_of_NAS_manufacturers) where you just have to add the hard drives, or you can configure your own hardware and use open-source software as the operating system. - -One example of the second variant you'll see mentioned here is [FreeNAS](https://freenas.org/). It is based on [FreeBSD](https://www.freebsd.org/), which like Linux belongs to the family of Unix-like operating systems. One strength of FreeBSD/FreeNAS is that it includes the powerful ZFS file system ([OpenZFS](http://www.open-zfs.org/wiki/Main_Page), to be exact). However, it does not support the [Docker](https://www.docker.com/) containers the way Linux does. Also, the Linux ecosystem is larger. On the other hand, very few Linux distributions include ZFS out of the box because of licensing issues. - -Ansible-NAS in its default form attempts to have the best of both worlds by using Docker on Linux with ZFS. This is possible because the [Ubuntu](https://www.ubuntu.com/server) Linux distribution supports both technologies. As the name says, Ansible-NAS uses [Ansible](https://www.ansible.com/) server automation which is usually deployed on big multi-machine enterprise systems, not small home servers the size of a breadbox. - -## Before you take the plunge - -The commercial NAS vendors try to make setting up and running a NAS as simple and painless as possible - for a fee, obviously. The open-source NAS software providers have lots of resources to help you get started with your own hardware. FreeNAS for instance comes with extensive documentation, good introductions to ZFS and other topics, and a large community to lean on. - -With Ansible-NAS, at this point at least, you're pretty much on your own. Though there is a [Gitter](https://gitter.im/Ansible-NAS/Chat) chat room (see [support](support.md)), you're expected to have some familiarity with the technologies involved and be able to set up the basic stuff yourself. - -As a to-do list, before you can even install Ansible-NAS, you'll have to: - -1. Choose, buy, configure, and test your own **hardware**. If you're paranoid (a good mindset when dealing with servers), you'll probably want an uninterruptible power supply (UPS) of some sort as well as SMART monitoring for your hard drives. See the [FreeNAS hardware requirements](https://freenas.org/hardware-requirements/) as a guideline, but remember you'll also be running Docker. If you use ZFS (see below), take into account it [loves RAM](zfs/zfs_overview.md) and prefers to have the hard drives all to itself. - -1. Install **Ubuntu Server**, currently 22.04 LTS, and keep it updated. You'll probably want to perform other basic setup tasks like hardening SSH and including email notifications. There are [various guides](https://devanswers.co/ubuntu-20-04-initial-server-setup/) for this, but if you're just getting started, you'll probably need a book. - -You will probably want to install a specialized filesystem for bulk storage such as [ZFS](http://www.open-zfs.org/wiki/Main_Page) or [Btrfs](https://btrfs.wiki.kernel.org/index.php/Main_Page). Both offer features such as snapshots, checksumming and scrubbing to protect your data against bitrot, ransomware and other nasties. Ansible-NAS historically prefers **ZFS** because this lets you swap storage pools with [FreeNAS](https://freenas.org/zfs/). A [brief introduction](zfs/zfs_overview.md) to ZFS is included in the Ansible-NAS documentation, as well as [an example](zfs/zfs_configuration.md) of a very simple ZFS setup. - -After that, you can continue with the actual [installation](installation.md) of Ansible-NAS. - -## How to experiment - -The easiest way to take Ansible-NAS for a spin is in a virtual machine, for instance in [VirtualBox](https://www.virtualbox.org/) or [libvirt](https://libvirt.org). You'll want to create three virtual hard drives for testing: one of the actual NAS, and the two others to create a mirrored ZFS pool. This will let you experiment with installing, configuring, and running a complete system. - -A [Vagrant](https://vagrantup.com) _Vagrantfile_ and launch script are also available (`tests/test-vagrant.sh`), see the [testing](testing.md) page for more details. diff --git a/docs/post_installation.md b/docs/post_installation.md deleted file mode 100644 index f0ce3ef866..0000000000 --- a/docs/post_installation.md +++ /dev/null @@ -1,11 +0,0 @@ -# Now what? - -## Enabling More Applications - -Look through the `roles` directory in the Ansible-NAS source code for applications to enable. - -If you see something you like, read its docs to find out what variable you need to set in your inventory `nas.yml`, and set it to true. Run the playbook again, and you're done. - -## Configure Heimdall - -[Heimdall](https://heimdall.site/) is configured out of the box to give you a dashboard that pulls together all the applications you install with Ansible-NAS. diff --git a/docs/testing.md b/docs/testing.md deleted file mode 100644 index 2ac5c9a9c6..0000000000 --- a/docs/testing.md +++ /dev/null @@ -1,21 +0,0 @@ -# Vagrant - -A [Vagrant](https://www.vagrantup.com/) Vagrantfile and launch script (`tests/test-vagrant.sh`) are provided to spin up a testing VM. The config in `tests/test.yml` is used by the script to override any existing config in `group_vars/all.yml`. - -By default the VM will be available on 172.30.1.5. If everything has worked correctly after running `tests/test-vagrant.sh`, you should be able to connect to Heimdall on . - -After making changes to the playbook, you can apply them to the running VM by running `vagrant provision`. - -Once you're done testing, destroy the VM with `vagrant destroy`. - -## Travis CI - -Travis CI runs some sanity checks against branches once pushed to GitHub. These can be viewed [here](https://github.com/davestephens/ansible-nas/blob/master/.travis.yml). - -### ansible-lint - -`ansible-lint` is run as part of the CI (and VSCode tasks are provided) to ensure the playbook confirms to some sort of standard! You may or may not agree with all of the rules, but using it keeps things nice and consistent. - -### Syntax Checking - -`ansible-playbook --syntax-check` is run against nas.yml to ensure nothing is majorly broken. diff --git a/docs/upgrading.md b/docs/upgrading.md deleted file mode 100644 index 8eee2a0342..0000000000 --- a/docs/upgrading.md +++ /dev/null @@ -1,24 +0,0 @@ -# Upgrading Ansible-NAS - -## Upgrading from prior to January 2020 (`all.yml.dist` config style) - -If you're upgrading from [this](https://github.com/davestephens/ansible-nas/commit/52c7fef3aba08e30331931747c81fb7b3bfd359a) commit or earlier, these instructions are relevant to you. - -Rather than having to merge every new config line into your own `all.yml` file, now you only need to maintain the differences that are relevant to you in your own `nas.yml`, stored within an inventory directory. Your inventory `nas.yml` takes precedence over `group_vars/all.yml`, which is how this setup works. `group_vars/all.yml` is now tracked as part of the repo. - -This will make updates from `master` much simpler, as there will be no requirement to merge changes from `all.yml.dist` into your own `all.yml` any more. You simply pull from master, then add the bits you're interested in into your inventory `nas.yml`. - -Instructions to upgrade from prior to January 2020 ([this]([this](https://github.com/davestephens/ansible-nas/commit/52c7fef3aba08e30331931747c81fb7b3bfd359a)) commit or earlier): - -- Move your `group_vars/all.yml` somewhere safe. -- Pull from master. There shouldn't be any merge conflicts unless you've been hacking on the project. -- Create your own inventory and config files by copying `inventories/sample` to your own directory: - - `cp -rfp inventories/sample inventories/my-ansible-nas` - - Note that `my-ansible-nas` can be anything you want, but adjust the following instructions accordingly. - -- Then: - - - **Quick and Dirty:** Copy the contents of your `all.yml` into `inventories/my-ansible-nas/group_vars/nas.yml`. - - **Nice and Tidy:** Copy only the differences between your own `all.yml` and the distribution `group_vars/all.yml` into `inventories/my-ansible-nas/group_vars/nas.yml`. This is likely to be things like `ansible_nas_hostname`, `samba_shares`, `ansible_nas_timezone`, enabled applications, any application tweaks you've made in config etc. diff --git a/docs/zfs/zfs_configuration.md b/docs/zfs/zfs_configuration.md deleted file mode 100644 index df748e66f5..0000000000 --- a/docs/zfs/zfs_configuration.md +++ /dev/null @@ -1,244 +0,0 @@ -# ZFS Configuration - -This text deals with specific ZFS configuration questions for Ansible-NAS. If you are new to ZFS and are looking for the big picture, please read the [ZFS overview](zfs_overview.md) introduction first. - -## Just so there is no misunderstanding - -Unlike other NAS variants, Ansible-NAS does not install, configure or manage the disks or file systems for you. It doesn't care which file system you use - ZFS, Btrfs, XFS or EXT4, take your pick. Nor does it provides a mechanism for snapshots or disk monitoring. As Tony Stark said to Loki in _Avengers_: It's all on you. - -However, Ansible-NAS has traditionally been used with the powerful ZFS filesystem. Since out of the box support for [ZFS on Linux](https://zfsonlinux.org/) with Ubuntu is comparatively new, this text shows how to set up a simple storage configuration. To paraphrase Nick Fury from _Winter Soldier_: We do share. We're nice like that. - -> Using ZFS for Docker containers is currently not covered by this document. See [the official Docker ZFS documentation](https://docs.docker.com/storage/storagedriver/zfs-driver/) instead. - -## The obligatory warning - -We take no responsibility for any bad thing that might happen if you follow this guide. We strongly suggest you test these procedures in a virtual machine first. Always, always, always backup your data. - -## The basic setup - -For this example, we're assuming two identical spinning rust hard drives for Ansible-NAS storage. These two drives will be **mirrored** to provide redundancy. The actual Ubuntu system will be on a different drive and is not our concern. - -> [Root on ZFS](https://openzfs.github.io/openzfs-docs/Getting%20Started/Ubuntu/Ubuntu%2022.04%20Root%20on%20ZFS.html) is possible, but not something that has been tested with Ansible-NAS. - -The Ubuntu kernel is already ready for ZFS. We only need the utility package which we install with `sudo apt install zfsutils`. - -### Creating a pool - -We assume you don't mind totally destroying whatever data might be on your two storage drives, have used a tool such as `gparted` to remove any existing partitions, and have installed a new GPT partition table on each drive. To create our ZFS pool, we will use a command in this form: - -```bash - sudo zpool create -o ashift= mirror -``` - -The options from simple to complex are: - -**NAME**: ZFS pools traditionally take their names from characters in the [The Matrix](https://www.imdb.com/title/tt0133093/fullcredits). The two most common are `tank` and `dozer`. Whatever you use, it should be short - think `ash`, not `xenomorph`. - -**DRIVES**: The Linux command `lsblk` will give you a quick overview of the hard drives in the system. However, we don't pass the drive specification in the format `/dev/sde` because this is not persistent. Instead, [always use](https://github.com/zfsonlinux/zfs/wiki/FAQ#selecting-dev-names-when-creating-a-pool) the output of `ls /dev/disk/by-id/` to find the drives' IDs. - -**ASHIFT**: This is required to pass the [sector size](https://github.com/zfsonlinux/zfs/wiki/FAQ#advanced-format-disks) of the drive to ZFS for optimal performance. You might have to do this by hand because some drives lie: Whereas modern drives have 4k sector sizes (or 8k for many SSDs), they will report 512 bytes because Windows XP [can't handle 4k sectors](https://support.microsoft.com/en-us/help/2510009/microsoft-support-policy-for-4k-sector-hard-drives-in-windows). ZFS tries to [catch the liars](https://github.com/zfsonlinux/zfs/blob/master/cmd/zpool/zpool_vdev.c) and use the correct value. However, this sometimes fails, and you have to add it by hand. - -The `ashift` value is a power of two, so we have **9** for 512 bytes, **12** for 4k, and **13** for 8k. You can create a pool without this parameter and then use `zdb -C | grep ashift` to see what ZFS generated automatically. If it isn't what you think, destroy the pool again and add it manually. - -In our pretend case, we use two 3 TB WD Red drives. Listing all drives by ID gives us something like this, but with real serial numbers: - -```raw - ata-WDC_WD30EFRX-68EUZN0_WD-WCCFAKESN01 - ata-WDC_WD30EFRX-68EUZN0_WD-WCCFAKESN02 -``` - -WD Reds have a 4k sector size. The actual command to create the pool would then be: - -```bash - sudo zpool create -o ashift=12 tank mirror ata-WDC_WD30EFRX-68EUZN0_WD-WCCFAKESN01 ata-WDC_WD30EFRX-68EUZN0_WD-WCCFAKESN02 -``` - -Our new pool is named `tank` and is mirrored. To see information about it, use `zpool status tank` (no `sudo` necessary). If you screwed up (usually with `ashift`), use `sudo zpool destroy tank` and start over _now_ before it's too late. - -### Pool and filesystem properties - -Pools have properties that apply either to the pool itself or to filesystems created in the pool. You can use the command `zpool get all tank` to see the pool properties and `zfs get all tank` to see the filesystem properties. Most default values are perfectly sensible, some you'll [want to change](https://jrs-s.net/2018/08/17/zfs-tuning-cheat-sheet/). Setting defaults makes life easier when we create our filesystems. - -```bash - sudo zpool set autoexpand=on tank - sudo zfs set atime=off tank - sudo zfs set compression=lz4 tank -``` - -`autoexpand=on` lets the pool grow when you add larger hard drives. `atime=off` means that your system won't update a time stamp every time a file is accessed, something which would use a lot of resources. Usually, you don't care. Compression is a no-brainer on modern CPUs and should be on by default (we will discuss exceptions for compressed media files later). - -## Creating filesystems - -To actually store the data, we need filesystems (also known as "datasets"). For our very simple default Ansible-NAS setup, we will create two: One filesystem for movies (`movies_root` in `all.yml`) and one for downloads (`downloads_root`). - -### Movies (and other large, pre-compressed files) - -We first create the basic filesystem: - -```bash - sudo zfs create tank/movies -``` - -Movie files are usually rather large, already in a compressed format and for security reasons, the files stored there shouldn't be executable. We change the properties of the filesystem accordingly: - -```bash - sudo zfs set recordsize=1M tank/movies - sudo zfs set compression=off tank/movies - sudo zfs set exec=off tank/movies -``` - -The **recordsize** here is set to the currently largest possible value [to increase performance](https://jrs-s.net/2019/04/03/on-zfs-recordsize/) and save storage. Recall that we used `ashift` during the creation of the pool to match the ZFS block size with the drives' sector size. Records are created out of these blocks. Having larger records reduces the amount of metadata that is required, because various parts of ZFS such as caching and checksums work on this level. - -**Compression** is unnecessary for movie files because they are usually in a compressed format anyway. ZFS is good about recognizing this, and so if you happen to leave compression on as the default for the pool, it won't make much of a difference. - -[By default](https://zfsonlinux.org/manpages/0.7.13/man8/zfs.8.html#lbAI), ZFS stores pools directly under the root directory. Also, the filesystems don't have to be listed in `/etc/fstab` to be mounted. This means that our filesystem will appear as `/tank/movies` if you don't change anything. We need to change the line in `all.yml` accordingly: - -```raw - movies_root: "/tank/movies" -``` - -You can also set a traditional mount point if you wish with the `mountpoint` property. Setting this to `none` prevents the file system from being automatically mounted at all. - -The filesystems for TV shows, music files and podcasts - all large, pre-compressed files - should probably take the exact same parameters. - -### Downloads - -For downloads, we can leave most of the default parameters the way they are. - -```raw - sudo zfs create tank/downloads - sudo zfs set exec=off tank/downloads -``` - -The recordsize stays the 128 KB default. In `all.yml`, the new line is - -```raw - downloads_root: "/tank/downloads" -``` - -### Other data - -Depending on the use case, you might want to create and tune more filesystems. For example, [BitTorrent](http://open-zfs.org/wiki/Performance_tuning#Bit_Torrent), [MySQL](http://open-zfs.org/wiki/Performance_tuning#MySQL) and [Virtual Machines](http://open-zfs.org/wiki/Performance_tuning#Virtual_machines) all have known best configurations. - -## Setting up scrubs - -On Ubuntu, scrubs are configured out of the box to run on the second Sunday of every month. See `/etc/cron.d/zfsutils-linux` to change this. - -## Email notifications - -To have the [ZFS demon](http://manpages.ubuntu.com/manpages/bionic/man8/zed.8.html) `zed` send you emails when there is trouble, you first have to [install an email agent](https://www.reddit.com/r/zfs/comments/90prt4/zed_config_on_ubuntu_1804/) such as postfix. In the file `/etc/zfs/zed.d/zed.rc`, change the three entries: - -```bash -ZED_EMAIL_ADDR= -ZED_NOTIFY_INTERVAL_SECS=3600 -ZED_NOTIFY_VERBOSE=1 -``` - -If `zed` is not enabled, you might have to run `systemctl enable zed`. You can test the setup by manually starting a scrub with `sudo zpool scrub tank`. - -## Snapshots - -Snapshots create a "frozen" version of a filesystem, providing a safe copy of the contents. Correctly configured, they provide good protection against accidental deletion and certain types of attacks such as ransomware. On copy-on-write (COW) filesystems such as ZFS, they are cheap and fast to create. It is very rare that you _won't_ want snapshots. - -> Snapshots do not replace the need for backups. Nothing replaces the need for backups except more backups. - -### Managing snapshots by hand - -If you have data in a filesystem that never or very rarely changes, it might be easiest to just take a snapshot by hand after every major change. Use the `zfs snapshot` command with the name of the filesystem combined with an identifier separated by the `@` sign. Traditionally, this somehow includes the date of the snapshot, usually in some variant of the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. - -```bash - zfs snapshot tank/movies@2019-04-24 -``` - -To see the list of snapshots in the system, run - -```bash - zfs list -t snapshot -``` - -To revert ("roll back") to the previous snapshot, use the `zfs rollback` command. - -```bash - zfs rollback tank/movies@2019-04-24 -``` - -By default, you can only roll back to the most recent snapshot. Anything before then requires trickery outside the scope of this document. Finally, to get rid of a snapshot, use the `zfs destroy` command. - -```bash - zfs destroy tank/movies@2019-04-24 -``` - -> Be **very** careful with `destroy`. If you leave out the snapshot identifier and only list the filesystem - in our example, `tank/movies` - the filesystem itself will immediately be destroyed. There will be no confirmation prompt, because ZFS doesn't believe in that sort of thing. - -### Managing snapshots with Sanoid - -Usually, you'll want the process of creating new and deleting old snapshots to be automatic, especially on filesystems that change frequently. One tool for this is [sanoid](https://github.com/jimsalterjrs/sanoid/). There are various instructions for setting it up, the following is based on notes from [SvennD](https://www.svennd.be/zfs-snapshots-of-proxmox-using-sanoid/). For this example, we'll assume we have a single dataset `tank/movies` that holds, ah, movies. - -First, we install sanoid to the `/opt` directory. This assumes that Perl itself is already installed. - -```bash - sudo apt install libconfig-inifiles-perl libcapture-tiny-perl - cd /opt - sudo git clone https://github.com/jimsalterjrs/sanoid -``` - -It is probably easiest to link sanoid to `/usr/sbin`: - -```bash - sudo ln /opt/sanoid/sanoid /usr/sbin/ -``` - -Then we need to setup the configuration files - -```bash - sudo mkdir /etc/sanoid - sudo cp /opt/sanoid/sanoid.conf /etc/sanoid/sanoid.conf - sudo cp /opt/sanoid/sanoid.defaults.conf /etc/sanoid/sanoid.defaults.conf -``` - -We don't change the defaults file, but it has to be copied to the folder anyway. Next, we edit the `/etc/sanoid/sanoid.conf` configuration file in two steps: We design the "templates" and then tell sanoid which filesystems to use it on. - -The configuration file included with sanoid contains a "production" template for filesystems that change frequently. For media files, we assume that there is not going to be that much change from day-to-day, and especially there will be very few deletions. We use snapshots because this provides protection against cryptolocker attacks and against accidental deletions - -> Again, snapshots, even lots of snapshots, do not replace backups. - -For our example, we configure for two hourly snapshots (against "oh crap" deletions), 31 daily, one monthly and one yearly snapshot. - -```raw - [template_media] - frequently = 0 - hourly = 2 - daily = 31 - monthly = 1 - yearly = 1 - autosnap = yes - autoprune = yes -``` - -That might seem like a bunch of daily snapshots, but remember, if nothing has changed, a ZFS snapshot is basically free. - -Once we have an entry for the template, we assign it to the filesystem. - -```raw - [tank/movies] - use_template = media -``` - -Finally, we edit `/etc/crontab` to run sanoid every five minutes: - -```raw - */5 * * * * root /usr/sbin/sanoid --cron -``` - -After five minutes, you should see the first snapshots (use `zfs list -t snapshot` again). The list will look something like this mock example: - -```raw -NAME USED AVAIL REFER MOUNTPOINT -tank/movies@autosnap_2019-05-17_13:55:01_yearly 0B - 1,53G - -tank/movies@autosnap_2019-05-17_13:55:01_monthly 0B - 1,53G - -tank/movies@autosnap_2019-05-17_13:55:01_daily 0B - 1,53G - -``` - -Note that the snapshots use no storage, because we haven't changed anything. - -This is a very simple use of sanoid. Other functions include running scripts before and after snapshots, and setups to help with backups. See the included configuration files for examples. diff --git a/docs/zfs/zfs_overview.md b/docs/zfs/zfs_overview.md deleted file mode 100644 index 29fc329d97..0000000000 --- a/docs/zfs/zfs_overview.md +++ /dev/null @@ -1,110 +0,0 @@ -# ZFS Overview - -This is a general overview of the ZFS file system for people who are new to it. If you have some experience and are actually looking for specific information about how to configure ZFS for Ansible-NAS, check out the [ZFS example configuration](zfs_configuration.md). - -## What is ZFS and why would I want it? - -[ZFS](https://en.wikipedia.org/wiki/ZFS) is an advanced filesystem and volume manager originally created by Sun Microsystems starting in 2001. First released in 2005 for OpenSolaris, Oracle later bought Sun and switched to developing ZFS as closed source software. An open source fork took the name [OpenZFS](http://www.open-zfs.org/wiki/Main_Page), but is still called "ZFS" for short. It runs on Linux, FreeBSD, illumos and other platforms. - -ZFS aims to be the ["last word in -filesystems"](https://blogs.oracle.com/bonwick/zfs:-the-last-word-in-filesystems), a technology so future-proof that Michael W. Lucas and Allan Jude famously stated that the _Enterprise's_ computer on _Star Trek_ probably runs it. The design was based on [four principles](https://www.youtube.com/watch?v=MsY-BafQgj4): - -1. "Pooled" storage to eliminate the notion of volumes. You can add more storage the same way you just add a RAM stick to memory. - -1. Make sure data is always consistent on the disks. There is no `fsck` command for ZFS and none is needed. - -1. Detect and correct data corruption ("bitrot"). ZFS is one of the few storage systems that checksums everything, including the data itself, and is "self-healing". - -1. Make it easy to use. Try to "end the suffering" for the admins involved in managing storage. - -ZFS includes a host of other features such as snapshots, transparent compression and encryption. During the early years of ZFS, this all came with hardware requirements only enterprise users could afford. By now, however, computers have become so powerful that ZFS can run (with some effort) on a [Raspberry Pi](https://gist.github.com/mohakshah/b203d33a235307c40065bdc43e287547). - -FreeBSD and FreeNAS make extensive use of ZFS. What is holding ZFS back on Linux are [licensing issues](https://en.wikipedia.org/wiki/OpenZFS#History) beyond the scope of this document. - -Ansible-NAS doesn't actually specify a filesystem - you can use EXT4, XFS or Btrfs as well. However, ZFS not only provides the benefits listed above, but also lets you use your hard drives with different operating systems. Some people now using Ansible-NAS came from FreeNAS, and were able to `export` their ZFS storage drives there and `import` them to Ubuntu. On the other hand, if you ever decide to switch back to FreeNAS or maybe want to use FreeBSD instead of Linux, you should be able to use the same ZFS pools - -## An overview and some actual commands - -Storage in ZFS is organized in **pools**. Inside these pools, you create **filesystems** (also known as "datasets") which are like partitions on steroids. For instance, you can keep each user's `/home` directory in a separate filesystem. ZFS systems tend to use lots and lots of specialized filesystems with tailored parameters such as record size and compression. All filesystems share the available storage in their pool. - -Pools do not directly consist of hard disks or SSDs. Instead, drives are organized as **virtual devices** (VDEVs). This is where the physical redundancy in ZFS is located. Drives in a VDEV can be "mirrored" or combined as "RaidZ", roughly the equivalent of RAID5. These VDEVs are then combined into a pool by the administrator. The command might look something like this: - -```bash - sudo zpool create tank mirror /dev/sda /dev/sdb -``` - -This combines `/dev/sba` and `/dev/sdb` to a mirrored VDEV, and then defines a new pool named `tank` consisting of this single VDEV. (Actually, you'd want to use a different ID for the drives, but you get the idea.) You can now create a filesystem in this pool for, say, all of your _Mass Effect_ fan fiction: - -```bash - sudo zfs create tank/mefanfic -``` - -You can then enable automatic compression on this filesystem with `sudo zfs set compression=lz4 tank/mefanfic`. To take a **snapshot**, use - -```bash - sudo zfs snapshot tank/mefanfic@21540411 -``` - -Now, if evil people were somehow able to encrypt your precious fan fiction files with ransomware, you can simply laugh maniacally and revert to the old version: - -```bash - sudo zfs rollback tank/mefanfic@21540411 -``` - -Of course, you would lose any texts you might have added to the filesystem between that snapshot and now. Usually, you'll have some form of **automatic snapshot administration** configured. - -To detect bitrot and other data defects, ZFS periodically runs **scrubs**: The system compares the available copies of each data record with their checksums. If there is a mismatch, the data is repaired. - -## Known issues - -> At time of writing (April 2019), ZFS on Linux does not offer native encryption, TRIM support or device removal, which are all scheduled to beincluded in the upcoming [0.8 release](https://www.phoronix.com/scan.php?page=news_item&px=ZFS-On-Linux-0.8-RC1-Released) any day now. - -ZFS' original design for enterprise systems and redundancy requirements can make some things difficult. You can't just add individual drives to a pool and tell the system to reconfigure automatically. Instead, you have to either add a new VDEV, or replace each of the existing drives with one of higher capacity. In an enterprise environment, of course, you would just _buy_ a bunch of new drives and move the data from the old pool to the new pool. Shrinking a pool is even harder - put simply, ZFS is not built for this, though it is [being worked on](https://www.delphix.com/blog/delphix-engineering/openzfs-device-removal). - - If you absolutely must be able to add or remove single drives, ZFS might not be the filesystem for you - -## Myths and misunderstandings - -Information on the internet about ZFS can be outdated, conflicting or flat-out wrong. Partially this is because it has been in use for almost 15 years now and things change, partially it is the result of being used on different operating systems which have minor differences under the hood. Also, Google searches tend to first return the Oracle documentation for their closed source ZFS variant, which is increasingly diverging from the open source OpenZFS standard. - -To clear up some of the most common misunderstandings: - -### No, ZFS does not need at least 8 GB of RAM - -This myth is especially common [in FreeNAS circles](https://www.ixsystems.com/community/threads/does-freenas-really-need-8gb-of-ram.38685/). Curiously, FreeBSD, the basis of FreeNAS, will run with [1 GB](https://wiki.freebsd.org/ZFSTuningGuide). The [ZFS on Linux FAQ](https://github.com/zfsonlinux/zfs/wiki/FAQ#hardware-requirements), which is more relevant for Ansible-NAS, states under "suggested hardware": - -> 8GB+ of memory for the best performance. It's perfectly possible to run with -> 2GB or less (and people do), but you'll need more if using deduplication. - -(Deduplication is only useful in [special cases](http://open-zfs.org/wiki/Performance_tuning#Deduplication). If you are reading this, you probably don't need it.) - -Experience shows that 8 GB of RAM is in fact a sensible minimal amount for continuous use. But it's not a requirement. What everybody agrees on is that ZFS _loves_ RAM and works better the more it has, so you should have as much of it as you possibly can. When in doubt, add more RAM, and even more, and them some, until your motherboard's capacity is reached. - -### No, ECC RAM is not required for ZFS - -This is another case where a recommendation has been taken as a requirement. To quote the [ZFS on Linux FAQ](https://github.com/zfsonlinux/zfs/wiki/FAQ#do-i-have-to-use-ecc-memory-for-zfs) again: - -> Using ECC memory for OpenZFS is strongly recommended for enterprise environments where the strongest data integrity guarantees are required. Without ECC memory rare random bit flips caused by cosmic rays or by faulty memory can go undetected. If this were to occur OpenZFS (or any other filesystem) will write the damaged data to disk and be unable to automatically detect the corruption. - -ECC corrects [single bit errors](https://en.wikipedia.org/wiki/ECC_memory) in memory. It is _always_ better to have it on _any_ computer if you can afford it, and ZFS is no exception. However, there is absolutely no requirement for ZFS to have ECC RAM. If you just don't care about the danger of random bit flips because, hey, you can always just download [Night of the Living Dead](https://archive.org/details/night_of_the_living_dead) all over again, you're perfectly free to use normal RAM. If you do use ECC RAM, make sure your processor and motherboard support it. - -### No, the SLOG is not really a write cache - -You'll read the suggestion to add a fast SSD or NVMe as a "SLOG drive" (mistakenly also called "ZIL") for write caching. This isn't what happens, because ZFS already includes [a write cache](https://linuxhint.com/configuring-zfs-cache/) in RAM. Since RAM is always faster, adding a disk as a write cache doesn't even make sense - -What the **ZFS Intent Log (ZIL)** does, with or without a dedicated drive, is handle synchronous writes. These occur when the system refuses to signal a successful write until the data is actually stored on a physical disk somewhere. This keeps the data safe, but is slower. - -By default, the ZIL initially shoves a copy of the data on a normal VDEV somewhere and then gives the thumbs up. The actual write to the pool is performed later from the write cache in RAM, _not_ the temporary copy. The data there is only ever read if the power fails before the last step. The ZIL is all about protecting data, not making transfers faster. - -A **Separate Intent Log (SLOG)** is an additional fast drive for these temporary synchronous writes. It simply allows the ZIL give the thumbs up quicker. This means that a SLOG is never read unless the power has failed before the final write to the pool. - -Asynchronous writes just go through the normal write cache, by the way. If the power fails, the data is gone. - -In summary, the ZIL prevents data loss during synchronous writes, or at least ensures that the data in storage is consistent. You always have a ZIL. A SLOG will make the ZIL faster. You'll probably need to [do some research](https://www.ixsystems.com/blog/o-slog-not-slog-best-configure-zfs-intent-log/) and some testing to figure out if your system would benefit from a SLOG. NFS for instance uses synchronous writes, SMB usually doesn't. When in doubt, add more RAM instead. - -## Further reading and viewing - -- In 2012, Aaron Toponce wrote a now slightly dated, but still very good [introduction](https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/) to ZFS on Linux. If you only read one part, make it the [explanation of the ARC](https://pthree.org/2012/12/07/zfs-administration-part-iv-the-adjustable-replacement-cache/), ZFS' read cache. -- One of the best books on ZFS around is _FreeBSD Mastery: ZFS_ by Michael W. Lucas and Allan Jude. Though it is written for FreeBSD, the general guidelines apply for all variants. There is a second volume for advanced use. - -- Jeff Bonwick, one of the original creators of ZFS, tells the story of how ZFS came to be [on YouTube](https://www.youtube.com/watch?v=dcV2PaMTAJ4). diff --git a/website/.gitignore b/website/.gitignore new file mode 100644 index 0000000000..b2d6de3062 --- /dev/null +++ b/website/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/website/README.md b/website/README.md new file mode 100644 index 0000000000..aaba2fa1e1 --- /dev/null +++ b/website/README.md @@ -0,0 +1,41 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +### Installation + +``` +$ yarn +``` + +### Local Development + +``` +$ yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. + +### Build + +``` +$ yarn build +``` + +This command generates static content into the `build` directory and can be served using any static contents hosting service. + +### Deployment + +Using SSH: + +``` +$ USE_SSH=true yarn deploy +``` + +Not using SSH: + +``` +$ GIT_USER= yarn deploy +``` + +If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/babel.config.js b/website/babel.config.js new file mode 100644 index 0000000000..e00595dae7 --- /dev/null +++ b/website/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/website/blog/2022-09-19-welcome/index.md b/website/blog/2022-09-19-welcome/index.md new file mode 100644 index 0000000000..455771dfa4 --- /dev/null +++ b/website/blog/2022-09-19-welcome/index.md @@ -0,0 +1,10 @@ +--- +slug: welcome +title: Welcome +authors: [davestephens] +tags: [ansible-nas, website] +--- + +It's about time Ansible-NAS had a proper website and domain name. This new [Docusaurus](https://docusaurus.io) based site is moving closer to that goal, served from via Github Pages. + + diff --git a/website/blog/authors.yml b/website/blog/authors.yml new file mode 100644 index 0000000000..96348018cd --- /dev/null +++ b/website/blog/authors.yml @@ -0,0 +1,6 @@ +--- +davestephens: + name: David Stephens + title: Maintainer of Ansible-NAS + url: https://github.com/davestephens + image_url: https://github.com/davestephens.png diff --git a/website/docs/applications/_category_.json b/website/docs/applications/_category_.json new file mode 100644 index 0000000000..944529de3c --- /dev/null +++ b/website/docs/applications/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Applications", + "position": 3, + "link": { + "type": "generated-index", + "description": "All of the applications available for installation with Ansible-NAS." + } +} diff --git a/website/docs/applications/content-management/_category_.json b/website/docs/applications/content-management/_category_.json new file mode 100644 index 0000000000..a1ca20cfa8 --- /dev/null +++ b/website/docs/applications/content-management/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Content Management", + "link": { + "type": "generated-index", + "description": "All of the content management applications for installation with Ansible-NAS." + } +} diff --git a/docs/applications/dokuwiki.md b/website/docs/applications/content-management/dokuwiki.md similarity index 87% rename from docs/applications/dokuwiki.md rename to website/docs/applications/content-management/dokuwiki.md index f5290e0566..352d9b9be4 100644 --- a/docs/applications/dokuwiki.md +++ b/website/docs/applications/content-management/dokuwiki.md @@ -1,4 +1,7 @@ -# DokuWiki +--- +title: "Dokuwiki" +description: "Open source wiki software that doesn't require a database" +--- Homepage: diff --git a/docs/applications/joomla.md b/website/docs/applications/content-management/joomla.md similarity index 90% rename from docs/applications/joomla.md rename to website/docs/applications/content-management/joomla.md index c728079669..e573f2f397 100644 --- a/docs/applications/joomla.md +++ b/website/docs/applications/content-management/joomla.md @@ -1,4 +1,7 @@ -# Joomla CMS +--- +title: "Joomla" +description: "An award-winning content management system" +--- Homepage: diff --git a/docs/applications/tiddlywiki.md b/website/docs/applications/content-management/tiddlywiki.md similarity index 93% rename from docs/applications/tiddlywiki.md rename to website/docs/applications/content-management/tiddlywiki.md index cb161d5d84..be0344b2e0 100644 --- a/docs/applications/tiddlywiki.md +++ b/website/docs/applications/content-management/tiddlywiki.md @@ -1,4 +1,7 @@ -# TiddlyWiki +--- +title: "TiddlyWiki" +description: "A notebook for capturing, organizing, and sharing information" +--- Homepage: diff --git a/website/docs/applications/dashboards/_category_.json b/website/docs/applications/dashboards/_category_.json new file mode 100644 index 0000000000..478e028e70 --- /dev/null +++ b/website/docs/applications/dashboards/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Dashboards", + "link": { + "type": "generated-index", + "description": "All of the dashboards available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/dashy.md b/website/docs/applications/dashboards/dashy.md similarity index 96% rename from docs/applications/dashy.md rename to website/docs/applications/dashboards/dashy.md index f37e2d4eeb..d4ba750ea0 100644 --- a/docs/applications/dashy.md +++ b/website/docs/applications/dashboards/dashy.md @@ -1,5 +1,6 @@ - -# Dashy +--- +title: "Dashy" +--- Homepage: diff --git a/docs/applications/heimdall.md b/website/docs/applications/dashboards/heimdall.md similarity index 95% rename from docs/applications/heimdall.md rename to website/docs/applications/dashboards/heimdall.md index 472672ffce..7b0b00c307 100644 --- a/docs/applications/heimdall.md +++ b/website/docs/applications/dashboards/heimdall.md @@ -1,5 +1,6 @@ - -# Heimdall +--- +title: "Heimdall" +--- Homepage: diff --git a/docs/applications/organizr.md b/website/docs/applications/dashboards/organizr.md similarity index 94% rename from docs/applications/organizr.md rename to website/docs/applications/dashboards/organizr.md index 5f6f6bcd7e..3fb1b3cd95 100644 --- a/docs/applications/organizr.md +++ b/website/docs/applications/dashboards/organizr.md @@ -1,5 +1,6 @@ - -# Organizr +--- +title: "Organizr" +--- Homepage: diff --git a/website/docs/applications/development-tools/_category_.json b/website/docs/applications/development-tools/_category_.json new file mode 100644 index 0000000000..68a01ec388 --- /dev/null +++ b/website/docs/applications/development-tools/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Development Tools", + "link": { + "type": "generated-index", + "description": "All of the development tools available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/code-server.md b/website/docs/applications/development-tools/code-server.md similarity index 95% rename from docs/applications/code-server.md rename to website/docs/applications/development-tools/code-server.md index 8b1273d795..a8339f1045 100644 --- a/docs/applications/code-server.md +++ b/website/docs/applications/development-tools/code-server.md @@ -1,4 +1,6 @@ -# Code Server (VSCode) +--- +title: "Code Server" +--- Homepage: diff --git a/docs/applications/gitea.md b/website/docs/applications/development-tools/gitea.md similarity index 91% rename from docs/applications/gitea.md rename to website/docs/applications/development-tools/gitea.md index 1e673ce840..4624342009 100644 --- a/docs/applications/gitea.md +++ b/website/docs/applications/development-tools/gitea.md @@ -1,5 +1,6 @@ - -# Gitea +--- +title: "Gitea" +--- Homepage: diff --git a/docs/applications/gitlab.md b/website/docs/applications/development-tools/gitlab.md similarity index 96% rename from docs/applications/gitlab.md rename to website/docs/applications/development-tools/gitlab.md index f1b6873fdd..f5562d0430 100644 --- a/docs/applications/gitlab.md +++ b/website/docs/applications/development-tools/gitlab.md @@ -1,4 +1,6 @@ -# GitLab +--- +title: "GitLab" +--- Homepage: diff --git a/docs/applications/woodpecker_ci.md b/website/docs/applications/development-tools/woodpecker_ci.md similarity index 95% rename from docs/applications/woodpecker_ci.md rename to website/docs/applications/development-tools/woodpecker_ci.md index 216b4f538a..50208319b5 100644 --- a/docs/applications/woodpecker_ci.md +++ b/website/docs/applications/development-tools/woodpecker_ci.md @@ -1,4 +1,6 @@ -# Woodpecker CI +--- +title: "Woodpecker CI" +--- Woodpecker is a simple CI engine with great extensibility. diff --git a/website/docs/applications/download-tools/_category_.json b/website/docs/applications/download-tools/_category_.json new file mode 100644 index 0000000000..1afa459307 --- /dev/null +++ b/website/docs/applications/download-tools/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Download Tools", + "link": { + "type": "generated-index", + "description": "All of the download tools available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/bazarr.md b/website/docs/applications/download-tools/bazarr.md similarity index 94% rename from docs/applications/bazarr.md rename to website/docs/applications/download-tools/bazarr.md index c76cc45071..44bbd4ee5d 100644 --- a/docs/applications/bazarr.md +++ b/website/docs/applications/download-tools/bazarr.md @@ -1,4 +1,6 @@ -# Bazarr subtitle downloader +--- +title: "Bazarr" +--- Homepage: diff --git a/docs/applications/couchpotato.md b/website/docs/applications/download-tools/couchpotato.md similarity index 92% rename from docs/applications/couchpotato.md rename to website/docs/applications/download-tools/couchpotato.md index 6dcc6e7f94..05d1b79752 100644 --- a/docs/applications/couchpotato.md +++ b/website/docs/applications/download-tools/couchpotato.md @@ -1,5 +1,6 @@ - -# CouchPotato +--- +title: "Couchpotato" +--- Homepage: diff --git a/docs/applications/deluge.md b/website/docs/applications/download-tools/deluge.md similarity index 96% rename from docs/applications/deluge.md rename to website/docs/applications/download-tools/deluge.md index b0a86e23dd..0ced8e693d 100644 --- a/docs/applications/deluge.md +++ b/website/docs/applications/download-tools/deluge.md @@ -1,4 +1,6 @@ -# Deluge +--- +title: "Deluge" +--- Homepage: diff --git a/docs/applications/get_iplayer.md b/website/docs/applications/download-tools/get_iplayer.md similarity index 90% rename from docs/applications/get_iplayer.md rename to website/docs/applications/download-tools/get_iplayer.md index bbf144c39e..d0374cdc3e 100644 --- a/docs/applications/get_iplayer.md +++ b/website/docs/applications/download-tools/get_iplayer.md @@ -1,4 +1,6 @@ -# get_iplayer +--- +title: "Get_iPlayer" +--- Homepage: diff --git a/docs/applications/jackett.md b/website/docs/applications/download-tools/jackett.md similarity index 96% rename from docs/applications/jackett.md rename to website/docs/applications/download-tools/jackett.md index 919d8daa8b..866c1792ee 100644 --- a/docs/applications/jackett.md +++ b/website/docs/applications/download-tools/jackett.md @@ -1,4 +1,6 @@ -# Jackett +--- +title: "Jackett" +--- Homepage: diff --git a/docs/applications/lidarr.md b/website/docs/applications/download-tools/lidarr.md similarity index 92% rename from docs/applications/lidarr.md rename to website/docs/applications/download-tools/lidarr.md index 595802f6a5..32843d4add 100644 --- a/docs/applications/lidarr.md +++ b/website/docs/applications/download-tools/lidarr.md @@ -1,4 +1,6 @@ -# Lidarr music collection manager +--- +title: "Lidarr" +--- Homepage: diff --git a/docs/applications/mylar.md b/website/docs/applications/download-tools/mylar.md similarity index 95% rename from docs/applications/mylar.md rename to website/docs/applications/download-tools/mylar.md index b685ca319b..819183f1b1 100644 --- a/docs/applications/mylar.md +++ b/website/docs/applications/download-tools/mylar.md @@ -1,5 +1,6 @@ - -# Mylar +--- +title: "Mylar" +--- Homepage: diff --git a/docs/applications/nzbget.md b/website/docs/applications/download-tools/nzbget.md similarity index 95% rename from docs/applications/nzbget.md rename to website/docs/applications/download-tools/nzbget.md index 04f3fc6312..1e81efb51e 100644 --- a/docs/applications/nzbget.md +++ b/website/docs/applications/download-tools/nzbget.md @@ -1,4 +1,6 @@ -# NZBget +--- +title: "NZBGet" +--- Homepage: diff --git a/docs/applications/ombi.md b/website/docs/applications/download-tools/ombi.md similarity index 94% rename from docs/applications/ombi.md rename to website/docs/applications/download-tools/ombi.md index e4ba888454..c13076c280 100644 --- a/docs/applications/ombi.md +++ b/website/docs/applications/download-tools/ombi.md @@ -1,4 +1,6 @@ -# Ombi +--- +title: "Ombi" +--- Homepage: diff --git a/docs/applications/overseerr.md b/website/docs/applications/download-tools/overseerr.md similarity index 94% rename from docs/applications/overseerr.md rename to website/docs/applications/download-tools/overseerr.md index b0d6de633d..d754a8291d 100644 --- a/docs/applications/overseerr.md +++ b/website/docs/applications/download-tools/overseerr.md @@ -1,4 +1,6 @@ -# overseerr +--- +title: "Overseerr" +--- Homepage: diff --git a/docs/applications/prowlarr.md b/website/docs/applications/download-tools/prowlarr.md similarity index 96% rename from docs/applications/prowlarr.md rename to website/docs/applications/download-tools/prowlarr.md index e8c2497828..0c0c0b45c1 100644 --- a/docs/applications/prowlarr.md +++ b/website/docs/applications/download-tools/prowlarr.md @@ -1,4 +1,6 @@ -# Prowlarr +--- +title: "Prowlarr" +--- Homepages: [prowlarr](https://github.com/Prowlarr/Prowlarr) diff --git a/docs/applications/pyload.md b/website/docs/applications/download-tools/pyload.md similarity index 90% rename from docs/applications/pyload.md rename to website/docs/applications/download-tools/pyload.md index 02e8e6ee74..7870a26a1e 100644 --- a/docs/applications/pyload.md +++ b/website/docs/applications/download-tools/pyload.md @@ -1,6 +1,8 @@ -# pyLoad +--- +title: "pyLoad" +--- -Homepage: [https://pyload.net/](https://pyload.net//) +Homepage: [https://pyload.net/](https://pyload.net/) Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web. diff --git a/docs/applications/radarr.md b/website/docs/applications/download-tools/radarr.md similarity index 98% rename from docs/applications/radarr.md rename to website/docs/applications/download-tools/radarr.md index 141bbebbd0..09355c1f76 100644 --- a/docs/applications/radarr.md +++ b/website/docs/applications/download-tools/radarr.md @@ -1,4 +1,6 @@ -# Radarr +--- +title: "Radarr" +--- Homepage: [radarr](https://radarr.video/) diff --git a/docs/applications/sabnzbd.md b/website/docs/applications/download-tools/sabnzbd.md similarity index 94% rename from docs/applications/sabnzbd.md rename to website/docs/applications/download-tools/sabnzbd.md index a4ed13d11f..ddbd27d51b 100644 --- a/docs/applications/sabnzbd.md +++ b/website/docs/applications/download-tools/sabnzbd.md @@ -1,4 +1,6 @@ -# Sabnzbd +--- +title: "Sabnzbd" +--- Homepage: diff --git a/docs/applications/sonarr.md b/website/docs/applications/download-tools/sonarr.md similarity index 96% rename from docs/applications/sonarr.md rename to website/docs/applications/download-tools/sonarr.md index 0a7ecaf5f6..0833ecb97e 100644 --- a/docs/applications/sonarr.md +++ b/website/docs/applications/download-tools/sonarr.md @@ -1,6 +1,8 @@ -# Sonarr +--- +title: "Sonarr" +--- -Homepages: +Homepage: **Sonarr** is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. diff --git a/docs/applications/transmission.md b/website/docs/applications/download-tools/transmission.md similarity index 96% rename from docs/applications/transmission.md rename to website/docs/applications/download-tools/transmission.md index 456e741dfa..e29ce9c403 100644 --- a/docs/applications/transmission.md +++ b/website/docs/applications/download-tools/transmission.md @@ -1,4 +1,6 @@ -# Transmission +--- +title: "Transmission" +--- Homepage: diff --git a/docs/applications/utorrent.md b/website/docs/applications/download-tools/utorrent.md similarity index 94% rename from docs/applications/utorrent.md rename to website/docs/applications/download-tools/utorrent.md index 9693bebaab..c62bab8c1b 100644 --- a/docs/applications/utorrent.md +++ b/website/docs/applications/download-tools/utorrent.md @@ -1,5 +1,6 @@ - -# uTorrent +--- +title: "uTorrent" +--- Homepage: Docker Container: diff --git a/docs/applications/youtubedlmaterial.md b/website/docs/applications/download-tools/youtubedlmaterial.md similarity index 95% rename from docs/applications/youtubedlmaterial.md rename to website/docs/applications/download-tools/youtubedlmaterial.md index a7514cc882..5065be1ea5 100644 --- a/docs/applications/youtubedlmaterial.md +++ b/website/docs/applications/download-tools/youtubedlmaterial.md @@ -1,5 +1,6 @@ - -# YouTubeDL-Material +--- +title: "YouTubeDL-Material" +--- Homepage: Docker Container: diff --git a/website/docs/applications/gaming/_category_.json b/website/docs/applications/gaming/_category_.json new file mode 100644 index 0000000000..75d6121fc5 --- /dev/null +++ b/website/docs/applications/gaming/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Gaming", + "link": { + "type": "generated-index", + "description": "All of the gaming applications available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/minecraft-server.md b/website/docs/applications/gaming/minecraft-server.md similarity index 95% rename from docs/applications/minecraft-server.md rename to website/docs/applications/gaming/minecraft-server.md index e2ac52f8c0..e9e4e4a88c 100644 --- a/docs/applications/minecraft-server.md +++ b/website/docs/applications/gaming/minecraft-server.md @@ -1,4 +1,6 @@ -# Minecraft Server +--- +title: "Minecraft Server" +--- Homepage: diff --git a/website/docs/applications/home-automation/_category_.json b/website/docs/applications/home-automation/_category_.json new file mode 100644 index 0000000000..bb4eb41b5f --- /dev/null +++ b/website/docs/applications/home-automation/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Home Automation", + "link": { + "type": "generated-index", + "description": "All of the home automation applications available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/esphome.md b/website/docs/applications/home-automation/esphome.md similarity index 95% rename from docs/applications/esphome.md rename to website/docs/applications/home-automation/esphome.md index 07c382d7aa..e127a431d3 100644 --- a/docs/applications/esphome.md +++ b/website/docs/applications/home-automation/esphome.md @@ -1,4 +1,6 @@ -# EspHome +--- +title: "ESPHome" +--- Homepage: [esphome.io](https://esphome.io/) diff --git a/docs/applications/homeassistant.md b/website/docs/applications/home-automation/homeassistant.md similarity index 94% rename from docs/applications/homeassistant.md rename to website/docs/applications/home-automation/homeassistant.md index f7163cb25b..ac1bc59b59 100644 --- a/docs/applications/homeassistant.md +++ b/website/docs/applications/home-automation/homeassistant.md @@ -1,4 +1,6 @@ -# Home Assistant +--- +title: "Home Assistant" +--- Homepage: diff --git a/docs/applications/homebridge.md b/website/docs/applications/home-automation/homebridge.md similarity index 95% rename from docs/applications/homebridge.md rename to website/docs/applications/home-automation/homebridge.md index cbb9b329bc..98c80ebcdc 100644 --- a/docs/applications/homebridge.md +++ b/website/docs/applications/home-automation/homebridge.md @@ -1,4 +1,6 @@ -# Homebridge +--- +title: "Homebridge" +--- Homepage: diff --git a/docs/applications/mosquitto.md b/website/docs/applications/home-automation/mosquitto.md similarity index 87% rename from docs/applications/mosquitto.md rename to website/docs/applications/home-automation/mosquitto.md index 4015613e01..5fe0c9d6cc 100644 --- a/docs/applications/mosquitto.md +++ b/website/docs/applications/home-automation/mosquitto.md @@ -1,4 +1,6 @@ -# Mosquitto +--- +title: "Mosquitto" +--- Homepage: diff --git a/docs/applications/n8n.md b/website/docs/applications/home-automation/n8n.md similarity index 94% rename from docs/applications/n8n.md rename to website/docs/applications/home-automation/n8n.md index 5f531246d7..c96511632b 100644 --- a/docs/applications/n8n.md +++ b/website/docs/applications/home-automation/n8n.md @@ -1,4 +1,6 @@ -# Nodemation (n8n) +--- +title: "Nodemation (n8n)" +--- Homepage: diff --git a/docs/applications/openhab.md b/website/docs/applications/home-automation/openhab.md similarity index 96% rename from docs/applications/openhab.md rename to website/docs/applications/home-automation/openhab.md index 2ea46ddffb..47a60422ae 100644 --- a/docs/applications/openhab.md +++ b/website/docs/applications/home-automation/openhab.md @@ -1,4 +1,6 @@ -# openHAB +--- +title: "openHAB" +--- Homepage: diff --git a/website/docs/applications/media-serving/_category_.json b/website/docs/applications/media-serving/_category_.json new file mode 100644 index 0000000000..881325af58 --- /dev/null +++ b/website/docs/applications/media-serving/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Media Serving", + "link": { + "type": "generated-index", + "description": "All of the media applications available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/airsonic.md b/website/docs/applications/media-serving/airsonic.md similarity index 96% rename from docs/applications/airsonic.md rename to website/docs/applications/media-serving/airsonic.md index 6d3ef37632..1a4b7ca41e 100644 --- a/docs/applications/airsonic.md +++ b/website/docs/applications/media-serving/airsonic.md @@ -1,4 +1,6 @@ -# Airsonic +--- +title: "Airsonic" +--- Homepage: diff --git a/docs/applications/booksonic.md b/website/docs/applications/media-serving/booksonic.md similarity index 96% rename from docs/applications/booksonic.md rename to website/docs/applications/media-serving/booksonic.md index d396d60cfa..be8572c7a9 100644 --- a/docs/applications/booksonic.md +++ b/website/docs/applications/media-serving/booksonic.md @@ -1,4 +1,6 @@ -# Booksonic +--- +title: "Booksonic" +--- Homepage: diff --git a/docs/applications/calibre.md b/website/docs/applications/media-serving/calibre.md similarity index 96% rename from docs/applications/calibre.md rename to website/docs/applications/media-serving/calibre.md index f2d32de89e..607a533b0b 100644 --- a/docs/applications/calibre.md +++ b/website/docs/applications/media-serving/calibre.md @@ -1,4 +1,6 @@ -# Calibre-web +--- +title: "Calibre-web" +--- Homepage: diff --git a/docs/applications/emby.md b/website/docs/applications/media-serving/emby.md similarity index 88% rename from docs/applications/emby.md rename to website/docs/applications/media-serving/emby.md index e9edb43dbf..2e500f2932 100644 --- a/docs/applications/emby.md +++ b/website/docs/applications/media-serving/emby.md @@ -1,4 +1,6 @@ -# Emby +--- +title: "Emby" +--- Homepage: @@ -32,13 +34,6 @@ delete files then, which might be exactly what you want. However, you will not have the option to store cover art in the related folders. Always leave the configuration directory read/write -## File system considerations - -Movie and TV show files are almost always very large and pre-compressed. If you -are using a specialized filesystem such as ZFS for bulk storage, you'll want to -set the parameters accordingly. The [ZFS configuration -documentation](../zfs/zfs_configuration.md) has an example of this. - ## Naming movies and TV shows Emby is very fussy about how movies and TV shows must be named to enable diff --git a/docs/applications/jellyfin.md b/website/docs/applications/media-serving/jellyfin.md similarity index 89% rename from docs/applications/jellyfin.md rename to website/docs/applications/media-serving/jellyfin.md index 53bb21f675..ec24d3b422 100644 --- a/docs/applications/jellyfin.md +++ b/website/docs/applications/media-serving/jellyfin.md @@ -1,4 +1,6 @@ -# Jellyfin +--- +title: "Jellyfin" +--- Homepage: @@ -34,13 +36,6 @@ delete files then, which might be exactly what you want. However, you will not have the option to store cover art in the related folders. Always leave the configuration directory read/write -## File system considerations - -Movie and TV show files are almost always very large and pre-compressed. If you -are using a specialized filesystem such as ZFS for bulk storage, you'll want to -set the parameters accordingly. The [ZFS configuration -documentation](../zfs/zfs_configuration.md) has an example of this. - ## Naming movies and TV shows jellyfin is very fussy about how movies and TV shows must be named to enable diff --git a/docs/applications/komga.md b/website/docs/applications/media-serving/komga.md similarity index 84% rename from docs/applications/komga.md rename to website/docs/applications/media-serving/komga.md index 25bc1d78c0..82b21acc71 100644 --- a/docs/applications/komga.md +++ b/website/docs/applications/media-serving/komga.md @@ -1,4 +1,6 @@ -# Komga free and open source comics/mangas media server +--- +title: "Komga" +--- Homepage: diff --git a/docs/applications/minidlna.md b/website/docs/applications/media-serving/minidlna.md similarity index 95% rename from docs/applications/minidlna.md rename to website/docs/applications/media-serving/minidlna.md index 1f030d3d15..f216795b71 100644 --- a/docs/applications/minidlna.md +++ b/website/docs/applications/media-serving/minidlna.md @@ -1,4 +1,6 @@ -# MiniDLNA +--- +title: "MiniDLNA" +--- Homepage: diff --git a/docs/applications/mymediaforalexa.md b/website/docs/applications/media-serving/mymediaforalexa.md similarity index 92% rename from docs/applications/mymediaforalexa.md rename to website/docs/applications/media-serving/mymediaforalexa.md index 174f19d71c..85b42f6dcb 100644 --- a/docs/applications/mymediaforalexa.md +++ b/website/docs/applications/media-serving/mymediaforalexa.md @@ -1,4 +1,6 @@ -# My Media for Alexa +--- +title: "My Media for Alexa" +--- Homepage: diff --git a/docs/applications/navidrome.md b/website/docs/applications/media-serving/navidrome.md similarity index 94% rename from docs/applications/navidrome.md rename to website/docs/applications/media-serving/navidrome.md index bd8bb18053..3e5380e228 100644 --- a/docs/applications/navidrome.md +++ b/website/docs/applications/media-serving/navidrome.md @@ -1,4 +1,6 @@ -# Navidrome +--- +title: "Navidrome" +--- Homepage: diff --git a/docs/applications/plex.md b/website/docs/applications/media-serving/plex.md similarity index 96% rename from docs/applications/plex.md rename to website/docs/applications/media-serving/plex.md index be9a37e017..8fb789020f 100644 --- a/docs/applications/plex.md +++ b/website/docs/applications/media-serving/plex.md @@ -1,4 +1,6 @@ -# Plex +--- +title: "Plex" +--- Homepage: diff --git a/docs/applications/pytivo.md b/website/docs/applications/media-serving/pytivo.md similarity index 97% rename from docs/applications/pytivo.md rename to website/docs/applications/media-serving/pytivo.md index cd15993ef7..c3344a23b7 100644 --- a/docs/applications/pytivo.md +++ b/website/docs/applications/media-serving/pytivo.md @@ -1,5 +1,6 @@ - -# PyTivo +--- +title: "PyTivo" +--- Project Homepage: diff --git a/docs/applications/tautulli.md b/website/docs/applications/media-serving/tautulli.md similarity index 91% rename from docs/applications/tautulli.md rename to website/docs/applications/media-serving/tautulli.md index 97c24deae0..a987629912 100644 --- a/docs/applications/tautulli.md +++ b/website/docs/applications/media-serving/tautulli.md @@ -1,5 +1,6 @@ - -# Tautulli +--- +title: "Tautulli" +--- Homepage: diff --git a/docs/applications/ubooquity.md b/website/docs/applications/media-serving/ubooquity.md similarity index 97% rename from docs/applications/ubooquity.md rename to website/docs/applications/media-serving/ubooquity.md index 4e35b3f5b6..1dea780627 100644 --- a/docs/applications/ubooquity.md +++ b/website/docs/applications/media-serving/ubooquity.md @@ -1,4 +1,6 @@ -# Ubooquity Comic and Book Server +--- +title: "Ubooquity" +--- Homepage: diff --git a/website/docs/applications/monitoring/_category_.json b/website/docs/applications/monitoring/_category_.json new file mode 100644 index 0000000000..31e62d91df --- /dev/null +++ b/website/docs/applications/monitoring/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Monitoring", + "link": { + "type": "generated-index", + "description": "All of the monitoring applications available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/glances.md b/website/docs/applications/monitoring/glances.md similarity index 93% rename from docs/applications/glances.md rename to website/docs/applications/monitoring/glances.md index 382a549044..8963969682 100644 --- a/docs/applications/glances.md +++ b/website/docs/applications/monitoring/glances.md @@ -1,4 +1,6 @@ -# Glances +--- +title: "Glances" +--- Homepage: diff --git a/docs/applications/speedtest.md b/website/docs/applications/monitoring/speedtest.md similarity index 93% rename from docs/applications/speedtest.md rename to website/docs/applications/monitoring/speedtest.md index e748c3b07c..0d5eaa026f 100644 --- a/docs/applications/speedtest.md +++ b/website/docs/applications/monitoring/speedtest.md @@ -1,5 +1,6 @@ - -# Speedtest-Tracker +--- +title: "Speedtest-Tracker" +--- Homepage: diff --git a/docs/applications/stats.md b/website/docs/applications/monitoring/stats.md similarity index 97% rename from docs/applications/stats.md rename to website/docs/applications/monitoring/stats.md index 256209597f..1a92639aa8 100644 --- a/docs/applications/stats.md +++ b/website/docs/applications/monitoring/stats.md @@ -1,4 +1,6 @@ -# Stats +--- +title: "Stats" +--- The stats role uses Prometheus, Grafana, Telegraf and a number of metrics exporters to collect and record lots of metrics about your NAS. diff --git a/docs/applications/wireshark.md b/website/docs/applications/monitoring/wireshark.md similarity index 96% rename from docs/applications/wireshark.md rename to website/docs/applications/monitoring/wireshark.md index 34442ab1f8..689853d76e 100644 --- a/docs/applications/wireshark.md +++ b/website/docs/applications/monitoring/wireshark.md @@ -1,4 +1,6 @@ -# Wireshark +--- +title: "Wireshark" +--- Homepage: diff --git a/website/docs/applications/news/_category_.json b/website/docs/applications/news/_category_.json new file mode 100644 index 0000000000..8b75064a91 --- /dev/null +++ b/website/docs/applications/news/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "News", + "link": { + "type": "generated-index", + "description": "All of the news applications for installation with Ansible-NAS." + } +} diff --git a/docs/applications/freshrss.md b/website/docs/applications/news/freshrss.md similarity index 97% rename from docs/applications/freshrss.md rename to website/docs/applications/news/freshrss.md index 236fcabb3c..b34b3d08ed 100644 --- a/docs/applications/freshrss.md +++ b/website/docs/applications/news/freshrss.md @@ -1,5 +1,6 @@ - -# FreshRSS +--- +title: "FreshRSS" +--- Homepage: diff --git a/docs/applications/miniflux.md b/website/docs/applications/news/miniflux.md similarity index 100% rename from docs/applications/miniflux.md rename to website/docs/applications/news/miniflux.md diff --git a/docs/applications/rssbridge.md b/website/docs/applications/news/rssbridge.md similarity index 95% rename from docs/applications/rssbridge.md rename to website/docs/applications/news/rssbridge.md index 404fb65f3d..9ea01ba1b9 100644 --- a/docs/applications/rssbridge.md +++ b/website/docs/applications/news/rssbridge.md @@ -1,5 +1,6 @@ - -# RSS-Bridge +--- +title: "RSS-Bridge" +--- Homepage: diff --git a/website/docs/applications/other/_category_.json b/website/docs/applications/other/_category_.json new file mode 100644 index 0000000000..8742530b20 --- /dev/null +++ b/website/docs/applications/other/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Other", + "link": { + "type": "generated-index", + "description": "All of the applications with no other home for installation with Ansible-NAS." + } +} diff --git a/docs/applications/bitwarden.md b/website/docs/applications/other/bitwarden.md similarity index 96% rename from docs/applications/bitwarden.md rename to website/docs/applications/other/bitwarden.md index 339e85ce3d..21d22fb067 100644 --- a/docs/applications/bitwarden.md +++ b/website/docs/applications/other/bitwarden.md @@ -1,4 +1,6 @@ -# Bitwarden(_rs) Password Management +--- +title: "Bitwarden(_rs)" +--- Homepage: diff --git a/docs/applications/firefly.md b/website/docs/applications/other/firefly.md similarity index 94% rename from docs/applications/firefly.md rename to website/docs/applications/other/firefly.md index 7b293515f4..19bd8e8f57 100644 --- a/docs/applications/firefly.md +++ b/website/docs/applications/other/firefly.md @@ -1,4 +1,6 @@ -# Firefly III +--- +title: "Firefly III" +--- Homepage: diff --git a/docs/applications/gotify.md b/website/docs/applications/other/gotify.md similarity index 96% rename from docs/applications/gotify.md rename to website/docs/applications/other/gotify.md index a440b5df41..3e2e4267d6 100644 --- a/docs/applications/gotify.md +++ b/website/docs/applications/other/gotify.md @@ -1,4 +1,6 @@ -# Gotify +--- +title: "Gotify" +--- Homepage: diff --git a/docs/applications/guacamole.md b/website/docs/applications/other/guacamole.md similarity index 94% rename from docs/applications/guacamole.md rename to website/docs/applications/other/guacamole.md index 11e022e36d..eb1fa811cb 100644 --- a/docs/applications/guacamole.md +++ b/website/docs/applications/other/guacamole.md @@ -1,4 +1,6 @@ -# Guacamole +--- +title: "Guacamole" +--- Homepage: diff --git a/website/docs/applications/other/hello_world.md b/website/docs/applications/other/hello_world.md new file mode 100644 index 0000000000..383ff74541 --- /dev/null +++ b/website/docs/applications/other/hello_world.md @@ -0,0 +1,17 @@ +--- +title: "Hello World" +--- + +Homepage: + +A few sentences here about what the application does. + +## Usage + +Set `hello_world_enabled: true` in your `inventories//nas.yml` file. + +The Hello World web interface can be found at . + +## Specific Configuration + +Detail any information here about user setup steps once Ansible-NAS has started the application. diff --git a/docs/applications/mealie.md b/website/docs/applications/other/mealie.md similarity index 94% rename from docs/applications/mealie.md rename to website/docs/applications/other/mealie.md index 6e6a1c265a..b001c10f6c 100644 --- a/docs/applications/mealie.md +++ b/website/docs/applications/other/mealie.md @@ -1,4 +1,6 @@ -# Mealie +--- +title: "Mealie" +--- Homepage: diff --git a/docs/applications/nextcloud.md b/website/docs/applications/other/nextcloud.md similarity index 97% rename from docs/applications/nextcloud.md rename to website/docs/applications/other/nextcloud.md index 842839affd..5cc5b062fd 100644 --- a/docs/applications/nextcloud.md +++ b/website/docs/applications/other/nextcloud.md @@ -1,4 +1,6 @@ -# Nextcloud +--- +title: "Nextcloud" +--- Homepage: diff --git a/docs/applications/octoprint.md b/website/docs/applications/other/octoprint.md similarity index 97% rename from docs/applications/octoprint.md rename to website/docs/applications/other/octoprint.md index 7545064582..1d5b8c413e 100644 --- a/docs/applications/octoprint.md +++ b/website/docs/applications/other/octoprint.md @@ -1,5 +1,6 @@ -# Octoprint - +--- +title: "Octoprint" +--- Homepage: Octoprint is a control and monitoring application for your 3D printer. You can start and stop print jobs, view your webcam feed, move the print head and extruder manually and check your gcode files, all from a single web interface. Octoprint doesn't require modifications on the printer firmware, just make sure your NAS is phisically connected to it with a usb cable. diff --git a/docs/applications/paperless_ng.md b/website/docs/applications/other/paperless_ng.md similarity index 96% rename from docs/applications/paperless_ng.md rename to website/docs/applications/other/paperless_ng.md index 5adabc3182..651a01ad9e 100644 --- a/docs/applications/paperless_ng.md +++ b/website/docs/applications/other/paperless_ng.md @@ -1,4 +1,6 @@ -# Paperless-ng +--- +title: "Paperless-ng" +--- Homepage: diff --git a/docs/applications/piwigo.md b/website/docs/applications/other/piwigo.md similarity index 97% rename from docs/applications/piwigo.md rename to website/docs/applications/other/piwigo.md index 276d84acdc..f6760f8df9 100644 --- a/docs/applications/piwigo.md +++ b/website/docs/applications/other/piwigo.md @@ -1,4 +1,6 @@ -# Piwigo - Open Source Photo Gallery +--- +title: "Piwigo" +--- Homepage: [Piwigo.org](https://piwigo.org) diff --git a/docs/applications/thelounge.md b/website/docs/applications/other/thelounge.md similarity index 92% rename from docs/applications/thelounge.md rename to website/docs/applications/other/thelounge.md index fdb3337916..6292a700ae 100644 --- a/docs/applications/thelounge.md +++ b/website/docs/applications/other/thelounge.md @@ -1,4 +1,6 @@ -# The Lounge +--- +title: "The Lounge" +--- Homepage: diff --git a/docs/applications/traefik.md b/website/docs/applications/other/traefik.md similarity index 87% rename from docs/applications/traefik.md rename to website/docs/applications/other/traefik.md index 37c4bf4ceb..439d01aee6 100644 --- a/docs/applications/traefik.md +++ b/website/docs/applications/other/traefik.md @@ -1,4 +1,6 @@ -# Traefik +--- +title: "Traefik" +--- Homepage: @@ -7,7 +9,7 @@ Traefik is a reverse proxy used to provide external access to your Ansible-NAS b You can configure which applications are available externally by enabling the `_available_externally` setting for each application in the Advanced Settings section of your `all.yml`. -See [External Access](../configuration/external_access.md) for more info. +See [External Access](../../getting-started/external-access.md) for more info. ## Usage diff --git a/docs/applications/virtual_desktop.md b/website/docs/applications/other/virtual_desktop.md similarity index 96% rename from docs/applications/virtual_desktop.md rename to website/docs/applications/other/virtual_desktop.md index 0b84170db1..4ff7bec824 100644 --- a/docs/applications/virtual_desktop.md +++ b/website/docs/applications/other/virtual_desktop.md @@ -1,4 +1,6 @@ -# Virtual Desktop +--- +title: "Virtual Desktop" +--- It's possible to run a cut down desktop within a Docker container. We use [RattyDAVE's custom Ubuntu Mate image](https://github.com/RattyDAVE/docker-ubuntu-xrdp-mate-custom). diff --git a/docs/applications/wallabag.md b/website/docs/applications/other/wallabag.md similarity index 96% rename from docs/applications/wallabag.md rename to website/docs/applications/other/wallabag.md index 742b29731f..84bb4b95c0 100644 --- a/docs/applications/wallabag.md +++ b/website/docs/applications/other/wallabag.md @@ -1,4 +1,6 @@ -# wallabag +--- +title: "Wallabag" +--- Homepage: diff --git a/website/docs/applications/system-tools/_category_.json b/website/docs/applications/system-tools/_category_.json new file mode 100644 index 0000000000..1d44644be3 --- /dev/null +++ b/website/docs/applications/system-tools/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "System Tools", + "link": { + "type": "generated-index", + "description": "All of the system tools available for installation with Ansible-NAS." + } +} diff --git a/docs/applications/cloudcmd.md b/website/docs/applications/system-tools/cloudcmd.md similarity index 95% rename from docs/applications/cloudcmd.md rename to website/docs/applications/system-tools/cloudcmd.md index bb86dc38be..15f489d3b4 100644 --- a/docs/applications/cloudcmd.md +++ b/website/docs/applications/system-tools/cloudcmd.md @@ -1,4 +1,6 @@ -# Cloud Commander file manager +--- +title: "Cloud Commander" +--- Homepage: diff --git a/docs/applications/cloudflare_ddns.md b/website/docs/applications/system-tools/cloudflare_ddns.md similarity index 97% rename from docs/applications/cloudflare_ddns.md rename to website/docs/applications/system-tools/cloudflare_ddns.md index 42b3d4682a..300c4a576a 100644 --- a/docs/applications/cloudflare_ddns.md +++ b/website/docs/applications/system-tools/cloudflare_ddns.md @@ -1,4 +1,6 @@ -# Cloudflare Dynamic DNS Updater +--- +title: "Cloudflare DDNS" +--- Homepage: diff --git a/docs/applications/duplicacy.md b/website/docs/applications/system-tools/duplicacy.md similarity index 94% rename from docs/applications/duplicacy.md rename to website/docs/applications/system-tools/duplicacy.md index de4e853f2f..e3233b411f 100644 --- a/docs/applications/duplicacy.md +++ b/website/docs/applications/system-tools/duplicacy.md @@ -1,4 +1,6 @@ -# Duplicacy Cloud Backup +--- +title: "Duplicacy" +--- Homepage: diff --git a/docs/applications/duplicati.md b/website/docs/applications/system-tools/duplicati.md similarity index 92% rename from docs/applications/duplicati.md rename to website/docs/applications/system-tools/duplicati.md index 1a836a1af0..ad3448a8ca 100644 --- a/docs/applications/duplicati.md +++ b/website/docs/applications/system-tools/duplicati.md @@ -1,5 +1,6 @@ - -# Duplicati +--- +title: "Duplicati" +--- Homepage: diff --git a/docs/applications/healthchecks.io.md b/website/docs/applications/system-tools/healthchecks.io.md similarity index 95% rename from docs/applications/healthchecks.io.md rename to website/docs/applications/system-tools/healthchecks.io.md index 3c9db8ebaf..aadbcf9431 100644 --- a/docs/applications/healthchecks.io.md +++ b/website/docs/applications/system-tools/healthchecks.io.md @@ -1,4 +1,6 @@ -# Healthchecks.io +--- +title: "Healthchecks.io" +--- Homepage: diff --git a/docs/applications/krusader.md b/website/docs/applications/system-tools/krusader.md similarity index 93% rename from docs/applications/krusader.md rename to website/docs/applications/system-tools/krusader.md index 0f3c20292f..4c3e147f76 100644 --- a/docs/applications/krusader.md +++ b/website/docs/applications/system-tools/krusader.md @@ -1,5 +1,6 @@ - -# Krusader +--- +title: "Krusader" +--- Homepage: diff --git a/docs/applications/netbootxyz.md b/website/docs/applications/system-tools/netbootxyz.md similarity index 96% rename from docs/applications/netbootxyz.md rename to website/docs/applications/system-tools/netbootxyz.md index e11bb697c1..bca2bd5d25 100644 --- a/docs/applications/netbootxyz.md +++ b/website/docs/applications/system-tools/netbootxyz.md @@ -1,5 +1,6 @@ - -# netboot.xyz +--- +title: "netboot.xyz" +--- Homepage: diff --git a/website/docs/applications/system-tools/portainer.md b/website/docs/applications/system-tools/portainer.md new file mode 100644 index 0000000000..f21ce2d632 --- /dev/null +++ b/website/docs/applications/system-tools/portainer.md @@ -0,0 +1,6 @@ +--- +title: "Portainer" +--- + +# Portainer + diff --git a/docs/applications/route53_ddns.md b/website/docs/applications/system-tools/route53_ddns.md similarity index 97% rename from docs/applications/route53_ddns.md rename to website/docs/applications/system-tools/route53_ddns.md index c0b261d422..4ac4009997 100644 --- a/docs/applications/route53_ddns.md +++ b/website/docs/applications/system-tools/route53_ddns.md @@ -1,4 +1,6 @@ -# AWS Route53 Dynamic DNS Updater +--- +title: "AWS Route53 Dynamic DNS Updater" +--- ddns-route53: diff --git a/docs/applications/syncthing.md b/website/docs/applications/system-tools/syncthing.md similarity index 92% rename from docs/applications/syncthing.md rename to website/docs/applications/system-tools/syncthing.md index 389cb57bec..83e882d0db 100644 --- a/docs/applications/syncthing.md +++ b/website/docs/applications/system-tools/syncthing.md @@ -1,4 +1,6 @@ -# Syncthing: Open Source Continuous File Synchronisation +--- +title: "Syncthing" +--- Homepage: diff --git a/docs/applications/timemachine.md b/website/docs/applications/system-tools/timemachine.md similarity index 98% rename from docs/applications/timemachine.md rename to website/docs/applications/system-tools/timemachine.md index 37c2cbc723..2589ebe87a 100644 --- a/docs/applications/timemachine.md +++ b/website/docs/applications/system-tools/timemachine.md @@ -1,4 +1,6 @@ -# Time Machine +--- +title: "Time Machine" +--- Apple docs: diff --git a/docs/applications/watchtower.md b/website/docs/applications/system-tools/watchtower.md similarity index 96% rename from docs/applications/watchtower.md rename to website/docs/applications/system-tools/watchtower.md index 283bc72ff0..31e1fa2e71 100644 --- a/docs/applications/watchtower.md +++ b/website/docs/applications/system-tools/watchtower.md @@ -1,4 +1,6 @@ -# Watchtower +--- +title: "Watchtower" +--- Homepage: diff --git a/website/docs/contributing/_category_.json b/website/docs/contributing/_category_.json new file mode 100644 index 0000000000..ef5934a03f --- /dev/null +++ b/website/docs/contributing/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Contributing", + "position": 5, + "link": { + "type": "generated-index", + "description": "How to contribute to Ansible-NAS." + } +} diff --git a/website/docs/contributing/add-an-application.md b/website/docs/contributing/add-an-application.md new file mode 100644 index 0000000000..00b7988685 --- /dev/null +++ b/website/docs/contributing/add-an-application.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 2 +--- +# Add An Application + +Adding a new application to Ansible-NAS is easy! First, set up your [development environment](./development-environment.md). + +Then; + +- Start by looking at the `hello_world` role - this includes everything that's expected to be included with a new application. +- Ensure the application includes tests and documentation. Tests should ensure that the application starts and stops correctly. + + diff --git a/website/docs/contributing/development-environment.md b/website/docs/contributing/development-environment.md new file mode 100644 index 0000000000..c39cb11f05 --- /dev/null +++ b/website/docs/contributing/development-environment.md @@ -0,0 +1,25 @@ +--- +sidebar_position: 1 +--- + +# Development Environment + +A little setup is required to ensure that you can develop and test Ansible-NAS contributions. + +## Requirements + +Developing Ansible-NAS features require a few things: + +- Ansible (see [Installing Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html)) +- Python 3 (see [Python Setup and Usage](https://docs.python.org/3/using/index.html)) +- Node (see [Node.js Downloads](https://nodejs.org/en/download/)) + +## Setup + +- Ansible requirements - `ansible-galaxy install -r requirements.yml` +- Python requirements - `pip install -r requirements-dev.txt` +- Node.js requirements - `pushd website && npm install && popd` + +## IDE + +- Development of Ansible-NAS is carried out in Visual Studio Code. \ No newline at end of file diff --git a/website/docs/further-configuration/_category_.json b/website/docs/further-configuration/_category_.json new file mode 100644 index 0000000000..87a82e9d42 --- /dev/null +++ b/website/docs/further-configuration/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Further Configuration", + "position": 4, + "link": { + "type": "generated-index", + "description": "How to contribute to Ansible-NAS." + } +} diff --git a/website/docs/further-configuration/hardware.md b/website/docs/further-configuration/hardware.md new file mode 100644 index 0000000000..47b5e7bfbf --- /dev/null +++ b/website/docs/further-configuration/hardware.md @@ -0,0 +1,21 @@ +# Hardware + +Ansible-NAS will run against any Ubuntu box, a Raspberry Pi 4, or even a VM if you're just testing things out. The hardware you pick for Ansible-NAS depends largely on what you intend to do with your server - and is very much a "how long is a piece of string" type question. + +The [homeserver Reddit](https://www.reddit.com/r/HomeServer/) has lots of good information. + +## Questions To Think About + +1. What will be taxing the CPU(s) on your Ansible-NAS box? Are you intending to transcode video? How many users will be hitting it? + +2. How many applications do you intend to run in parallel? How much memory do these applications require? + +3. Are you going to run the ZFS file system? + +4. What are you intending to store on your Ansible-NAS? Is it data you can download again, or is it important to you that you don't lose it? Do you need mirrored disks? + +## HP Microserver + +Ansible-NAS development is tested against an HP Microserver N54L, with 16GB of memory, a 120GB SSD for the OS and 5x4TB WD Red NAS drives for storage. It works great :-) + +This is obviously not the only solution but a reasonable one if you just want a single box to buy. Many different models are available on eBay at varying prices. diff --git a/website/docs/further-configuration/migrating-from-freenas.md b/website/docs/further-configuration/migrating-from-freenas.md new file mode 100644 index 0000000000..41b11557e8 --- /dev/null +++ b/website/docs/further-configuration/migrating-from-freenas.md @@ -0,0 +1,13 @@ +# Migrating from FreeNAS + +FreeNAS uses ZFS as it's core storage filesystem. [ZFS on Linux](https://zfsonlinux.org/) is supported natively in Ubuntu, so importing FreeNAS zpools is easy. + +Once you have an Ubuntu Server installation up and running: + +1. Ensure you have a working backup of your FreeNAS data. +2. Check that the working backup you think you have actually works. +3. Shut down your Ubuntu Server, connect the disks, start it back up. +4. SSH to the server and run `zpool list` to determine available ZFS pools. +5. `zpool import ` against each of the pools you want to attach. +6. `chown -R root:root /mnt/` to fix the ownership of the data. +7. Update your Ansible-NAS configuration to reflect the paths of the ZFS zpools. You'll likely want to point `docker_home` at your ZFS zpools. diff --git a/docs/configuration/nfs_exports.md b/website/docs/further-configuration/nfs-exports.md similarity index 87% rename from docs/configuration/nfs_exports.md rename to website/docs/further-configuration/nfs-exports.md index 55f59cbe36..2582738294 100644 --- a/docs/configuration/nfs_exports.md +++ b/website/docs/further-configuration/nfs-exports.md @@ -2,8 +2,6 @@ Ansible-NAS uses the awesome [geerlingguy.nfs](https://github.com/geerlingguy/ansible-role-nfs) Ansible role to configure NFS exports. -More info on configuring NFS exports can be found [here](https://help.ubuntu.com/community/SettingUpNFSHowTo#Shares). - ## NFS Examples Ansible-NAS shares are defined in the `nfs_exports` section within `group_vars/all.yml`. The example provided will allow anyone to read the data in `{{ nfs_shares_root }}/public` on your Ansible-NAS box. diff --git a/docs/configuration/samba_shares.md b/website/docs/further-configuration/samba-shares.md similarity index 60% rename from docs/configuration/samba_shares.md rename to website/docs/further-configuration/samba-shares.md index d43d424fc2..5dab268c47 100644 --- a/docs/configuration/samba_shares.md +++ b/website/docs/further-configuration/samba-shares.md @@ -8,4 +8,6 @@ Ansible-NAS shares are defined in the `samba_shares` section within `group_vars/ ## File Permissions -Ansible-NAS creates an `ansible-nas` user and group on your server, which Samba will use to access the data in your shares. New data created will be permissioned correctly. However, if you have existing data this will need to be repermissioned so that Samba can read and serve it. An playbook is provided to do this for you - `permission_data.yml`. It is separated from the main Ansible-NAS playbook due to the time it can take to run with large amounts of data. You should only need to run this once. +Ansible-NAS creates an `ansible-nas` user and group on your server, which Samba will use to access the data in your shares. New data created will be permissioned correctly. + +However, if you have existing data this will need to be repermissioned so that Samba can read and serve it. An playbook is provided to do this for you - `permission_data.yml`. It is separated from the main Ansible-NAS playbook due to the time it can take to run with large amounts of data - you should only need to run this once. diff --git a/website/docs/getting-started/_category_.json b/website/docs/getting-started/_category_.json new file mode 100644 index 0000000000..614a98921b --- /dev/null +++ b/website/docs/getting-started/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Getting Started", + "position": 2, + "link": { + "type": "generated-index", + "description": "A quickstart guide to Ansible-NAS." + } +} diff --git a/website/docs/getting-started/configure-dashboard.md b/website/docs/getting-started/configure-dashboard.md new file mode 100644 index 0000000000..233ad64138 --- /dev/null +++ b/website/docs/getting-started/configure-dashboard.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 3 +--- + +# Configure A Dashboard + +Once you start to enable a few applications, it becomes difficult to remember the addresses of where to find them. + +Ansible-NAS can configure a few different dashboards for your organisational pleasure. Browse the [Dashboards](/docs/category/dashboards) category for options. diff --git a/website/docs/getting-started/enabling-applications.md b/website/docs/getting-started/enabling-applications.md new file mode 100644 index 0000000000..1ec00591cb --- /dev/null +++ b/website/docs/getting-started/enabling-applications.md @@ -0,0 +1,17 @@ +--- +sidebar_position: 2 +--- + +# Enabling Applications + +Ansible-NAS takes advantage of Ansible's [prescendence rules](https://docs.ansible.com/ansible/latest/reference_appendices/general_precedence.html) to enable and disable applications. + +Look through the documentation and find an application you want to install, and set the relevant variable to `true` in your inventory `nas.yml`. Don't edit the source code! + +Run the playbook again, and you're done. + +:::tip + +Every change you make to your configuration will require you to run the playbook against your Ansible-NAS box again. To save time, target a specific application using `ansible-playbook`'s `--tag` switch. + +::: diff --git a/docs/configuration/external_access.md b/website/docs/getting-started/external-access.md similarity index 84% rename from docs/configuration/external_access.md rename to website/docs/getting-started/external-access.md index 21bc49dbc9..d60bb60b3f 100644 --- a/docs/configuration/external_access.md +++ b/website/docs/getting-started/external-access.md @@ -1,23 +1,23 @@ +--- +sidebar_position: 4 +--- + # External Access There are a number of steps required to enable external access to the applications running on your NAS: -- Enable Traefik -- Domain name and DNS configuration -- Router configuration -- Enable specific applications for external access +1. [Domain Name and DNS Configuration](#domain-name-and-dns-configuration) +2. [Enable Traefik](#enable-traefik) +3. [Router Configuration](#router-configuration) +4. [Enable specific applications for external access](#enable-access-to-specific-applications) -## 💀💀💀 Warning! 💀💀💀 +:::danger Enabling access to applications externally **does not** automatically secure them. If you can access an application from within your own network without a username and password, this will also be the case externally. It is your responsibility to ensure that applications you enable external access to are secured appropriately! -## Enable Traefik - -Traefik routes traffic from ports 80 (HTTP) and 443 (HTTPS) on your Ansible-NAS box to the relevant application, based on hostname. - -Simply set `traefik_enabled: true` in your `all.yml`. By default it listens on ports 80 and 443, but doesn't route any traffic. +::: ## Domain Name and DNS Configuration @@ -25,12 +25,18 @@ Set `ansible_nas_domain` to the domain name you want to use for your Ansible-NAS You then need to enable and configure the Cloudflare Dynamic DNS container (`cloudflare_ddns_enabled: true`) so the wildcard DNS entry for your domain name is updated if/when your ISP issues you a new IP address. +## Enable Traefik + +Traefik routes traffic from ports 80 (HTTP) and 443 (HTTPS) on your Ansible-NAS box to the relevant application, based on hostname. + +Simply set `traefik_enabled: true` in your `all.yml`. By default it listens on ports 80 and 443, but doesn't route any traffic. + ## Router Configuration You need to map ports 80 and 443 from your router to your Ansible-NAS box. How to do this is entirely dependent on your router (and out of scope of these docs), but if you're using Ansible-NAS then this should be within your skillset. :) -## Enable Specific Applications +## Enable Access To Specific Applications Every application has a `_available_externally` setting in its `defaults/main.yml`. Setting this to `true` (by overriding it in your nas.yml) will configure Traefik to route `.yourdomain.com` to the application, making it available externally. diff --git a/website/docs/getting-started/installation.md b/website/docs/getting-started/installation.md new file mode 100644 index 0000000000..5ace4e903a --- /dev/null +++ b/website/docs/getting-started/installation.md @@ -0,0 +1,42 @@ +--- +sidebar_position: 1 +--- + +# Installation + +Ansible-NAS is an Ansible playbook that sets up applications of your choice on your home server. + +## Requirements + +- A Linux environment with Ansible installed (in Ansible terms the "control node"). See the official [Installing Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) docs for more info. +- SSH access to an Ubuntu 22.04 server that'll become your Ansible-NAS box. It's recommended to use a fresh Ubutu Server 22.04 installation. Do not use non-LTS releases. + +:::tip + +The control node and your Ansible-NAS box can be the same computer, if you choose. + +::: + +## Running Ansible-NAS + +:::caution + +Before running anything, check out the playbook and understand what it does. ***Do not*** blindly download code from the internet and trust that it's going to work as you expect. + +::: + +1. Clone Ansible-NAS: + + `git clone https://github.com/davestephens/ansible-nas.git && cd ansible-nas` + +2. Create your own inventory and config files by copying `inventories/sample` to your own directory: + + `cp -rfp inventories/sample inventories/my-ansible-nas` + +3. Review `group_vars/all.yml`. Change settings by overriding them in `inventories/my-ansible-nas/group_vars/nas.yml`. + +4. Update `inventories/my-ansible-nas/inventory`. + +5. Install the dependent roles: `ansible-galaxy install -r requirements.yml`. + +6. Run the playbook - `ansible-playbook -i inventories/my-ansible-nas/inventory nas.yml -b -K` diff --git a/website/docs/index.md b/website/docs/index.md new file mode 100644 index 0000000000..00eaab46fb --- /dev/null +++ b/website/docs/index.md @@ -0,0 +1,11 @@ +--- +sidebar_position: 1 +--- + +# Introduction + +After getting burned by broken FreeNAS updates one too many times, I figured I could do a much better job myself using just a stock Ubuntu install, some clever Ansible config and a bunch of Docker containers. Ansible-NAS was born! + +## Getting Started + +Head to the [installation](./getting-started/installation.md) guide to get started. Once you're done, check out how to [enable applications](./getting-started/enabling-applications.md), as well as how to enable [external access](./getting-started/external-access.md) diff --git a/docs/support.md b/website/docs/support.md similarity index 100% rename from docs/support.md rename to website/docs/support.md index 35d4afe9af..7b78ff88e8 100644 --- a/docs/support.md +++ b/website/docs/support.md @@ -2,10 +2,10 @@ Getting support for Ansible-NAS is easy! -## Gitter.im - -Ansible-NAS has its own [Gitter](https://gitter.im/Ansible-NAS/Chat) chat room. `davestephens` hangs out there as well as a few existing users. Come say hi! - ## GitHub Issues Raise an [issue](https://github.com/davestephens/ansible-nas/issues), using the supplied template to provide as much information as possible. + +## Gitter.im + +Ansible-NAS has its own [Gitter](https://gitter.im/Ansible-NAS/Chat) chat room. `davestephens` hangs out there as well as a few existing users. Come say hi! diff --git a/website/docs/upgrading.md b/website/docs/upgrading.md new file mode 100644 index 0000000000..573a287fb5 --- /dev/null +++ b/website/docs/upgrading.md @@ -0,0 +1,19 @@ +# Upgrading + +Upgrading consists of two steps - firstly updating the Ansible-NAS code on your Ansible control node, and then running the playbook against your Ubuntu server. + +Assuming you haven't changed anything except the files in your inventory directory, you can simply run: + +```bash +git pull origin master +``` + +...to pull the latest updates from GitHub. If you've changed files outside of the inventory directory, you'll need to fix any merge conflicts. + +To see the effect of running the latest version of Ansible-NAS against your Ubuntu server, you can run Ansible in check mode first: + +```bash +ansible-playbook -i inventories/my-ansible-nas/inventory nas.yml -b -K -C +``` + +Once you're happy, run as normal. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js new file mode 100644 index 0000000000..9354f780c4 --- /dev/null +++ b/website/docusaurus.config.js @@ -0,0 +1,145 @@ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion + +const lightCodeTheme = require('prism-react-renderer/themes/github'); +const darkCodeTheme = require('prism-react-renderer/themes/dracula'); + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Ansible-NAS', + tagline: 'Easily build a homelab or NAS replacement with an Ubuntu server and some basic hardware', + url: 'https://ansible-nas.io', + baseUrl: '/', + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + favicon: 'img/favicon.ico', + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: 'davestephens', // Usually your GitHub org/user name. + projectName: 'ansible-nas', // Usually your repo name. + trailingSlash: true, + + // Even if you don't use internalization, you can use this field to set useful + // metadata like html lang. For example, if your site is Chinese, you may want + // to replace "en" with "zh-Hans". + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + sidebarPath: require.resolve('./sidebars.js'), + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: + 'https://github.com/davestephens/ansible-nas/tree/master/website', + }, + blog: { + showReadingTime: true, + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: 'Ansible-NAS', + items: [ + { + type: 'doc', + docId: 'index', + position: 'left', + label: 'Docs', + }, + { + type: 'doc', + docId: '/category/getting-started', + position: 'left', + label: 'Getting Started', + }, + { + type: 'doc', + docId: '/category/applications', + position: 'left', + label: 'Applications', + }, + {to: '/blog', label: 'Blog', position: 'left'}, + { + type: 'search', + position: 'right', + }, + { + href: 'https://github.com/davestephens/ansible-nas', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + links: [ + { + title: 'Docs', + items: [ + { + label: 'Getting Started', + to: 'docs/category/getting-started', + }, + { + label: 'Support', + to: 'docs/support', + }, + ], + }, + { + title: 'Community', + items: [ + { + label: 'Gitter.im', + href: 'https://gitter.im/Ansible-NAS/Chat', + }, + ], + }, + { + title: 'More', + items: [ + { + label: 'Blog', + to: '/blog', + }, + { + label: 'GitHub', + href: 'https://github.com/facebook/docusaurus', + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} David Stephens. Site built with Docusaurus.`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + announcementBar: { + id: 'support_us', + content: + 'Enjoying Ansible NAS? Please consider supporting further development by buying me a coffee ☕', + backgroundColor: '#fafbfc', + textColor: '#091E42', + isCloseable: false, + }, + }), +}; + +module.exports = config; diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 0000000000..4c1bab13fe --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,21190 @@ +{ + "name": "ansible-nas", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ansible-nas", + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "yarn": "^1.22.19" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "2.1.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", + "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", + "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "dependencies": { + "@algolia/autocomplete-shared": "1.7.1" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", + "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "dependencies": { + "@algolia/cache-common": "4.14.2" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "dependencies": { + "@algolia/cache-common": "4.14.2" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "dependencies": { + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "dependencies": { + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "dependencies": { + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "dependencies": { + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "dependencies": { + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "node_modules/@algolia/logger-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "dependencies": { + "@algolia/logger-common": "4.14.2" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "dependencies": { + "@algolia/requester-common": "4.14.2" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "dependencies": { + "@algolia/requester-common": "4.14.2" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "dependencies": { + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "dependencies": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "dependencies": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz", + "integrity": "sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA==", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz", + "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "dependencies": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@docsearch/css": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", + "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==" + }, + "node_modules/@docsearch/react": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", + "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.7.1", + "@algolia/autocomplete-preset-algolia": "1.7.1", + "@docsearch/css": "3.2.1", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "dependencies": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^1.12.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "dependencies": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "dependencies": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.42", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "dependencies": { + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "dependencies": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^1.12.3", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "dependencies": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "dependencies": { + "@docusaurus/logger": "2.1.0", + "@svgr/webpack": "^6.2.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "dependencies": { + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz", + "integrity": "sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz", + "integrity": "sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz", + "integrity": "sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz", + "integrity": "sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz", + "integrity": "sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz", + "integrity": "sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz", + "integrity": "sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz", + "integrity": "sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.3.1.tgz", + "integrity": "sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.3.1", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.3.1", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.3.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.3.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.3.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.3.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.3.1", + "@svgr/babel-plugin-transform-svg-component": "^6.3.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.3.1.tgz", + "integrity": "sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA==", + "dependencies": { + "@svgr/plugin-jsx": "^6.3.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.1.tgz", + "integrity": "sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ==", + "dependencies": { + "@babel/types": "^7.18.4", + "entities": "^4.3.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.3.1.tgz", + "integrity": "sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw==", + "dependencies": { + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.3.1", + "@svgr/hast-util-to-babel-ast": "^6.3.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.3.1.tgz", + "integrity": "sha512-yJIjTDKPYqzFVjmsbH5EdIwEsmKxjxdXSGJVLeUgwZOZPAkNQmD1v7LDbOdOKbR44FG8465Du+zWPdbYGnbMbw==", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.3.1.tgz", + "integrity": "sha512-eODxwIUShLxSMaRjzJtrj9wg89D75JLczvWg9SaB5W+OtVTkiC1vdGd8+t+pf5fTlBOy4RRXAq7x1E3DUl3D0A==", + "dependencies": { + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.3.1", + "@svgr/plugin-jsx": "^6.3.1", + "@svgr/plugin-svgo": "^6.3.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "node_modules/@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "node_modules/@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/react": { + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", + "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.3", + "caniuse-lite": "^1.0.30001399", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001402", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", + "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "dependencies": { + "browserslist": "^4.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "dependencies": { + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "dependencies": { + "autoprefixer": "^10.3.7", + "cssnano-preset-default": "^5.2.12", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "dependencies": { + "css-declaration-sorter": "^6.3.0", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flux": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", + "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/immer": { + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", + "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "dependencies": { + "browserslist": "^4.20.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "dependencies": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", + "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.3", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-mdx/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remark-mdx/node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "dependencies": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.2.1.tgz", + "integrity": "sha512-D/uYFWkI/31OrnKmXZqGAGK5GbQRPp/BWA1nuITcc6ICblhhuQUPHS5E2GSCVS7Hwhf4ciq8qsATwBUxv+lI6w==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "dependencies": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/update-notifier/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "node_modules/wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", + "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yarn": { + "version": "1.22.19", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz", + "integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==", + "hasInstallScript": true, + "bin": { + "yarn": "bin/yarn.js", + "yarnpkg": "bin/yarn.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", + "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "requires": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", + "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "requires": { + "@algolia/autocomplete-shared": "1.7.1" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", + "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", + "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "requires": { + "@algolia/cache-common": "4.14.2" + } + }, + "@algolia/cache-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", + "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + }, + "@algolia/cache-in-memory": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", + "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "requires": { + "@algolia/cache-common": "4.14.2" + } + }, + "@algolia/client-account": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", + "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "requires": { + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "@algolia/client-analytics": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", + "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "requires": { + "@algolia/client-common": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "@algolia/client-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", + "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "requires": { + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "@algolia/client-personalization": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", + "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "requires": { + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "@algolia/client-search": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", + "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "requires": { + "@algolia/client-common": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + }, + "@algolia/logger-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", + "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + }, + "@algolia/logger-console": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", + "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "requires": { + "@algolia/logger-common": "4.14.2" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", + "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "requires": { + "@algolia/requester-common": "4.14.2" + } + }, + "@algolia/requester-common": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", + "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + }, + "@algolia/requester-node-http": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", + "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "requires": { + "@algolia/requester-common": "4.14.2" + } + }, + "@algolia/transporter": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", + "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "requires": { + "@algolia/cache-common": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/requester-common": "4.14.2" + } + }, + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz", + "integrity": "sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==" + }, + "@babel/core": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz", + "integrity": "sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/generator": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz", + "integrity": "sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg==", + "requires": { + "@babel/types": "^7.19.0", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz", + "integrity": "sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==", + "requires": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", + "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", + "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", + "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helpers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", + "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz", + "integrity": "sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", + "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", + "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", + "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz", + "integrity": "sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==", + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.18.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", + "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.1.tgz", + "integrity": "sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA==", + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz", + "integrity": "sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-typescript": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", + "requires": { + "@babel/compat-data": "^7.19.1", + "@babel/helper-compilation-targets": "^7.19.1", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.13", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.1.tgz", + "integrity": "sha512-j2vJGnkopRzH+ykJ8h68wrHnEUmtK//E723jjixiAl/PPf6FhqY/vYRcMVlNydRKQjQsTsYEjpx+DZMIvnGk/g==", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz", + "integrity": "sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.1", + "@babel/types": "^7.19.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@docsearch/css": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", + "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==" + }, + "@docsearch/react": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", + "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", + "requires": { + "@algolia/autocomplete-core": "1.7.1", + "@algolia/autocomplete-preset-algolia": "1.7.1", + "@docsearch/css": "3.2.1", + "algoliasearch": "^4.0.0" + } + }, + "@docusaurus/core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", + "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "requires": { + "@babel/core": "^7.18.6", + "@babel/generator": "^7.18.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@babel/runtime": "^7.18.6", + "@babel/runtime-corejs3": "^7.18.6", + "@babel/traverse": "^7.18.8", + "@docusaurus/cssnano-preset": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.2.1", + "autoprefixer": "^10.4.7", + "babel-loader": "^8.2.5", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.0", + "cli-table3": "^0.6.2", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.23.3", + "css-loader": "^6.7.1", + "css-minimizer-webpack-plugin": "^4.0.0", + "cssnano": "^5.1.12", + "del": "^6.1.1", + "detect-port": "^1.3.0", + "escape-html": "^1.0.3", + "eta": "^1.12.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "html-minifier-terser": "^6.1.0", + "html-tags": "^3.2.0", + "html-webpack-plugin": "^5.5.0", + "import-fresh": "^3.3.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.6.1", + "postcss": "^8.4.14", + "postcss-loader": "^7.0.0", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.3", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.3", + "rtl-detect": "^1.0.4", + "semver": "^7.3.7", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.3", + "tslib": "^2.4.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^6.0.1", + "webpack": "^5.73.0", + "webpack-bundle-analyzer": "^4.5.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpackbar": "^5.0.2" + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", + "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "requires": { + "cssnano-preset-advanced": "^5.3.8", + "postcss": "^8.4.14", + "postcss-sort-media-queries": "^4.2.1", + "tslib": "^2.4.0" + } + }, + "@docusaurus/logger": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", + "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "requires": { + "chalk": "^4.1.2", + "tslib": "^2.4.0" + } + }, + "@docusaurus/mdx-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", + "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "requires": { + "@babel/parser": "^7.18.8", + "@babel/traverse": "^7.18.8", + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@mdx-js/mdx": "^1.6.22", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "image-size": "^1.0.1", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.2.0", + "stringify-object": "^3.3.0", + "tslib": "^2.4.0", + "unified": "^9.2.2", + "unist-util-visit": "^2.0.3", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + } + }, + "@docusaurus/module-type-aliases": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", + "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "requires": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", + "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "tslib": "^2.4.0", + "unist-util-visit": "^2.0.3", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", + "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@types/react-router-config": "^5.0.6", + "combine-promises": "^1.1.0", + "fs-extra": "^10.1.0", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", + "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "fs-extra": "^10.1.0", + "tslib": "^2.4.0", + "webpack": "^5.73.0" + } + }, + "@docusaurus/plugin-debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", + "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "fs-extra": "^10.1.0", + "react-json-view": "^1.21.3", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", + "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", + "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-sitemap": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", + "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "fs-extra": "^10.1.0", + "sitemap": "^7.1.1", + "tslib": "^2.4.0" + } + }, + "@docusaurus/preset-classic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", + "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/plugin-debug": "2.1.0", + "@docusaurus/plugin-google-analytics": "2.1.0", + "@docusaurus/plugin-google-gtag": "2.1.0", + "@docusaurus/plugin-sitemap": "2.1.0", + "@docusaurus/theme-classic": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-search-algolia": "2.1.0", + "@docusaurus/types": "2.1.0" + } + }, + "@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "requires": { + "@types/react": "*", + "prop-types": "^15.6.2" + } + }, + "@docusaurus/theme-classic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", + "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", + "requires": { + "@docusaurus/core": "2.1.0", + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/types": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-common": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "copy-text-to-clipboard": "^3.0.1", + "infima": "0.2.0-alpha.42", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.14", + "prism-react-renderer": "^1.3.5", + "prismjs": "^1.28.0", + "react-router-dom": "^5.3.3", + "rtlcss": "^3.5.0", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", + "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", + "requires": { + "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/module-type-aliases": "2.1.0", + "@docusaurus/plugin-content-blog": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/plugin-content-pages": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^1.2.1", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^1.3.5", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", + "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "requires": { + "@docsearch/react": "^3.1.1", + "@docusaurus/core": "2.1.0", + "@docusaurus/logger": "2.1.0", + "@docusaurus/plugin-content-docs": "2.1.0", + "@docusaurus/theme-common": "2.1.0", + "@docusaurus/theme-translations": "2.1.0", + "@docusaurus/utils": "2.1.0", + "@docusaurus/utils-validation": "2.1.0", + "algoliasearch": "^4.13.1", + "algoliasearch-helper": "^3.10.0", + "clsx": "^1.2.1", + "eta": "^1.12.3", + "fs-extra": "^10.1.0", + "lodash": "^4.17.21", + "tslib": "^2.4.0", + "utility-types": "^3.10.0" + } + }, + "@docusaurus/theme-translations": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", + "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "requires": { + "fs-extra": "^10.1.0", + "tslib": "^2.4.0" + } + }, + "@docusaurus/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", + "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.6.0", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.73.0", + "webpack-merge": "^5.8.0" + } + }, + "@docusaurus/utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "requires": { + "@docusaurus/logger": "2.1.0", + "@svgr/webpack": "^6.2.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.1.0", + "github-slugger": "^1.4.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.4.0", + "url-loader": "^4.1.1", + "webpack": "^5.73.0" + } + }, + "@docusaurus/utils-common": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", + "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@docusaurus/utils-validation": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", + "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "requires": { + "@docusaurus/logger": "2.1.0", + "@docusaurus/utils": "2.1.0", + "joi": "^17.6.0", + "js-yaml": "^4.1.0", + "tslib": "^2.4.0" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "requires": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.3.1.tgz", + "integrity": "sha512-jDBKArXYO1u0B1dmd2Nf8Oy6aTF5vLDfLoO9Oon/GLkqZ/NiggYWZA+a2HpUMH4ITwNqS3z43k8LWApB8S583w==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.3.1.tgz", + "integrity": "sha512-dQzyJ4prwjcFd929T43Z8vSYiTlTu8eafV40Z2gO7zy/SV5GT+ogxRJRBIKWomPBOiaVXFg3jY4S5hyEN3IBjQ==", + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.3.1.tgz", + "integrity": "sha512-HBOUc1XwSU67fU26V5Sfb8MQsT0HvUyxru7d0oBJ4rA2s4HW3PhyAPC7fV/mdsSGpAvOdd8Wpvkjsr0fWPUO7A==", + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.3.1.tgz", + "integrity": "sha512-C12e6aN4BXAolRrI601gPn5MDFCRHO7C4TM8Kks+rDtl8eEq+NN1sak0eAzJu363x3TmHXdZn7+Efd2nr9I5dA==", + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.3.1.tgz", + "integrity": "sha512-6NU55Mmh3M5u2CfCCt6TX29/pPneutrkJnnDCHbKZnjukZmmgUAZLtZ2g6ZoSPdarowaQmAiBRgAHqHmG0vuqA==", + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.3.1.tgz", + "integrity": "sha512-HV1NGHYTTe1vCNKlBgq/gKuCSfaRlKcHIADn7P8w8U3Zvujdw1rmusutghJ1pZJV7pDt3Gt8ws+SVrqHnBO/Qw==", + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.3.1.tgz", + "integrity": "sha512-2wZhSHvTolFNeKDAN/ZmIeSz2O9JSw72XD+o2bNp2QAaWqa8KGpn5Yk5WHso6xqfSAiRzAE+GXlsrBO4UP9LLw==", + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.3.1.tgz", + "integrity": "sha512-cZ8Tr6ZAWNUFfDeCKn/pGi976iWSkS8ijmEYKosP+6ktdZ7lW9HVLHojyusPw3w0j8PI4VBeWAXAmi/2G7owxw==", + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.3.1.tgz", + "integrity": "sha512-tQtWtzuMMQ3opH7je+MpwfuRA1Hf3cKdSgTtAYwOBDfmhabP7rcTfBi3E7V3MuwJNy/Y02/7/RutvwS1W4Qv9g==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.3.1", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.3.1", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.3.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.3.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.3.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.3.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.3.1", + "@svgr/babel-plugin-transform-svg-component": "^6.3.1" + } + }, + "@svgr/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.3.1.tgz", + "integrity": "sha512-Sm3/7OdXbQreemf9aO25keerZSbnKMpGEfmH90EyYpj1e8wMD4TuwJIb3THDSgRMWk1kYJfSRulELBy4gVgZUA==", + "requires": { + "@svgr/plugin-jsx": "^6.3.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.3.1.tgz", + "integrity": "sha512-NgyCbiTQIwe3wHe/VWOUjyxmpUmsrBjdoIxKpXt3Nqc3TN30BpJG22OxBvVzsAh9jqep0w0/h8Ywvdk3D9niNQ==", + "requires": { + "@babel/types": "^7.18.4", + "entities": "^4.3.0" + } + }, + "@svgr/plugin-jsx": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.3.1.tgz", + "integrity": "sha512-r9+0mYG3hD4nNtUgsTXWGYJomv/bNd7kC16zvsM70I/bGeoCi/3lhTmYqeN6ChWX317OtQCSZZbH4wq9WwoXbw==", + "requires": { + "@babel/core": "^7.18.5", + "@svgr/babel-preset": "^6.3.1", + "@svgr/hast-util-to-babel-ast": "^6.3.1", + "svg-parser": "^2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.3.1.tgz", + "integrity": "sha512-yJIjTDKPYqzFVjmsbH5EdIwEsmKxjxdXSGJVLeUgwZOZPAkNQmD1v7LDbOdOKbR44FG8465Du+zWPdbYGnbMbw==", + "requires": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + } + }, + "@svgr/webpack": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.3.1.tgz", + "integrity": "sha512-eODxwIUShLxSMaRjzJtrj9wg89D75JLczvWg9SaB5W+OtVTkiC1vdGd8+t+pf5fTlBOy4RRXAq7x1E3DUl3D0A==", + "requires": { + "@babel/core": "^7.18.5", + "@babel/plugin-transform-react-constant-elements": "^7.17.12", + "@babel/preset-env": "^7.18.2", + "@babel/preset-react": "^7.17.12", + "@babel/preset-typescript": "^7.17.12", + "@svgr/core": "^6.3.1", + "@svgr/plugin-jsx": "^6.3.1", + "@svgr/plugin-svgo": "^6.3.1" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + }, + "@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/react": { + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-router": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.19.tgz", + "integrity": "sha512-Fv/5kb2STAEMT3wHzdKQK2z8xKq38EDIGVrutYLmQVVLe+4orDFquU52hQrULnEHinMKv9FSA6lf9+uNT1ITtA==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "@types/react-router-config": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", + "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "requires": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "@types/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", + "requires": { + "@types/node": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "requires": { + "@types/node": "*" + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } + } + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "address": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.1.tgz", + "integrity": "sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "algoliasearch": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", + "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", + "requires": { + "@algolia/cache-browser-local-storage": "4.14.2", + "@algolia/cache-common": "4.14.2", + "@algolia/cache-in-memory": "4.14.2", + "@algolia/client-account": "4.14.2", + "@algolia/client-analytics": "4.14.2", + "@algolia/client-common": "4.14.2", + "@algolia/client-personalization": "4.14.2", + "@algolia/client-search": "4.14.2", + "@algolia/logger-common": "4.14.2", + "@algolia/logger-console": "4.14.2", + "@algolia/requester-browser-xhr": "4.14.2", + "@algolia/requester-common": "4.14.2", + "@algolia/requester-node-http": "4.14.2", + "@algolia/transporter": "4.14.2" + } + }, + "algoliasearch-helper": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", + "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "requires": { + "@algolia/events": "^4.0.1" + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "autoprefixer": { + "version": "10.4.11", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", + "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", + "requires": { + "browserslist": "^4.21.3", + "caniuse-lite": "^1.0.30001399", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "requires": { + "follow-redirects": "^1.14.7" + } + }, + "babel-loader": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001402", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", + "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==" + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "clean-css": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", + "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + } + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==" + } + } + }, + "core-js": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.1.tgz", + "integrity": "sha512-sr0FY4lnO1hkQ4gLDr24K0DGnweGO1QwSj5BpfQjpSJPdqWalja4cTps29Y/PJVG/P7FYlPDkH3hO+Tr0CvDgQ==" + }, + "core-js-compat": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz", + "integrity": "sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw==", + "requires": { + "browserslist": "^4.21.3" + } + }, + "core-js-pure": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.1.tgz", + "integrity": "sha512-7Fr74bliUDdeJCBMxkkIuQ4xfxn/SwrVg+HkJUAoNEXVqYLv55l6Af0dJ5Lq2YBUW9yKqSkLXaS5SYPK6MGa/A==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "requires": {} + }, + "css-loader": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", + "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.7", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.5" + } + }, + "css-minimizer-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-Zd+yz4nta4GXi3pMqF6skO8kjzuCUbr62z8SLMGZZtxWxTGTLopOiabPGNDEyjHCRhnhdA1EfHmqLa2Oekjtng==", + "requires": { + "cssnano": "^5.1.8", + "jest-worker": "^27.5.1", + "postcss": "^8.4.13", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", + "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "requires": { + "cssnano-preset-default": "^5.2.12", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-advanced": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", + "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "requires": { + "autoprefixer": "^10.3.7", + "cssnano-preset-default": "^5.2.12", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + } + }, + "cssnano-preset-default": { + "version": "5.2.12", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", + "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "requires": { + "css-declaration-sorter": "^6.3.0", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.2", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.6", + "postcss-merge-rules": "^5.1.2", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.3", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "requires": { + "execa": "^5.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + }, + "dependencies": { + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + } + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.254", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", + "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "requires": { + "@types/node": "*", + "require-like": ">= 0.1.1" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + } + } + }, + "express": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "requires": { + "punycode": "^1.3.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", + "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "requires": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.30" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flux": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", + "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.1" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "fork-ts-checker-webpack-plugin": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", + "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "requires": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + } + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } + } + }, + "html-tags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", + "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" + } + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "image-size": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", + "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "requires": { + "queue": "6.0.2" + } + }, + "immer": { + "version": "9.0.15", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz", + "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "infima": { + "version": "0.2.0-alpha.42", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", + "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.6.0.tgz", + "integrity": "sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memfs": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", + "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "parse5": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + } + } + }, + "postcss": { + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", + "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "requires": { + "browserslist": "^4.20.3", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "requires": {} + }, + "postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-loader": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", + "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.7" + } + }, + "postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-merge-longhand": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", + "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.0" + } + }, + "postcss-merge-rules": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", + "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", + "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "requires": { + "browserslist": "^4.16.6", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", + "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "requires": { + "browserslist": "^4.16.6", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", + "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", + "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "requires": { + "sort-css-media-queries": "2.1.0" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "requires": {} + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "requires": {} + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "requires": { + "inherits": "~2.0.3" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "requires": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "requires": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-loadable": { + "version": "npm:@docusaurus/react-loadable@5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "requires": { + "@types/react": "*", + "prop-types": "^15.6.2" + } + }, + "react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "requires": { + "@babel/runtime": "^7.10.3" + } + }, + "react-router": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz", + "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.3", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-textarea-autosize": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpu-core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", + "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==" + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + }, + "remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + } + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "rtlcss": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", + "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "requires": { + "find-up": "^5.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.3.11", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==" + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "requires": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.2.1.tgz", + "integrity": "sha512-D/uYFWkI/31OrnKmXZqGAGK5GbQRPp/BWA1nuITcc6ICblhhuQUPHS5E2GSCVS7Hwhf4ciq8qsATwBUxv+lI6w==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", + "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "requires": { + "browserslist": "^4.16.6", + "postcss-selector-parser": "^6.0.4" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "tiny-invariant": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", + "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + } + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "peer": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" + }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "requires": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", + "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "requires": { + "string-width": "^5.0.1" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + }, + "wrap-ansi": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", + "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.1.tgz", + "integrity": "sha512-qDOv24WjnYuL+wbwHdlsYZFy+cgPtrYw0Tn7GLORicQp9BkQLzrgI3Pm4VyR9ERZ41YTn7KlMPuL1n05WdZvmg==" + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yarn": { + "version": "1.22.19", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.19.tgz", + "integrity": "sha512-/0V5q0WbslqnwP91tirOvldvYISzaqhClxzyUKXYxs07yUILIs5jx/k6CFe8bvKSkds5w+eiOqta39Wk3WxdcQ==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 0000000000..c730d1fb7c --- /dev/null +++ b/website/package.json @@ -0,0 +1,44 @@ +{ + "name": "ansible-nas", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "2.1.0", + "@docusaurus/preset-classic": "2.1.0", + "@mdx-js/react": "^1.6.22", + "clsx": "^1.2.1", + "prism-react-renderer": "^1.3.5", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "yarn": "^1.22.19" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "2.1.0" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=16.14" + } +} diff --git a/website/sidebars.js b/website/sidebars.js new file mode 100644 index 0000000000..9ab54c2459 --- /dev/null +++ b/website/sidebars.js @@ -0,0 +1,33 @@ +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + /* + tutorialSidebar: [ + 'intro', + 'hello', + { + type: 'category', + label: 'Tutorial', + items: ['tutorial-basics/create-a-document'], + }, + ], + */ +}; + +module.exports = sidebars; diff --git a/website/src/components/HomepageFeatures/index.js b/website/src/components/HomepageFeatures/index.js new file mode 100644 index 0000000000..577bf9577d --- /dev/null +++ b/website/src/components/HomepageFeatures/index.js @@ -0,0 +1,61 @@ +import React from 'react'; +import clsx from 'clsx'; +import styles from './styles.module.css'; + +const FeatureList = [ + { + title: 'Over Fifty Applications', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Easily install over fifty different applications onto your home server. + + ), + }, + { + title: 'Easily Extensible', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Simple to extend with more applications by adding a new Ansible role. + + ), + }, + { + title: 'Powered by Ansible', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Built from scratch with Ansible. + + ), + }, +]; + +function Feature({Svg, title, description}) { + return ( +
+
+ +
+
+

{title}

+

{description}

+
+
+ ); +} + +export default function HomepageFeatures() { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/website/src/components/HomepageFeatures/styles.module.css b/website/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000000..b248eb2e5d --- /dev/null +++ b/website/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/website/src/css/custom.css b/website/src/css/custom.css new file mode 100644 index 0000000000..2bc6a4cfde --- /dev/null +++ b/website/src/css/custom.css @@ -0,0 +1,30 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #2e8555; + --ifm-color-primary-dark: #29784c; + --ifm-color-primary-darker: #277148; + --ifm-color-primary-darkest: #205d3b; + --ifm-color-primary-light: #33925d; + --ifm-color-primary-lighter: #359962; + --ifm-color-primary-lightest: #3cad6e; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #25c2a0; + --ifm-color-primary-dark: #21af90; + --ifm-color-primary-darker: #1fa588; + --ifm-color-primary-darkest: #1a8870; + --ifm-color-primary-light: #29d5b0; + --ifm-color-primary-lighter: #32d8b4; + --ifm-color-primary-lightest: #4fddbf; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); +} diff --git a/website/src/pages/index.js b/website/src/pages/index.js new file mode 100644 index 0000000000..3222b26e24 --- /dev/null +++ b/website/src/pages/index.js @@ -0,0 +1,34 @@ +import React from 'react'; +import clsx from 'clsx'; +import Link from '@docusaurus/Link'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import HomepageFeatures from '@site/src/components/HomepageFeatures'; + +import styles from './index.module.css'; + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + return ( +
+
+

{siteConfig.title}

+

{siteConfig.tagline}

+
+
+ ); +} + +export default function Home() { + const {siteConfig} = useDocusaurusContext(); + return ( + + +
+ +
+
+ ); +} diff --git a/website/src/pages/index.module.css b/website/src/pages/index.module.css new file mode 100644 index 0000000000..9f71a5da77 --- /dev/null +++ b/website/src/pages/index.module.css @@ -0,0 +1,23 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} diff --git a/website/static/.nojekyll b/website/static/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/website/static/CNAME b/website/static/CNAME new file mode 100644 index 0000000000..5e1380ca9f --- /dev/null +++ b/website/static/CNAME @@ -0,0 +1 @@ +ansible-nas.io \ No newline at end of file diff --git a/website/static/img/docusaurus.png b/website/static/img/docusaurus.png new file mode 100644 index 0000000000000000000000000000000000000000..f458149e3c8f53335f28fbc162ae67f55575c881 GIT binary patch literal 5142 zcma)=cTf{R(}xj7f`AaDml%oxrAm_`5IRVc-jPtHML-0kDIiip57LWD@4bW~(nB|) z34|^sbOZqj<;8ct`Tl-)=Jw`pZtiw=e$UR_Mn2b8rM$y@hlq%XQe90+?|Mf68-Ux_ zzTBiDn~3P%oVt>{f$z+YC7A)8ak`PktoIXDkpXod+*gQW4fxTWh!EyR9`L|fi4YlH z{IyM;2-~t3s~J-KF~r-Z)FWquQCfG*TQy6w*9#k2zUWV-+tCNvjrtl9(o}V>-)N!) ziZgEgV>EG+b(j@ex!dx5@@nGZim*UfFe<+e;(xL|j-Pxg(PCsTL~f^br)4{n5?OU@ z*pjt{4tG{qBcDSa3;yKlopENd6Yth=+h9)*lkjQ0NwgOOP+5Xf?SEh$x6@l@ZoHoYGc5~d2>pO43s3R|*yZw9yX^kEyUV2Zw1%J4o`X!BX>CwJ zI8rh1-NLH^x1LnaPGki_t#4PEz$ad+hO^$MZ2 ziwt&AR}7_yq-9Pfn}k3`k~dKCbOsHjvWjnLsP1{)rzE8ERxayy?~{Qz zHneZ2gWT3P|H)fmp>vA78a{0&2kk3H1j|n59y{z@$?jmk9yptqCO%* zD2!3GHNEgPX=&Ibw?oU1>RSxw3;hhbOV77-BiL%qQb1(4J|k=Y{dani#g>=Mr?Uyd z)1v~ZXO_LT-*RcG%;i|Wy)MvnBrshlQoPxoO*82pKnFSGNKWrb?$S$4x+24tUdpb= zr$c3K25wQNUku5VG@A=`$K7%?N*K+NUJ(%%)m0Vhwis*iokN#atyu(BbK?+J+=H z!kaHkFGk+qz`uVgAc600d#i}WSs|mtlkuwPvFp) z1{Z%nt|NwDEKj1(dhQ}GRvIj4W?ipD76jZI!PGjd&~AXwLK*98QMwN&+dQN1ML(6< z@+{1`=aIc z9Buqm97vy3RML|NsM@A>Nw2=sY_3Ckk|s;tdn>rf-@Ke1m!%F(9(3>V%L?w#O&>yn z(*VIm;%bgezYB;xRq4?rY})aTRm>+RL&*%2-B%m; zLtxLTBS=G!bC$q;FQ|K3{nrj1fUp`43Qs&V!b%rTVfxlDGsIt3}n4p;1%Llj5ePpI^R} zl$Jhx@E}aetLO!;q+JH@hmelqg-f}8U=XnQ+~$9RHGUDOoR*fR{io*)KtYig%OR|08ygwX%UqtW81b@z0*`csGluzh_lBP=ls#1bwW4^BTl)hd|IIfa zhg|*M%$yt@AP{JD8y!7kCtTmu{`YWw7T1}Xlr;YJTU1mOdaAMD172T8Mw#UaJa1>V zQ6CD0wy9NEwUsor-+y)yc|Vv|H^WENyoa^fWWX zwJz@xTHtfdhF5>*T70(VFGX#8DU<^Z4Gez7vn&4E<1=rdNb_pj@0?Qz?}k;I6qz@| zYdWfcA4tmI@bL5JcXuoOWp?ROVe*&o-T!><4Ie9@ypDc!^X&41u(dFc$K$;Tv$c*o zT1#8mGWI8xj|Hq+)#h5JToW#jXJ73cpG-UE^tsRf4gKw>&%Z9A>q8eFGC zG@Iv(?40^HFuC_-%@u`HLx@*ReU5KC9NZ)bkS|ZWVy|_{BOnlK)(Gc+eYiFpMX>!# zG08xle)tntYZ9b!J8|4H&jaV3oO(-iFqB=d}hGKk0 z%j)johTZhTBE|B-xdinS&8MD=XE2ktMUX8z#eaqyU?jL~PXEKv!^) zeJ~h#R{@O93#A4KC`8@k8N$T3H8EV^E2 z+FWxb6opZnX-av5ojt@`l3TvSZtYLQqjps{v;ig5fDo^}{VP=L0|uiRB@4ww$Eh!CC;75L%7|4}xN+E)3K&^qwJizphcnn=#f<&Np$`Ny%S)1*YJ`#@b_n4q zi%3iZw8(I)Dzp0yY}&?<-`CzYM5Rp+@AZg?cn00DGhf=4|dBF8BO~2`M_My>pGtJwNt4OuQm+dkEVP4 z_f*)ZaG6@t4-!}fViGNd%E|2%ylnzr#x@C!CrZSitkHQ}?_;BKAIk|uW4Zv?_npjk z*f)ztC$Cj6O<_{K=dPwO)Z{I=o9z*lp?~wmeTTP^DMP*=<-CS z2FjPA5KC!wh2A)UzD-^v95}^^tT<4DG17#wa^C^Q`@f@=jLL_c3y8@>vXDJd6~KP( zurtqU1^(rnc=f5s($#IxlkpnU=ATr0jW`)TBlF5$sEwHLR_5VPTGiO?rSW9*ND`bYN*OX&?=>!@61{Z4)@E;VI9 zvz%NmR*tl>p-`xSPx$}4YcdRc{_9k)>4Jh&*TSISYu+Y!so!0JaFENVY3l1n*Fe3_ zRyPJ(CaQ-cNP^!3u-X6j&W5|vC1KU!-*8qCcT_rQN^&yqJ{C(T*`(!A=))=n%*-zp_ewRvYQoJBS7b~ zQlpFPqZXKCXUY3RT{%UFB`I-nJcW0M>1^*+v)AxD13~5#kfSkpWys^#*hu)tcd|VW zEbVTi`dbaM&U485c)8QG#2I#E#h)4Dz8zy8CLaq^W#kXdo0LH=ALhK{m_8N@Bj=Um zTmQOO*ID(;Xm}0kk`5nCInvbW9rs0pEw>zlO`ZzIGkB7e1Afs9<0Z(uS2g*BUMhp> z?XdMh^k}k<72>}p`Gxal3y7-QX&L{&Gf6-TKsE35Pv%1 z;bJcxPO+A9rPGsUs=rX(9^vydg2q`rU~otOJ37zb{Z{|)bAS!v3PQ5?l$+LkpGNJq zzXDLcS$vMy|9sIidXq$NE6A-^v@)Gs_x_3wYxF%y*_e{B6FvN-enGst&nq0z8Hl0< z*p6ZXC*su`M{y|Fv(Vih_F|83=)A6ay-v_&ph1Fqqcro{oeu99Y0*FVvRFmbFa@gs zJ*g%Gik{Sb+_zNNf?Qy7PTf@S*dTGt#O%a9WN1KVNj`q$1Qoiwd|y&_v?}bR#>fdP zSlMy2#KzRq4%?ywXh1w;U&=gKH%L~*m-l%D4Cl?*riF2~r*}ic9_{JYMAwcczTE`!Z z^KfriRf|_YcQ4b8NKi?9N7<4;PvvQQ}*4YxemKK3U-7i}ap8{T7=7`e>PN7BG-Ej;Uti2$o=4T#VPb zm1kISgGzj*b?Q^MSiLxj26ypcLY#RmTPp+1>9zDth7O?w9)onA%xqpXoKA-`Jh8cZ zGE(7763S3qHTKNOtXAUA$H;uhGv75UuBkyyD;eZxzIn6;Ye7JpRQ{-6>)ioiXj4Mr zUzfB1KxvI{ZsNj&UA`+|)~n}96q%_xKV~rs?k=#*r*7%Xs^Hm*0~x>VhuOJh<2tcb zKbO9e-w3zbekha5!N@JhQm7;_X+J!|P?WhssrMv5fnQh$v*986uWGGtS}^szWaJ*W z6fLVt?OpPMD+-_(3x8Ra^sX~PT1t5S6bfk@Jb~f-V)jHRul#Hqu;0(+ER7Z(Z4MTR z+iG>bu+BW2SNh|RAGR2-mN5D1sTcb-rLTha*@1@>P~u;|#2N{^AC1hxMQ|(sp3gTa zDO-E8Yn@S7u=a?iZ!&&Qf2KKKk7IT`HjO`U*j1~Df9Uxz$~@otSCK;)lbLSmBuIj% zPl&YEoRwsk$8~Az>>djrdtp`PX z`Pu#IITS7lw07vx>YE<4pQ!&Z^7L?{Uox`CJnGjYLh1XN^tt#zY*0}tA*a=V)rf=&-kLgD|;t1D|ORVY}8 F{0H{b<4^zq literal 0 HcmV?d00001 diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c01d54bcd39a5f853428f3cd5aa0f383d963c484 GIT binary patch literal 3626 zcmb`Je@s(X6vrR`EK3%b%orErlDW({vnABqA zcfaS{d+xbU5JKp0*;0YOg+;Fl!eT)XRuapIwFLL`=imZCSon$`se`_<%@MB=M~KG+ z=EW^FL`w|Bo>*ktlaS^(fut!95`iG5u=SZ8nfDHO#GaTlH1-XG^;vsjUb^gWTVz0+ z^=WR1wv9-2oeR=_;fL0H7rNWqAzGtO(D;`~cX(RcN0w2v24Y8)6t`cS^_ghs`_ho? z{0ka~1Dgo8TfAP$r*ua?>$_V+kZ!-(TvEJ7O2f;Y#tezt$&R4 zLI}=-y@Z!grf*h3>}DUL{km4R>ya_I5Ag#{h_&?+HpKS!;$x3LC#CqUQ8&nM?X))Q zXAy2?`YL4FbC5CgJu(M&Q|>1st8XXLZ|5MgwgjP$m_2Vt0(J z&Gu7bOlkbGzGm2sh?X`){7w69Y$1#@P@7DF{ZE=4%T0NDS)iH`tiPSKpDNW)zmtn( zw;4$f>k)4$LBc>eBAaTZeCM2(iD+sHlj!qd z2GjRJ>f_Qes(+mnzdA^NH?^NB(^o-%Gmg$c8MNMq&`vm@9Ut;*&$xSD)PKH{wBCEC z4P9%NQ;n2s59ffMn8*5)5AAg4-93gBXBDX`A7S& zH-|%S3Wd%T79fk-e&l`{!?lve8_epXhE{d3Hn$Cg!t=-4D(t$cK~7f&4s?t7wr3ZP z*!SRQ-+tr|e1|hbc__J`k3S!rMy<0PHy&R`v#aJv?`Y?2{avK5sQz%=Us()jcNuZV z*$>auD4cEw>;t`+m>h?f?%VFJZj8D|Y1e_SjxG%J4{-AkFtT2+ZZS5UScS~%;dp!V>)7zi`w(xwSd*FS;Lml=f6hn#jq)2is4nkp+aTrV?)F6N z>DY#SU0IZ;*?Hu%tSj4edd~kYNHMFvS&5}#3-M;mBCOCZL3&;2obdG?qZ>rD|zC|Lu|sny76pn2xl|6sk~Hs{X9{8iBW zwiwgQt+@hi`FYMEhX2 \ No newline at end of file diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/website/static/img/undraw_docusaurus_mountain.svg new file mode 100644 index 0000000000..af961c49a8 --- /dev/null +++ b/website/static/img/undraw_docusaurus_mountain.svg @@ -0,0 +1,171 @@ + + Easy to Use + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_react.svg b/website/static/img/undraw_docusaurus_react.svg new file mode 100644 index 0000000000..94b5cf08f8 --- /dev/null +++ b/website/static/img/undraw_docusaurus_react.svg @@ -0,0 +1,170 @@ + + Powered by React + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/website/static/img/undraw_docusaurus_tree.svg b/website/static/img/undraw_docusaurus_tree.svg new file mode 100644 index 0000000000..d9161d3392 --- /dev/null +++ b/website/static/img/undraw_docusaurus_tree.svg @@ -0,0 +1,40 @@ + + Focus on What Matters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a2d895d00b64ee59c2c3da92008ec1d93b6a0abe Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 20 Sep 2022 23:39:59 +0100 Subject: [PATCH 047/286] Update docs deploy workflow --- .github/workflows/docs-deploy.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 002167b89d..bf73ec875d 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -7,9 +7,21 @@ on: - master jobs: + lint: + name: Lint Docs + runs-on: ubuntu-latest + steps: + - name: Lint docs + uses: articulate/actions-markdownlint@v1 + with: + version: 0.32.2 + deploy: name: Deploy to GitHub Pages runs-on: ubuntu-latest + defaults: + run: + working-directory: website steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 @@ -30,4 +42,4 @@ jobs: with: github_token: ${{ secrets.GITHUB_TOKEN }} # Build output to publish to the `gh-pages` branch: - publish_dir: ./build + publish_dir: ./website/build From efdcbdf81b75309e305bcc1fe5a6ff216fa07cd5 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 20 Sep 2022 23:54:44 +0100 Subject: [PATCH 048/286] Fix npm cache package-lock.json path --- .github/workflows/docs-deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index bf73ec875d..69195fb7f9 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -24,10 +24,12 @@ jobs: working-directory: website steps: - uses: actions/checkout@v2 + - uses: actions/setup-node@v3 with: node-version: 18 cache: npm + cache-dependency-path: website/package-lock.json - name: Install dependencies run: npm ci @@ -35,8 +37,6 @@ jobs: - name: Build website run: npm run build - # Popular action to deploy to GitHub Pages: - # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: From 33ae89c189acfdd66f19ce0d9ae397e3b03998ff Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 21 Sep 2022 23:39:19 +0100 Subject: [PATCH 049/286] Doc linting --- website/README.md | 41 ------------------- website/blog/2022-09-19-welcome/index.md | 2 - .../applications/system-tools/portainer.md | 7 +++- .../docs/contributing/add-an-application.md | 2 - .../contributing/development-environment.md | 2 +- .../migrating-from-freenas.md | 2 +- 6 files changed, 8 insertions(+), 48 deletions(-) delete mode 100644 website/README.md diff --git a/website/README.md b/website/README.md deleted file mode 100644 index aaba2fa1e1..0000000000 --- a/website/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Website - -This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/blog/2022-09-19-welcome/index.md b/website/blog/2022-09-19-welcome/index.md index 455771dfa4..ded52a7e02 100644 --- a/website/blog/2022-09-19-welcome/index.md +++ b/website/blog/2022-09-19-welcome/index.md @@ -6,5 +6,3 @@ tags: [ansible-nas, website] --- It's about time Ansible-NAS had a proper website and domain name. This new [Docusaurus](https://docusaurus.io) based site is moving closer to that goal, served from via Github Pages. - - diff --git a/website/docs/applications/system-tools/portainer.md b/website/docs/applications/system-tools/portainer.md index f21ce2d632..78c727e62f 100644 --- a/website/docs/applications/system-tools/portainer.md +++ b/website/docs/applications/system-tools/portainer.md @@ -2,5 +2,10 @@ title: "Portainer" --- -# Portainer +Homepage: +## Usage + +Set `portainer_enabled: true` in your `inventories//nas.yml` file. + +The Portainer web interface can be found at . diff --git a/website/docs/contributing/add-an-application.md b/website/docs/contributing/add-an-application.md index 00b7988685..3bf3fa8547 100644 --- a/website/docs/contributing/add-an-application.md +++ b/website/docs/contributing/add-an-application.md @@ -9,5 +9,3 @@ Then; - Start by looking at the `hello_world` role - this includes everything that's expected to be included with a new application. - Ensure the application includes tests and documentation. Tests should ensure that the application starts and stops correctly. - - diff --git a/website/docs/contributing/development-environment.md b/website/docs/contributing/development-environment.md index c39cb11f05..7fb9514755 100644 --- a/website/docs/contributing/development-environment.md +++ b/website/docs/contributing/development-environment.md @@ -22,4 +22,4 @@ Developing Ansible-NAS features require a few things: ## IDE -- Development of Ansible-NAS is carried out in Visual Studio Code. \ No newline at end of file +- Development of Ansible-NAS is carried out in Visual Studio Code. diff --git a/website/docs/further-configuration/migrating-from-freenas.md b/website/docs/further-configuration/migrating-from-freenas.md index 41b11557e8..032bde266b 100644 --- a/website/docs/further-configuration/migrating-from-freenas.md +++ b/website/docs/further-configuration/migrating-from-freenas.md @@ -10,4 +10,4 @@ Once you have an Ubuntu Server installation up and running: 4. SSH to the server and run `zpool list` to determine available ZFS pools. 5. `zpool import ` against each of the pools you want to attach. 6. `chown -R root:root /mnt/` to fix the ownership of the data. -7. Update your Ansible-NAS configuration to reflect the paths of the ZFS zpools. You'll likely want to point `docker_home` at your ZFS zpools. +7. Update your Ansible-NAS configuration to reflect the paths of the ZFS zpools. You'll likely want to point `docker_home` at your ZFS zpools. From 3b18fc4c8f04c438145df1e78925b94aeb67904a Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 21 Sep 2022 23:57:05 +0100 Subject: [PATCH 050/286] Fix docs build --- .github/workflows/docs-deploy.yml | 1 + .github/workflows/docs-test.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml index 69195fb7f9..c0b9f21063 100644 --- a/.github/workflows/docs-deploy.yml +++ b/.github/workflows/docs-deploy.yml @@ -11,6 +11,7 @@ jobs: name: Lint Docs runs-on: ubuntu-latest steps: + - uses: actions/checkout@v3 - name: Lint docs uses: articulate/actions-markdownlint@v1 with: diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index b28de87445..5a8a919a3f 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -11,6 +11,7 @@ jobs: name: Lint Docs runs-on: ubuntu-latest steps: + - uses: actions/checkout@v3 - name: Lint docs uses: articulate/actions-markdownlint@v1 with: From 8d1cd19b80f3eaf7f6436c3e4922a70241ffe762 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 1 Oct 2022 21:00:27 +0100 Subject: [PATCH 051/286] Fixes #585 --- roles/ansible-nas-general/tasks/main.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/roles/ansible-nas-general/tasks/main.yml b/roles/ansible-nas-general/tasks/main.yml index 8400a3ea06..e32d515d44 100644 --- a/roles/ansible-nas-general/tasks/main.yml +++ b/roles/ansible-nas-general/tasks/main.yml @@ -4,14 +4,6 @@ src: motd.txt dest: /etc/motd -- name: Enable Universe repository - raw: apt-add-repository universe - register: add_repo_result - changed_when: "'distribution component enabled for all sources' in add_repo_result.stdout" - until: add_repo_result.rc == 0 - retries: 3 - delay: 1 - - name: Update apt-cache apt: update_cache: yes From 1b87b918c188509e03d8a1a3b78b958802e50fb3 Mon Sep 17 00:00:00 2001 From: eniad Date: Tue, 4 Oct 2022 22:35:44 -0400 Subject: [PATCH 052/286] add calibremanager --- README.md | 1 + nas.yml | 5 +++ roles/calibre/tasks/main.yml | 1 + roles/calibremanager/defaults/main.yml | 28 ++++++++++++ .../molecule/default/molecule.yml | 6 +++ .../molecule/default/side_effect.yml | 10 +++++ .../molecule/default/verify.yml | 18 ++++++++ .../molecule/default/verify_stopped.yml | 18 ++++++++ roles/calibremanager/tasks/main.yml | 45 +++++++++++++++++++ .../media-serving/calibremanager.md | 34 ++++++++++++++ 10 files changed, 166 insertions(+) create mode 100644 roles/calibremanager/defaults/main.yml create mode 100644 roles/calibremanager/molecule/default/molecule.yml create mode 100644 roles/calibremanager/molecule/default/side_effect.yml create mode 100644 roles/calibremanager/molecule/default/verify.yml create mode 100644 roles/calibremanager/molecule/default/verify_stopped.yml create mode 100644 roles/calibremanager/tasks/main.yml create mode 100644 website/docs/applications/media-serving/calibremanager.md diff --git a/README.md b/README.md index 38a939a2a7..eae1ddaf81 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ If you have a spare domain name you can configure applications to be accessible * [Bitwarden_rs](https://github.com/dani-garcia/bitwarden_rs) - Self-Hosting port of password manager * [Booksonic](https://booksonic.org/) - The selfhosted audiobook server * [Calibre-web](https://github.com/janeczku/calibre-web) - Provides a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. +* [Calibre](https://calibre-ebook.com) - Calibre is a powerful and easy to use e-book manager. * [Code Server](https://code.visualstudio.com/) - Powerful IDE from Microsoft accessible through the browser * [Cloud Commander](https://cloudcmd.io/) - A dual panel file manager with integrated web console and text editor * [Cloudflare DDNS](https://hub.docker.com/r/joshuaavalon/cloudflare-ddns/) - automatically update Cloudflare with your IP address diff --git a/nas.yml b/nas.yml index da82bc9acf..9166cb12c6 100644 --- a/nas.yml +++ b/nas.yml @@ -61,6 +61,11 @@ tags: - calibre + - role: calibremanager + tags: + - calibremanager + when: (calibremanager_enabled | default(False)) + - role: cloudcmd tags: - cloudcmd diff --git a/roles/calibre/tasks/main.yml b/roles/calibre/tasks/main.yml index 0a98a5c4d0..b6c02e77a5 100644 --- a/roles/calibre/tasks/main.yml +++ b/roles/calibre/tasks/main.yml @@ -16,6 +16,7 @@ volumes: - "{{ calibre_data_directory }}/config:/config" - "{{ calibre_books_root }}:/books" + - "{{ calibre_data_directory }}/data:/data" env: TZ: "{{ ansible_nas_timezone }}" PUID: "{{ calibre_user_id }}" diff --git a/roles/calibremanager/defaults/main.yml b/roles/calibremanager/defaults/main.yml new file mode 100644 index 0000000000..f6cbc88b31 --- /dev/null +++ b/roles/calibremanager/defaults/main.yml @@ -0,0 +1,28 @@ +--- +calibremanager_enabled: false +calibremanager_available_externally: "false" + +# uid / gid +calibremanager_user_id: "1000" +calibremanager_group_id: "1000" + +# directories +calibremanager_data_directory: "{{ docker_home }}/calibremanager" +calibremanager_books_directory: "{{ books_root }}" +calibremanager_comics_directory: "{{ comics_root }}" + +# network +calibremanager_port: "8093" +calibremanager_webserver_port: "8094" +calibremanager_hostname: "calibremanager" + +# env +calibremanager_password: "" +calibremanager_cli_args: "" +calibremanager_security_opts: "seccomp=unconfined" # For why this is here, see https://github.com/linuxserver/docker-calibre/issues/102 + +# specs +calibremanager_memory: 1g + +# docker +calibremanager_container_name: calibremanager diff --git a/roles/calibremanager/molecule/default/molecule.yml b/roles/calibremanager/molecule/default/molecule.yml new file mode 100644 index 0000000000..9f13c2558c --- /dev/null +++ b/roles/calibremanager/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + calibremanager_enabled: true diff --git a/roles/calibremanager/molecule/default/side_effect.yml b/roles/calibremanager/molecule/default/side_effect.yml new file mode 100644 index 0000000000..1fa2b2a6ab --- /dev/null +++ b/roles/calibremanager/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + calibremanager_enabled: false diff --git a/roles/calibremanager/molecule/default/verify.yml b/roles/calibremanager/molecule/default/verify.yml new file mode 100644 index 0000000000..7e1a983c00 --- /dev/null +++ b/roles/calibremanager/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ calibremanager_container_name }}" + register: result + + - name: Check Calibre is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/calibremanager/molecule/default/verify_stopped.yml b/roles/calibremanager/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..86bdf0836d --- /dev/null +++ b/roles/calibremanager/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Calibre + docker_container: + name: "{{ calibremanager_container_name }}" + state: absent + register: result + + - name: Check Calibre is stopped + assert: + that: + - not result.changed diff --git a/roles/calibremanager/tasks/main.yml b/roles/calibremanager/tasks/main.yml new file mode 100644 index 0000000000..447b0928ac --- /dev/null +++ b/roles/calibremanager/tasks/main.yml @@ -0,0 +1,45 @@ +--- +- name: Create Calibre Directories + file: + path: "{{ item }}" + state: directory + mode: 0755 + with_items: + - "{{ calibremanager_data_directory }}/data" + +- name: Calibre Docker Container + docker_container: + name: "{{ calibremanager_container_name }}" + image: linuxserver/calibre + pull: true + volumes: + - "{{ calibremanager_data_directory }}/data:/config:rw" + - "{{ calibremanager_books_directory }}:/books:rw" + - "{{ calibremanager_comics_directory }}:/comics:rw" + ports: + - "{{ calibremanager_port }}:8080" + - "{{ calibremanager_webserver_port }}:8081" + security_opts: "{{ calibremanager_security_opts }}" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ calibremanager_user_id }}" + PGID: "{{ calibremanager_group_id }}" + PASSWORD: "{{ calibremanager_password }}" + CLI_ARGS: "{{ calibremanager_cli_args }}" + restart_policy: unless-stopped + memory: "{{ calibremanager_memory }}" + labels: + traefik.enable: "{{ calibremanager_available_externally }}" + traefik.http.routers.calibre.rule: "Host(`{{ calibremanager_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.calibre.tls.certresolver: "letsencrypt" + traefik.http.routers.calibre.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.calibre.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.calibre.loadbalancer.server.port: "8080" + +- name: Stop Calibre Manager + block: + - name: Stop Calibre Manager + docker_container: + name: "{{ calibremanager_container_name }}" + state: absent + when: calibremanager_enabled is false \ No newline at end of file diff --git a/website/docs/applications/media-serving/calibremanager.md b/website/docs/applications/media-serving/calibremanager.md new file mode 100644 index 0000000000..cb462b5d12 --- /dev/null +++ b/website/docs/applications/media-serving/calibremanager.md @@ -0,0 +1,34 @@ +# Calibre + +Homepage: [https://calibre-ebook.com](https://calibre-ebook.com) + +Calibre is a powerful and easy to use e-book manager. + +## Usage + +Set `calibremanager_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +By default, there is no password set for the main gui. Optional `calibremanager_password` will allow setting a password for the user `abc`. + +Optionally, cli start arguments can be passed to calibre using `calibremanager_cli_args`. + +The Calibre webserver must be turned on in the Calibre manager to make it available at the selected port (8094 by default). + +## Use with Calibre-web + +Ansible-NAS has long come with [../calibre](Calibre-web). To allow Calibre-web direct access to the Calibre database, both applications can share a Docker data directory. To do so, include the following in your inventory `nas.yml`: + +```yml +calibremanager_data_directory: "{{ docker_home }}/calibre" +``` + +In this case, the Calibre Database Directory is `/data/Calibre Library` + +## Ports + +```yml +calibremanager_port: "8093" +calibremanager_webserver_port: "8094" +``` From bdcaca6a7c3e875fe1ef2c7a46cc710f3d1991f6 Mon Sep 17 00:00:00 2001 From: eniad Date: Tue, 4 Oct 2022 23:46:56 -0400 Subject: [PATCH 053/286] linting calibremanager role --- roles/calibremanager/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/calibremanager/tasks/main.yml b/roles/calibremanager/tasks/main.yml index 447b0928ac..9d3f262232 100644 --- a/roles/calibremanager/tasks/main.yml +++ b/roles/calibremanager/tasks/main.yml @@ -19,7 +19,7 @@ ports: - "{{ calibremanager_port }}:8080" - "{{ calibremanager_webserver_port }}:8081" - security_opts: "{{ calibremanager_security_opts }}" + security_opts: "{{ calibremanager_security_opts }}" env: TZ: "{{ ansible_nas_timezone }}" PUID: "{{ calibremanager_user_id }}" @@ -42,4 +42,4 @@ docker_container: name: "{{ calibremanager_container_name }}" state: absent - when: calibremanager_enabled is false \ No newline at end of file + when: calibremanager_enabled is false From 68352004f327a7af229d73bb0289cca5fafdb812 Mon Sep 17 00:00:00 2001 From: eniad Date: Wed, 5 Oct 2022 20:56:53 -0400 Subject: [PATCH 054/286] reformat calibremanager task to match new format --- nas.yml | 1 - roles/calibremanager/tasks/main.yml | 73 +++++++++++++++-------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/nas.yml b/nas.yml index 9166cb12c6..5af29495fb 100644 --- a/nas.yml +++ b/nas.yml @@ -64,7 +64,6 @@ - role: calibremanager tags: - calibremanager - when: (calibremanager_enabled | default(False)) - role: cloudcmd tags: diff --git a/roles/calibremanager/tasks/main.yml b/roles/calibremanager/tasks/main.yml index 9d3f262232..63fbce0dcd 100644 --- a/roles/calibremanager/tasks/main.yml +++ b/roles/calibremanager/tasks/main.yml @@ -1,40 +1,43 @@ --- -- name: Create Calibre Directories - file: - path: "{{ item }}" - state: directory - mode: 0755 - with_items: - - "{{ calibremanager_data_directory }}/data" +- name: Start Calibre Manager + block: + - name: Create Calibre Manager Directories + file: + path: "{{ item }}" + state: directory + mode: 0755 + with_items: + - "{{ calibremanager_data_directory }}/data" -- name: Calibre Docker Container - docker_container: - name: "{{ calibremanager_container_name }}" - image: linuxserver/calibre - pull: true - volumes: - - "{{ calibremanager_data_directory }}/data:/config:rw" - - "{{ calibremanager_books_directory }}:/books:rw" - - "{{ calibremanager_comics_directory }}:/comics:rw" - ports: - - "{{ calibremanager_port }}:8080" - - "{{ calibremanager_webserver_port }}:8081" - security_opts: "{{ calibremanager_security_opts }}" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ calibremanager_user_id }}" - PGID: "{{ calibremanager_group_id }}" - PASSWORD: "{{ calibremanager_password }}" - CLI_ARGS: "{{ calibremanager_cli_args }}" - restart_policy: unless-stopped - memory: "{{ calibremanager_memory }}" - labels: - traefik.enable: "{{ calibremanager_available_externally }}" - traefik.http.routers.calibre.rule: "Host(`{{ calibremanager_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.calibre.tls.certresolver: "letsencrypt" - traefik.http.routers.calibre.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.calibre.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.calibre.loadbalancer.server.port: "8080" + - name: Calibre Docker Container + docker_container: + name: "{{ calibremanager_container_name }}" + image: linuxserver/calibre + pull: true + volumes: + - "{{ calibremanager_data_directory }}/data:/config:rw" + - "{{ calibremanager_books_directory }}:/books:rw" + - "{{ calibremanager_comics_directory }}:/comics:rw" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ calibremanager_user_id }}" + PGID: "{{ calibremanager_group_id }}" + PASSWORD: "{{ calibremanager_password }}" + CLI_ARGS: "{{ calibremanager_cli_args }}" + ports: + - "{{ calibremanager_port }}:8080" + - "{{ calibremanager_webserver_port }}:8081" + security_opts: "{{ calibremanager_security_opts }}" + restart_policy: unless-stopped + memory: "{{ calibremanager_memory }}" + labels: + traefik.enable: "{{ calibremanager_available_externally | string }}" + traefik.http.routers.calibremanager.rule: "Host(`{{ calibremanager_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.calibremanager.tls.certresolver: "letsencrypt" + traefik.http.routers.calibremanager.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.calibremanager.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.calibremanager.loadbalancer.server.port: "8080" + when: calibremanager_enabled is true - name: Stop Calibre Manager block: From 1e3c150fffb2fbc4d9914c3000bbf65d495ec7e2 Mon Sep 17 00:00:00 2001 From: eniad Date: Thu, 6 Oct 2022 15:01:09 -0400 Subject: [PATCH 055/286] rename misnamed calibre role to calibreweb --- nas.yml | 4 +- roles/calibre/defaults/main.yml | 20 ++++---- roles/calibre/molecule/default/molecule.yml | 1 - roles/calibre/tasks/main.yml | 32 +++++++------ roles/calibremanager/defaults/main.yml | 28 ----------- .../molecule/default/molecule.yml | 6 --- roles/calibremanager/tasks/main.yml | 48 ------------------- roles/calibreweb/defaults/main.yml | 24 ++++++++++ .../calibreweb/molecule/default/molecule.yml | 7 +++ .../molecule/default/side_effect.yml | 2 +- .../molecule/default/verify.yml | 2 +- .../molecule/default/verify_stopped.yml | 2 +- roles/calibreweb/tasks/main.yml | 44 +++++++++++++++++ .../applications/media-serving/calibre-web.md | 39 +++++++++++++++ .../applications/media-serving/calibre.md | 27 +++++------ .../media-serving/calibremanager.md | 34 ------------- 16 files changed, 160 insertions(+), 160 deletions(-) delete mode 100644 roles/calibremanager/defaults/main.yml delete mode 100644 roles/calibremanager/molecule/default/molecule.yml delete mode 100644 roles/calibremanager/tasks/main.yml create mode 100644 roles/calibreweb/defaults/main.yml create mode 100644 roles/calibreweb/molecule/default/molecule.yml rename roles/{calibremanager => calibreweb}/molecule/default/side_effect.yml (86%) rename roles/{calibremanager => calibreweb}/molecule/default/verify.yml (88%) rename roles/{calibremanager => calibreweb}/molecule/default/verify_stopped.yml (86%) create mode 100644 roles/calibreweb/tasks/main.yml create mode 100644 website/docs/applications/media-serving/calibre-web.md delete mode 100644 website/docs/applications/media-serving/calibremanager.md diff --git a/nas.yml b/nas.yml index 5af29495fb..621ae0fcce 100644 --- a/nas.yml +++ b/nas.yml @@ -61,9 +61,9 @@ tags: - calibre - - role: calibremanager + - role: calibreweb tags: - - calibremanager + - calibreweb - role: cloudcmd tags: diff --git a/roles/calibre/defaults/main.yml b/roles/calibre/defaults/main.yml index f5c0289b5c..602c21055f 100644 --- a/roles/calibre/defaults/main.yml +++ b/roles/calibre/defaults/main.yml @@ -1,22 +1,26 @@ --- calibre_enabled: false -calibre_available_externally: false +calibre_available_externally: "false" # uid / gid -calibre_user_id: "0" -calibre_group_id: "0" +calibre_user_id: "1000" +calibre_group_id: "1000" # directories calibre_data_directory: "{{ docker_home }}/calibre" -calibre_books_root: "{{ books_root }}" - -# other -calibre_ebook_conversion: "linuxserver/calibre-web:calibre" +calibre_books_directory: "{{ books_root }}" +calibre_comics_directory: "{{ comics_root }}" # network -calibre_port: "8084" +calibre_port: "8093" +calibre_webserver_port: "8094" calibre_hostname: "calibre" +# env +calibre_password: "" +calibre_cli_args: "" +calibre_security_opts: "seccomp=unconfined" # For why this is here, see https://github.com/linuxserver/docker-calibre/issues/102 + # specs calibre_memory: 1g diff --git a/roles/calibre/molecule/default/molecule.yml b/roles/calibre/molecule/default/molecule.yml index bc8274e36c..ba7b4d59c5 100644 --- a/roles/calibre/molecule/default/molecule.yml +++ b/roles/calibre/molecule/default/molecule.yml @@ -4,4 +4,3 @@ provisioner: group_vars: all: calibre_enabled: true - calibre_port: "8085" # 8084 is used by github actions diff --git a/roles/calibre/tasks/main.yml b/roles/calibre/tasks/main.yml index b6c02e77a5..1fe1b23673 100644 --- a/roles/calibre/tasks/main.yml +++ b/roles/calibre/tasks/main.yml @@ -1,43 +1,47 @@ --- -- name: Start Calibre +- name: Start Calibre Manager block: - - name: Create Calibre-web Directories + - name: Create Calibre Manager Directories file: path: "{{ item }}" state: directory + mode: 0755 with_items: - - "{{ calibre_data_directory }}/config" + - "{{ calibre_data_directory }}/data" - - name: Calibre-web Docker Container + - name: Calibre Docker Container docker_container: name: "{{ calibre_container_name }}" - image: linuxserver/calibre-web:latest + image: linuxserver/calibre pull: true volumes: - - "{{ calibre_data_directory }}/config:/config" - - "{{ calibre_books_root }}:/books" - - "{{ calibre_data_directory }}/data:/data" + - "{{ calibre_data_directory }}/data:/config:rw" + - "{{ calibre_books_directory }}:/books:rw" + - "{{ calibre_comics_directory }}:/comics:rw" env: TZ: "{{ ansible_nas_timezone }}" PUID: "{{ calibre_user_id }}" PGID: "{{ calibre_group_id }}" - DOCKER_MODS: "{{ calibre_ebook_conversion }}" + PASSWORD: "{{ calibre_password }}" + CLI_ARGS: "{{ calibre_cli_args }}" ports: - - "{{ calibre_port }}:8083" + - "{{ calibre_port }}:8080" + - "{{ calibre_webserver_port }}:8081" + security_opts: "{{ calibre_security_opts }}" restart_policy: unless-stopped memory: "{{ calibre_memory }}" labels: traefik.enable: "{{ calibre_available_externally | string }}" - traefik.http.routers.calibre.rule: "Host(`calibre.{{ ansible_nas_domain }}`)" + traefik.http.routers.calibre.rule: "Host(`{{ calibre_hostname }}.{{ ansible_nas_domain }}`)" traefik.http.routers.calibre.tls.certresolver: "letsencrypt" traefik.http.routers.calibre.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.calibre.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.calibre.loadbalancer.server.port: "8083" + traefik.http.services.calibre.loadbalancer.server.port: "8080" when: calibre_enabled is true -- name: Stop Calibre +- name: Stop Calibre Manager block: - - name: Stop Calibre + - name: Stop Calibre Manager docker_container: name: "{{ calibre_container_name }}" state: absent diff --git a/roles/calibremanager/defaults/main.yml b/roles/calibremanager/defaults/main.yml deleted file mode 100644 index f6cbc88b31..0000000000 --- a/roles/calibremanager/defaults/main.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -calibremanager_enabled: false -calibremanager_available_externally: "false" - -# uid / gid -calibremanager_user_id: "1000" -calibremanager_group_id: "1000" - -# directories -calibremanager_data_directory: "{{ docker_home }}/calibremanager" -calibremanager_books_directory: "{{ books_root }}" -calibremanager_comics_directory: "{{ comics_root }}" - -# network -calibremanager_port: "8093" -calibremanager_webserver_port: "8094" -calibremanager_hostname: "calibremanager" - -# env -calibremanager_password: "" -calibremanager_cli_args: "" -calibremanager_security_opts: "seccomp=unconfined" # For why this is here, see https://github.com/linuxserver/docker-calibre/issues/102 - -# specs -calibremanager_memory: 1g - -# docker -calibremanager_container_name: calibremanager diff --git a/roles/calibremanager/molecule/default/molecule.yml b/roles/calibremanager/molecule/default/molecule.yml deleted file mode 100644 index 9f13c2558c..0000000000 --- a/roles/calibremanager/molecule/default/molecule.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -provisioner: - inventory: - group_vars: - all: - calibremanager_enabled: true diff --git a/roles/calibremanager/tasks/main.yml b/roles/calibremanager/tasks/main.yml deleted file mode 100644 index 63fbce0dcd..0000000000 --- a/roles/calibremanager/tasks/main.yml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: Start Calibre Manager - block: - - name: Create Calibre Manager Directories - file: - path: "{{ item }}" - state: directory - mode: 0755 - with_items: - - "{{ calibremanager_data_directory }}/data" - - - name: Calibre Docker Container - docker_container: - name: "{{ calibremanager_container_name }}" - image: linuxserver/calibre - pull: true - volumes: - - "{{ calibremanager_data_directory }}/data:/config:rw" - - "{{ calibremanager_books_directory }}:/books:rw" - - "{{ calibremanager_comics_directory }}:/comics:rw" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ calibremanager_user_id }}" - PGID: "{{ calibremanager_group_id }}" - PASSWORD: "{{ calibremanager_password }}" - CLI_ARGS: "{{ calibremanager_cli_args }}" - ports: - - "{{ calibremanager_port }}:8080" - - "{{ calibremanager_webserver_port }}:8081" - security_opts: "{{ calibremanager_security_opts }}" - restart_policy: unless-stopped - memory: "{{ calibremanager_memory }}" - labels: - traefik.enable: "{{ calibremanager_available_externally | string }}" - traefik.http.routers.calibremanager.rule: "Host(`{{ calibremanager_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.calibremanager.tls.certresolver: "letsencrypt" - traefik.http.routers.calibremanager.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.calibremanager.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.calibremanager.loadbalancer.server.port: "8080" - when: calibremanager_enabled is true - -- name: Stop Calibre Manager - block: - - name: Stop Calibre Manager - docker_container: - name: "{{ calibremanager_container_name }}" - state: absent - when: calibremanager_enabled is false diff --git a/roles/calibreweb/defaults/main.yml b/roles/calibreweb/defaults/main.yml new file mode 100644 index 0000000000..1a8abfc92a --- /dev/null +++ b/roles/calibreweb/defaults/main.yml @@ -0,0 +1,24 @@ +--- +calibreweb_enabled: false +calibreweb_available_externally: false + +# uid / gid +calibreweb_user_id: "0" +calibreweb_group_id: "0" + +# directories +calibreweb_data_directory: "{{ docker_home }}/calibreweb" +calibreweb_books_root: "{{ books_root }}" + +# other +calibreweb_ebook_conversion: "linuxserver/calibre-web:calibre" + +# network +calibreweb_port: "8084" +calibreweb_hostname: "calibreweb" + +# specs +calibreweb_memory: 1g + +# docker +calibreweb_container_name: calibreweb diff --git a/roles/calibreweb/molecule/default/molecule.yml b/roles/calibreweb/molecule/default/molecule.yml new file mode 100644 index 0000000000..cbb41075f6 --- /dev/null +++ b/roles/calibreweb/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + calibreweb_enabled: true + calibreweb_port: "8085" # 8084 is used by github actions diff --git a/roles/calibremanager/molecule/default/side_effect.yml b/roles/calibreweb/molecule/default/side_effect.yml similarity index 86% rename from roles/calibremanager/molecule/default/side_effect.yml rename to roles/calibreweb/molecule/default/side_effect.yml index 1fa2b2a6ab..704ce061b6 100644 --- a/roles/calibremanager/molecule/default/side_effect.yml +++ b/roles/calibreweb/molecule/default/side_effect.yml @@ -7,4 +7,4 @@ include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: - calibremanager_enabled: false + calibreweb_enabled: false diff --git a/roles/calibremanager/molecule/default/verify.yml b/roles/calibreweb/molecule/default/verify.yml similarity index 88% rename from roles/calibremanager/molecule/default/verify.yml rename to roles/calibreweb/molecule/default/verify.yml index 7e1a983c00..12bf6ba8e2 100644 --- a/roles/calibremanager/molecule/default/verify.yml +++ b/roles/calibreweb/molecule/default/verify.yml @@ -8,7 +8,7 @@ - name: Get container state docker_container_info: - name: "{{ calibremanager_container_name }}" + name: "{{ calibreweb_container_name }}" register: result - name: Check Calibre is running diff --git a/roles/calibremanager/molecule/default/verify_stopped.yml b/roles/calibreweb/molecule/default/verify_stopped.yml similarity index 86% rename from roles/calibremanager/molecule/default/verify_stopped.yml rename to roles/calibreweb/molecule/default/verify_stopped.yml index 86bdf0836d..9e92e7ce98 100644 --- a/roles/calibremanager/molecule/default/verify_stopped.yml +++ b/roles/calibreweb/molecule/default/verify_stopped.yml @@ -8,7 +8,7 @@ - name: Try and stop and remove Calibre docker_container: - name: "{{ calibremanager_container_name }}" + name: "{{ calibreweb_container_name }}" state: absent register: result diff --git a/roles/calibreweb/tasks/main.yml b/roles/calibreweb/tasks/main.yml new file mode 100644 index 0000000000..e7411c3236 --- /dev/null +++ b/roles/calibreweb/tasks/main.yml @@ -0,0 +1,44 @@ +--- +- name: Start Calibre + block: + - name: Create Calibre-web Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ calibreweb_data_directory }}/config" + + - name: Calibre-web Docker Container + docker_container: + name: "{{ calibreweb_container_name }}" + image: linuxserver/calibre-web:latest + pull: true + volumes: + - "{{ calibreweb_data_directory }}/config:/config" + - "{{ calibreweb_books_root }}:/books" + - "{{ calibreweb_data_directory }}/data:/data" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ calibreweb_user_id }}" + PGID: "{{ calibreweb_group_id }}" + DOCKER_MODS: "{{ calibreweb_ebook_conversion }}" + ports: + - "{{ calibreweb_port }}:8083" + restart_policy: unless-stopped + memory: "{{ calibreweb_memory }}" + labels: + traefik.enable: "{{ calibreweb_available_externally | string }}" + traefik.http.routers.calibreweb.rule: "Host(`{{ calibreweb_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.calibreweb.tls.certresolver: "letsencrypt" + traefik.http.routers.calibreweb.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.calibreweb.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.calibreweb.loadbalancer.server.port: "8083" + when: calibreweb_enabled is true + +- name: Stop Calibre + block: + - name: Stop Calibre + docker_container: + name: "{{ calibreweb_container_name }}" + state: absent + when: calibreweb_enabled is false diff --git a/website/docs/applications/media-serving/calibre-web.md b/website/docs/applications/media-serving/calibre-web.md new file mode 100644 index 0000000000..d6b149cee7 --- /dev/null +++ b/website/docs/applications/media-serving/calibre-web.md @@ -0,0 +1,39 @@ +--- +title: "Calibre-web" +--- + +Homepage: + +Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. + +## Usage + +Set `calibreweb_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +Requires Calibre ebook management program. Available for download [here](https://calibre-ebook.com/download). + +### Admin login + +**Default admin login:** Username: admin Password: admin123 + +### eBook Conversion + +If you do not need eBook conversion you can disable it to save resources by setting the `calibreweb_ebook_conversion` variable in `group_vars/all.yml` file to be empty. + +- Conversion enabled: `calibreweb_ebook_conversion: "linuxserver/calibre-web:calibre"` + +- Conversion disabled: `calibreweb_ebook_conversion: ""` + +You can target just Calibre by appending `-t calibre` to your `ansible-playbook` command. + +## Use with Calibre + +Ansible-NAS add [../calibre](Calibre) long after Calibre-web. To allow Calibre-web direct access to the Calibre database, both applications can share a Docker data directory. To do so, include the following in your inventory `nas.yml`: + +```yml +calibreweb_data_directory: "{{ docker_home }}/calibre" +``` + +In this case, the Calibre Database Directory is `/data/Calibre Library`. diff --git a/website/docs/applications/media-serving/calibre.md b/website/docs/applications/media-serving/calibre.md index 607a533b0b..0ae22af8da 100644 --- a/website/docs/applications/media-serving/calibre.md +++ b/website/docs/applications/media-serving/calibre.md @@ -1,10 +1,8 @@ ---- -title: "Calibre-web" ---- +# Calibre -Homepage: +Homepage: [https://calibre-ebook.com](https://calibre-ebook.com) -Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. +Calibre is a powerful and easy to use e-book manager. ## Usage @@ -12,18 +10,15 @@ Set `calibre_enabled: true` in your `inventories//nas.yml` file. ## Specific Configuration -Requires Calibre ebook management program. Available for download [here](https://calibre-ebook.com/download). +By default, there is no password set for the main gui. Optional `calibre_password` will allow setting a password for the user `abc`. -### Admin login +Optionally, cli start arguments can be passed to calibre using `calibre_cli_args`. -**Default admin login:** Username: admin Password: admin123 +The Calibre webserver must be turned on in the Calibre manager to make it available at the selected port (8094 by default). -### eBook Conversion +## Ports -If you do not need eBook conversion you can disable it to save resources by setting the `calibre_ebook_conversion` variable in `group_vars/all.yml` file to be empty. - -- Conversion enabled: `calibre_ebook_conversion: "linuxserver/calibre-web:calibre"` - -- Conversion disabled: `calibre_ebook_conversion: ""` - -You can target just Calibre by appending `-t calibre` to your `ansible-playbook` command. +```yml +calibre_port: "8093" +calibre_webserver_port: "8094" +``` diff --git a/website/docs/applications/media-serving/calibremanager.md b/website/docs/applications/media-serving/calibremanager.md deleted file mode 100644 index cb462b5d12..0000000000 --- a/website/docs/applications/media-serving/calibremanager.md +++ /dev/null @@ -1,34 +0,0 @@ -# Calibre - -Homepage: [https://calibre-ebook.com](https://calibre-ebook.com) - -Calibre is a powerful and easy to use e-book manager. - -## Usage - -Set `calibremanager_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -By default, there is no password set for the main gui. Optional `calibremanager_password` will allow setting a password for the user `abc`. - -Optionally, cli start arguments can be passed to calibre using `calibremanager_cli_args`. - -The Calibre webserver must be turned on in the Calibre manager to make it available at the selected port (8094 by default). - -## Use with Calibre-web - -Ansible-NAS has long come with [../calibre](Calibre-web). To allow Calibre-web direct access to the Calibre database, both applications can share a Docker data directory. To do so, include the following in your inventory `nas.yml`: - -```yml -calibremanager_data_directory: "{{ docker_home }}/calibre" -``` - -In this case, the Calibre Database Directory is `/data/Calibre Library` - -## Ports - -```yml -calibremanager_port: "8093" -calibremanager_webserver_port: "8094" -``` From 406433a01fc53dd6d0fd0777a49041a913abe9a5 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 8 Oct 2022 13:22:42 +0100 Subject: [PATCH 056/286] Upgrade to latest geerlingguy.docker role --- requirements.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.yml b/requirements.yml index 871895380e..d69a68cbb4 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,6 +1,6 @@ --- - name: geerlingguy.docker - version: 5.1.0 + version: 6.0.0 - name: bertvv.samba version: v2.7.1 From 1769218a5e7bc928f995fd6f81070a918358f1c6 Mon Sep 17 00:00:00 2001 From: eniad Date: Tue, 18 Oct 2022 21:20:35 -0400 Subject: [PATCH 057/286] clean up naming for rename of calibre-web role --- roles/calibre/tasks/main.yml | 8 ++++---- roles/calibreweb/molecule/default/verify.yml | 2 +- roles/calibreweb/molecule/default/verify_stopped.yml | 4 ++-- roles/calibreweb/tasks/main.yml | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/roles/calibre/tasks/main.yml b/roles/calibre/tasks/main.yml index 1fe1b23673..0cbd7e725e 100644 --- a/roles/calibre/tasks/main.yml +++ b/roles/calibre/tasks/main.yml @@ -1,7 +1,7 @@ --- -- name: Start Calibre Manager +- name: Start Calibre block: - - name: Create Calibre Manager Directories + - name: Create Calibre Directories file: path: "{{ item }}" state: directory @@ -39,9 +39,9 @@ traefik.http.services.calibre.loadbalancer.server.port: "8080" when: calibre_enabled is true -- name: Stop Calibre Manager +- name: Stop Calibre block: - - name: Stop Calibre Manager + - name: Stop Calibre docker_container: name: "{{ calibre_container_name }}" state: absent diff --git a/roles/calibreweb/molecule/default/verify.yml b/roles/calibreweb/molecule/default/verify.yml index 12bf6ba8e2..9147588805 100644 --- a/roles/calibreweb/molecule/default/verify.yml +++ b/roles/calibreweb/molecule/default/verify.yml @@ -11,7 +11,7 @@ name: "{{ calibreweb_container_name }}" register: result - - name: Check Calibre is running + - name: Check Calibre-web is running assert: that: - result.container['State']['Status'] == "running" diff --git a/roles/calibreweb/molecule/default/verify_stopped.yml b/roles/calibreweb/molecule/default/verify_stopped.yml index 9e92e7ce98..d44eca621a 100644 --- a/roles/calibreweb/molecule/default/verify_stopped.yml +++ b/roles/calibreweb/molecule/default/verify_stopped.yml @@ -6,13 +6,13 @@ - include_vars: file: ../../defaults/main.yml - - name: Try and stop and remove Calibre + - name: Try and stop and remove Calibre-web docker_container: name: "{{ calibreweb_container_name }}" state: absent register: result - - name: Check Calibre is stopped + - name: Check Calibre-web is stopped assert: that: - not result.changed diff --git a/roles/calibreweb/tasks/main.yml b/roles/calibreweb/tasks/main.yml index e7411c3236..09c6fd49b8 100644 --- a/roles/calibreweb/tasks/main.yml +++ b/roles/calibreweb/tasks/main.yml @@ -1,5 +1,5 @@ --- -- name: Start Calibre +- name: Start Calibre-web block: - name: Create Calibre-web Directories file: @@ -35,9 +35,9 @@ traefik.http.services.calibreweb.loadbalancer.server.port: "8083" when: calibreweb_enabled is true -- name: Stop Calibre +- name: Stop Calibre-web block: - - name: Stop Calibre + - name: Stop Calibre-web docker_container: name: "{{ calibreweb_container_name }}" state: absent From 684061819a12b66a028da280d9ba6a2624bfa09f Mon Sep 17 00:00:00 2001 From: eniad Date: Tue, 18 Oct 2022 21:29:20 -0400 Subject: [PATCH 058/286] add cache-dependency-path to github test-deploy --- .github/workflows/docs-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 5a8a919a3f..b3fd85e681 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -26,6 +26,7 @@ jobs: with: node-version: 18 cache: yarn + cache-dependency-path: ./website/package-lock.json - name: Install dependencies run: yarn install --frozen-lockfile From 378836e5a983a9970552fe660436dc5e6164f3cb Mon Sep 17 00:00:00 2001 From: eniad Date: Tue, 18 Oct 2022 21:33:35 -0400 Subject: [PATCH 059/286] Revert "add cache-dependency-path to github test-deploy" This reverts commit 684061819a12b66a028da280d9ba6a2624bfa09f. --- .github/workflows/docs-test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index b3fd85e681..5a8a919a3f 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -26,7 +26,6 @@ jobs: with: node-version: 18 cache: yarn - cache-dependency-path: ./website/package-lock.json - name: Install dependencies run: yarn install --frozen-lockfile From 4093d42997a80ccac691e0dd5137eaf037605226 Mon Sep 17 00:00:00 2001 From: Andrei Mahalean Date: Wed, 26 Oct 2022 22:53:20 +1300 Subject: [PATCH 060/286] add environment variables to fix broken login page --- roles/firefly/tasks/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/roles/firefly/tasks/main.yml b/roles/firefly/tasks/main.yml index a1a2d185dc..3384eb17f7 100644 --- a/roles/firefly/tasks/main.yml +++ b/roles/firefly/tasks/main.yml @@ -42,6 +42,8 @@ ports: - "{{ firefly_port }}:8080" env: + APP_URL: "https://{{ firefly_hostname }}.{{ ansible_nas_domain }}" + TRUSTED_PROXIES: "**" APP_ENV: "local" APP_KEY: "S0m3R@nd0mString0f32Ch@rsEx@ct1y" DB_CONNECTION: "mysql" From a3bbe5a3f7cd512414ca05d79f2e9da8169cec97 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 17:53:37 +0000 Subject: [PATCH 061/286] Add Drone CI config --- .drone.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000000..c9bd1ce35a --- /dev/null +++ b/.drone.yml @@ -0,0 +1,19 @@ +--- +kind: pipeline +name: default + +steps: +- name: check ansible syntax + image: plugins/ansible:3 + settings: + playbook: nas.yml + galaxy: requirements.yml + inventory: tests/inventories/integration_testing/inventory + syntax_check: true + +- name: lint + image: python:3 + commands: + - pip3 install ansible yamllint==1.27.1 ansible-lint==6.5 + - ansible-lint nas.yml + - yamllint . From f6def440037f0a2c6598e2e8865638ae5814b840 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 18:00:09 +0000 Subject: [PATCH 062/286] Pin Molecule version until bug is fixed --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index d1e407e3ca..392de4852c 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Molecule Test - uses: gofrolist/molecule-action@v2 + uses: gofrolist/molecule-action@v2.3.4 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test From 3c33a98d9e2458cb86c570ed7160609c53e85e32 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 18:03:53 +0000 Subject: [PATCH 063/286] Fix yml indentation --- .drone.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.drone.yml b/.drone.yml index c9bd1ce35a..9b28eb4e06 100644 --- a/.drone.yml +++ b/.drone.yml @@ -3,17 +3,17 @@ kind: pipeline name: default steps: -- name: check ansible syntax - image: plugins/ansible:3 - settings: + - name: check ansible syntax + image: plugins/ansible:3 + settings: playbook: nas.yml galaxy: requirements.yml inventory: tests/inventories/integration_testing/inventory syntax_check: true -- name: lint - image: python:3 - commands: - - pip3 install ansible yamllint==1.27.1 ansible-lint==6.5 - - ansible-lint nas.yml - - yamllint . + - name: lint + image: python:3 + commands: + - pip3 install ansible yamllint==1.27.1 ansible-lint==6.5 + - ansible-lint nas.yml + - yamllint . From e94016b06c7e70f866a80fd93ed29aa4803eecfa Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 18:12:12 +0000 Subject: [PATCH 064/286] Pin integration test molecule to correct version --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 392de4852c..d3233748c2 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Molecule Test - uses: gofrolist/molecule-action@v2.3.4 + uses: gofrolist/molecule-action@v2.3.1 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test From 4f329924abff620ce4243727ef4ae7f7d7883e65 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 21:31:08 +0000 Subject: [PATCH 065/286] Try pinning action to commit --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index d3233748c2..f0355c1b24 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Molecule Test - uses: gofrolist/molecule-action@v2.3.1 + uses: gofrolist/molecule-action@0321a06bde0e4d1f4b6c819d0a0e1a941e92f06c with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test From dab3dfb72b844598361900aa89c452fabc36c576 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 22:17:51 +0000 Subject: [PATCH 066/286] Try again... --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index f0355c1b24..b529dd158c 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Molecule Test - uses: gofrolist/molecule-action@0321a06bde0e4d1f4b6c819d0a0e1a941e92f06c + uses: gofrolist/molecule-action@5d3b2497368889553ec8cbb2762ae577c33b3d89 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test From 85199bed2782cc9a12a26707d4fee739794a536a Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 6 Nov 2022 23:26:26 +0000 Subject: [PATCH 067/286] Add Drone CI --- README.md | 3 +- nas.yml | 8 ++ roles/drone-ci/defaults/main.yml | 43 +++++++++ roles/drone-ci/molecule/default/molecule.yml | 10 +++ .../drone-ci/molecule/default/side_effect.yml | 10 +++ roles/drone-ci/molecule/default/verify.yml | 26 ++++++ .../molecule/default/verify_stopped.yml | 25 ++++++ roles/drone-ci/tasks/main.yml | 88 +++++++++++++++++++ .../development-tools/drone_ci.md | 19 ++++ 9 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 roles/drone-ci/defaults/main.yml create mode 100644 roles/drone-ci/molecule/default/molecule.yml create mode 100644 roles/drone-ci/molecule/default/side_effect.yml create mode 100644 roles/drone-ci/molecule/default/verify.yml create mode 100644 roles/drone-ci/molecule/default/verify_stopped.yml create mode 100644 roles/drone-ci/tasks/main.yml create mode 100644 website/docs/applications/development-tools/drone_ci.md diff --git a/README.md b/README.md index 38a939a2a7..d4daa5e354 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ You can configure Ansible-NAS to set up any (or all!) of the applications listed If you have a spare domain name you can configure applications to be accessible externally to your home LAN too; they'll be configured with a sensible hostname and DNS gets updated accordingly if your home IP address changes. -### Available Applications +## Available Applications * [Airsonic](https://airsonic.github.io/) - catalog and stream music * [Bazarr](https://github.com/morpheus65535/bazarr) - companion to Radarr and Sonarr for downloading subtitles @@ -28,6 +28,7 @@ If you have a spare domain name you can configure applications to be accessible * [Dashy](https://dashy.to/) - A self-hosted startpage for your server. Easy to use visual editor, status checking, widgets, themes and tons more! * [Deluge](https://dev.deluge-torrent.org/) - A lightweight, Free Software, cross-platform BitTorrent client. * [DokuWiki](https://www.dokuwiki.org/) - A simple to use and highly versatile Open Source wiki software that doesn't require a database. +* [Drone CI](https://drone.io) - A self-service Continuous Integration platform for busy development teams. * [Duplicacy](https://duplicacy.com/) - A web UI for the Duplicacy cloud backup program, which provides lock-free deduplication backups to multiple providers * [Duplicati](https://www.duplicati.com/) - for backing up your stuff * [Emby](https://emby.media/) - Media streaming and management diff --git a/nas.yml b/nas.yml index da82bc9acf..b71dcd3902 100644 --- a/nas.yml +++ b/nas.yml @@ -89,6 +89,10 @@ tags: - dokuwiki + - role: drone-ci + tags: + - drone_ci + - role: duplicacy tags: - duplicacy @@ -257,6 +261,10 @@ - nextcloud when: (nextcloud_enabled | default(False)) + - role: nomad + tags: + - nomad + - role: nzbget tags: - nzbget diff --git a/roles/drone-ci/defaults/main.yml b/roles/drone-ci/defaults/main.yml new file mode 100644 index 0000000000..42be23b99b --- /dev/null +++ b/roles/drone-ci/defaults/main.yml @@ -0,0 +1,43 @@ +--- +drone_ci_enabled: false +drone_ci_available_externally: false + +# directories +drone_ci_data_directory: "{{ docker_home }}/drone-ci" + +# network +drone_ci_port_http: 8001 +drone_ci_runner_port_http: 8002 +drone_ci_address: "http://{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ drone_ci_port_http }}" +drone_ci_hostname: drone-ci + +# memory +drone_ci_memory: 1g +drone_ci_agent_memory: 1g + +# docker +drone_ci_container_name: drone-ci +drone_ci_runner_container_name: drone-ci-runner + +# Drone-CI Application Config +# the users that'll be granted admin, comma separated. Should match a gitea user. +drone_ci_admin_user: david + +# shared secret - use openssl rand -hex 16 to generate your own +drone_ci_agent_secret: d052ab29a86a02c6b6ff1e5851ee15e1 + +# debug logging +drone_ci_debug_logging: false + +# the url to your gitea server +drone_ci_gitea_url: "http://{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ gitea_port_http }}" + +# gitea auth credentials. see https://drone-ci.org/docs/administration/forges/gitea for more info +drone_ci_gitea_client_id: notset +drone_ci_gitea_client_secret: notset + +# how many drone runners to run +drone_ci_runner_capacity: 2 + +# name of the Drone runner +drone_ci_runner_name: "{{ ansible_nas_hostname }}" diff --git a/roles/drone-ci/molecule/default/molecule.yml b/roles/drone-ci/molecule/default/molecule.yml new file mode 100644 index 0000000000..0671311d0c --- /dev/null +++ b/roles/drone-ci/molecule/default/molecule.yml @@ -0,0 +1,10 @@ +--- +provisioner: + inventory: + group_vars: + all: + drone_ci_enabled: true + drone_ci_gitea_client_id: asdfasdf12341234 + drone_ci_gitea_client_secret: asdfasd12341234 + gitea_port_http: 3001 + ansible_nas_hostname: ansible-nas-ci diff --git a/roles/drone-ci/molecule/default/side_effect.yml b/roles/drone-ci/molecule/default/side_effect.yml new file mode 100644 index 0000000000..1adfbc19f8 --- /dev/null +++ b/roles/drone-ci/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + drone_ci_enabled: false diff --git a/roles/drone-ci/molecule/default/verify.yml b/roles/drone-ci/molecule/default/verify.yml new file mode 100644 index 0000000000..c993caf942 --- /dev/null +++ b/roles/drone-ci/molecule/default/verify.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ drone_ci_container_name }}" + register: result + + - name: Get container state + docker_container_info: + name: "{{ drone_ci_runner_container_name }}" + register: result_runner + + + - name: Check Drone CI is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false + - result_runner.container['State']['Status'] == "running" + - result_runner.container['State']['Restarting'] == false diff --git a/roles/drone-ci/molecule/default/verify_stopped.yml b/roles/drone-ci/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..3f8ce56f01 --- /dev/null +++ b/roles/drone-ci/molecule/default/verify_stopped.yml @@ -0,0 +1,25 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Drone CI + docker_container: + name: "{{ drone_ci_container_name }}" + state: absent + register: result + + - name: Try and stop and remove Drone CI runner + docker_container: + name: "{{ drone_ci_runner_container_name }}" + state: absent + register: result_runner + + - name: Check Drone CI is stopped + assert: + that: + - not result.changed + - not result_runner.changed diff --git a/roles/drone-ci/tasks/main.yml b/roles/drone-ci/tasks/main.yml new file mode 100644 index 0000000000..c15cc6c12c --- /dev/null +++ b/roles/drone-ci/tasks/main.yml @@ -0,0 +1,88 @@ +--- +- name: Start Drone-CI + block: + - name: Check for Gitea installation + fail: + msg: "Drone-CI requires Gitea enabled and running for authentication, please set that up first." + when: gitea_enabled is false + + - name: Check for Gitea config + fail: + msg: "Missing Gitea Oauth2 config! Read https://docs.drone.io/server/provider/gitea/ and set drone_ci_gitea_client_id and drone_ci_gitea_client_secret." + when: drone_ci_gitea_client_id == "notset" + + - name: Create Drone-CI Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ drone_ci_data_directory }}" + + - name: Create Drone-CI container + docker_container: + name: "{{ drone_ci_container_name }}" + image: drone/drone:2 + pull: true + volumes: + - "{{ drone_ci_data_directory }}:/var/lib/drone:rw" + ports: + - "{{ drone_ci_port_http }}:80" + env: + DRONE_USER_CREATE: "username:{{ drone_ci_admin_user }},admin:true" + DRONE_SERVER_HOST: "{{ drone_ci_address }}" + DRONE_RPC_SECRET: "{{ drone_ci_agent_secret }}" + DRONE_GITEA_SERVER: "{{ drone_ci_gitea_url }}" + DRONE_GITEA_CLIENT_ID: "{{ drone_ci_gitea_client_id }}" + DRONE_GITEA_CLIENT_SECRET: "{{ drone_ci_gitea_client_secret }}" + DRONE_LOGS_DEBUG: "{{ drone_ci_debug_logging | string }}" + DRONE_SERVER_PROTO: "http" + restart_policy: unless-stopped + memory: "{{ drone_ci_memory }}" + labels: + traefik.enable: "{{ drone_ci_available_externally | string }}" + traefik.http.routers.drone_ci.rule: "Host(`{{ drone_ci_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.drone_ci.tls.certresolver: "letsencrypt" + traefik.http.routers.drone_ci.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.drone_ci.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.drone_ci.loadbalancer.server.port: "80" + + - name: Create Drone-CI Runner container + docker_container: + name: "{{ drone_ci_runner_container_name }}" + image: drone/drone-runner-docker:1 + pull: true + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:rw" + ports: + - "{{ drone_ci_runner_port_http }}:3000" + env: + DRONE_RPC_HOST: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ drone_ci_port_http }}" + DRONE_RPC_SECRET: "{{ drone_ci_agent_secret }}" + DRONE_RPC_PROTO: "http" + DRONE_RUNNER_CAPACITY: "{{ drone_ci_runner_capacity | string }}" + DRONE_RUNNER_NAME: "{{ drone_ci_runner_name }}" + restart_policy: unless-stopped + memory: "{{ drone_ci_agent_memory }}" + + # - name: Add webhook allowed hosts to Gitea + # blockinfile: + # path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + # block: | + # [webhook] + # ALLOWED_HOST_LIST=private + # SKIP_TLS_VERIFY=true + # notify: restart gitea + when: drone_ci_enabled is true + +- name: Stop Drone-CI + block: + - name: Stop Drone-CI + docker_container: + name: "{{ drone_ci_container_name }}" + state: absent + + - name: Stop Drone-CI Runner + docker_container: + name: "{{ drone_ci_runner_container_name }}" + state: absent + when: drone_ci_enabled is false diff --git a/website/docs/applications/development-tools/drone_ci.md b/website/docs/applications/development-tools/drone_ci.md new file mode 100644 index 0000000000..6567250ee3 --- /dev/null +++ b/website/docs/applications/development-tools/drone_ci.md @@ -0,0 +1,19 @@ +--- +title: "Drone CI" +--- + +Drone is a self-service Continuous Integration platform for busy development teams. + +Check it out at . + +## Usage + +Set `drone_ci_enabled: true` in your `inventories//nas.yml` file. + +Gitea (`gitea_enabled: true`) must be set up and running before attempting to set up Drone CI. + +## Setup Tasks + +An Oauth2 application must be set up in Gitea. Visit for more info, then set `drone_ci_gitea_client_id` and `drone_ci_gitea_client_secret` accordingly. The Gitea Redirect URL will be `http://:{{ drone_ci_port_http }}/login` + +Set `drone_ci_admin_user` to the same username as your user in Gitea. From e8e0d7866d252b316c911c83dac2f0e1d5e073c1 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 8 Nov 2022 22:02:45 +0000 Subject: [PATCH 068/286] Fix block indentation --- roles/drone-ci/tasks/main.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/roles/drone-ci/tasks/main.yml b/roles/drone-ci/tasks/main.yml index c15cc6c12c..db36a55b68 100644 --- a/roles/drone-ci/tasks/main.yml +++ b/roles/drone-ci/tasks/main.yml @@ -64,14 +64,14 @@ restart_policy: unless-stopped memory: "{{ drone_ci_agent_memory }}" - # - name: Add webhook allowed hosts to Gitea - # blockinfile: - # path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" - # block: | - # [webhook] - # ALLOWED_HOST_LIST=private - # SKIP_TLS_VERIFY=true - # notify: restart gitea + - name: Add webhook allowed hosts to Gitea + blockinfile: + path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + block: | + [webhook] + ALLOWED_HOST_LIST=private + SKIP_TLS_VERIFY=true + notify: restart gitea when: drone_ci_enabled is true - name: Stop Drone-CI From c367740b8ef3755a94a898df792adfafd387242a Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 8 Nov 2022 23:03:01 +0000 Subject: [PATCH 069/286] Add Nomad --- README.md | 1 + roles/nomad/defaults/main.yml | 9 +++++ roles/nomad/tasks/main.yml | 39 +++++++++++++++++++ roles/nomad/templates/nomad.hcl | 22 +++++++++++ .../applications/development-tools/nomad.md | 13 +++++++ 5 files changed, 84 insertions(+) create mode 100644 roles/nomad/defaults/main.yml create mode 100644 roles/nomad/tasks/main.yml create mode 100644 roles/nomad/templates/nomad.hcl create mode 100644 website/docs/applications/development-tools/nomad.md diff --git a/README.md b/README.md index d4daa5e354..a32ccc73d5 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ If you have a spare domain name you can configure applications to be accessible * [netboot.xyz](https://netboot.xyz/) - a PXE boot server * [Netdata](https://my-netdata.io/) - An extremely comprehensive system monitoring solution * [Nextcloud](https://nextcloud.com/) - A self-hosted Dropbox alternative +* [Nomad](https://www.nomadproject.io/) - A simple and flexible scheduler and software orchestrator * [NZBget](https://nzbget.net/) - The most efficient usenet downloader * [Octoprint](https://octoprint.org/) - Control and monitor your 3D printer * [Ombi](https://ombi.io/) - web application that automatically gives your users the ability to request content diff --git a/roles/nomad/defaults/main.yml b/roles/nomad/defaults/main.yml new file mode 100644 index 0000000000..c9442609d0 --- /dev/null +++ b/roles/nomad/defaults/main.yml @@ -0,0 +1,9 @@ +--- +nomad_enabled: false +nomad_data_home: "{{ docker_home }}/nomad" +nomad_service_name: nomad + +# ports +nomad_port_http: 4646 +nomad_port_rpc: 4647 +nomad_port_serf: 4648 diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml new file mode 100644 index 0000000000..c38e8b3661 --- /dev/null +++ b/roles/nomad/tasks/main.yml @@ -0,0 +1,39 @@ +--- +- name: Install and start Nomad + block: + - name: Add Hashicorp GPG key + ansible.builtin.apt_key: + url: https://apt.releases.hashicorp.com/gpg + state: present + + - name: Add Hashicorp apt repository + ansible.builtin.apt_repository: + repo: "deb https://apt.releases.hashicorp.com {{ ansible_facts['lsb']['codename'] }} main" + state: present + filename: hashicorp + + - name: Install Nomad + ansible.builtin.apt: + name: nomad + state: present + + - name: Template Nomad config + ansible.builtin.template: + src: nomad.hcl + dest: /etc/nomad.d/nomad.hcl + + - name: Start Nomad + ansible.builtin.systemd: + name: "{{ nomad_service_name }}" + state: started + enabled: yes + when: nomad_enabled is true + +- name: Stop Nomad + block: + - name: Stop Nomad + ansible.builtin.systemd: + name: "{{ nomad_service_name }}" + state: stopped + enabled: no + when: nomad_enabled is false diff --git a/roles/nomad/templates/nomad.hcl b/roles/nomad/templates/nomad.hcl new file mode 100644 index 0000000000..4bfeb72eea --- /dev/null +++ b/roles/nomad/templates/nomad.hcl @@ -0,0 +1,22 @@ +# Full configuration options can be found at https://www.nomadproject.io/docs/configuration + +data_dir = "{{ nomad_data_home }}/data" +bind_addr = "0.0.0.0" + +ports { + http = {{ nomad_port_http }} + rpc = {{ nomad_port_rpc }} + serf = {{ nomad_port_serf }} +} + +server { + # license_path is required as of Nomad v1.1.1+ + #license_path = "/opt/nomad/license.hclic" + enabled = true + bootstrap_expect = 1 +} + +client { + enabled = true + servers = ["0.0.0.0"] +} diff --git a/website/docs/applications/development-tools/nomad.md b/website/docs/applications/development-tools/nomad.md new file mode 100644 index 0000000000..08389d110a --- /dev/null +++ b/website/docs/applications/development-tools/nomad.md @@ -0,0 +1,13 @@ +--- +title: "Nomad" +--- + +Homepage: + +A simple and flexible scheduler and orchestrator to deploy and manage containers and non-containerised applications across on-prem and clouds at scale. + +## Usage + +Set `nomad_enabled: true` in your `inventories//nas.yml` file. + +Nomad's web interface can be found at From 7b621f9bdac216d8c641435e913f4bae13b0bde3 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 8 Nov 2022 23:05:42 +0000 Subject: [PATCH 070/286] Linting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a32ccc73d5..787292d491 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ If you have a spare domain name you can configure applications to be accessible * [netboot.xyz](https://netboot.xyz/) - a PXE boot server * [Netdata](https://my-netdata.io/) - An extremely comprehensive system monitoring solution * [Nextcloud](https://nextcloud.com/) - A self-hosted Dropbox alternative -* [Nomad](https://www.nomadproject.io/) - A simple and flexible scheduler and software orchestrator +* [Nomad](https://www.nomadproject.io/) - A simple and flexible scheduler and software orchestrator * [NZBget](https://nzbget.net/) - The most efficient usenet downloader * [Octoprint](https://octoprint.org/) - Control and monitor your 3D printer * [Ombi](https://ombi.io/) - web application that automatically gives your users the ability to request content From 5886702aedbd0e0ab2f5c045e9047d1a0184be80 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Thu, 10 Nov 2022 22:27:02 +0000 Subject: [PATCH 071/286] Add Nomad restart when config changes --- roles/nomad/handlers/main.yml | 6 ++++++ roles/nomad/tasks/main.yml | 1 + roles/nomad/templates/nomad.hcl | 5 +++++ 3 files changed, 12 insertions(+) create mode 100644 roles/nomad/handlers/main.yml diff --git a/roles/nomad/handlers/main.yml b/roles/nomad/handlers/main.yml new file mode 100644 index 0000000000..88b8c54960 --- /dev/null +++ b/roles/nomad/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: Restart Nomad + systemd: + state: restarted + name: "{{ nomad_service_name }}" + listen: "restart nomad" diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index c38e8b3661..6d1bdb036e 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -21,6 +21,7 @@ ansible.builtin.template: src: nomad.hcl dest: /etc/nomad.d/nomad.hcl + notify: restart nomad - name: Start Nomad ansible.builtin.systemd: diff --git a/roles/nomad/templates/nomad.hcl b/roles/nomad/templates/nomad.hcl index 4bfeb72eea..ad6e41bcf7 100644 --- a/roles/nomad/templates/nomad.hcl +++ b/roles/nomad/templates/nomad.hcl @@ -19,4 +19,9 @@ server { client { enabled = true servers = ["0.0.0.0"] + + host_volume "docker_data" { + path = "{{ docker_home }}" + read_only = false + } } From 2d1823dcbc950483ab9e5a67e146cdf6f6ea75f4 Mon Sep 17 00:00:00 2001 From: Kycilak <105238216+Kycilak@users.noreply.github.com> Date: Sat, 19 Nov 2022 11:33:07 +0100 Subject: [PATCH 072/286] Update installation link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 787292d491..9e67c2b43d 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Ansible NAS doesn't set up your disk partitions, primarily because getting it wr ## Installation -See [Installation](https://davestephens.github.io/ansible-nas/installation/). +See [Installation](https://ansible-nas.io/docs/getting-started/installation/). ## Documentation From 317c8c055b82473b44925cc00b07ee8364f0a470 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 23 Nov 2022 22:53:07 +0000 Subject: [PATCH 073/286] Pin molecule-action to molecule 4.0.1 --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index b529dd158c..5bbebaefd6 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,7 @@ jobs: steps: - uses: actions/checkout@v3 - name: Molecule Test - uses: gofrolist/molecule-action@5d3b2497368889553ec8cbb2762ae577c33b3d89 + uses: gofrolist/molecule-action@dfbfd1af6a77523c8a937a1532f92808065a00a4 with: molecule_options: --base-config ../../tests/molecule/base.yml molecule_command: test From e29f21b354c1076daf8a870743e2b2f3fe41d946 Mon Sep 17 00:00:00 2001 From: Franciszek Korta Date: Mon, 5 Dec 2022 19:30:38 +0000 Subject: [PATCH 074/286] Use proper app name in speedtest help page --- website/docs/applications/monitoring/speedtest.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/applications/monitoring/speedtest.md b/website/docs/applications/monitoring/speedtest.md index 0d5eaa026f..d9f82ad92c 100644 --- a/website/docs/applications/monitoring/speedtest.md +++ b/website/docs/applications/monitoring/speedtest.md @@ -10,8 +10,8 @@ Continuously track your internet speed ## Usage -Set `speedtest_enabled: true` in your `inventories//nas.yml` file. +Set `speedtest_tracker_enabled: true` in your `inventories//nas.yml` file. -If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_available_externally: true` in your `inventories//nas.yml` file. +If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_tracker_available_externally: true` in your `inventories//nas.yml` file. The Speedtest-Tracker interface can be found at . From 6de2fb2276cc6080ee4a5c907e8e76ac23afb4da Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Wed, 7 Dec 2022 20:59:08 -0700 Subject: [PATCH 075/286] feature(mumble): add mumble configuration This should provide the necessary configuration to run the mumble server docker container, and also probably expose it externally. Refs: #620 --- roles/mumble/defaults/main.yaml | 17 ++++++++++++++ roles/mumble/tasks/main.yaml | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 roles/mumble/defaults/main.yaml create mode 100644 roles/mumble/tasks/main.yaml diff --git a/roles/mumble/defaults/main.yaml b/roles/mumble/defaults/main.yaml new file mode 100644 index 0000000000..b3465ac741 --- /dev/null +++ b/roles/mumble/defaults/main.yaml @@ -0,0 +1,17 @@ +--- +mumble_enabled: false +mumble_available_externally: false + +# Directories +mumble_data_directory: "{{ docker_home }}/mumble" + +# Networking +mumble_tcp_port: "64738" +mumble_udp_port: "64738" +mumble_hostname: mumble + +# Configuration +# It is strongly advised this password is change, especially if this is publicly available. +mumble_server_password: "abcpassword123" + +mumble_container_name: mumble-server diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yaml new file mode 100644 index 0000000000..6ea84b910c --- /dev/null +++ b/roles/mumble/tasks/main.yaml @@ -0,0 +1,40 @@ +--- +- name: Start Mumble + block: + - name: Create Mumble Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ mumble_data_directory }}" + + - name: Mumble Docker Container + docker_container: + name: mumble + image: mumblevoip/mumble-server:latest + pull: true + volumes: + - "{{ mumble_data_directory }}:/data:rw" + ports: + - "{{ mumble_tcp_port }}:64738/tcp" + - "{{ mumble_udp_port }}:64738/udp" + env: + # Setting the password prevents unwanted users from connecting to the instance, especially if publicly available. + MUMBLE_CONFIG_SERVER_PASSWORD: "{{ mumble_server_password }}" + restart_policy: unless-stopped + labels: + traefik.enable: "{{ mumble_available_externally | string }}" + traefik.http.routers.mumble.rule: "Host(`{{ mumble_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.mumble.tls.certresolver: "letsencrypt" + traefik.http.routers.mumble.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.mumble.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.mumble.loadbalancer.server.port: "64738" + when: mumble_enabled is true + +- name: Stop Mumble + block: + - name: Stop Mumble + docker_container: + name: "{{ mumble_container_name }}" + state: absent + when: mumble_enabled is false From 1f33ef3ba92cd86dfc75a79afa9b1997fbfe94f3 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Wed, 7 Dec 2022 21:35:11 -0700 Subject: [PATCH 076/286] feature(mumble): attempt correct permissions The data directory does not have permissions for access, so attempt to widen those permissions. Additionally, add the role if enabled, and add conditional to nomad role. Refs: 620 --- nas.yml | 6 ++++++ roles/mumble/tasks/main.yaml | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/nas.yml b/nas.yml index b71dcd3902..99c7c5b7f0 100644 --- a/nas.yml +++ b/nas.yml @@ -226,6 +226,11 @@ - mosquitto when: (mosquitto_enabled | default(False)) + - role: mumble + tags: + - mumble + when: (mumble_enabled | default(False)) + - role: mylar tags: - mylar @@ -264,6 +269,7 @@ - role: nomad tags: - nomad + when: (nomad_enabled | default(False)) - role: nzbget tags: diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yaml index 6ea84b910c..d3c9ffc91a 100644 --- a/roles/mumble/tasks/main.yaml +++ b/roles/mumble/tasks/main.yaml @@ -5,12 +5,13 @@ file: path: "{{ item }}" state: directory + mode: "0755" with_items: - "{{ mumble_data_directory }}" - name: Mumble Docker Container docker_container: - name: mumble + name: "{{ mumble_container_name }}" image: mumblevoip/mumble-server:latest pull: true volumes: From b0e69bd74b1623809519d98027cd596cc9212ed0 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Fri, 9 Dec 2022 17:22:47 -0700 Subject: [PATCH 077/286] refactor: open permissions The mumble docker image has the uid and gid baked in at image creation. In order for the application in the container to write to the mounted volume we're opening permissions to the mumble data directory. Refs: #620 --- roles/mumble/tasks/main.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yaml index d3c9ffc91a..f836ff2295 100644 --- a/roles/mumble/tasks/main.yaml +++ b/roles/mumble/tasks/main.yaml @@ -5,7 +5,9 @@ file: path: "{{ item }}" state: directory - mode: "0755" + # The mumble image gets uid/gid at build time, and uses 1000 for both, by default. + # This ends up with permission denied on the data directory, unless we fully open the permissions. + mode: "0777" with_items: - "{{ mumble_data_directory }}" From aeaecbafe468e1f0c4c91603f57055e031f422f9 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Fri, 9 Dec 2022 17:47:32 -0700 Subject: [PATCH 078/286] refactor(mumble): add molecule and readme; attempt permissions Add the expected molecule files as well as the readme for the role. Attempt to change permissions to the uid/gid used inside the Mumble container for the data directory. Refs: #620 --- roles/mumble/docs/mumble.md | 15 +++++++++++++++ roles/mumble/modlecule/default/molecule.yml | 7 +++++++ .../mumble/modlecule/default/side_effect.yml | 11 +++++++++++ roles/mumble/modlecule/default/verify.yml | 19 +++++++++++++++++++ .../modlecule/default/verify_stopped.yml | 19 +++++++++++++++++++ roles/mumble/tasks/main.yaml | 5 +++-- 6 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 roles/mumble/docs/mumble.md create mode 100644 roles/mumble/modlecule/default/molecule.yml create mode 100644 roles/mumble/modlecule/default/side_effect.yml create mode 100644 roles/mumble/modlecule/default/verify.yml create mode 100644 roles/mumble/modlecule/default/verify_stopped.yml diff --git a/roles/mumble/docs/mumble.md b/roles/mumble/docs/mumble.md new file mode 100644 index 0000000000..a166aac77f --- /dev/null +++ b/roles/mumble/docs/mumble.md @@ -0,0 +1,15 @@ +# Mumble + +Homepage: + +Mumble is a free, open source, low latency, high quality voice chat application. + +## Usage + +Set `mumble_enabled: true` in your `inventories//nas.yml` file. +The configuration here applies a server password, via `mumble_server_password`, to the Mumble instance, so that if you make this application available externally it won't be +accessible to everyone by default. That being said, it is **strongly** encouraged that +you change this value to something unique. + +Clients can then connect to the service at `ansible_nas_host_or_ip:64738` using the +password that you've definitely changed. diff --git a/roles/mumble/modlecule/default/molecule.yml b/roles/mumble/modlecule/default/molecule.yml new file mode 100644 index 0000000000..5513870a5a --- /dev/null +++ b/roles/mumble/modlecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + mumble_enabled: true + diff --git a/roles/mumble/modlecule/default/side_effect.yml b/roles/mumble/modlecule/default/side_effect.yml new file mode 100644 index 0000000000..3044d1c0ad --- /dev/null +++ b/roles/mumble/modlecule/default/side_effect.yml @@ -0,0 +1,11 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + mumble_enabled: false + diff --git a/roles/mumble/modlecule/default/verify.yml b/roles/mumble/modlecule/default/verify.yml new file mode 100644 index 0000000000..145baab774 --- /dev/null +++ b/roles/mumble/modlecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Get container state + docker_container_info: + name: "{{ mumble_container_name }}" + register: result + + - name: Check Mumble is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false + diff --git a/roles/mumble/modlecule/default/verify_stopped.yml b/roles/mumble/modlecule/default/verify_stopped.yml new file mode 100644 index 0000000000..7ebff65d7a --- /dev/null +++ b/roles/mumble/modlecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Mumble + docker_container: + name: "{{ mumble_container_name }}" + state: absent + register: result + + - name: Check Mumble is stopped + assert: + that: + - not result.changed + diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yaml index f836ff2295..569f14dd35 100644 --- a/roles/mumble/tasks/main.yaml +++ b/roles/mumble/tasks/main.yaml @@ -7,11 +7,12 @@ state: directory # The mumble image gets uid/gid at build time, and uses 1000 for both, by default. # This ends up with permission denied on the data directory, unless we fully open the permissions. - mode: "0777" + owner: 1000 + group: 1000 with_items: - "{{ mumble_data_directory }}" - - name: Mumble Docker Container + - name: Create Mumble Docker Container docker_container: name: "{{ mumble_container_name }}" image: mumblevoip/mumble-server:latest From af24f92684561986c1bb3f3ed5d71bb292634989 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Fri, 9 Dec 2022 17:56:16 -0700 Subject: [PATCH 079/286] chore(mumble): update permissions comment Update the permissions comment to explain what's going on. Stick with changing the ownership of the mumble data directory because it's slightly less gross than fully opening permissions of the folder. Refs: #620 --- roles/mumble/tasks/main.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yaml index 569f14dd35..b841ffc246 100644 --- a/roles/mumble/tasks/main.yaml +++ b/roles/mumble/tasks/main.yaml @@ -6,7 +6,7 @@ path: "{{ item }}" state: directory # The mumble image gets uid/gid at build time, and uses 1000 for both, by default. - # This ends up with permission denied on the data directory, unless we fully open the permissions. + # This ends up with permission denied on the data directory, unless we change ownership or fully open the permissions. owner: 1000 group: 1000 with_items: From 263ac760a898fdd2f7a1ef70d4b3cce4f51528d9 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Fri, 9 Dec 2022 17:58:48 -0700 Subject: [PATCH 080/286] chore: undo out of scope fix Revert the changes to fix the nomad bug since it's out of scope for this work. --- nas.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/nas.yml b/nas.yml index 99c7c5b7f0..755048d7ba 100644 --- a/nas.yml +++ b/nas.yml @@ -269,7 +269,6 @@ - role: nomad tags: - nomad - when: (nomad_enabled | default(False)) - role: nzbget tags: From 4f19f6ae47c1068cac5289c3c1901c32a1790e09 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Fri, 9 Dec 2022 18:28:14 -0700 Subject: [PATCH 081/286] refactor(mumble): lint and mv molecule directory The molecule directory was named incorrectly, and there were linting errors. Refs: #620 --- README.md | 1 + roles/mumble/docs/mumble.md | 3 ++- roles/mumble/{modlecule => molecule}/default/molecule.yml | 1 - roles/mumble/{modlecule => molecule}/default/side_effect.yml | 1 - roles/mumble/{modlecule => molecule}/default/verify.yml | 4 ++-- .../mumble/{modlecule => molecule}/default/verify_stopped.yml | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) rename roles/mumble/{modlecule => molecule}/default/molecule.yml (98%) rename roles/mumble/{modlecule => molecule}/default/side_effect.yml (99%) rename roles/mumble/{modlecule => molecule}/default/verify.yml (90%) rename roles/mumble/{modlecule => molecule}/default/verify_stopped.yml (88%) diff --git a/README.md b/README.md index 9e67c2b43d..4d20f59757 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ If you have a spare domain name you can configure applications to be accessible * [MiniDLNA](https://sourceforge.net/projects/minidlna/) - simple media server which is fully compliant with DLNA/UPnP-AV clients * [Miniflux](https://miniflux.app/) - An RSS news reader * [Mosquitto](https://mosquitto.org) - An open source MQTT broker +* [Mumble](https://www.mumble.info) - Open source, low latency, high quality voice chat * [Mylar](https://github.com/evilhero/mylar) - An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents * [MyMediaForAlexa](https://www.mymediaalexa.com/) - Lets you stream your music collection to your alexa device * [n8n](https://n8n.io/) - Nodemation, a node based workflow and automation service like IFTTT. diff --git a/roles/mumble/docs/mumble.md b/roles/mumble/docs/mumble.md index a166aac77f..9a71f1524f 100644 --- a/roles/mumble/docs/mumble.md +++ b/roles/mumble/docs/mumble.md @@ -7,7 +7,8 @@ Mumble is a free, open source, low latency, high quality voice chat application. ## Usage Set `mumble_enabled: true` in your `inventories//nas.yml` file. -The configuration here applies a server password, via `mumble_server_password`, to the Mumble instance, so that if you make this application available externally it won't be +The configuration here applies a server password, via `mumble_server_password`, to +the Mumble instance, so that if you make this application available externally it won't be accessible to everyone by default. That being said, it is **strongly** encouraged that you change this value to something unique. diff --git a/roles/mumble/modlecule/default/molecule.yml b/roles/mumble/molecule/default/molecule.yml similarity index 98% rename from roles/mumble/modlecule/default/molecule.yml rename to roles/mumble/molecule/default/molecule.yml index 5513870a5a..d6f75a6b79 100644 --- a/roles/mumble/modlecule/default/molecule.yml +++ b/roles/mumble/molecule/default/molecule.yml @@ -4,4 +4,3 @@ provisioner: group_vars: all: mumble_enabled: true - diff --git a/roles/mumble/modlecule/default/side_effect.yml b/roles/mumble/molecule/default/side_effect.yml similarity index 99% rename from roles/mumble/modlecule/default/side_effect.yml rename to roles/mumble/molecule/default/side_effect.yml index 3044d1c0ad..397569d226 100644 --- a/roles/mumble/modlecule/default/side_effect.yml +++ b/roles/mumble/molecule/default/side_effect.yml @@ -8,4 +8,3 @@ name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: mumble_enabled: false - diff --git a/roles/mumble/modlecule/default/verify.yml b/roles/mumble/molecule/default/verify.yml similarity index 90% rename from roles/mumble/modlecule/default/verify.yml rename to roles/mumble/molecule/default/verify.yml index 145baab774..ec53d8de6f 100644 --- a/roles/mumble/modlecule/default/verify.yml +++ b/roles/mumble/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state @@ -16,4 +17,3 @@ that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false - diff --git a/roles/mumble/modlecule/default/verify_stopped.yml b/roles/mumble/molecule/default/verify_stopped.yml similarity index 88% rename from roles/mumble/modlecule/default/verify_stopped.yml rename to roles/mumble/molecule/default/verify_stopped.yml index 7ebff65d7a..da429ba804 100644 --- a/roles/mumble/modlecule/default/verify_stopped.yml +++ b/roles/mumble/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Mumble @@ -16,4 +17,3 @@ assert: that: - not result.changed - From 0f1dcd0eb843a0ebae5f63df09fedc8dbf5d4db2 Mon Sep 17 00:00:00 2001 From: "Justin D. Fetherolf" Date: Sat, 10 Dec 2022 11:28:03 -0700 Subject: [PATCH 082/286] refactor(mumble): properly disable Don't default disable the mumble role; this will be taken care of in `tasks/main.yml` Refs: #620 --- nas.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/nas.yml b/nas.yml index 755048d7ba..60d747154d 100644 --- a/nas.yml +++ b/nas.yml @@ -229,7 +229,6 @@ - role: mumble tags: - mumble - when: (mumble_enabled | default(False)) - role: mylar tags: From 91d5b9213a91dd9b2bca050bdc282322c0a6daf0 Mon Sep 17 00:00:00 2001 From: JokerGermany <30293477+JokerGermany@users.noreply.github.com> Date: Tue, 27 Dec 2022 23:16:34 +0100 Subject: [PATCH 083/286] jellyfin url changed looks like the url changed --- website/docs/applications/media-serving/jellyfin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/applications/media-serving/jellyfin.md b/website/docs/applications/media-serving/jellyfin.md index ec24d3b422..939177de2b 100644 --- a/website/docs/applications/media-serving/jellyfin.md +++ b/website/docs/applications/media-serving/jellyfin.md @@ -2,7 +2,7 @@ title: "Jellyfin" --- -Homepage: +Homepage: Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! From 7d403e880f88aa97d84a6ba7586598400c7fcb29 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 7 Jan 2023 15:26:28 +0100 Subject: [PATCH 084/286] Fix Drone-CI test error --- roles/drone-ci/handlers/main.yml | 8 +++++++ roles/drone-ci/molecule/default/molecule.yml | 3 +++ roles/drone-ci/molecule/default/prepare.yml | 25 ++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 roles/drone-ci/handlers/main.yml create mode 100644 roles/drone-ci/molecule/default/prepare.yml diff --git a/roles/drone-ci/handlers/main.yml b/roles/drone-ci/handlers/main.yml new file mode 100644 index 0000000000..f96a6c2bef --- /dev/null +++ b/roles/drone-ci/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: restart gitea + community.docker.docker_container: + name: gitea + image: gitea/gitea:latest + state: started + restart: true + listen: "restart gitea" \ No newline at end of file diff --git a/roles/drone-ci/molecule/default/molecule.yml b/roles/drone-ci/molecule/default/molecule.yml index 0671311d0c..6e293974d6 100644 --- a/roles/drone-ci/molecule/default/molecule.yml +++ b/roles/drone-ci/molecule/default/molecule.yml @@ -8,3 +8,6 @@ provisioner: drone_ci_gitea_client_secret: asdfasd12341234 gitea_port_http: 3001 ansible_nas_hostname: ansible-nas-ci + gitea_data_directory: "/tmp" + playbooks: + prepare: prepare.yml diff --git a/roles/drone-ci/molecule/default/prepare.yml b/roles/drone-ci/molecule/default/prepare.yml new file mode 100644 index 0000000000..144e66215a --- /dev/null +++ b/roles/drone-ci/molecule/default/prepare.yml @@ -0,0 +1,25 @@ +--- +- name: Prepare + hosts: all + tasks: + - name: Install docker python module + pip: + name: docker + + - name: Create a dummy gitea config directory + file: + path: "{{ item }}" + state: directory + recurse: yes + with_items: + - "{{ gitea_data_directory }}/gitea/gitea/conf" + + - name: Create a dummy gitea config file + file: + path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + state: touch + + handlers: + - name: restart gitea + command: echo "this task will restart gitea" + listen: "restart gitea" \ No newline at end of file From 98cd41f9fcad5764d70f92800df7e99e7f7dd949 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 7 Jan 2023 15:29:54 +0100 Subject: [PATCH 085/286] Remove unnecessary handler --- roles/drone-ci/molecule/default/prepare.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/roles/drone-ci/molecule/default/prepare.yml b/roles/drone-ci/molecule/default/prepare.yml index 144e66215a..343f1e6fb5 100644 --- a/roles/drone-ci/molecule/default/prepare.yml +++ b/roles/drone-ci/molecule/default/prepare.yml @@ -18,8 +18,3 @@ file: path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" state: touch - - handlers: - - name: restart gitea - command: echo "this task will restart gitea" - listen: "restart gitea" \ No newline at end of file From 934e3a4307a5060925fb0cece213e9cce5fbef16 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 7 Jan 2023 15:59:14 +0100 Subject: [PATCH 086/286] Fix lint --- roles/drone-ci/handlers/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/drone-ci/handlers/main.yml b/roles/drone-ci/handlers/main.yml index f96a6c2bef..991c4bcc86 100644 --- a/roles/drone-ci/handlers/main.yml +++ b/roles/drone-ci/handlers/main.yml @@ -1,8 +1,8 @@ --- -- name: restart gitea +- name: Restart gitea community.docker.docker_container: name: gitea image: gitea/gitea:latest state: started restart: true - listen: "restart gitea" \ No newline at end of file + listen: "restart gitea" From 9168b490bb250846ef60bc4ec3ad0f291f674ca4 Mon Sep 17 00:00:00 2001 From: choskeli <98036866+choskeli@users.noreply.github.com> Date: Fri, 27 Jan 2023 23:20:24 -0500 Subject: [PATCH 087/286] update vaultwarden image --- README.md | 2 +- roles/bitwarden/tasks/main.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9e67c2b43d..955ba8ab49 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you have a spare domain name you can configure applications to be accessible * [Airsonic](https://airsonic.github.io/) - catalog and stream music * [Bazarr](https://github.com/morpheus65535/bazarr) - companion to Radarr and Sonarr for downloading subtitles -* [Bitwarden_rs](https://github.com/dani-garcia/bitwarden_rs) - Self-Hosting port of password manager +* [Bitwarden](https://github.com/dani-garcia/vaultwarden) - Password Manger (Technically Vaultwarden, a lightweight implementation in Rust) * [Booksonic](https://booksonic.org/) - The selfhosted audiobook server * [Calibre-web](https://github.com/janeczku/calibre-web) - Provides a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. * [Code Server](https://code.visualstudio.com/) - Powerful IDE from Microsoft accessible through the browser diff --git a/roles/bitwarden/tasks/main.yml b/roles/bitwarden/tasks/main.yml index e89d682a19..3ad680bd09 100644 --- a/roles/bitwarden/tasks/main.yml +++ b/roles/bitwarden/tasks/main.yml @@ -12,7 +12,7 @@ - name: Bitwarden Docker Container docker_container: name: "{{ bitwarden_container_name }}" - image: bitwardenrs/server:latest + image: vaultwarden/server:latest pull: true ports: - "{{ bitwarden_port_a }}:80" From 66de80567d8dad8128c67ffe65f49b9cca9234dd Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 31 Jan 2023 00:13:44 +0000 Subject: [PATCH 088/286] Fix Nomad start and stop reliability --- roles/nomad/tasks/main.yml | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index 6d1bdb036e..117da3ed8d 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -32,9 +32,23 @@ - name: Stop Nomad block: - - name: Stop Nomad - ansible.builtin.systemd: - name: "{{ nomad_service_name }}" - state: stopped - enabled: no + - name: Check if Nomad is installed + stat: + path: /usr/bin/nomad + register: nomad_install + + - block: + - name: Stop Nomad + ansible.builtin.systemd: + name: "{{ nomad_service_name }}" + state: stopped + enabled: no + daemon_reload: yes + + - name: Uninstall Nomad + ansible.builtin.apt: + name: nomad + state: absent + + when: nomad_install.stat.exists when: nomad_enabled is false From 3f35049a21f728bcdc610ced221c84182dde2170 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 31 Jan 2023 00:37:13 +0000 Subject: [PATCH 089/286] Flip to Vaultwarden image, fixes #643 --- roles/bitwarden/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/bitwarden/tasks/main.yml b/roles/bitwarden/tasks/main.yml index e89d682a19..3ad680bd09 100644 --- a/roles/bitwarden/tasks/main.yml +++ b/roles/bitwarden/tasks/main.yml @@ -12,7 +12,7 @@ - name: Bitwarden Docker Container docker_container: name: "{{ bitwarden_container_name }}" - image: bitwardenrs/server:latest + image: vaultwarden/server:latest pull: true ports: - "{{ bitwarden_port_a }}:80" From 168ca111cb890d0d797363a300a810975e098140 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 5 Feb 2023 23:26:12 +0000 Subject: [PATCH 090/286] Fix Nomad linting --- roles/nomad/tasks/main.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index 117da3ed8d..0165ec80a3 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -38,17 +38,17 @@ register: nomad_install - block: - - name: Stop Nomad - ansible.builtin.systemd: - name: "{{ nomad_service_name }}" - state: stopped - enabled: no - daemon_reload: yes - - - name: Uninstall Nomad - ansible.builtin.apt: - name: nomad - state: absent + - name: Stop Nomad + ansible.builtin.systemd: + name: "{{ nomad_service_name }}" + state: stopped + enabled: no + daemon_reload: yes + + - name: Uninstall Nomad + ansible.builtin.apt: + name: nomad + state: absent when: nomad_install.stat.exists when: nomad_enabled is false From a7b17cfcc05240b4546fb9af2cf6e1c57b73fecf Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:14:24 +0100 Subject: [PATCH 091/286] Add cache-dependency path --- .github/workflows/docs-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 5a8a919a3f..4270ff491d 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -26,6 +26,7 @@ jobs: with: node-version: 18 cache: yarn + cache-dependency-path: website/package-lock.json - name: Install dependencies run: yarn install --frozen-lockfile From a0961a98f57f5e81ff4d8a3d9013a7408d55482f Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:21:03 +0100 Subject: [PATCH 092/286] Enable workflow dispatch --- .github/workflows/docs-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 4270ff491d..9026e4d258 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -5,6 +5,7 @@ on: pull_request: branches: - master + workflow_dispatch: jobs: lint: From 3dce6ad0cdffaddc8ae9eb4dec215cfa9b8598b4 Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:30:29 +0100 Subject: [PATCH 093/286] Update workflow --- .github/workflows/docs-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 9026e4d258..c70bf74139 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -5,6 +5,7 @@ on: pull_request: branches: - master + - fix-docs-test workflow_dispatch: jobs: From 0c8b0301d3483075284f2946e43cfb2ef5e8b9bc Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:31:54 +0100 Subject: [PATCH 094/286] Update workflow --- .github/workflows/docs-test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index c70bf74139..18da65c44e 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -6,6 +6,8 @@ on: branches: - master - fix-docs-test + push: + branches: [fix-docs-test] workflow_dispatch: jobs: From f22cafc7731dfbb9ada2a0fa9212a6d19567867f Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:36:00 +0100 Subject: [PATCH 095/286] Add default working directory --- .github/workflows/docs-test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 18da65c44e..de12025622 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -24,6 +24,9 @@ jobs: test-deploy: name: Test deployment runs-on: ubuntu-latest + defaults: + run: + working-directory: website steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v3 From 3084aa2d3bfbda96c9d5ad9cb83fe003954c9e26 Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:39:12 +0100 Subject: [PATCH 096/286] Try with npm instead of yarn --- .github/workflows/docs-test.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index de12025622..49df666561 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -32,10 +32,15 @@ jobs: - uses: actions/setup-node@v3 with: node-version: 18 - cache: yarn + cache: npm cache-dependency-path: website/package-lock.json + # - name: Install dependencies + # run: yarn install --frozen-lockfile + # - name: Test build website + # run: yarn build - name: Install dependencies - run: yarn install --frozen-lockfile - - name: Test build website - run: yarn build \ No newline at end of file + run: npm ci + + - name: Build website + run: npm run build \ No newline at end of file From 93235fea0c588052a196bc4e39a97cc85f14df50 Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 15 Feb 2023 12:42:04 +0100 Subject: [PATCH 097/286] Cleanup temporary stuff --- .github/workflows/docs-test.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/docs-test.yml b/.github/workflows/docs-test.yml index 49df666561..a4972ca9fb 100644 --- a/.github/workflows/docs-test.yml +++ b/.github/workflows/docs-test.yml @@ -5,10 +5,6 @@ on: pull_request: branches: - master - - fix-docs-test - push: - branches: [fix-docs-test] - workflow_dispatch: jobs: lint: @@ -35,10 +31,6 @@ jobs: cache: npm cache-dependency-path: website/package-lock.json - # - name: Install dependencies - # run: yarn install --frozen-lockfile - # - name: Test build website - # run: yarn build - name: Install dependencies run: npm ci From bcee9bf5a0a5edf2184852a4001e4362d9af0214 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 18 Feb 2023 15:35:37 +0000 Subject: [PATCH 098/286] Name unnamed block --- roles/nomad/tasks/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index 0165ec80a3..f11a764e71 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -37,7 +37,8 @@ path: /usr/bin/nomad register: nomad_install - - block: + - name: Stop and Uninstall Nomad + block: - name: Stop Nomad ansible.builtin.systemd: name: "{{ nomad_service_name }}" From 917c8c4d46f950d301b8ccd033ae66aaaa900ec5 Mon Sep 17 00:00:00 2001 From: Anarion Date: Mon, 6 Mar 2023 10:53:42 +0100 Subject: [PATCH 099/286] :sparkles: Add badge with role count --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 955ba8ab49..927037e15b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ You can configure Ansible-NAS to set up any (or all!) of the applications listed If you have a spare domain name you can configure applications to be accessible externally to your home LAN too; they'll be configured with a sensible hostname and DNS gets updated accordingly if your home IP address changes. -## Available Applications +## Available Applications ![Roles](https://img.shields.io/github/directory-file-count/davestephens/ansible-nas/roles?label=Roles) * [Airsonic](https://airsonic.github.io/) - catalog and stream music * [Bazarr](https://github.com/morpheus65535/bazarr) - companion to Radarr and Sonarr for downloading subtitles From 496028663236bfc417a9830f1cce253b7b789686 Mon Sep 17 00:00:00 2001 From: Anarion Date: Wed, 8 Mar 2023 21:47:39 +0100 Subject: [PATCH 100/286] First portion of migration freshrss, get_iplayer, gitlab, glances, gotify, guacamole, healthchecks.io --- ansible-nas.code-workspace | 15 +++ nas.yml | 7 -- roles/freshrss/defaults/main.yml | 5 + roles/freshrss/docs/freshrss.md | 21 ++++ roles/freshrss/molecule/default/molecule.yml | 6 + .../freshrss/molecule/default/side_effect.yml | 10 ++ roles/freshrss/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/freshrss/tasks/main.yml | 72 ++++++----- roles/get_iplayer/defaults/main.yml | 5 + roles/get_iplayer/docs/get_iplayer.md | 11 ++ .../get_iplayer/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/get_iplayer/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/get_iplayer/tasks/main.yml | 50 +++++--- roles/gitlab/defaults/main.yml | 7 ++ roles/gitlab/docs/gitlab.md | 13 ++ roles/gitlab/molecule/default/molecule.yml | 6 + roles/gitlab/molecule/default/side_effect.yml | 10 ++ roles/gitlab/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/gitlab/tasks/main.yml | 118 ++++++++++-------- roles/glances/defaults/main.yml | 5 + roles/glances/docs/glances.md | 15 +++ roles/glances/molecule/default/molecule.yml | 6 + .../glances/molecule/default/side_effect.yml | 10 ++ roles/glances/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/glances/tasks/main.yml | 60 +++++---- roles/gotify/defaults/main.yml | 8 +- roles/gotify/docs/gotify.md | 16 +++ roles/gotify/molecule/default/molecule.yml | 6 + roles/gotify/molecule/default/side_effect.yml | 10 ++ roles/gotify/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/gotify/tasks/main.yml | 70 ++++++----- roles/guacamole/defaults/main.yml | 5 + roles/guacamole/docs/guacamole.md | 17 +++ roles/guacamole/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/guacamole/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/guacamole/tasks/main.yml | 102 ++++++++------- roles/healthchecks.io/docs/healthchecks.io.md | 11 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/healthchecks.io/tasks/main.yml | 24 +++- 50 files changed, 818 insertions(+), 217 deletions(-) create mode 100644 ansible-nas.code-workspace create mode 100644 roles/freshrss/docs/freshrss.md create mode 100644 roles/freshrss/molecule/default/molecule.yml create mode 100644 roles/freshrss/molecule/default/side_effect.yml create mode 100644 roles/freshrss/molecule/default/verify.yml create mode 100644 roles/freshrss/molecule/default/verify_stopped.yml create mode 100644 roles/get_iplayer/docs/get_iplayer.md create mode 100644 roles/get_iplayer/molecule/default/molecule.yml create mode 100644 roles/get_iplayer/molecule/default/side_effect.yml create mode 100644 roles/get_iplayer/molecule/default/verify.yml create mode 100644 roles/get_iplayer/molecule/default/verify_stopped.yml create mode 100644 roles/gitlab/docs/gitlab.md create mode 100644 roles/gitlab/molecule/default/molecule.yml create mode 100644 roles/gitlab/molecule/default/side_effect.yml create mode 100644 roles/gitlab/molecule/default/verify.yml create mode 100644 roles/gitlab/molecule/default/verify_stopped.yml create mode 100644 roles/glances/docs/glances.md create mode 100644 roles/glances/molecule/default/molecule.yml create mode 100644 roles/glances/molecule/default/side_effect.yml create mode 100644 roles/glances/molecule/default/verify.yml create mode 100644 roles/glances/molecule/default/verify_stopped.yml create mode 100644 roles/gotify/docs/gotify.md create mode 100644 roles/gotify/molecule/default/molecule.yml create mode 100644 roles/gotify/molecule/default/side_effect.yml create mode 100644 roles/gotify/molecule/default/verify.yml create mode 100644 roles/gotify/molecule/default/verify_stopped.yml create mode 100644 roles/guacamole/docs/guacamole.md create mode 100644 roles/guacamole/molecule/default/molecule.yml create mode 100644 roles/guacamole/molecule/default/side_effect.yml create mode 100644 roles/guacamole/molecule/default/verify.yml create mode 100644 roles/guacamole/molecule/default/verify_stopped.yml create mode 100644 roles/healthchecks.io/docs/healthchecks.io.md create mode 100644 roles/healthchecks.io/molecule/default/molecule.yml create mode 100644 roles/healthchecks.io/molecule/default/side_effect.yml create mode 100644 roles/healthchecks.io/molecule/default/verify.yml create mode 100644 roles/healthchecks.io/molecule/default/verify_stopped.yml diff --git a/ansible-nas.code-workspace b/ansible-nas.code-workspace new file mode 100644 index 0000000000..cec4ab85f1 --- /dev/null +++ b/ansible-nas.code-workspace @@ -0,0 +1,15 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "yaml.schemas": { + "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible.json#/$defs/tasks": "file:///c%3A/Users/anarion/Documents/repos/ansible-nas/roles/immich/tasks/main.yml" + }, + "files.associations": { + "*.yaml": "home-assistant" + } + }, +} \ No newline at end of file diff --git a/nas.yml b/nas.yml index b71dcd3902..bf2eff1873 100644 --- a/nas.yml +++ b/nas.yml @@ -116,12 +116,10 @@ - role: freshrss tags: - freshrss - when: (freshrss_enabled | default(False)) - role: get_iplayer tags: - get_iplayer - when: (get_iplayer_enabled | default(False)) - role: gitea tags: @@ -130,27 +128,22 @@ - role: gitlab tags: - gitlab - when: (gitlab_enabled | default(False)) - role: glances tags: - glances - when: (glances_enabled | default(False)) - role: gotify tags: - gotify - when: (gotify_enabled | default(False)) - role: guacamole tags: - guacamole - when: (guacamole_enabled | default(False)) - role: healthchecks.io tags: - healthchecks.io - when: (healthchecks_enabled | default(False)) - role: heimdall tags: diff --git a/roles/freshrss/defaults/main.yml b/roles/freshrss/defaults/main.yml index a662c44209..9dcc3401cd 100644 --- a/roles/freshrss/defaults/main.yml +++ b/roles/freshrss/defaults/main.yml @@ -10,5 +10,10 @@ freshrss_extensions_directory: "{{ docker_home }}/freshrss" freshrss_port: "8089" freshrss_hostname: "freshrss" +# docker +freshrss_container_name: freshrss +freshrss_image_name: "freshrss/freshrss" +freshrss_image_version: latest + # specs freshrss_memory: 1g diff --git a/roles/freshrss/docs/freshrss.md b/roles/freshrss/docs/freshrss.md new file mode 100644 index 0000000000..d9cc30c990 --- /dev/null +++ b/roles/freshrss/docs/freshrss.md @@ -0,0 +1,21 @@ +# Freshrss + +Homepage: + +FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed. + +It is lightweight, easy to work with, powerful, and customizable. + +It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface. + +Thanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc. + +FreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed. + +Finally, it supports extensions for further tuning. + +## Usage + +Set `freshrss_enabled: true` in your `inventories//nas.yml` file. + +The FreshRSS web interface can be found at . diff --git a/roles/freshrss/molecule/default/molecule.yml b/roles/freshrss/molecule/default/molecule.yml new file mode 100644 index 0000000000..76523f3fda --- /dev/null +++ b/roles/freshrss/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + freshrss_enabled: true diff --git a/roles/freshrss/molecule/default/side_effect.yml b/roles/freshrss/molecule/default/side_effect.yml new file mode 100644 index 0000000000..da69dc58fd --- /dev/null +++ b/roles/freshrss/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + freshrss_enabled: false diff --git a/roles/freshrss/molecule/default/verify.yml b/roles/freshrss/molecule/default/verify.yml new file mode 100644 index 0000000000..08aa5ccab1 --- /dev/null +++ b/roles/freshrss/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get freshrss container state + community.docker.docker_container: + name: "{{ freshrss_container_name }}" + register: result + + - name: Check if freshrss containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/freshrss/molecule/default/verify_stopped.yml b/roles/freshrss/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f25fad5b5c --- /dev/null +++ b/roles/freshrss/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove freshrss + community.docker.docker_container: + name: "{{ freshrss_container_name }}" + state: absent + register: result + + - name: Check if freshrss is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/freshrss/tasks/main.yml b/roles/freshrss/tasks/main.yml index c39bd64d3c..74494d2cf6 100644 --- a/roles/freshrss/tasks/main.yml +++ b/roles/freshrss/tasks/main.yml @@ -1,32 +1,44 @@ --- -- name: Create FreshRSS Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ freshrss_data_directory }}/data" - - "{{ freshrss_extensions_directory }}/extensions" +- name: Start FreshRSS + block: + - name: Create FreshRSS Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ freshrss_data_directory }}/data" + - "{{ freshrss_extensions_directory }}/extensions" -- name: FreshRSS Docker Container - docker_container: - name: freshrss - image: freshrss/freshrss - pull: true - volumes: - - "{{ freshrss_data_directory }}/data:/var/www/FreshRSS/data:rw" - - "{{ freshrss_extensions_directory }}/extensions:/var/www/FreshRSS/extensions:rw" - ports: - - "{{ freshrss_port }}:80" - env: - TZ: "{{ ansible_nas_timezone }}" - CRON_MIN: "1,31" - restart_policy: unless-stopped - memory: "{{ freshrss_memory }}" - labels: - traefik.enable: "{{ freshrss_available_externally | string }}" - traefik.http.routers.freshrss.rule: "Host(`{{ freshrss_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.freshrss.tls.certresolver: "letsencrypt" - traefik.http.routers.freshrss.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.freshrss.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.freshrss.loadbalancer.server.port: "80" + - name: FreshRSS Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ freshrss_container_name }}" + image: "{{ freshrss_image_name }}:{{ freshrss_image_version }}" + pull: true + volumes: + - "{{ freshrss_data_directory }}/data:/var/www/FreshRSS/data:rw" + - "{{ freshrss_extensions_directory }}/extensions:/var/www/FreshRSS/extensions:rw" + ports: + - "{{ freshrss_port }}:80" + env: + TZ: "{{ ansible_nas_timezone }}" + CRON_MIN: "1,31" + restart_policy: unless-stopped + memory: "{{ freshrss_memory }}" + labels: + traefik.enable: "{{ freshrss_available_externally | string }}" + traefik.http.routers.freshrss.rule: "Host(`{{ freshrss_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.freshrss.tls.certresolver: "letsencrypt" + traefik.http.routers.freshrss.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.freshrss.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.freshrss.loadbalancer.server.port: "80" + when: freshrss_enabled is true + + +- name: Stop FreshRSS + block: + - name: Stop FreshRSS + community.docker.docker_container: + name: "{{ freshrss_container_name }}" + state: absent + when: freshrss_enabled is false diff --git a/roles/get_iplayer/defaults/main.yml b/roles/get_iplayer/defaults/main.yml index c45a0124a6..56aac558e5 100644 --- a/roles/get_iplayer/defaults/main.yml +++ b/roles/get_iplayer/defaults/main.yml @@ -8,5 +8,10 @@ get_iplayer_download_directory: "{{ tv_root }}/iplayer_downloads" # network get_iplayer_port: "8182" +# docker +get_iplayer_container_name: "get_iplayer" +get_iplayer_image_name: "kolonuk/get_iplayer" +get_iplayer_image_version: "latest" + # specs get_iplayer_memory: "1g" diff --git a/roles/get_iplayer/docs/get_iplayer.md b/roles/get_iplayer/docs/get_iplayer.md new file mode 100644 index 0000000000..48173c248d --- /dev/null +++ b/roles/get_iplayer/docs/get_iplayer.md @@ -0,0 +1,11 @@ +# Get_iPlayer + +Homepage: + +Downloads TV and radio programmes from BBC iPlayer. + +## Usage + +Set `get_iplayer_enabled: true` in your `inventories//nas.yml` file. + +The get_iplayer web interface can be found at . diff --git a/roles/get_iplayer/molecule/default/molecule.yml b/roles/get_iplayer/molecule/default/molecule.yml new file mode 100644 index 0000000000..02aa4913a2 --- /dev/null +++ b/roles/get_iplayer/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + get_iplayer_enabled: true diff --git a/roles/get_iplayer/molecule/default/side_effect.yml b/roles/get_iplayer/molecule/default/side_effect.yml new file mode 100644 index 0000000000..b867185510 --- /dev/null +++ b/roles/get_iplayer/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + get_iplayer_enabled: false diff --git a/roles/get_iplayer/molecule/default/verify.yml b/roles/get_iplayer/molecule/default/verify.yml new file mode 100644 index 0000000000..e702ec7b8c --- /dev/null +++ b/roles/get_iplayer/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get get_iplayer container state + community.docker.docker_container: + name: "{{ get_iplayer_container_name }}" + register: result + + - name: Check if get_iplayer containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/get_iplayer/molecule/default/verify_stopped.yml b/roles/get_iplayer/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..dfe2162114 --- /dev/null +++ b/roles/get_iplayer/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove get_iplayer + community.docker.docker_container: + name: "{{ get_iplayer_container_name }}" + state: absent + register: result + + - name: Check if get_iplayer is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/get_iplayer/tasks/main.yml b/roles/get_iplayer/tasks/main.yml index 4f05f6e919..4db0cb8f4d 100644 --- a/roles/get_iplayer/tasks/main.yml +++ b/roles/get_iplayer/tasks/main.yml @@ -1,21 +1,33 @@ --- -- name: Create get_iplayer Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ get_iplayer_config_directory }}" - - "{{ get_iplayer_download_directory }}" +- name: Start get_iplayer + block: + - name: Create get_iplayer Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ get_iplayer_config_directory }}" + - "{{ get_iplayer_download_directory }}" -- name: Get_iplayer Docker Container - docker_container: - name: get_iplayer - image: kolonuk/get_iplayer - pull: true - volumes: - - "{{ get_iplayer_config_directory }}:/root/.get_iplayer:rw" - - "{{ get_iplayer_download_directory }}:/root/output:rw" - ports: - - "{{ get_iplayer_port }}:8181" - restart_policy: unless-stopped - memory: "{{ get_iplayer_memory }}" + - name: Create get_iplayer Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ get_iplayer_container_name }}" + image: "{{ get_iplayer_image_name }}:{{ get_iplayer_image_version }}" + pull: true + volumes: + - "{{ get_iplayer_config_directory }}:/root/.get_iplayer:rw" + - "{{ get_iplayer_download_directory }}:/root/output:rw" + ports: + - "{{ get_iplayer_port }}:8181" + restart_policy: unless-stopped + memory: "{{ get_iplayer_memory }}" + when: get_iplayer_enabled is true + +- name: Stop get_iplayer + block: + - name: Stop get_iplayer + community.docker.docker_container: + name: "{{ get_iplayer_container_name }}" + state: absent + when: get_iplayer_enabled is false diff --git a/roles/gitlab/defaults/main.yml b/roles/gitlab/defaults/main.yml index d663eb2f49..db33f9d7e6 100644 --- a/roles/gitlab/defaults/main.yml +++ b/roles/gitlab/defaults/main.yml @@ -12,5 +12,12 @@ gitlab_port_http: "4080" gitlab_port_https: "4443" gitlab_port_ssh: "422" +# docker +gitlab_container_name: "gitlab" +gitlab_image_name: "gitlab/gitlab-ce" +gitlab_image_version: "latest" +gitlab_user_id: "1000" +gitlab_group_id: "1000" + # specs gitlab_memory: "4g" diff --git a/roles/gitlab/docs/gitlab.md b/roles/gitlab/docs/gitlab.md new file mode 100644 index 0000000000..f1b6873fdd --- /dev/null +++ b/roles/gitlab/docs/gitlab.md @@ -0,0 +1,13 @@ +# GitLab + +Homepage: + +If Gitea isn't powerful enough for you then consider GitLab. It's a much more powerful (and consequently bigger) Git repository solution that includes a suite of code analytics. On the other hand it requires more RAM. + +## Usage + +Set `gitlab_enabled: true` in your `inventories//nas.yml` file. + +To make GitLab available externally via Traefik set `gitlab_available_externally: true` in your `inventories//nas.yml` file. + +The first time you run GitLab you'll be prompted for an account's password. The password is for GitLab's `root` administrator account. From there you can log in to create additional users and further configure the application. diff --git a/roles/gitlab/molecule/default/molecule.yml b/roles/gitlab/molecule/default/molecule.yml new file mode 100644 index 0000000000..177a9b8c74 --- /dev/null +++ b/roles/gitlab/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + gitlab_enabled: true diff --git a/roles/gitlab/molecule/default/side_effect.yml b/roles/gitlab/molecule/default/side_effect.yml new file mode 100644 index 0000000000..1c319b0170 --- /dev/null +++ b/roles/gitlab/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + gitlab_enabled: false diff --git a/roles/gitlab/molecule/default/verify.yml b/roles/gitlab/molecule/default/verify.yml new file mode 100644 index 0000000000..318e6b65fd --- /dev/null +++ b/roles/gitlab/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get gitlab container state + community.docker.docker_container: + name: "{{ gitlab_container_name }}" + register: result + + - name: Check if gitlab containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/gitlab/molecule/default/verify_stopped.yml b/roles/gitlab/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..46bcc078d3 --- /dev/null +++ b/roles/gitlab/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove gitlab + community.docker.docker_container: + name: "{{ gitlab_container_name }}" + state: absent + register: result + + - name: Check if gitlab is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/gitlab/tasks/main.yml b/roles/gitlab/tasks/main.yml index 31f2d4c97f..549da0b29a 100644 --- a/roles/gitlab/tasks/main.yml +++ b/roles/gitlab/tasks/main.yml @@ -1,57 +1,69 @@ --- -# The gitlab uid/gid matches 'git:git' in the Gitlab Docker image. -- name: Create Gitlab group account - group: - name: gitlab - gid: 998 - state: present +- name: Start Gitlab + block: + # The gitlab uid/gid matches 'git:git' in the Gitlab Docker image. + - name: Create Gitlab group account + group: + name: gitlab + gid: 998 + state: present -- name: Create Gitlab user account - user: - name: gitlab - uid: 998 - state: present - system: yes - update_password: on_create - create_home: no - group: gitlab + - name: Create Gitlab user account + user: + name: gitlab + uid: 998 + state: present + system: yes + update_password: on_create + create_home: no + group: gitlab -- name: Create Gitlab Directories - file: - path: "{{ item }}" - state: directory - owner: gitlab - group: gitlab - with_items: - - "{{ gitlab_data_directory }}/config" - - "{{ gitlab_data_directory }}/log" - - "{{ gitlab_data_directory }}/data" + - name: Create Gitlab Directories + file: + path: "{{ item }}" + state: directory + owner: gitlab + group: gitlab + with_items: + - "{{ gitlab_data_directory }}/config" + - "{{ gitlab_data_directory }}/log" + - "{{ gitlab_data_directory }}/data" -- name: Create Gitlab Docker Container - docker_container: - name: gitlab - image: gitlab/gitlab-ce:latest - pull: true - volumes: - - "{{ gitlab_data_directory }}/config:/etc/gitlab:rw" - - "{{ gitlab_data_directory }}/log:/var/log/gitlab:rw" - - "{{ gitlab_data_directory }}/data:/var/opt/gitlab:rw" - network_mode: "bridge" - ports: - - "{{ gitlab_port_http }}:80" - - "{{ gitlab_port_https }}:443" - - "{{ gitlab_port_ssh }}:22" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ gitlab_user_id }}" - PGID: "{{ gitlab_group_id }}" - restart_policy: unless-stopped - hostname: "{{ gitlab_hostname }}.{{ ansible_nas_domain }}" - memory: "{{ gitlab_memory }}" - labels: - traefik.enable: "{{ gitlab_available_externally | string }}" - traefik.http.routers.gitlab.rule: "Host(`{{ gitlab_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.gitlab.tls.certresolver: "letsencrypt" - traefik.http.routers.gitlab.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.gitlab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.gitlab.loadbalancer.server.port: "80" + - name: Create Gitlab Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ gitlab_container_name }}" + image: "{{ gitlab_image_name }}:{{ gitlab_image_version }}" + pull: true + volumes: + - "{{ gitlab_data_directory }}/config:/etc/gitlab:rw" + - "{{ gitlab_data_directory }}/log:/var/log/gitlab:rw" + - "{{ gitlab_data_directory }}/data:/var/opt/gitlab:rw" + network_mode: "bridge" + ports: + - "{{ gitlab_port_http }}:80" + - "{{ gitlab_port_https }}:443" + - "{{ gitlab_port_ssh }}:22" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ gitlab_user_id }}" + PGID: "{{ gitlab_group_id }}" + restart_policy: unless-stopped + hostname: "{{ gitlab_hostname }}.{{ ansible_nas_domain }}" + memory: "{{ gitlab_memory }}" + labels: + traefik.enable: "{{ gitlab_available_externally | string }}" + traefik.http.routers.gitlab.rule: "Host(`{{ gitlab_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.gitlab.tls.certresolver: "letsencrypt" + traefik.http.routers.gitlab.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.gitlab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.gitlab.loadbalancer.server.port: "80" + when: gitlab_enabled is true + +- name: Stop Gitlab + block: + - name: Stop Gitlab + community.docker.docker_container: + name: "{{ gitlab_container_name }}" + state: absent + when: gitlab_enabled is false diff --git a/roles/glances/defaults/main.yml b/roles/glances/defaults/main.yml index d5fbc587a1..f54f5beae2 100644 --- a/roles/glances/defaults/main.yml +++ b/roles/glances/defaults/main.yml @@ -12,5 +12,10 @@ glances_port_two: "61209" glances_security_options: - "apparmor=unconfined" +# docker +glances_container_name: "glances" +glances_image_name: "nicolargo/glances" +glances_image_version: "latest" + # specs glances_memory: 1g diff --git a/roles/glances/docs/glances.md b/roles/glances/docs/glances.md new file mode 100644 index 0000000000..382a549044 --- /dev/null +++ b/roles/glances/docs/glances.md @@ -0,0 +1,15 @@ +# Glances + +Homepage: + +Glances is a cross-platform system monitoring tool written in Python. + +## Usage + +Set `glances_enabled: true` in your `inventories//nas.yml` file. + +The Glances web interface can be found at . + +## Specific Configuration + +Glances can be integrated with InfluxDB and Grafana. diff --git a/roles/glances/molecule/default/molecule.yml b/roles/glances/molecule/default/molecule.yml new file mode 100644 index 0000000000..425b90c982 --- /dev/null +++ b/roles/glances/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + glances_enabled: true diff --git a/roles/glances/molecule/default/side_effect.yml b/roles/glances/molecule/default/side_effect.yml new file mode 100644 index 0000000000..b1924b70b2 --- /dev/null +++ b/roles/glances/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + glances_enabled: false diff --git a/roles/glances/molecule/default/verify.yml b/roles/glances/molecule/default/verify.yml new file mode 100644 index 0000000000..2a9e2cc217 --- /dev/null +++ b/roles/glances/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get glances container state + community.docker.docker_container: + name: "{{ glances_container_name }}" + register: result + + - name: Check if glances containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/glances/molecule/default/verify_stopped.yml b/roles/glances/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..5fcee40999 --- /dev/null +++ b/roles/glances/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove glances + community.docker.docker_container: + name: "{{ glances_container_name }}" + state: absent + register: result + + - name: Check if glances is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/glances/tasks/main.yml b/roles/glances/tasks/main.yml index f732f26802..a89a7f2431 100644 --- a/roles/glances/tasks/main.yml +++ b/roles/glances/tasks/main.yml @@ -1,25 +1,37 @@ --- -- name: Create Glances Docker Container - docker_container: - name: glances - image: nicolargo/glances - pull: true - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "/etc/timezone:/etc/timezone:ro" - pid_mode: host - ports: - - "{{ glances_port_one }}:61208" - - "{{ glances_port_two }}:61209" - env: - GLANCES_OPT: "-w" - restart_policy: unless-stopped - security_opts: "{{ glances_security_options }}" - memory: "{{ glances_memory }}" - labels: - traefik.enable: "{{ glances_available_externally | string }}" - traefik.http.routers.glances.rule: "Host(`{{ glances_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.glances.tls.certresolver: "letsencrypt" - traefik.http.routers.glances.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.glances.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.glances.loadbalancer.server.port: "61208" +- name: Start Glances + block: + - name: Create Glances Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ glances_container_name }}" + image: "{{ glances_image_name }}:{{ glances_image_version }}" + pull: true + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "/etc/timezone:/etc/timezone:ro" + pid_mode: host + ports: + - "{{ glances_port_one }}:61208" + - "{{ glances_port_two }}:61209" + env: + GLANCES_OPT: "-w" + restart_policy: unless-stopped + security_opts: "{{ glances_security_options }}" + memory: "{{ glances_memory }}" + labels: + traefik.enable: "{{ glances_available_externally | string }}" + traefik.http.routers.glances.rule: "Host(`{{ glances_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.glances.tls.certresolver: "letsencrypt" + traefik.http.routers.glances.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.glances.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.glances.loadbalancer.server.port: "61208" + when: glances_enabled is true + +- name: Stop Glances + block: + - name: Stop Glances + community.docker.docker_container: + name: "{{ glances_container_name }}" + state: absent + when: glances_enabled is false diff --git a/roles/gotify/defaults/main.yml b/roles/gotify/defaults/main.yml index 1ae240af32..6bd37c220c 100644 --- a/roles/gotify/defaults/main.yml +++ b/roles/gotify/defaults/main.yml @@ -5,14 +5,14 @@ gotify_available_externally: false # data directory gotify_data_directory: "{{ docker_home }}/gotify" -# docker image to use -gotify_docker_image: gotify/server:latest - # network gotify_port: "2346" gotify_hostname: "gotify" -# user to run container with +# docker +gotify_container_name: "gotify" +gotify_image_name: "gotify/server" +gotify_image_version: "latest" gotify_user_id: "0" gotify_group_id: "0" diff --git a/roles/gotify/docs/gotify.md b/roles/gotify/docs/gotify.md new file mode 100644 index 0000000000..a440b5df41 --- /dev/null +++ b/roles/gotify/docs/gotify.md @@ -0,0 +1,16 @@ +# Gotify + +Homepage: + +A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui) + +## Usage + +Set `gotify_enabled: true` in your `inventories//nas.yml` file. + +The Gotify web interface can be found at . + +Android client: [https://play.google.com/store/apps/details?id=com.github.gotify](https://play.google.com/store/apps/details?id=com.github.gotify) +iOS client: n/a +Chrome extension: n/a +Firefox extension: diff --git a/roles/gotify/molecule/default/molecule.yml b/roles/gotify/molecule/default/molecule.yml new file mode 100644 index 0000000000..bcda50855e --- /dev/null +++ b/roles/gotify/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + gotify_enabled: true diff --git a/roles/gotify/molecule/default/side_effect.yml b/roles/gotify/molecule/default/side_effect.yml new file mode 100644 index 0000000000..36038c8e36 --- /dev/null +++ b/roles/gotify/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + gotify_enabled: false diff --git a/roles/gotify/molecule/default/verify.yml b/roles/gotify/molecule/default/verify.yml new file mode 100644 index 0000000000..62059cb760 --- /dev/null +++ b/roles/gotify/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get gotify container state + community.docker.docker_container: + name: "{{ gotify_container_name }}" + register: result + + - name: Check if gotify containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/gotify/molecule/default/verify_stopped.yml b/roles/gotify/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..541bbe3de2 --- /dev/null +++ b/roles/gotify/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove gotify + community.docker.docker_container: + name: "{{ gotify_container_name }}" + state: absent + register: result + + - name: Check if gotify is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/gotify/tasks/main.yml b/roles/gotify/tasks/main.yml index 7560d692a6..ef6f33f890 100644 --- a/roles/gotify/tasks/main.yml +++ b/roles/gotify/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create Gotify Data Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ gotify_data_directory }}" +- name: Start Gotify + block: + - name: Create Gotify Data Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ gotify_data_directory }}" -- name: Gotify Docker Container - docker_container: - name: gotify - image: "{{ gotify_docker_image }}" - pull: true - ports: - - "{{ gotify_port }}:80" - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - - "{{ gotify_data_directory }}:/app/data:rw" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ gotify_user_id }}" - PGID: "{{ gotify_group_id }}" - restart_policy: unless-stopped - memory: "{{ gotify_memory }}" - labels: - traefik.enable: "{{ gotify_available_externally | string }}" - traefik.http.routers.gotify.rule: "Host(`{{ gotify_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.gotify.tls.certresolver: "letsencrypt" - traefik.http.routers.gotify.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.gotify.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.gotify.loadbalancer.server.port: "80" + - name: Gotify Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ gotify_container_name }}" + image: "{{ gotify_image_name }}:{{ gotify_image_version }}" + pull: true + ports: + - "{{ gotify_port }}:80" + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + - "{{ gotify_data_directory }}:/app/data:rw" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ gotify_user_id }}" + PGID: "{{ gotify_group_id }}" + restart_policy: unless-stopped + memory: "{{ gotify_memory }}" + labels: + traefik.enable: "{{ gotify_available_externally | string }}" + traefik.http.routers.gotify.rule: "Host(`{{ gotify_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.gotify.tls.certresolver: "letsencrypt" + traefik.http.routers.gotify.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.gotify.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.gotify.loadbalancer.server.port: "80" + when: gotify_enabled is true + +- name: Stop Gotify + block: + - name: Stop Gotify + community.docker.docker_container: + name: "{{ gotify_container_name }}" + state: absent + when: gotify_enabled is false diff --git a/roles/guacamole/defaults/main.yml b/roles/guacamole/defaults/main.yml index 04147f5692..ce2f2af3e8 100644 --- a/roles/guacamole/defaults/main.yml +++ b/roles/guacamole/defaults/main.yml @@ -9,5 +9,10 @@ guacamole_data_directory: "{{ docker_home }}/guacamole" guacamole_port: "8090" guacamole_hostname: "guacamole" +# docker +guacamole_container_name: "guacamole" +guacamole_image_name: "oznu/guacamole" +guacamole_image_version: "latest" + # specs guacamole_memory: 1g diff --git a/roles/guacamole/docs/guacamole.md b/roles/guacamole/docs/guacamole.md new file mode 100644 index 0000000000..11e022e36d --- /dev/null +++ b/roles/guacamole/docs/guacamole.md @@ -0,0 +1,17 @@ +# Guacamole + +Homepage: + +Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. + +## Usage + +Set `guacamole_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +The default username and password is `guacadmin`. Change it! + +## What to connect to? + +You can run a virtual desktop from your Ansible-NAS box, check out the [Virtual Desktop docs](virtual_desktop.md). diff --git a/roles/guacamole/molecule/default/molecule.yml b/roles/guacamole/molecule/default/molecule.yml new file mode 100644 index 0000000000..6522e319ab --- /dev/null +++ b/roles/guacamole/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + guacamole_enabled: true diff --git a/roles/guacamole/molecule/default/side_effect.yml b/roles/guacamole/molecule/default/side_effect.yml new file mode 100644 index 0000000000..ca6338334a --- /dev/null +++ b/roles/guacamole/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + guacamole_enabled: false diff --git a/roles/guacamole/molecule/default/verify.yml b/roles/guacamole/molecule/default/verify.yml new file mode 100644 index 0000000000..dc90031f1f --- /dev/null +++ b/roles/guacamole/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get guacamole container state + community.docker.docker_container: + name: "{{ guacamole_container_name }}" + register: result + + - name: Check if guacamole containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/guacamole/molecule/default/verify_stopped.yml b/roles/guacamole/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f3b6955b3a --- /dev/null +++ b/roles/guacamole/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove guacamole + community.docker.docker_container: + name: "{{ guacamole_container_name }}" + state: absent + register: result + + - name: Check if guacamole is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/guacamole/tasks/main.yml b/roles/guacamole/tasks/main.yml index 913067c19c..1eee84fd37 100644 --- a/roles/guacamole/tasks/main.yml +++ b/roles/guacamole/tasks/main.yml @@ -1,51 +1,63 @@ --- -- name: Create Guacamole directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ guacamole_data_directory }}/config" +- name: Start Guacamole + block: + - name: Create Guacamole directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ guacamole_data_directory }}/config" -- name: Remove Old Guacamole Mysql Docker Container - docker_container: - name: guacamole-mysql - state: absent - keep_volumes: true + - name: Remove Old Guacamole Mysql Docker Container + docker_container: + name: guacamole-mysql + state: absent + keep_volumes: true -- name: Remove Old Guacamole guacd Docker Container - docker_container: - name: guacamole-guacd - state: absent - keep_volumes: true + - name: Remove Old Guacamole guacd Docker Container + docker_container: + name: guacamole-guacd + state: absent + keep_volumes: true -- name: Remove old Guacamole directories - file: - path: "{{ item }}" - state: absent - with_items: - - "{{ guacamole_data_directory }}/mysql" + - name: Remove old Guacamole directories + file: + path: "{{ item }}" + state: absent + with_items: + - "{{ guacamole_data_directory }}/mysql" -- name: Guacamole Container - docker_container: - name: guacamole - image: "oznu/guacamole" - pull: true - volumes: - - "{{ guacamole_data_directory }}/config:/config:rw" - ports: - - "{{ guacamole_port }}:8080" - restart_policy: unless-stopped - memory: "{{ guacamole_memory }}" - labels: - traefik.enable: "{{ guacamole_available_externally | string }}" - traefik.http.routers.guacamole.rule: "Host(`{{ guacamole_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.guacamole.tls.certresolver: "letsencrypt" - traefik.http.routers.guacamole.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.guacamole.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.guacamole.loadbalancer.server.port: "8080" + - name: Guacamole Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ guacamole_container_name }}" + image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}" + pull: true + volumes: + - "{{ guacamole_data_directory }}/config:/config:rw" + ports: + - "{{ guacamole_port }}:8080" + restart_policy: unless-stopped + memory: "{{ guacamole_memory }}" + labels: + traefik.enable: "{{ guacamole_available_externally | string }}" + traefik.http.routers.guacamole.rule: "Host(`{{ guacamole_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.guacamole.tls.certresolver: "letsencrypt" + traefik.http.routers.guacamole.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.guacamole.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.guacamole.loadbalancer.server.port: "8080" -- name: Restart Guacamole Container - docker_container: - name: guacamole - image: "oznu/guacamole" - restart: true + - name: Restart Guacamole Container + community.docker.docker_container: + name: "{{ guacamole_container_name }}" + image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}" + restart: true + when: guacamole_enabled is true + +- name: Stop Guacamole + block: + - name: Stop Guacamole + community.docker.docker_container: + name: "{{ guacamole_container_name }}" + state: absent + when: guacamole_enabled is false diff --git a/roles/healthchecks.io/docs/healthchecks.io.md b/roles/healthchecks.io/docs/healthchecks.io.md new file mode 100644 index 0000000000..3c9db8ebaf --- /dev/null +++ b/roles/healthchecks.io/docs/healthchecks.io.md @@ -0,0 +1,11 @@ +# Healthchecks.io + +Homepage: + +A simple cronjob that uses `curl` to ping a given endpoint on the `healthchecks.io` servers. You can choose how often it should ping the endpoint, and what happens when it doesn't. Email/Slack/Telegram and many more services can be integrated. + +## Usage + +Create your own project on , and set both the time between pings and the grace time. Set your prefered integration such as email. + +Set `healthchecks_enabled: true` in your `inventories//nas.yml` file, and if your time between pings is different than the default `healthchecks_ping_minutes`, change it. Finally, set your ping url in the `healthchecks_url` variable. diff --git a/roles/healthchecks.io/molecule/default/molecule.yml b/roles/healthchecks.io/molecule/default/molecule.yml new file mode 100644 index 0000000000..5343b31e60 --- /dev/null +++ b/roles/healthchecks.io/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + healthchecks_enabled: true diff --git a/roles/healthchecks.io/molecule/default/side_effect.yml b/roles/healthchecks.io/molecule/default/side_effect.yml new file mode 100644 index 0000000000..2b44544841 --- /dev/null +++ b/roles/healthchecks.io/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + healthchecks_enabled: false diff --git a/roles/healthchecks.io/molecule/default/verify.yml b/roles/healthchecks.io/molecule/default/verify.yml new file mode 100644 index 0000000000..69fff456dd --- /dev/null +++ b/roles/healthchecks.io/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Check cron job file + ansible.builtin.fetch: + src: /var/spool/cron/crontabs/root + dest: /tmp/fetched + + - name: Check if cron job does exist + ansible.builtin.assert: + that: "lookup('file', '/tmp/fetched/instance/var/spool/cron/crontabs/root') is search('healthchecks.io')" + fail_msg: "Cron job 'healthchecks.io' does not exist!" + success_msg: "Cron job 'healthchecks.io' does exist!" diff --git a/roles/healthchecks.io/molecule/default/verify_stopped.yml b/roles/healthchecks.io/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..b0fa202467 --- /dev/null +++ b/roles/healthchecks.io/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Check cron job file + ansible.builtin.fetch: + src: /var/spool/cron/crontabs/root + dest: /tmp/fetched + + - name: Check if cron job does not exist + ansible.builtin.assert: + that: "not lookup('file', '/tmp/fetched/instance/var/spool/cron/crontabs/root') is search('healthchecks.io')" + fail_msg: "Cron job 'healthchecks.io' still exists!" + success_msg: "Cron job 'healthchecks.io' does not exist!" diff --git a/roles/healthchecks.io/tasks/main.yml b/roles/healthchecks.io/tasks/main.yml index e9a7e14596..0e79f7cf3f 100644 --- a/roles/healthchecks.io/tasks/main.yml +++ b/roles/healthchecks.io/tasks/main.yml @@ -1,7 +1,19 @@ --- -- name: Add healthchecks.io cronjob - cron: - name: healthchecks.io - minute: "*/{{ healthchecks_ping_minutes }}" - user: root - job: "curl -m 10 --retry 5 {{ healthchecks_url }}" +- name: Start Healthchecks + block: + - name: Add healthchecks.io cronjob + ansible.builtin.cron: + name: healthchecks.io + minute: "*/{{ healthchecks_ping_minutes }}" + user: root + job: "curl -m 10 --retry 5 {{ healthchecks_url }}" + when: healthchecks_enabled is true + +- name: Stop Healthchecks + block: + - name: Remove healthchecks.io cronjob + ansible.builtin.cron: + name: healthchecks.io + user: root + state: absent + when: healthchecks_enabled is false From 463ea6f5cfca28dedaf4db4bf92dbcb2b74ccbb4 Mon Sep 17 00:00:00 2001 From: Anarion Date: Thu, 9 Mar 2023 15:17:27 +0100 Subject: [PATCH 101/286] Fix drone_ci tests --- roles/drone-ci/handlers/main.yml | 8 ++++++++ roles/drone-ci/molecule/default/molecule.yml | 3 +++ roles/drone-ci/molecule/default/prepare.yml | 20 +++++++++++++++++++ roles/drone-ci/molecule/default/verify.yml | 3 ++- .../molecule/default/verify_stopped.yml | 3 ++- 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 roles/drone-ci/handlers/main.yml create mode 100644 roles/drone-ci/molecule/default/prepare.yml diff --git a/roles/drone-ci/handlers/main.yml b/roles/drone-ci/handlers/main.yml new file mode 100644 index 0000000000..991c4bcc86 --- /dev/null +++ b/roles/drone-ci/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: Restart gitea + community.docker.docker_container: + name: gitea + image: gitea/gitea:latest + state: started + restart: true + listen: "restart gitea" diff --git a/roles/drone-ci/molecule/default/molecule.yml b/roles/drone-ci/molecule/default/molecule.yml index 0671311d0c..6e293974d6 100644 --- a/roles/drone-ci/molecule/default/molecule.yml +++ b/roles/drone-ci/molecule/default/molecule.yml @@ -8,3 +8,6 @@ provisioner: drone_ci_gitea_client_secret: asdfasd12341234 gitea_port_http: 3001 ansible_nas_hostname: ansible-nas-ci + gitea_data_directory: "/tmp" + playbooks: + prepare: prepare.yml diff --git a/roles/drone-ci/molecule/default/prepare.yml b/roles/drone-ci/molecule/default/prepare.yml new file mode 100644 index 0000000000..343f1e6fb5 --- /dev/null +++ b/roles/drone-ci/molecule/default/prepare.yml @@ -0,0 +1,20 @@ +--- +- name: Prepare + hosts: all + tasks: + - name: Install docker python module + pip: + name: docker + + - name: Create a dummy gitea config directory + file: + path: "{{ item }}" + state: directory + recurse: yes + with_items: + - "{{ gitea_data_directory }}/gitea/gitea/conf" + + - name: Create a dummy gitea config file + file: + path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + state: touch diff --git a/roles/drone-ci/molecule/default/verify.yml b/roles/drone-ci/molecule/default/verify.yml index c993caf942..f48abc5395 100644 --- a/roles/drone-ci/molecule/default/verify.yml +++ b/roles/drone-ci/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/drone-ci/molecule/default/verify_stopped.yml b/roles/drone-ci/molecule/default/verify_stopped.yml index 3f8ce56f01..3f50b5da4d 100644 --- a/roles/drone-ci/molecule/default/verify_stopped.yml +++ b/roles/drone-ci/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Drone CI From e253f0a5d0c1c8f6ae74ddc9872b09631f1bf4d5 Mon Sep 17 00:00:00 2001 From: Anarion Date: Thu, 9 Mar 2023 21:47:42 +0100 Subject: [PATCH 102/286] Another set: heimdall to overseer --- nas.yml | 17 --- roles/heimdall/docs/heimdall.md | 15 +++ roles/homeassistant/defaults/main.yml | 5 + roles/homeassistant/docs/homeassistant.md | 13 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../homeassistant/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/homeassistant/tasks/main.yml | 62 +++++---- roles/homebridge/defaults/main.yml | 5 + roles/homebridge/docs/homebridge.md | 11 ++ .../homebridge/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/homebridge/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/homebridge/tasks/main.yml | 72 ++++++----- roles/jackett/defaults/main.yml | 5 + roles/jackett/docs/jackett.md | 11 ++ roles/jackett/molecule/default/molecule.yml | 6 + .../jackett/molecule/default/side_effect.yml | 10 ++ roles/jackett/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/jackett/tasks/main.yml | 66 ++++++---- roles/jellyfin/defaults/main.yml | 5 + roles/jellyfin/docs/jellyfin.md | 65 ++++++++++ roles/jellyfin/molecule/default/molecule.yml | 6 + .../jellyfin/molecule/default/side_effect.yml | 10 ++ roles/jellyfin/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/jellyfin/tasks/main.yml | 82 ++++++------ roles/joomla/defaults/main.yml | 10 ++ roles/joomla/docs/joomla.md | 23 ++++ roles/joomla/molecule/default/molecule.yml | 6 + roles/joomla/molecule/default/side_effect.yml | 10 ++ roles/joomla/molecule/default/verify.yml | 26 ++++ .../molecule/default/verify_stopped.yml | 26 ++++ roles/joomla/tasks/main.yml | 113 ++++++++++------- roles/komga/defaults/main.yml | 5 + roles/komga/docs/komga.md | 13 ++ roles/komga/molecule/default/molecule.yml | 6 + roles/komga/molecule/default/side_effect.yml | 10 ++ roles/komga/molecule/default/verify.yml | 19 +++ .../komga/molecule/default/verify_stopped.yml | 19 +++ roles/komga/tasks/main.yml | 80 +++++++----- roles/krusader/defaults/main.yml | 5 + roles/krusader/docs/krusader.md | 13 ++ roles/krusader/molecule/default/molecule.yml | 6 + .../krusader/molecule/default/side_effect.yml | 10 ++ roles/krusader/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/krusader/tasks/main.yml | 76 ++++++----- roles/lidarr/defaults/main.yml | 5 + roles/lidarr/docs/lidarr.md | 9 ++ roles/lidarr/molecule/default/molecule.yml | 6 + roles/lidarr/molecule/default/side_effect.yml | 10 ++ roles/lidarr/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/lidarr/tasks/main.yml | 68 +++++----- roles/mealie/defaults/main.yml | 5 + roles/mealie/docs/mealie.md | 11 ++ roles/mealie/molecule/default/molecule.yml | 6 + roles/mealie/molecule/default/side_effect.yml | 10 ++ roles/mealie/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/mealie/tasks/main.yml | 83 ++++++------ roles/minecraft-server/defaults/main.yml | 5 + .../minecraft-server/docs/minecraft-server.md | 13 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/minecraft-server/tasks/main.yml | 48 ++++--- roles/minidlna/defaults/main.yml | 5 + roles/minidlna/docs/minidlna.md | 11 ++ roles/minidlna/molecule/default/molecule.yml | 7 ++ .../minidlna/molecule/default/side_effect.yml | 10 ++ roles/minidlna/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/minidlna/tasks/main.yml | 44 ++++--- roles/miniflux/defaults/main.yml | 8 ++ roles/miniflux/docs/miniflux.md | 15 +++ roles/miniflux/molecule/default/molecule.yml | 6 + .../miniflux/molecule/default/side_effect.yml | 10 ++ roles/miniflux/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/miniflux/tasks/main.yml | 97 +++++++------- roles/mosquitto/defaults/main.yml | 5 + roles/mosquitto/docs/mosquitto.md | 9 ++ roles/mosquitto/molecule/default/molecule.yml | 16 +++ .../molecule/default/side_effect.yml | 10 ++ roles/mosquitto/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/mosquitto/tasks/main.yml | 68 +++++----- roles/mylar/defaults/main.yml | 5 + roles/mylar/docs/mylar.md | 15 +++ roles/mylar/molecule/default/molecule.yml | 6 + roles/mylar/molecule/default/side_effect.yml | 10 ++ roles/mylar/molecule/default/verify.yml | 19 +++ .../mylar/molecule/default/verify_stopped.yml | 19 +++ roles/mylar/tasks/main.yml | 76 ++++++----- roles/mymediaforalexa/defaults/main.yml | 5 + roles/mymediaforalexa/docs/mymediaforalexa.md | 11 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/mymediaforalexa/tasks/main.yml | 48 ++++--- roles/n8n/defaults/main.yml | 5 + roles/n8n/docs/n8n.md | 18 +++ roles/n8n/molecule/default/molecule.yml | 6 + roles/n8n/molecule/default/side_effect.yml | 10 ++ roles/n8n/molecule/default/verify.yml | 19 +++ roles/n8n/molecule/default/verify_stopped.yml | 19 +++ roles/n8n/tasks/main.yml | 70 ++++++----- roles/navidrome/defaults/main.yml | 5 + roles/navidrome/docs/navidrome.md | 11 ++ roles/navidrome/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/navidrome/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/navidrome/tasks/main.yml | 78 +++++++----- roles/netbootxyz/defaults/main.yml | 5 +- roles/netbootxyz/docs/netbootxyz.md | 15 +++ .../netbootxyz/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/netbootxyz/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/netbootxyz/tasks/main.yml | 76 ++++++----- roles/netdata/defaults/main.yml | 5 + roles/netdata/docs/netdata.md | 11 ++ roles/netdata/molecule/default/molecule.yml | 7 ++ .../netdata/molecule/default/side_effect.yml | 10 ++ roles/netdata/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/netdata/tasks/main.yml | 76 ++++++----- roles/nextcloud/defaults/main.yml | 15 ++- roles/nextcloud/docs/nextcloud.md | 25 ++++ roles/nextcloud/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/nextcloud/molecule/default/verify.yml | 26 ++++ .../molecule/default/verify_stopped.yml | 26 ++++ roles/nextcloud/tasks/main.yml | 119 +++++++++++------- roles/nomad/docs/nomad.md | 11 ++ roles/nomad/molecule/default/molecule.yml | 16 +++ roles/nomad/molecule/default/side_effect.yml | 10 ++ roles/nomad/molecule/default/verify.yml | 21 ++++ .../nomad/molecule/default/verify_stopped.yml | 18 +++ roles/nomad/tasks/main.yml | 12 +- roles/nzbget/defaults/main.yml | 5 + roles/nzbget/docs/nzbget.md | 11 ++ roles/nzbget/molecule/default/molecule.yml | 6 + roles/nzbget/molecule/default/side_effect.yml | 10 ++ roles/nzbget/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/nzbget/tasks/main.yml | 70 ++++++----- roles/octoprint/defaults/main.yml | 5 + roles/octoprint/docs/octoprint.md | 11 ++ roles/octoprint/molecule/default/molecule.yml | 19 +++ .../molecule/default/side_effect.yml | 10 ++ roles/octoprint/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/octoprint/tasks/main.yml | 74 ++++++----- roles/ombi/defaults/main.yml | 5 +- roles/ombi/docs/ombi.md | 9 ++ roles/ombi/molecule/default/molecule.yml | 6 + roles/ombi/molecule/default/side_effect.yml | 10 ++ roles/ombi/molecule/default/verify.yml | 19 +++ .../ombi/molecule/default/verify_stopped.yml | 19 +++ roles/ombi/tasks/main.yml | 64 ++++++---- roles/openhab/defaults/main.yml | 5 + roles/openhab/docs/openhab.md | 15 +++ roles/openhab/molecule/default/molecule.yml | 6 + .../openhab/molecule/default/side_effect.yml | 10 ++ roles/openhab/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/openhab/tasks/main.yml | 110 ++++++++-------- roles/organizr/defaults/main.yml | 5 +- roles/organizr/docs/organizr.md | 15 +++ roles/organizr/molecule/default/molecule.yml | 6 + .../organizr/molecule/default/side_effect.yml | 10 ++ roles/organizr/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/organizr/tasks/main.yml | 70 ++++++----- roles/overseerr/defaults/main.yml | 5 +- roles/overseerr/docs/overseerr.md | 13 ++ roles/overseerr/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/overseerr/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/overseerr/tasks/main.yml | 70 ++++++----- roles/paperless_ng/docs/trilium.md | 11 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../paperless_ng/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/piwigo/docs/trilium.md | 11 ++ roles/piwigo/molecule/default/molecule.yml | 6 + roles/piwigo/molecule/default/side_effect.yml | 10 ++ roles/piwigo/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/plex/docs/trilium.md | 11 ++ roles/plex/molecule/default/molecule.yml | 6 + roles/plex/molecule/default/side_effect.yml | 10 ++ roles/plex/molecule/default/verify.yml | 19 +++ .../plex/molecule/default/verify_stopped.yml | 19 +++ roles/portainer/docs/trilium.md | 11 ++ roles/portainer/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/portainer/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ 210 files changed, 3504 insertions(+), 838 deletions(-) create mode 100644 roles/heimdall/docs/heimdall.md create mode 100644 roles/homeassistant/docs/homeassistant.md create mode 100644 roles/homeassistant/molecule/default/molecule.yml create mode 100644 roles/homeassistant/molecule/default/side_effect.yml create mode 100644 roles/homeassistant/molecule/default/verify.yml create mode 100644 roles/homeassistant/molecule/default/verify_stopped.yml create mode 100644 roles/homebridge/docs/homebridge.md create mode 100644 roles/homebridge/molecule/default/molecule.yml create mode 100644 roles/homebridge/molecule/default/side_effect.yml create mode 100644 roles/homebridge/molecule/default/verify.yml create mode 100644 roles/homebridge/molecule/default/verify_stopped.yml create mode 100644 roles/jackett/docs/jackett.md create mode 100644 roles/jackett/molecule/default/molecule.yml create mode 100644 roles/jackett/molecule/default/side_effect.yml create mode 100644 roles/jackett/molecule/default/verify.yml create mode 100644 roles/jackett/molecule/default/verify_stopped.yml create mode 100644 roles/jellyfin/docs/jellyfin.md create mode 100644 roles/jellyfin/molecule/default/molecule.yml create mode 100644 roles/jellyfin/molecule/default/side_effect.yml create mode 100644 roles/jellyfin/molecule/default/verify.yml create mode 100644 roles/jellyfin/molecule/default/verify_stopped.yml create mode 100644 roles/joomla/docs/joomla.md create mode 100644 roles/joomla/molecule/default/molecule.yml create mode 100644 roles/joomla/molecule/default/side_effect.yml create mode 100644 roles/joomla/molecule/default/verify.yml create mode 100644 roles/joomla/molecule/default/verify_stopped.yml create mode 100644 roles/komga/docs/komga.md create mode 100644 roles/komga/molecule/default/molecule.yml create mode 100644 roles/komga/molecule/default/side_effect.yml create mode 100644 roles/komga/molecule/default/verify.yml create mode 100644 roles/komga/molecule/default/verify_stopped.yml create mode 100644 roles/krusader/docs/krusader.md create mode 100644 roles/krusader/molecule/default/molecule.yml create mode 100644 roles/krusader/molecule/default/side_effect.yml create mode 100644 roles/krusader/molecule/default/verify.yml create mode 100644 roles/krusader/molecule/default/verify_stopped.yml create mode 100644 roles/lidarr/docs/lidarr.md create mode 100644 roles/lidarr/molecule/default/molecule.yml create mode 100644 roles/lidarr/molecule/default/side_effect.yml create mode 100644 roles/lidarr/molecule/default/verify.yml create mode 100644 roles/lidarr/molecule/default/verify_stopped.yml create mode 100644 roles/mealie/docs/mealie.md create mode 100644 roles/mealie/molecule/default/molecule.yml create mode 100644 roles/mealie/molecule/default/side_effect.yml create mode 100644 roles/mealie/molecule/default/verify.yml create mode 100644 roles/mealie/molecule/default/verify_stopped.yml create mode 100644 roles/minecraft-server/docs/minecraft-server.md create mode 100644 roles/minecraft-server/molecule/default/molecule.yml create mode 100644 roles/minecraft-server/molecule/default/side_effect.yml create mode 100644 roles/minecraft-server/molecule/default/verify.yml create mode 100644 roles/minecraft-server/molecule/default/verify_stopped.yml create mode 100644 roles/minidlna/docs/minidlna.md create mode 100644 roles/minidlna/molecule/default/molecule.yml create mode 100644 roles/minidlna/molecule/default/side_effect.yml create mode 100644 roles/minidlna/molecule/default/verify.yml create mode 100644 roles/minidlna/molecule/default/verify_stopped.yml create mode 100644 roles/miniflux/docs/miniflux.md create mode 100644 roles/miniflux/molecule/default/molecule.yml create mode 100644 roles/miniflux/molecule/default/side_effect.yml create mode 100644 roles/miniflux/molecule/default/verify.yml create mode 100644 roles/miniflux/molecule/default/verify_stopped.yml create mode 100644 roles/mosquitto/docs/mosquitto.md create mode 100644 roles/mosquitto/molecule/default/molecule.yml create mode 100644 roles/mosquitto/molecule/default/side_effect.yml create mode 100644 roles/mosquitto/molecule/default/verify.yml create mode 100644 roles/mosquitto/molecule/default/verify_stopped.yml create mode 100644 roles/mylar/docs/mylar.md create mode 100644 roles/mylar/molecule/default/molecule.yml create mode 100644 roles/mylar/molecule/default/side_effect.yml create mode 100644 roles/mylar/molecule/default/verify.yml create mode 100644 roles/mylar/molecule/default/verify_stopped.yml create mode 100644 roles/mymediaforalexa/docs/mymediaforalexa.md create mode 100644 roles/mymediaforalexa/molecule/default/molecule.yml create mode 100644 roles/mymediaforalexa/molecule/default/side_effect.yml create mode 100644 roles/mymediaforalexa/molecule/default/verify.yml create mode 100644 roles/mymediaforalexa/molecule/default/verify_stopped.yml create mode 100644 roles/n8n/docs/n8n.md create mode 100644 roles/n8n/molecule/default/molecule.yml create mode 100644 roles/n8n/molecule/default/side_effect.yml create mode 100644 roles/n8n/molecule/default/verify.yml create mode 100644 roles/n8n/molecule/default/verify_stopped.yml create mode 100644 roles/navidrome/docs/navidrome.md create mode 100644 roles/navidrome/molecule/default/molecule.yml create mode 100644 roles/navidrome/molecule/default/side_effect.yml create mode 100644 roles/navidrome/molecule/default/verify.yml create mode 100644 roles/navidrome/molecule/default/verify_stopped.yml create mode 100644 roles/netbootxyz/docs/netbootxyz.md create mode 100644 roles/netbootxyz/molecule/default/molecule.yml create mode 100644 roles/netbootxyz/molecule/default/side_effect.yml create mode 100644 roles/netbootxyz/molecule/default/verify.yml create mode 100644 roles/netbootxyz/molecule/default/verify_stopped.yml create mode 100644 roles/netdata/docs/netdata.md create mode 100644 roles/netdata/molecule/default/molecule.yml create mode 100644 roles/netdata/molecule/default/side_effect.yml create mode 100644 roles/netdata/molecule/default/verify.yml create mode 100644 roles/netdata/molecule/default/verify_stopped.yml create mode 100644 roles/nextcloud/docs/nextcloud.md create mode 100644 roles/nextcloud/molecule/default/molecule.yml create mode 100644 roles/nextcloud/molecule/default/side_effect.yml create mode 100644 roles/nextcloud/molecule/default/verify.yml create mode 100644 roles/nextcloud/molecule/default/verify_stopped.yml create mode 100644 roles/nomad/docs/nomad.md create mode 100644 roles/nomad/molecule/default/molecule.yml create mode 100644 roles/nomad/molecule/default/side_effect.yml create mode 100644 roles/nomad/molecule/default/verify.yml create mode 100644 roles/nomad/molecule/default/verify_stopped.yml create mode 100644 roles/nzbget/docs/nzbget.md create mode 100644 roles/nzbget/molecule/default/molecule.yml create mode 100644 roles/nzbget/molecule/default/side_effect.yml create mode 100644 roles/nzbget/molecule/default/verify.yml create mode 100644 roles/nzbget/molecule/default/verify_stopped.yml create mode 100644 roles/octoprint/docs/octoprint.md create mode 100644 roles/octoprint/molecule/default/molecule.yml create mode 100644 roles/octoprint/molecule/default/side_effect.yml create mode 100644 roles/octoprint/molecule/default/verify.yml create mode 100644 roles/octoprint/molecule/default/verify_stopped.yml create mode 100644 roles/ombi/docs/ombi.md create mode 100644 roles/ombi/molecule/default/molecule.yml create mode 100644 roles/ombi/molecule/default/side_effect.yml create mode 100644 roles/ombi/molecule/default/verify.yml create mode 100644 roles/ombi/molecule/default/verify_stopped.yml create mode 100644 roles/openhab/docs/openhab.md create mode 100644 roles/openhab/molecule/default/molecule.yml create mode 100644 roles/openhab/molecule/default/side_effect.yml create mode 100644 roles/openhab/molecule/default/verify.yml create mode 100644 roles/openhab/molecule/default/verify_stopped.yml create mode 100644 roles/organizr/docs/organizr.md create mode 100644 roles/organizr/molecule/default/molecule.yml create mode 100644 roles/organizr/molecule/default/side_effect.yml create mode 100644 roles/organizr/molecule/default/verify.yml create mode 100644 roles/organizr/molecule/default/verify_stopped.yml create mode 100644 roles/overseerr/docs/overseerr.md create mode 100644 roles/overseerr/molecule/default/molecule.yml create mode 100644 roles/overseerr/molecule/default/side_effect.yml create mode 100644 roles/overseerr/molecule/default/verify.yml create mode 100644 roles/overseerr/molecule/default/verify_stopped.yml create mode 100644 roles/paperless_ng/docs/trilium.md create mode 100644 roles/paperless_ng/molecule/default/molecule.yml create mode 100644 roles/paperless_ng/molecule/default/side_effect.yml create mode 100644 roles/paperless_ng/molecule/default/verify.yml create mode 100644 roles/paperless_ng/molecule/default/verify_stopped.yml create mode 100644 roles/piwigo/docs/trilium.md create mode 100644 roles/piwigo/molecule/default/molecule.yml create mode 100644 roles/piwigo/molecule/default/side_effect.yml create mode 100644 roles/piwigo/molecule/default/verify.yml create mode 100644 roles/piwigo/molecule/default/verify_stopped.yml create mode 100644 roles/plex/docs/trilium.md create mode 100644 roles/plex/molecule/default/molecule.yml create mode 100644 roles/plex/molecule/default/side_effect.yml create mode 100644 roles/plex/molecule/default/verify.yml create mode 100644 roles/plex/molecule/default/verify_stopped.yml create mode 100644 roles/portainer/docs/trilium.md create mode 100644 roles/portainer/molecule/default/molecule.yml create mode 100644 roles/portainer/molecule/default/side_effect.yml create mode 100644 roles/portainer/molecule/default/verify.yml create mode 100644 roles/portainer/molecule/default/verify_stopped.yml diff --git a/nas.yml b/nas.yml index bf2eff1873..a4d2e4341b 100644 --- a/nas.yml +++ b/nas.yml @@ -148,7 +148,6 @@ - role: heimdall tags: - heimdall - when: (heimdall_enabled | default(False)) - role: hello_world tags: @@ -157,82 +156,66 @@ - role: homeassistant tags: - homeassistant - when: (homeassistant_enabled | default(False)) - role: homebridge tags: - homebridge - when: (homebridge_enabled | default(False)) - role: jackett tags: - jackett - when: (jackett_enabled | default(False)) - role: jellyfin tags: - jellyfin - when: (jellyfin_enabled | default(False)) - role: joomla tags: - joomla - when: (joomla_enabled | default(False)) - role: komga tags: - komga - when: (komga_enabled | default(False)) - role: krusader tags: - krusader - when: (krusader_enabled | default(False)) - role: lidarr tags: - lidarr - when: (lidarr_enabled | default(False)) - role: mealie tags: - mealie - when: (mealie_enabled | default(False)) - role: minecraft-server tags: - minecraft-server - when: (minecraft_server_enabled | default(False)) - role: minidlna tags: - minidlna - when: (minidlna_enabled | default(False)) - role: miniflux tags: - miniflux - when: (miniflux_enabled | default(False)) - role: mosquitto tags: - mosquitto - when: (mosquitto_enabled | default(False)) - role: mylar tags: - mylar - when: (mylar_enabled | default(False)) - role: mymediaforalexa tags: - mymediaforalexa - when: (mymediaforalexa_enabled | default(False)) - role: n8n tags: - n8n - when: (n8n_enabled | default(False)) - role: navidrome tags: diff --git a/roles/heimdall/docs/heimdall.md b/roles/heimdall/docs/heimdall.md new file mode 100644 index 0000000000..ff2417ddef --- /dev/null +++ b/roles/heimdall/docs/heimdall.md @@ -0,0 +1,15 @@ +# Heimdall + +Homepage: + +Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like + +## Usage + +Set `heimdall_enabled: true` in your `inventories//nas.yml` file. + +The Heimdall web interface can be found at . + +## Specific Configuration + +Heimdall defaults to port 10080 - some browsers block this port. Override `heimdall_port_http` to move it somewhere else. diff --git a/roles/homeassistant/defaults/main.yml b/roles/homeassistant/defaults/main.yml index 7490d2e1af..dd6d857ff2 100644 --- a/roles/homeassistant/defaults/main.yml +++ b/roles/homeassistant/defaults/main.yml @@ -9,5 +9,10 @@ homeassistant_data_directory: "{{ docker_home }}/homeassistant" homeassistant_port: "8123" homeassistant_hostname: "homeassistant" +# docker +homeassistant_container_name: "homeassistant" +homeassistant_image_name: "homeassistant/home-assistant" +homeassistant_image_version: latest + # specs homeassistant_memory: 1g diff --git a/roles/homeassistant/docs/homeassistant.md b/roles/homeassistant/docs/homeassistant.md new file mode 100644 index 0000000000..f7163cb25b --- /dev/null +++ b/roles/homeassistant/docs/homeassistant.md @@ -0,0 +1,13 @@ +# Home Assistant + +Homepage: + +Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. + +## Usage + +Set `homeassistant_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Home Assistant externally, don't forget to set `homeassistant_available_externally: true` in your `inventories//nas.yml` file. + +The Home Assistant web interface can be found at . diff --git a/roles/homeassistant/molecule/default/molecule.yml b/roles/homeassistant/molecule/default/molecule.yml new file mode 100644 index 0000000000..8d74fd32c1 --- /dev/null +++ b/roles/homeassistant/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + homeassistant_enabled: true diff --git a/roles/homeassistant/molecule/default/side_effect.yml b/roles/homeassistant/molecule/default/side_effect.yml new file mode 100644 index 0000000000..7fd43749e2 --- /dev/null +++ b/roles/homeassistant/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + homeassistant_enabled: false diff --git a/roles/homeassistant/molecule/default/verify.yml b/roles/homeassistant/molecule/default/verify.yml new file mode 100644 index 0000000000..e21658927f --- /dev/null +++ b/roles/homeassistant/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get homeassistant container state + community.docker.docker_container: + name: "{{ homeassistant_container_name }}" + register: result + + - name: Check if homeassistant containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/homeassistant/molecule/default/verify_stopped.yml b/roles/homeassistant/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e4d2ab86f6 --- /dev/null +++ b/roles/homeassistant/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove homeassistant + community.docker.docker_container: + name: "{{ homeassistant_container_name }}" + state: absent + register: result + + - name: Check if homeassistant is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/homeassistant/tasks/main.yml b/roles/homeassistant/tasks/main.yml index 1f211cd119..0c1ee6039f 100644 --- a/roles/homeassistant/tasks/main.yml +++ b/roles/homeassistant/tasks/main.yml @@ -1,27 +1,39 @@ --- -- name: Create Home Assistant Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ homeassistant_data_directory }}/config" +- name: Start Homeassistant + block: + - name: Create Home Assistant Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ homeassistant_data_directory }}/config" -- name: Home Assistant Docker Container - docker_container: - name: homeassistant - image: homeassistant/home-assistant - pull: true - volumes: - - "{{ homeassistant_data_directory }}/config:/config:rw" - network_mode: host - restart_policy: unless-stopped - env: - TZ: "{{ ansible_nas_timezone }}" - labels: - traefik.enable: "{{ homeassistant_available_externally | string }}" - traefik.http.routers.homeassistant.rule: "Host(`{{ homeassistant_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.homeassistant.tls.certresolver: "letsencrypt" - traefik.http.routers.homeassistant.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.homeassistant.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.homeassistant.loadbalancer.server.port: "8123" - memory: "{{ homeassistant_memory }}" + - name: Home Assistant Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ homeassistant_container_name }}" + image: "{{ homeassistant_image_name }}:{{ homeassistant_image_version }}" + pull: true + volumes: + - "{{ homeassistant_data_directory }}/config:/config:rw" + network_mode: host + restart_policy: unless-stopped + env: + TZ: "{{ ansible_nas_timezone }}" + labels: + traefik.enable: "{{ homeassistant_available_externally | string }}" + traefik.http.routers.homeassistant.rule: "Host(`{{ homeassistant_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.homeassistant.tls.certresolver: "letsencrypt" + traefik.http.routers.homeassistant.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.homeassistant.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.homeassistant.loadbalancer.server.port: "8123" + memory: "{{ homeassistant_memory }}" + when: homeassistant_enabled is true + +- name: Stop homeassistant + block: + - name: Stop homeassistant + community.docker.docker_container: + name: "{{ homeassistant_container_name }}" + state: absent + when: homeassistant_enabled is false diff --git a/roles/homebridge/defaults/main.yml b/roles/homebridge/defaults/main.yml index 03ef218103..286e899035 100644 --- a/roles/homebridge/defaults/main.yml +++ b/roles/homebridge/defaults/main.yml @@ -14,5 +14,10 @@ homebridge_group_id: "0" homebridge_hostname: "homebridge" homebridge_port: "8087" +# docker +homebridge_container_name: "homebridge" +homebridge_image_name: "oznu/homebridge" +homebridge_image_version: "latest" + # specs homebridge_memory: "1g" diff --git a/roles/homebridge/docs/homebridge.md b/roles/homebridge/docs/homebridge.md new file mode 100644 index 0000000000..cbb9b329bc --- /dev/null +++ b/roles/homebridge/docs/homebridge.md @@ -0,0 +1,11 @@ +# Homebridge + +Homepage: + +Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices. + +## Usage + +Set `homebridge_enabled: true` in your `inventories//nas.yml` file. + +The Homebridge web interface can be found at . The default username and password is 'admin' - change this after your first login! diff --git a/roles/homebridge/molecule/default/molecule.yml b/roles/homebridge/molecule/default/molecule.yml new file mode 100644 index 0000000000..57e51aec57 --- /dev/null +++ b/roles/homebridge/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + homebridge_enabled: true diff --git a/roles/homebridge/molecule/default/side_effect.yml b/roles/homebridge/molecule/default/side_effect.yml new file mode 100644 index 0000000000..c8cf2044ad --- /dev/null +++ b/roles/homebridge/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + homebridge_enabled: false diff --git a/roles/homebridge/molecule/default/verify.yml b/roles/homebridge/molecule/default/verify.yml new file mode 100644 index 0000000000..0fa3521cee --- /dev/null +++ b/roles/homebridge/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get homebridge container state + community.docker.docker_container: + name: "{{ homebridge_container_name }}" + register: result + + - name: Check if homebridge containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/homebridge/molecule/default/verify_stopped.yml b/roles/homebridge/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f5539057ea --- /dev/null +++ b/roles/homebridge/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove homebridge + community.docker.docker_container: + name: "{{ homebridge_container_name }}" + state: absent + register: result + + - name: Check if homebridge is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/homebridge/tasks/main.yml b/roles/homebridge/tasks/main.yml index 55f50fd69f..2ac79111e2 100644 --- a/roles/homebridge/tasks/main.yml +++ b/roles/homebridge/tasks/main.yml @@ -1,32 +1,44 @@ --- -- name: Create Homebridge Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ homebridge_config_directory }}" +- name: Start Homebridge + block: + - name: Create Homebridge Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ homebridge_config_directory }}" -- name: Create Homebridge Docker Container - docker_container: - name: homebridge - image: oznu/homebridge - pull: true - volumes: - - "{{ homebridge_config_directory }}:/homebridge" - network_mode: "host" - env: - TZ: "{{ ansible_nas_timezone }}" - PGID: "{{ homebridge_group_id }}" - PUID: "{{ homebridge_user_id }}" - HOMEBRIDGE_CONFIG_UI: "1" - HOMEBRIDGE_CONFIG_UI_PORT: "{{ homebridge_port }}" - restart_policy: unless-stopped - memory: "{{ homebridge_memory }}" - labels: - traefik.enable: "{{ homebridge_available_externally | string }}" - traefik.http.routers.homebridge.rule: "Host(`{{ homebridge_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.homebridge.tls.certresolver: "letsencrypt" - traefik.http.routers.homebridge.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.homebridge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.homebridge.loadbalancer.server.port: "8087" + - name: Create Homebridge Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ homebridge_container_name }}" + image: "{{ homebridge_image_name }}:{{ homebridge_image_version }}" + pull: true + volumes: + - "{{ homebridge_config_directory }}:/homebridge" + network_mode: "host" + env: + TZ: "{{ ansible_nas_timezone }}" + PGID: "{{ homebridge_group_id }}" + PUID: "{{ homebridge_user_id }}" + HOMEBRIDGE_CONFIG_UI: "1" + HOMEBRIDGE_CONFIG_UI_PORT: "{{ homebridge_port }}" + restart_policy: unless-stopped + memory: "{{ homebridge_memory }}" + labels: + traefik.enable: "{{ homebridge_available_externally | string }}" + traefik.http.routers.homebridge.rule: "Host(`{{ homebridge_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.homebridge.tls.certresolver: "letsencrypt" + traefik.http.routers.homebridge.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.homebridge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.homebridge.loadbalancer.server.port: "8087" + when: homebridge_enabled is true + +- name: Stop Homebridge + block: + - name: Stop Homebridge + community.docker.docker_container: + name: "{{ homebridge_container_name }}" + state: absent + when: homebridge_enabled is false diff --git a/roles/jackett/defaults/main.yml b/roles/jackett/defaults/main.yml index 5d87e72124..a1cd3793eb 100644 --- a/roles/jackett/defaults/main.yml +++ b/roles/jackett/defaults/main.yml @@ -11,5 +11,10 @@ jackett_torrents_root: "{{ torrents_root }}" jackett_hostname: "jackett" jackett_port: "9117" +# docker +jackett_container_name: "jackett" +jackett_image_name: "linuxserver/jackett" +jackett_image_version: "latest" + # specs jackett_memory: "1g" diff --git a/roles/jackett/docs/jackett.md b/roles/jackett/docs/jackett.md new file mode 100644 index 0000000000..919d8daa8b --- /dev/null +++ b/roles/jackett/docs/jackett.md @@ -0,0 +1,11 @@ +# Jackett + +Homepage: + +Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, qBittorrent, Nefarious etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. + +## Usage + +Set `jackett_enabled: true` in your `inventories//nas.yml` file. + +The Jackett web interface can be found at . diff --git a/roles/jackett/molecule/default/molecule.yml b/roles/jackett/molecule/default/molecule.yml new file mode 100644 index 0000000000..44642cb1b7 --- /dev/null +++ b/roles/jackett/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + jackett_enabled: true diff --git a/roles/jackett/molecule/default/side_effect.yml b/roles/jackett/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a83651bf94 --- /dev/null +++ b/roles/jackett/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + jackett_enabled: false diff --git a/roles/jackett/molecule/default/verify.yml b/roles/jackett/molecule/default/verify.yml new file mode 100644 index 0000000000..387a850e9a --- /dev/null +++ b/roles/jackett/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get jackett container state + community.docker.docker_container: + name: "{{ jackett_container_name }}" + register: result + + - name: Check if jackett containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/jackett/molecule/default/verify_stopped.yml b/roles/jackett/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f57260526b --- /dev/null +++ b/roles/jackett/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove jackett + community.docker.docker_container: + name: "{{ jackett_container_name }}" + state: absent + register: result + + - name: Check if jackett is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/jackett/tasks/main.yml b/roles/jackett/tasks/main.yml index ed9036139a..bffc6121c7 100644 --- a/roles/jackett/tasks/main.yml +++ b/roles/jackett/tasks/main.yml @@ -1,29 +1,41 @@ --- -- name: Create jackett Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ jackett_data_directory }}" +- name: Start Jackett + block: + - name: Create Jackett Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ jackett_data_directory }}" -- name: Jackett Docker Container - docker_container: - name: jackett - image: linuxserver/jackett - volumes: - - "{{ jackett_data_directory }}:/config:rw" - - "/etc/localtime:/etc/localtime:ro" - - "{{ jackett_torrents_root }}:/downloads" - ports: - - "{{ jackett_port }}:9117" - env: - TZ: "{{ ansible_nas_timezone }}" - restart_policy: unless-stopped - memory: "{{ jackett_memory }}" - labels: - traefik.enable: "{{ jackett_available_externally | string }}" - traefik.http.routers.jackett.rule: "Host(`{{ jackett_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.jackett.tls.certresolver: "letsencrypt" - traefik.http.routers.jackett.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.jackett.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.jackett.loadbalancer.server.port: "9117" + - name: Jackett Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ jackett_container_name }}" + image: "{{ jackett_image_name }}:{{ jackett_image_version }}" + volumes: + - "{{ jackett_data_directory }}:/config:rw" + - "/etc/localtime:/etc/localtime:ro" + - "{{ jackett_torrents_root }}:/downloads" + ports: + - "{{ jackett_port }}:9117" + env: + TZ: "{{ ansible_nas_timezone }}" + restart_policy: unless-stopped + memory: "{{ jackett_memory }}" + labels: + traefik.enable: "{{ jackett_available_externally | string }}" + traefik.http.routers.jackett.rule: "Host(`{{ jackett_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.jackett.tls.certresolver: "letsencrypt" + traefik.http.routers.jackett.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.jackett.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.jackett.loadbalancer.server.port: "9117" + when: jackett_enabled is true + +- name: Stop Jackett + block: + - name: Stop Jackett + community.docker.docker_container: + name: "{{ jackett_container_name }}" + state: absent + when: jackett_enabled is false diff --git a/roles/jellyfin/defaults/main.yml b/roles/jellyfin/defaults/main.yml index 5306b78853..49ec1a11d7 100644 --- a/roles/jellyfin/defaults/main.yml +++ b/roles/jellyfin/defaults/main.yml @@ -29,5 +29,10 @@ jellyfin_hostname: "jellyfin" jellyfin_port_http: "8896" jellyfin_port_https: "8928" +# docker +jellyfin_container_name: "jellyfin" +jellyfin_image_name: "linuxserver/jellyfin" +jellyfin_image_version: "latest" + # specs jellyfin_memory: "1g" diff --git a/roles/jellyfin/docs/jellyfin.md b/roles/jellyfin/docs/jellyfin.md new file mode 100644 index 0000000000..dfe89533b1 --- /dev/null +++ b/roles/jellyfin/docs/jellyfin.md @@ -0,0 +1,65 @@ +# Jellyfin + +Homepage: + +Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! + +Note that [Plex](https://www.plex.tv/), also included in Ansible-NAS, has a very +similar functionality. + +## Usage + +Set `jellyfin_enabled: true` in your `inventories//nas.yml` file. There are further +parameters you can edit such as `movies_root`, `tv_root` or `music_root` lower down + +## Specific Configuration + +The jellyfin web interface can be found at port 8896 (http) or 8928 (https, if +configured) of your NAS. + +By default, Ansible-NAS gives jellyfin read/write access to the folders where your +movies, TV shows and music are stored. To change this to read-only, edit the following +lines in `all.yml`: + +```yaml + jellyfin_movies_permissions: "rw" + jellyfin_tv_permissions: "rw" + jellyfin_books_permissions: "rw" + jellyfin_audiobooks_permissions: "rw" + jellyfin_music_permissions: "rw" +``` + +so that they end in `ro` instead of `rw`. Note that jellyfin will not be able to +delete files then, which might be exactly what you want. However, you will not +have the option to store cover art in the related folders. Always leave the +configuration directory read/write + +## Naming movies and TV shows + +jellyfin is very fussy about how movies and TV shows must be named to enable +automatic downloads of cover art and metadata. In short, movie files should +follow how movies are listed in the [IMDb](https://www.imdb.com/), including the +year of publication: + +```raw + movies/Bride of Frankenstein (1935).mp4 +``` + +Note the spaces. You should probably remove colons and other special characters +TV shows require a folder structure with the name of the series - again if +possible with the year of publication - followed by sub-folders for the +individual seasons. For example, the first episode of the first season of +the original "Doctor Who" could be stored as: + +```raw + tv/Doctor Who (1963)/Season 1/Doctor Who - s01e01.mp4 +``` + +The [TVDB](https://www.thetvdb.com/) is one source for the exact names of TV +shows. + +Unfortunately, there are number of special cases, especially related to split +movies and older series. See the [movie +naming](https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming) and [TV +naming](https://github.com/MediaBrowser/Wiki/wiki/TV-naming) guides for further +information. diff --git a/roles/jellyfin/molecule/default/molecule.yml b/roles/jellyfin/molecule/default/molecule.yml new file mode 100644 index 0000000000..d376e66357 --- /dev/null +++ b/roles/jellyfin/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + jellyfin_enabled: true diff --git a/roles/jellyfin/molecule/default/side_effect.yml b/roles/jellyfin/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a55b26c630 --- /dev/null +++ b/roles/jellyfin/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + jellyfin_enabled: false diff --git a/roles/jellyfin/molecule/default/verify.yml b/roles/jellyfin/molecule/default/verify.yml new file mode 100644 index 0000000000..fa07a167c7 --- /dev/null +++ b/roles/jellyfin/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get jellyfin container state + community.docker.docker_container: + name: "{{ jellyfin_container_name }}" + register: result + + - name: Check if jellyfin containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/jellyfin/molecule/default/verify_stopped.yml b/roles/jellyfin/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..18552ea830 --- /dev/null +++ b/roles/jellyfin/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove jellyfin + community.docker.docker_container: + name: "{{ jellyfin_container_name }}" + state: absent + register: result + + - name: Check if jellyfin is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/jellyfin/tasks/main.yml b/roles/jellyfin/tasks/main.yml index d7f7ae298a..434b624b7d 100644 --- a/roles/jellyfin/tasks/main.yml +++ b/roles/jellyfin/tasks/main.yml @@ -1,37 +1,49 @@ --- -- name: Create Jellyfin Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ jellyfin_config_directory }}" +- name: Start jellyfin + block: + - name: Create Jellyfin Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ jellyfin_config_directory }}" -- name: Jellyfin Docker Container - docker_container: - name: jellyfin - image: linuxserver/jellyfin - pull: true - volumes: - - "{{ jellyfin_config_directory }}:/config:rw" - - "{{ jellyfin_movies_directory }}:/movies:{{ jellyfin_movies_permissions }}" - - "{{ jellyfin_music_directory }}:/music:{{ jellyfin_music_permissions }}" - - "{{ jellyfin_photos_directory }}:/photos:{{ jellyfin_photos_permissions }}" - - "{{ jellyfin_tv_directory }}:/tv:{{ jellyfin_tv_permissions }}" - - "{{ jellyfin_books_directory }}:/books:{{ jellyfin_books_permissions }}" - - "{{ jellyfin_audiobooks_directory }}:/audiobooks:{{ jellyfin_audiobooks_permissions }}" - ports: - - "{{ jellyfin_port_http }}:8096" - - "{{ jellyfin_port_https }}:8920" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ jellyfin_user_id }}" - PGID: "{{ jellyfin_group_id }}" - restart_policy: unless-stopped - memory: "{{ jellyfin_memory }}" - labels: - traefik.enable: "{{ jellyfin_available_externally | string }}" - traefik.http.routers.jellyfin.rule: "Host(`{{ jellyfin_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.jellyfin.tls.certresolver: "letsencrypt" - traefik.http.routers.jellyfin.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.jellyfin.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.jellyfin.loadbalancer.server.port: "8096" + - name: Jellyfin Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ jellyfin_container_name }}" + image: "{{ jellyfin_image_name }}:{{ jellyfin_image_version }}" + pull: true + volumes: + - "{{ jellyfin_config_directory }}:/config:rw" + - "{{ jellyfin_movies_directory }}:/movies:{{ jellyfin_movies_permissions }}" + - "{{ jellyfin_music_directory }}:/music:{{ jellyfin_music_permissions }}" + - "{{ jellyfin_photos_directory }}:/photos:{{ jellyfin_photos_permissions }}" + - "{{ jellyfin_tv_directory }}:/tv:{{ jellyfin_tv_permissions }}" + - "{{ jellyfin_books_directory }}:/books:{{ jellyfin_books_permissions }}" + - "{{ jellyfin_audiobooks_directory }}:/audiobooks:{{ jellyfin_audiobooks_permissions }}" + ports: + - "{{ jellyfin_port_http }}:8096" + - "{{ jellyfin_port_https }}:8920" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ jellyfin_user_id }}" + PGID: "{{ jellyfin_group_id }}" + restart_policy: unless-stopped + memory: "{{ jellyfin_memory }}" + labels: + traefik.enable: "{{ jellyfin_available_externally | string }}" + traefik.http.routers.jellyfin.rule: "Host(`{{ jellyfin_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.jellyfin.tls.certresolver: "letsencrypt" + traefik.http.routers.jellyfin.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.jellyfin.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.jellyfin.loadbalancer.server.port: "8096" + when: jellyfin_enabled is true + +- name: Stop jellyfin + block: + - name: Stop jellyfin + community.docker.docker_container: + name: "{{ jellyfin_container_name }}" + state: absent + when: jellyfin_enabled is false diff --git a/roles/joomla/defaults/main.yml b/roles/joomla/defaults/main.yml index cff8308ad6..87099632cc 100644 --- a/roles/joomla/defaults/main.yml +++ b/roles/joomla/defaults/main.yml @@ -10,6 +10,16 @@ joomla_data_directory: "{{ docker_home }}/joomla" # network joomla_port: "8181" joomla_hostname: "joomla" +joomla_network_name: "joomla" + +# docker +joomla_container_name: "joomla" +joomla_image_name: "joomla" +joomla_image_version: "latest" +joomla_db_container_name: "joomla-db" +joomla_db_image_name: "mysql" +joomla_db_image_version: "5.7" # specs joomla_memory: 1g +joomla_db_memory: 1g diff --git a/roles/joomla/docs/joomla.md b/roles/joomla/docs/joomla.md new file mode 100644 index 0000000000..e0ad95a4c1 --- /dev/null +++ b/roles/joomla/docs/joomla.md @@ -0,0 +1,23 @@ +# Joomla + +Homepage: + +Joomla! is an award-winning content management system (CMS), which enables you to build web sites and powerful online applications. + +## Usage + +Set `joomla_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Joomla externally, set `joomla_available_externally: true` in your `inventories//nas.yml` file. + +The Joomla web interface can be found at . + +## Specific Configuration + +- Set `joomla_database_password` in your `all.yml` before installing Joomla. + +- On first run you'll need to enter database details: + - Host: `mysql` + - Database: `joomla` + - Username: `root` + - Password: whatever you set for `joomla_database_password`. diff --git a/roles/joomla/molecule/default/molecule.yml b/roles/joomla/molecule/default/molecule.yml new file mode 100644 index 0000000000..498a06f662 --- /dev/null +++ b/roles/joomla/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + joomla_enabled: true diff --git a/roles/joomla/molecule/default/side_effect.yml b/roles/joomla/molecule/default/side_effect.yml new file mode 100644 index 0000000000..ced35ccf13 --- /dev/null +++ b/roles/joomla/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + joomla_enabled: false diff --git a/roles/joomla/molecule/default/verify.yml b/roles/joomla/molecule/default/verify.yml new file mode 100644 index 0000000000..728ea20cae --- /dev/null +++ b/roles/joomla/molecule/default/verify.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get joomla container state + community.docker.docker_container: + name: "{{ joomla_container_name }}" + register: result + + - name: Get joomla db container state + community.docker.docker_container: + name: "{{ joomla_db_container_name }}" + register: result_db + + - name: Check if joomla containers are running + ansible.builtin.assert: + that: + - result_db.container['State']['Status'] == "running" + - result_db.container['State']['Restarting'] == false + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/joomla/molecule/default/verify_stopped.yml b/roles/joomla/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..601be52130 --- /dev/null +++ b/roles/joomla/molecule/default/verify_stopped.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove joomla + community.docker.docker_container: + name: "{{ joomla_container_name }}" + state: absent + register: result + + - name: Try and stop and remove joomla db + community.docker.docker_container: + name: "{{ joomla_db_container_name }}" + state: absent + register: result_db + + - name: Check if joomla is stopped + ansible.builtin.assert: + that: + - not result.changed + - not result_db.changed diff --git a/roles/joomla/tasks/main.yml b/roles/joomla/tasks/main.yml index 61a82bc091..2dbcfe8705 100644 --- a/roles/joomla/tasks/main.yml +++ b/roles/joomla/tasks/main.yml @@ -1,47 +1,72 @@ --- -- name: Create Joomla Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ joomla_data_directory }}" - - "{{ joomla_data_directory }}/db" +- name: Start Joomla + block: + - name: Create Joomla Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ joomla_data_directory }}" + - "{{ joomla_data_directory }}/db" -- name: MySQL Docker Container for Joomla - docker_container: - name: joomla_mysql - image: mysql:5.7 - pull: true - volumes: - - "{{ joomla_data_directory }}/db:/var/lib/mysql" - env: - MYSQL_DATABASE: "joomla" - MYSQL_USER: "joomla" - MYSQL_ROOT_PASSWORD: "{{ joomla_database_password }}" - restart_policy: unless-stopped - memory: 1g + - name: Create Joomla network + community.docker.docker_network: + name: "{{ joomla_network_name }}" -- name: Joomla Docker Container - docker_container: - name: joomla - image: joomla - pull: true - volumes: - - "{{ joomla_data_directory }}:/var/www/html:rw" - ports: - - "{{ joomla_port }}:80" - links: - - "joomla_mysql:mysql" - env: - JOOMLA_DB_HOST: "mysql" - JOOMLA_DB_USER: "root" - JOOMLA_DB_PASSWORD: "{{ joomla_database_password }}" - restart_policy: unless-stopped - memory: "{{ joomla_memory }}" - labels: - traefik.enable: "{{ joomla_available_externally | string }}" - traefik.http.routers.joomla.rule: "Host(`{{ joomla_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.joomla.tls.certresolver: "letsencrypt" - traefik.http.routers.joomla.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.joomla.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.joomla.loadbalancer.server.port: "80" + - name: MySQL Docker Container for Joomla + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ joomla_db_container_name }}" + image: "{{ joomla_db_image_name }}:{{ joomla_db_image_version }}" + pull: true + networks: + - name: "{{ joomla_network_name }}" + network_mode: "{{ joomla_network_name }}" + volumes: + - "{{ joomla_data_directory }}/db:/var/lib/mysql" + env: + MYSQL_DATABASE: "joomla" + MYSQL_USER: "joomla" + MYSQL_ROOT_PASSWORD: "{{ joomla_database_password }}" + restart_policy: unless-stopped + memory: "{{ joomla_db_memory }}" + + - name: Joomla Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ joomla_container_name }}" + image: "{{ joomla_image_name }}:{{ joomla_image_version }}" + pull: true + networks: + - name: "{{ joomla_network_name }}" + network_mode: "{{ joomla_network_name }}" + volumes: + - "{{ joomla_data_directory }}:/var/www/html:rw" + ports: + - "{{ joomla_port }}:80" + env: + JOOMLA_DB_HOST: "{{ joomla_db_container_name }}" + JOOMLA_DB_USER: "root" + JOOMLA_DB_PASSWORD: "{{ joomla_database_password }}" + restart_policy: unless-stopped + memory: "{{ joomla_memory }}" + labels: + traefik.enable: "{{ joomla_available_externally | string }}" + traefik.http.routers.joomla.rule: "Host(`{{ joomla_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.joomla.tls.certresolver: "letsencrypt" + traefik.http.routers.joomla.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.joomla.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.joomla.loadbalancer.server.port: "80" + when: joomla_enabled is true + +- name: Stop Joomla + block: + - name: Stop Joomla + community.docker.docker_container: + name: "{{ joomla_container_name }}" + state: absent + - name: Stop Joomla DB + community.docker.docker_container: + name: "{{ joomla_db_container_name }}" + state: absent + when: joomla_enabled is false diff --git a/roles/komga/defaults/main.yml b/roles/komga/defaults/main.yml index 8a0ed1b7b6..a1b35f094f 100644 --- a/roles/komga/defaults/main.yml +++ b/roles/komga/defaults/main.yml @@ -16,5 +16,10 @@ komga_group_id: "1000" komga_hostname: "komga" komga_port_http: "8088" +# docker +komga_container_name: "komga" +komga_image_name: "gotson/komga" +komga_image_version: "latest" + # specs komga_memory: "1g" diff --git a/roles/komga/docs/komga.md b/roles/komga/docs/komga.md new file mode 100644 index 0000000000..3c0b3c7de7 --- /dev/null +++ b/roles/komga/docs/komga.md @@ -0,0 +1,13 @@ +# Komga + +Homepage: + +Docker Image: + +Komga is a media server for your comics, mangas, BDs and magazines. + +## Usage + +Set `komga_enabled: true` in your `inventories//nas.yml` file. + +Access the webui at by default. diff --git a/roles/komga/molecule/default/molecule.yml b/roles/komga/molecule/default/molecule.yml new file mode 100644 index 0000000000..8b6061b232 --- /dev/null +++ b/roles/komga/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + komga_enabled: true diff --git a/roles/komga/molecule/default/side_effect.yml b/roles/komga/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f923232d2c --- /dev/null +++ b/roles/komga/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + komga_enabled: false diff --git a/roles/komga/molecule/default/verify.yml b/roles/komga/molecule/default/verify.yml new file mode 100644 index 0000000000..aad4abe828 --- /dev/null +++ b/roles/komga/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Get komga container state + docker_container_info: + name: "{{ komga_container_name }}" + register: result + + - name: Check if komga docker container is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/komga/molecule/default/verify_stopped.yml b/roles/komga/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..a601c7960e --- /dev/null +++ b/roles/komga/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove komga + docker_container: + name: "{{ komga_container_name }}" + state: absent + register: result + + - name: Check if komga container is stopped + assert: + that: + - not result.changed diff --git a/roles/komga/tasks/main.yml b/roles/komga/tasks/main.yml index 79758cd84f..f5daa3b3d8 100644 --- a/roles/komga/tasks/main.yml +++ b/roles/komga/tasks/main.yml @@ -1,36 +1,48 @@ --- -- name: Create Komga Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ komga_data_directory }}" - - "{{ komga_data_directory }}/config" +- name: Start Komga + block: + - name: Create Komga Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ komga_data_directory }}" + - "{{ komga_data_directory }}/config" -- name: Komga Docker Container - docker_container: - name: komga - image: gotson/komga - pull: true - volumes: - - "{{ komga_comics_directory }}:/comics:ro" - - "{{ komga_books_directory }}:/books:ro" - - "{{ komga_data_directory }}:/data:rw" - - "{{ komga_data_directory }}/config:/config:rw" - network_mode: "bridge" - ports: - - "{{ komga_port_http }}:8080" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ komga_user_id }}" - PGID: "{{ komga_group_id }}" - restart_policy: unless-stopped - memory: "{{ komga_memory }}" - labels: - traefik.enable: "{{ komga_available_externally | string }}" - traefik.http.routers.komga.rule: "Host(`{{ komga_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.komga.tls.certresolver: "letsencrypt" - traefik.http.routers.komga.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.komga.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.komga.loadbalancer.server.port: "8080" + - name: Komga Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ komga_container_name }}" + image: "{{ komga_image_name }}:{{ komga_image_version }}" + pull: true + volumes: + - "{{ komga_comics_directory }}:/comics:ro" + - "{{ komga_books_directory }}:/books:ro" + - "{{ komga_data_directory }}:/data:rw" + - "{{ komga_data_directory }}/config:/config:rw" + network_mode: "bridge" + ports: + - "{{ komga_port_http }}:8080" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ komga_user_id }}" + PGID: "{{ komga_group_id }}" + restart_policy: unless-stopped + memory: "{{ komga_memory }}" + labels: + traefik.enable: "{{ komga_available_externally | string }}" + traefik.http.routers.komga.rule: "Host(`{{ komga_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.komga.tls.certresolver: "letsencrypt" + traefik.http.routers.komga.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.komga.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.komga.loadbalancer.server.port: "8080" + when: komga_enabled is true + +- name: Stop Komga + block: + - name: Stop Komga + community.docker.docker_container: + name: "{{ komga_container_name }}" + state: absent + when: komga_enabled is false diff --git a/roles/krusader/defaults/main.yml b/roles/krusader/defaults/main.yml index 4f8a59c663..c68c443248 100644 --- a/roles/krusader/defaults/main.yml +++ b/roles/krusader/defaults/main.yml @@ -18,5 +18,10 @@ krusader_port_http: "5800" krusader_port_vnc: "5900" krusader_hostname: "krusader" +# docker +krusader_container_name: "krusader" +krusader_image_name: "djaydev/krusader" +krusader_image_version: "latest" + # specs krusader_memory: 1g diff --git a/roles/krusader/docs/krusader.md b/roles/krusader/docs/krusader.md new file mode 100644 index 0000000000..fc020a1077 --- /dev/null +++ b/roles/krusader/docs/krusader.md @@ -0,0 +1,13 @@ +# Krusader + +Homepage: + +Docker Container: [Krusader](https://hub.docker.com/r/djaydev/krusader) + +Krusader provides twin panel file management for your ansible-nas via browser and VNC. + +## Usage + +Set `krusader_enabled: true` in your `inventories//nas.yml` file. + +The Krusader web interface can be found at . diff --git a/roles/krusader/molecule/default/molecule.yml b/roles/krusader/molecule/default/molecule.yml new file mode 100644 index 0000000000..8c7166075d --- /dev/null +++ b/roles/krusader/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + krusader_enabled: true diff --git a/roles/krusader/molecule/default/side_effect.yml b/roles/krusader/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5f5a9c030d --- /dev/null +++ b/roles/krusader/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + krusader_enabled: false diff --git a/roles/krusader/molecule/default/verify.yml b/roles/krusader/molecule/default/verify.yml new file mode 100644 index 0000000000..24b6cfb2e1 --- /dev/null +++ b/roles/krusader/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Get krusader container state + docker_container_info: + name: "{{ krusader_container_name }}" + register: result + + - name: Check if krusader docker container is running + assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/krusader/molecule/default/verify_stopped.yml b/roles/krusader/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..081b85ad7e --- /dev/null +++ b/roles/krusader/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove krusader + docker_container: + name: "{{ krusader_container_name }}" + state: absent + register: result + + - name: Check if krusader container is stopped + assert: + that: + - not result.changed diff --git a/roles/krusader/tasks/main.yml b/roles/krusader/tasks/main.yml index d193dadd84..2832fd3875 100644 --- a/roles/krusader/tasks/main.yml +++ b/roles/krusader/tasks/main.yml @@ -1,34 +1,46 @@ --- -- name: Krusader Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ krusader_config_directory }}/krusader" +- name: Start Krusader + block: + - name: Krusader Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ krusader_config_directory }}/krusader" -- name: Krusader Docker Container - docker_container: - name: krusader - image: djaydev/krusader:latest - pull: true - volumes: - - "{{ krusader_config_directory }}:/config:rw" - - "{{ krusader_browse_directory }}:/mnt/fs" - ports: - - "{{ krusader_port_http }}:5800" - - "{{ krusader_port_vnc }}:5900" - env: - USER_ID: "{{ krusader_user_id }}" - GROUP_ID: "{{ krusader_group_id }}" - SECURE_CONNECTION: "{{ krusader_secure_connection }}" - TZ: "{{ ansible_nas_timezone }}" - VNC_PASSWORD: "{{ krusader_vnc_password }}" - restart_policy: unless-stopped - memory: "{{ krusader_memory }}" - labels: - traefik.enable: "{{ krusader_available_externally }}" - traefik.http.routers.krusader.rule: "Host(`{{ krusader_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.krusader.tls.certresolver: "letsencrypt" - traefik.http.routers.krusader.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.krusader.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.krusader.loadbalancer.server.port: "5800" + - name: Krusader Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ krusader_container_name }}" + image: "{{ krusader_image_name }}:{{ krusader_image_version }}" + pull: true + volumes: + - "{{ krusader_config_directory }}:/config:rw" + - "{{ krusader_browse_directory }}:/mnt/fs" + ports: + - "{{ krusader_port_http }}:5800" + - "{{ krusader_port_vnc }}:5900" + env: + USER_ID: "{{ krusader_user_id }}" + GROUP_ID: "{{ krusader_group_id }}" + SECURE_CONNECTION: "{{ krusader_secure_connection }}" + TZ: "{{ ansible_nas_timezone }}" + VNC_PASSWORD: "{{ krusader_vnc_password }}" + restart_policy: unless-stopped + memory: "{{ krusader_memory }}" + labels: + traefik.enable: "{{ krusader_available_externally }}" + traefik.http.routers.krusader.rule: "Host(`{{ krusader_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.krusader.tls.certresolver: "letsencrypt" + traefik.http.routers.krusader.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.krusader.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.krusader.loadbalancer.server.port: "5800" + when: krusader_enabled is true + +- name: Stop Krusader + block: + - name: Stop Krusader + community.docker.docker_container: + name: "{{ krusader_container_name }}" + state: absent + when: krusader_enabled is false diff --git a/roles/lidarr/defaults/main.yml b/roles/lidarr/defaults/main.yml index ac89b7100e..7d65c8c221 100644 --- a/roles/lidarr/defaults/main.yml +++ b/roles/lidarr/defaults/main.yml @@ -15,5 +15,10 @@ lidarr_group_id: "0" lidarr_port: "8686" lidarr_hostname: "lidarr" +# docker +lidarr_container_name: "lidarr" +lidarr_image_name: "linuxserver/lidarr" +lidarr_image_version: "latest" + # specs lidarr_memory: 1g diff --git a/roles/lidarr/docs/lidarr.md b/roles/lidarr/docs/lidarr.md new file mode 100644 index 0000000000..3956445491 --- /dev/null +++ b/roles/lidarr/docs/lidarr.md @@ -0,0 +1,9 @@ +# Lidarr + +Homepage: + +Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. + +## Usage + +Set `lidarr_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/lidarr/molecule/default/molecule.yml b/roles/lidarr/molecule/default/molecule.yml new file mode 100644 index 0000000000..5881b4984f --- /dev/null +++ b/roles/lidarr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + lidarr_enabled: true diff --git a/roles/lidarr/molecule/default/side_effect.yml b/roles/lidarr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..9bca21b147 --- /dev/null +++ b/roles/lidarr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + lidarr_enabled: false diff --git a/roles/lidarr/molecule/default/verify.yml b/roles/lidarr/molecule/default/verify.yml new file mode 100644 index 0000000000..02df67184b --- /dev/null +++ b/roles/lidarr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get lidarr container state + community.docker.docker_container: + name: "{{ lidarr_container_name }}" + register: result + + - name: Check if lidarr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/lidarr/molecule/default/verify_stopped.yml b/roles/lidarr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..4fb7012702 --- /dev/null +++ b/roles/lidarr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove lidarr + community.docker.docker_container: + name: "{{ lidarr_container_name }}" + state: absent + register: result + + - name: Check if lidarr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/lidarr/tasks/main.yml b/roles/lidarr/tasks/main.yml index 8e6fa9ae24..abfdccb29f 100644 --- a/roles/lidarr/tasks/main.yml +++ b/roles/lidarr/tasks/main.yml @@ -1,30 +1,42 @@ --- -- name: Create Lidarr Directory - file: - path: "{{ lidarr_data_directory }}" - state: directory +- name: Start Lidarr + block: + - name: Create Lidarr Directory + ansible.builtin.file: + path: "{{ lidarr_data_directory }}" + state: directory -- name: Lidarr Docker Container - docker_container: - name: lidarr - image: linuxserver/lidarr - pull: true - volumes: - - "{{ lidarr_music_directory }}:/music:rw" - - "{{ lidarr_downloads_directory }}:/downloads:rw" - - "{{ lidarr_data_directory }}:/config:rw" - ports: - - "{{ lidarr_port }}:8686" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ lidarr_user_id }}" - PGID: "{{ lidarr_group_id }}" - restart_policy: unless-stopped - memory: "{{ lidarr_memory }}" - labels: - traefik.enable: "{{ lidarr_available_externally | string }}" - traefik.http.routers.lidarr.rule: "Host(`{{ lidarr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.lidarr.tls.certresolver: "letsencrypt" - traefik.http.routers.lidarr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.lidarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.lidarr.loadbalancer.server.port: "8686" + - name: Lidarr Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ lidarr_container_name }}" + image: "{{ lidarr_image_name }}:{{ lidarr_image_version }}" + pull: true + volumes: + - "{{ lidarr_music_directory }}:/music:rw" + - "{{ lidarr_downloads_directory }}:/downloads:rw" + - "{{ lidarr_data_directory }}:/config:rw" + ports: + - "{{ lidarr_port }}:8686" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ lidarr_user_id }}" + PGID: "{{ lidarr_group_id }}" + restart_policy: unless-stopped + memory: "{{ lidarr_memory }}" + labels: + traefik.enable: "{{ lidarr_available_externally | string }}" + traefik.http.routers.lidarr.rule: "Host(`{{ lidarr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.lidarr.tls.certresolver: "letsencrypt" + traefik.http.routers.lidarr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.lidarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.lidarr.loadbalancer.server.port: "8686" + when: lidarr_enabled is true + +- name: Stop Lidarr + block: + - name: Stop Lidarr + community.docker.docker_container: + name: "{{ lidarr_container_name }}" + state: absent + when: lidarr_enabled is false diff --git a/roles/mealie/defaults/main.yml b/roles/mealie/defaults/main.yml index 9555a134e6..3a038c7e88 100644 --- a/roles/mealie/defaults/main.yml +++ b/roles/mealie/defaults/main.yml @@ -13,5 +13,10 @@ mealie_group_id: "1000" mealie_hostname: "mealie" mealie_port: "9925" +# docker +mealie_container_name: "mealie" +mealie_image_name: "hkotel/mealie" +mealie_image_version: "latest" + # specs mealie_memory: 1g diff --git a/roles/mealie/docs/mealie.md b/roles/mealie/docs/mealie.md new file mode 100644 index 0000000000..6e6a1c265a --- /dev/null +++ b/roles/mealie/docs/mealie.md @@ -0,0 +1,11 @@ +# Mealie + +Homepage: + +A self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. + +## Usage + +Set `mealie_enabled: true` in your `inventories//nas.yml` file. + +The Mealie web interface can be found at . diff --git a/roles/mealie/molecule/default/molecule.yml b/roles/mealie/molecule/default/molecule.yml new file mode 100644 index 0000000000..22adf926f9 --- /dev/null +++ b/roles/mealie/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + mealie_enabled: true diff --git a/roles/mealie/molecule/default/side_effect.yml b/roles/mealie/molecule/default/side_effect.yml new file mode 100644 index 0000000000..53a89e50ea --- /dev/null +++ b/roles/mealie/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + mealie_enabled: false diff --git a/roles/mealie/molecule/default/verify.yml b/roles/mealie/molecule/default/verify.yml new file mode 100644 index 0000000000..ae2c360328 --- /dev/null +++ b/roles/mealie/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get mealie container state + community.docker.docker_container: + name: "{{ mealie_container_name }}" + register: result + + - name: Check if mealie containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/mealie/molecule/default/verify_stopped.yml b/roles/mealie/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..1d1abad091 --- /dev/null +++ b/roles/mealie/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove mealie + community.docker.docker_container: + name: "{{ mealie_container_name }}" + state: absent + register: result + + - name: Check if mealie is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/mealie/tasks/main.yml b/roles/mealie/tasks/main.yml index b480eafa4a..9978441c8c 100644 --- a/roles/mealie/tasks/main.yml +++ b/roles/mealie/tasks/main.yml @@ -1,37 +1,50 @@ --- -- name: Create Mealie Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ mealie_data_directory }}/data" +- name: Start Mealie + block: + - name: Create Mealie Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ mealie_data_directory }}/data" + + - name: Mealie Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ mealie_container_name }}" + image: "{{ mealie_image_name }}:{{ mealie_image_version }}" + pull: true + volumes: + - "{{ mealie_data_directory }}:/app/data:rw" + ports: + - "{{ mealie_port }}:80" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ mealie_user_id }}" + PGID: "{{ mealie_group_id }}" + RECIPE_PUBLIC: "true" + RECIPE_SHOW_NUTRITION: "true" + RECIPE_SHOW_ASSETS: "true" + RECIPE_LANDSCAPE_VIEW: "true" + RECIPE_DISABLE_COMMENTS: "false" + RECIPE_DISABLE_AMOUNT: "false" + BASE_URL: "{{ ansible_nas_domain }}:{{ mealie_port }}" + restart_policy: unless-stopped + memory: "{{ mealie_memory }}" + labels: + traefik.enable: "{{ mealie_available_externally | string }}" + traefik.http.routers.mealie.rule: "Host(`{{ mealie_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.mealie.tls.certresolver: "letsencrypt" + traefik.http.routers.mealie.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.mealie.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.mealie.loadbalancer.server.port: "80" + when: mealie_enabled is true + +- name: Stop Mealie + block: + - name: Stop Mealie + community.docker.docker_container: + name: "{{ mealie_container_name }}" + state: absent + when: mealie_enabled is false -- name: Mealie Docker Container - docker_container: - name: mealie - image: hkotel/mealie:latest - pull: true - volumes: - - "{{ mealie_data_directory }}:/app/data:rw" - ports: - - "{{ mealie_port }}:80" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ mealie_user_id }}" - PGID: "{{ mealie_group_id }}" - RECIPE_PUBLIC: "true" - RECIPE_SHOW_NUTRITION: "true" - RECIPE_SHOW_ASSETS: "true" - RECIPE_LANDSCAPE_VIEW: "true" - RECIPE_DISABLE_COMMENTS: "false" - RECIPE_DISABLE_AMOUNT: "false" - BASE_URL: "{{ ansible_nas_domain }}:{{ mealie_port }}" - restart_policy: unless-stopped - memory: "{{ mealie_memory }}" - labels: - traefik.enable: "{{ mealie_available_externally | string }}" - traefik.http.routers.mealie.rule: "Host(`{{ mealie_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.mealie.tls.certresolver: "letsencrypt" - traefik.http.routers.mealie.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.mealie.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.mealie.loadbalancer.server.port: "80" diff --git a/roles/minecraft-server/defaults/main.yml b/roles/minecraft-server/defaults/main.yml index 4fee052b2a..6f29ebaf61 100644 --- a/roles/minecraft-server/defaults/main.yml +++ b/roles/minecraft-server/defaults/main.yml @@ -6,3 +6,8 @@ minecraft_server_data_directory: "{{ docker_home }}/minecraft_server" # network minecraft_server_port: "25565" + +# docker +minecraft_server_container_name: "minecraft-server" +minecraft_server_image_name: "itzg/minecraft-server" +minecraft_server_image_version: "latest" diff --git a/roles/minecraft-server/docs/minecraft-server.md b/roles/minecraft-server/docs/minecraft-server.md new file mode 100644 index 0000000000..e2ac52f8c0 --- /dev/null +++ b/roles/minecraft-server/docs/minecraft-server.md @@ -0,0 +1,13 @@ +# Minecraft Server + +Homepage: + +The server version of the game Minecraft, running in a container. "Prepare for an adventure of limitless possibilities as you build, mine, battle mobs, and explore the ever-changing Minecraft landscape." + +## Usage + +Set `minecraft_server_enabled: true` in your `inventories//nas.yml` file. + +The Ansible NAS host or ip address should then be usable as a server within the Minecraft multiplayer game menu. + +The image `itzg/minecraft-server` has [documentation](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) with further details on how to manage the Minecraft server instance. diff --git a/roles/minecraft-server/molecule/default/molecule.yml b/roles/minecraft-server/molecule/default/molecule.yml new file mode 100644 index 0000000000..b1b89a8328 --- /dev/null +++ b/roles/minecraft-server/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + minecraft_server_enabled: true diff --git a/roles/minecraft-server/molecule/default/side_effect.yml b/roles/minecraft-server/molecule/default/side_effect.yml new file mode 100644 index 0000000000..e098c99510 --- /dev/null +++ b/roles/minecraft-server/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + minecraft_server_enabled: false diff --git a/roles/minecraft-server/molecule/default/verify.yml b/roles/minecraft-server/molecule/default/verify.yml new file mode 100644 index 0000000000..5a145c44a6 --- /dev/null +++ b/roles/minecraft-server/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get minecraft_server container state + community.docker.docker_container: + name: "{{ minecraft_server_container_name }}" + register: result + + - name: Check if minecraft_server containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/minecraft-server/molecule/default/verify_stopped.yml b/roles/minecraft-server/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f89567277b --- /dev/null +++ b/roles/minecraft-server/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove minecraft_server + community.docker.docker_container: + name: "{{ minecraft_server_container_name }}" + state: absent + register: result + + - name: Check if minecraft_server is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/minecraft-server/tasks/main.yml b/roles/minecraft-server/tasks/main.yml index b3d721fb90..a7be622801 100644 --- a/roles/minecraft-server/tasks/main.yml +++ b/roles/minecraft-server/tasks/main.yml @@ -1,20 +1,32 @@ --- -- name: Create Minecraft Server Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ minecraft_server_data_directory }}" +- name: Start Minecraft Server + block: + - name: Create Minecraft Server Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ minecraft_server_data_directory }}" -- name: Minecraft Server Docker Container - docker_container: - name: minecraft-server - image: itzg/minecraft-server:latest - pull: true - volumes: - - "{{ minecraft_server_data_directory }}:/data:rw" - ports: - - "{{ minecraft_server_port }}:25565" - env: - EULA: "TRUE" - restart_policy: unless-stopped + - name: Minecraft Server Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ minecraft_server_container_name }}" + image: "{{ minecraft_server_image_name }}:{{ minecraft_server_image_version }}" + pull: true + volumes: + - "{{ minecraft_server_data_directory }}:/data:rw" + ports: + - "{{ minecraft_server_port }}:25565" + env: + EULA: "TRUE" + restart_policy: unless-stopped + when: minecraft_server_enabled is true + +- name: Stop Minecraft Server + block: + - name: Stop Minecraft Server + community.docker.docker_container: + name: "{{ minecraft_server_container_name }}" + state: absent + when: minecraft_server_enabled is false diff --git a/roles/minidlna/defaults/main.yml b/roles/minidlna/defaults/main.yml index fa29e4cf6a..4fe223f888 100644 --- a/roles/minidlna/defaults/main.yml +++ b/roles/minidlna/defaults/main.yml @@ -11,5 +11,10 @@ minidlna_media_directory2: "{{ tv_root }}" minidlna_friendly_name: "{{ ansible_nas_hostname }}" minidlna_port: "8201" +# docker +minidlna_container_name: "minidnla" +minidlna_image_name: "vladgh/minidlna" +minidlna_image_version: "latest" + # specs minidlna_memory: "1g" diff --git a/roles/minidlna/docs/minidlna.md b/roles/minidlna/docs/minidlna.md new file mode 100644 index 0000000000..1f030d3d15 --- /dev/null +++ b/roles/minidlna/docs/minidlna.md @@ -0,0 +1,11 @@ +# MiniDLNA + +Homepage: + +MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP clients. The MiniDNLA daemon serves media files (music, pictures, and video) to clients on a network. Example clients include applications such as Totem and Kodi, and devices such as portable media players, Smartphones, Televisions, and gaming systems (such as PS3 and Xbox 360). + +## Usage + +Set `minidlna_enabled: true` in your `inventories//nas.yml` file. + +The very basic MiniDLNA web interface can be found at . diff --git a/roles/minidlna/molecule/default/molecule.yml b/roles/minidlna/molecule/default/molecule.yml new file mode 100644 index 0000000000..45dcbcbfab --- /dev/null +++ b/roles/minidlna/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + minidlna_enabled: true + ansible_nas_hostname: ansible-nas diff --git a/roles/minidlna/molecule/default/side_effect.yml b/roles/minidlna/molecule/default/side_effect.yml new file mode 100644 index 0000000000..8aa2b5ba8b --- /dev/null +++ b/roles/minidlna/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + minidlna_enabled: false diff --git a/roles/minidlna/molecule/default/verify.yml b/roles/minidlna/molecule/default/verify.yml new file mode 100644 index 0000000000..7cad6a8c20 --- /dev/null +++ b/roles/minidlna/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get minidlna container state + community.docker.docker_container: + name: "{{ minidlna_container_name }}" + register: result + + - name: Check if minidlna containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/minidlna/molecule/default/verify_stopped.yml b/roles/minidlna/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..cb144af74b --- /dev/null +++ b/roles/minidlna/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove minidlna + community.docker.docker_container: + name: "{{ minidlna_container_name }}" + state: absent + register: result + + - name: Check if minidlna is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/minidlna/tasks/main.yml b/roles/minidlna/tasks/main.yml index 8feb8ebd60..513c9696ad 100644 --- a/roles/minidlna/tasks/main.yml +++ b/roles/minidlna/tasks/main.yml @@ -1,17 +1,29 @@ --- -- name: MiniDLNA Docker Container - docker_container: - name: minidlna - image: vladgh/minidlna - pull: true - volumes: - - "{{ minidlna_media_directory1 }}:/media1:rw" - - "{{ minidlna_media_directory2 }}:/media2:rw" - env: - MINIDLNA_MEDIA_DIR1: "/media1" - MINIDLNA_MEDIA_DIR2: "/media2" - MINIDLNA_FRIENDLY_NAME: "{{ minidlna_friendly_name }}" - MINIDLNA_PORT: "{{ minidlna_port }}" - restart_policy: unless-stopped - network_mode: host - memory: "{{ minidlna_memory }}" +- name: Start MiniDLNA + block: + - name: MiniDLNA Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ minidlna_container_name }}" + image: "{{ minidlna_image_name }}:{{ minidlna_image_version }}" + pull: true + volumes: + - "{{ minidlna_media_directory1 }}:/media1:rw" + - "{{ minidlna_media_directory2 }}:/media2:rw" + env: + MINIDLNA_MEDIA_DIR1: "/media1" + MINIDLNA_MEDIA_DIR2: "/media2" + MINIDLNA_FRIENDLY_NAME: "{{ minidlna_friendly_name }}" + MINIDLNA_PORT: "{{ minidlna_port }}" + restart_policy: unless-stopped + network_mode: host + memory: "{{ minidlna_memory }}" + when: minidlna_enabled is true + +- name: Stop MiniDLNA + block: + - name: Stop MiniDLNA + community.docker.docker_container: + name: "{{ minidlna_container_name }}" + state: absent + when: minidlna_enabled is false diff --git a/roles/miniflux/defaults/main.yml b/roles/miniflux/defaults/main.yml index 40a3caa6e5..010223fd2e 100644 --- a/roles/miniflux/defaults/main.yml +++ b/roles/miniflux/defaults/main.yml @@ -14,6 +14,14 @@ miniflux_admin_password: supersecure miniflux_hostname: "miniflux" miniflux_port: "8070" +# docker +miniflux_container_name: "miniflux" +miniflux_image_name: "miniflux/miniflux" +miniflux_image_version: "latest" +miniflux_db_container_name: "miniflux-postgres" +miniflux_db_image_name: "postgres" +miniflux_db_image_version: "11.1" + # specs miniflux_memory: "1g" miniflux_postgres_memory: "1g" diff --git a/roles/miniflux/docs/miniflux.md b/roles/miniflux/docs/miniflux.md new file mode 100644 index 0000000000..92890158b9 --- /dev/null +++ b/roles/miniflux/docs/miniflux.md @@ -0,0 +1,15 @@ +# Miniflux + +Homepage: + +Miniflux is a minimalist and opinionated feed reader. + +## Usage + +Set `miniflux_enabled: true` in your `inventories//nas.yml` file. + +The Miniflux web interface can be found at , the default username is `admin` and password `supersecure`. + +## Specific Configuration + +An admin user will be created with the username and password of `miniflux_admin_username` and `miniflux_admin_password` respectively. These can be found in the Miniflux section within `all.yml.dist`. diff --git a/roles/miniflux/molecule/default/molecule.yml b/roles/miniflux/molecule/default/molecule.yml new file mode 100644 index 0000000000..281aaf2ab1 --- /dev/null +++ b/roles/miniflux/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + miniflux_enabled: true diff --git a/roles/miniflux/molecule/default/side_effect.yml b/roles/miniflux/molecule/default/side_effect.yml new file mode 100644 index 0000000000..2f1a23d184 --- /dev/null +++ b/roles/miniflux/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + miniflux_enabled: false diff --git a/roles/miniflux/molecule/default/verify.yml b/roles/miniflux/molecule/default/verify.yml new file mode 100644 index 0000000000..89bb48fd7f --- /dev/null +++ b/roles/miniflux/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get miniflux container state + community.docker.docker_container: + name: "{{ miniflux_container_name }}" + register: result + + - name: Check if miniflux containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/miniflux/molecule/default/verify_stopped.yml b/roles/miniflux/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..05382c5dd2 --- /dev/null +++ b/roles/miniflux/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove miniflux + community.docker.docker_container: + name: "{{ miniflux_container_name }}" + state: absent + register: result + + - name: Check if miniflux is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/miniflux/tasks/main.yml b/roles/miniflux/tasks/main.yml index 969f35851a..664813df37 100644 --- a/roles/miniflux/tasks/main.yml +++ b/roles/miniflux/tasks/main.yml @@ -1,45 +1,58 @@ --- -- name: Create Miniflux Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ miniflux_data_directory }}/postgres" +- name: Start Miniflux + block: + - name: Create Miniflux Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ miniflux_data_directory }}/postgres" -- name: Create Postgres for Miniflux - docker_container: - name: miniflux-postgres - image: postgres:11.1 - pull: true - volumes: - - "{{ miniflux_data_directory }}/postgres:/var/lib/postgresql/data:rw" - env: - POSTGRES_USER: "miniflux" - POSTGRES_PASSWORD: "supersecure" - restart_policy: unless-stopped - memory: "{{ miniflux_postgres_memory }}" + - name: Create Postgres for Miniflux + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ miniflux_db_container_name }}" + image: "{{ miniflux_db_image_name }}:{{ miniflux_db_image_version }}" + pull: true + volumes: + - "{{ miniflux_data_directory }}/postgres:/var/lib/postgresql/data:rw" + env: + POSTGRES_USER: "miniflux" + POSTGRES_PASSWORD: "supersecure" + restart_policy: unless-stopped + memory: "{{ miniflux_postgres_memory }}" -- name: Create Miniflux Docker Container - docker_container: - name: miniflux - image: miniflux/miniflux:latest - pull: true - links: - - miniflux-postgres:db - ports: - - "{{ miniflux_port }}:8080" - env: - DATABASE_URL: "postgres://miniflux:supersecure@db/miniflux?sslmode=disable" - RUN_MIGRATIONS: "1" - CREATE_ADMIN: "1" - ADMIN_USERNAME: "{{ miniflux_admin_username }}" - ADMIN_PASSWORD: "{{ miniflux_admin_password }}" - restart_policy: unless-stopped - memory: "{{ miniflux_memory }}" - labels: - traefik.enable: "{{ miniflux_available_externally | string }}" - traefik.http.routers.miniflux.rule: "Host(`{{ miniflux_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.miniflux.tls.certresolver: "letsencrypt" - traefik.http.routers.miniflux.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.miniflux.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.miniflux.loadbalancer.server.port: "8080" + - name: Create Miniflux Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ miniflux_container_name }}" + image: "{{ miniflux_image_name }}:{{ miniflux_image_version }}" + pull: true + links: + - miniflux-postgres:db + ports: + - "{{ miniflux_port }}:8080" + env: + DATABASE_URL: "postgres://miniflux:supersecure@db/miniflux?sslmode=disable" + RUN_MIGRATIONS: "1" + CREATE_ADMIN: "1" + ADMIN_USERNAME: "{{ miniflux_admin_username }}" + ADMIN_PASSWORD: "{{ miniflux_admin_password }}" + restart_policy: unless-stopped + memory: "{{ miniflux_memory }}" + labels: + traefik.enable: "{{ miniflux_available_externally | string }}" + traefik.http.routers.miniflux.rule: "Host(`{{ miniflux_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.miniflux.tls.certresolver: "letsencrypt" + traefik.http.routers.miniflux.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.miniflux.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.miniflux.loadbalancer.server.port: "8080" + when: miniflux_enabled is true + +- name: Stop Miniflux + block: + - name: Stop Miniflux + community.docker.docker_container: + name: "{{ miniflux_container_name }}" + state: absent + when: miniflux_enabled is false diff --git a/roles/mosquitto/defaults/main.yml b/roles/mosquitto/defaults/main.yml index f1aa88a67b..0060d18a8b 100644 --- a/roles/mosquitto/defaults/main.yml +++ b/roles/mosquitto/defaults/main.yml @@ -12,5 +12,10 @@ mosquitto_group_id: "0" mosquitto_port_a: "1883" mosquitto_port_b: "9001" +# docker +mosquitto_container_name: "mosquitto" +mosquitto_image_name: "eclipse-mosquitto" +mosquitto_image_version: "latest" + # specs mosquitto_memory: 1g diff --git a/roles/mosquitto/docs/mosquitto.md b/roles/mosquitto/docs/mosquitto.md new file mode 100644 index 0000000000..4015613e01 --- /dev/null +++ b/roles/mosquitto/docs/mosquitto.md @@ -0,0 +1,9 @@ +# Mosquitto + +Homepage: + +Mosquitto is a lightweight open source MQTT message broker. + +## Usage + +Set `mosquitto_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/mosquitto/molecule/default/molecule.yml b/roles/mosquitto/molecule/default/molecule.yml new file mode 100644 index 0000000000..0cbf69e3d3 --- /dev/null +++ b/roles/mosquitto/molecule/default/molecule.yml @@ -0,0 +1,16 @@ +--- +provisioner: + inventory: + group_vars: + all: + mosquitto_enabled: true + mosquitto_data_directory: "/tmp/mosquitto" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp:rw + privileged: true + pre_build_image: true diff --git a/roles/mosquitto/molecule/default/side_effect.yml b/roles/mosquitto/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5b4097e630 --- /dev/null +++ b/roles/mosquitto/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + mosquitto_enabled: false diff --git a/roles/mosquitto/molecule/default/verify.yml b/roles/mosquitto/molecule/default/verify.yml new file mode 100644 index 0000000000..0656648d9f --- /dev/null +++ b/roles/mosquitto/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get mosquitto container state + community.docker.docker_container: + name: "{{ mosquitto_container_name }}" + register: result + + - name: Check if mosquitto containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/mosquitto/molecule/default/verify_stopped.yml b/roles/mosquitto/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..f7e040ccdf --- /dev/null +++ b/roles/mosquitto/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove mosquitto + community.docker.docker_container: + name: "{{ mosquitto_container_name }}" + state: absent + register: result + + - name: Check if mosquitto is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/mosquitto/tasks/main.yml b/roles/mosquitto/tasks/main.yml index aa787c77b1..9442184537 100644 --- a/roles/mosquitto/tasks/main.yml +++ b/roles/mosquitto/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create Mosquitto Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ mosquitto_data_directory }}/config" - - "{{ mosquitto_data_directory }}/data" - - "{{ mosquitto_data_directory }}/log" +- name: Start Mosquitto + block: + - name: Create Mosquitto Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ mosquitto_data_directory }}/config" + - "{{ mosquitto_data_directory }}/data" + - "{{ mosquitto_data_directory }}/log" -- name: Template mosquitto.conf - copy: - src: mosquitto.conf - dest: "{{ mosquitto_data_directory }}/config/mosquitto.conf" - register: mosquitto_conf + - name: Template mosquitto.conf + ansible.builtin.copy: + src: mosquitto.conf + dest: "{{ mosquitto_data_directory }}/config/mosquitto.conf" + register: mosquitto_conf -- name: Create Mosquitto container - docker_container: - name: mosquitto - image: eclipse-mosquitto:latest - pull: true - volumes: - - "{{ mosquitto_data_directory }}/config/mosquitto.conf:/mosquitto/config/mosquitto.conf:rw" - - "{{ mosquitto_data_directory }}/data:/mosquitto/data:rw" - - "{{ mosquitto_data_directory }}/log:/mosquitto/log:rw" - ports: - - "{{ mosquitto_port_a }}:1883" - - "{{ mosquitto_port_b }}:9001" - restart_policy: unless-stopped - restart: "{{ mosquitto_conf is changed }}" - memory: 1g + - name: Create Mosquitto container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ mosquitto_container_name }}" + image: "{{ mosquitto_image_name }}:{{ mosquitto_image_version }}" + pull: true + volumes: + - "{{ mosquitto_data_directory }}/config/mosquitto.conf:/mosquitto/config/mosquitto.conf:rw" + - "{{ mosquitto_data_directory }}/data:/mosquitto/data:rw" + - "{{ mosquitto_data_directory }}/log:/mosquitto/log:rw" + ports: + - "{{ mosquitto_port_a }}:1883" + - "{{ mosquitto_port_b }}:9001" + restart_policy: unless-stopped + restart: "{{ mosquitto_conf is changed }}" + memory: 1g + when: mosquitto_enabled is true + +- name: Stop Mosquitto + block: + - name: Stop Mosquitto + community.docker.docker_container: + name: "{{ mosquitto_container_name }}" + state: absent + when: mosquitto_enabled is false diff --git a/roles/mylar/defaults/main.yml b/roles/mylar/defaults/main.yml index ad073aac99..f91212e2c1 100644 --- a/roles/mylar/defaults/main.yml +++ b/roles/mylar/defaults/main.yml @@ -16,5 +16,10 @@ mylar_group_id: "0" mylar_hostname: "mylar" mylar_port_http: "8585" +# docker +mylar_container_name: "mylar" +mylar_image_name: "linuxserver/mylar" +mylar_image_version: "latest" + # specs mylar_memory: "1g" diff --git a/roles/mylar/docs/mylar.md b/roles/mylar/docs/mylar.md new file mode 100644 index 0000000000..0ddf2e913c --- /dev/null +++ b/roles/mylar/docs/mylar.md @@ -0,0 +1,15 @@ +# Mylar + +Homepage: + +Docker Container: + +An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents + +## Usage + +Set `mylar_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Mylar externally, don't forget to set `mylar_available_externally: true` in your `inventories//nas.yml` file. + +The Mylar web interface can be found at . diff --git a/roles/mylar/molecule/default/molecule.yml b/roles/mylar/molecule/default/molecule.yml new file mode 100644 index 0000000000..8eb0e567da --- /dev/null +++ b/roles/mylar/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + mylar_enabled: true diff --git a/roles/mylar/molecule/default/side_effect.yml b/roles/mylar/molecule/default/side_effect.yml new file mode 100644 index 0000000000..bf19034e8c --- /dev/null +++ b/roles/mylar/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + mylar_enabled: false diff --git a/roles/mylar/molecule/default/verify.yml b/roles/mylar/molecule/default/verify.yml new file mode 100644 index 0000000000..fb17cd4115 --- /dev/null +++ b/roles/mylar/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get mylar container state + community.docker.docker_container: + name: "{{ mylar_container_name }}" + register: result + + - name: Check if mylar containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/mylar/molecule/default/verify_stopped.yml b/roles/mylar/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..8d3cf8a731 --- /dev/null +++ b/roles/mylar/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove mylar + community.docker.docker_container: + name: "{{ mylar_container_name }}" + state: absent + register: result + + - name: Check if mylar is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/mylar/tasks/main.yml b/roles/mylar/tasks/main.yml index c7e1e2400f..16d4f97d52 100644 --- a/roles/mylar/tasks/main.yml +++ b/roles/mylar/tasks/main.yml @@ -1,34 +1,46 @@ --- -- name: Create Mylar Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ mylar_data_directory }}/config" +- name: Start Mylar + block: + - name: Create Mylar Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ mylar_data_directory }}/config" -- name: Mylar Docker Container - docker_container: - name: mylar - image: linuxserver/mylar - pull: true - volumes: - - "{{ mylar_comics_directory }}:/comics:rw" - - "{{ mylar_downloads_directory }}:/downloads:rw" - - "{{ mylar_data_directory }}/config:/config:rw" - network_mode: "bridge" - ports: - - "{{ mylar_port_http }}:8090" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ mylar_user_id }}" - PGID: "{{ mylar_group_id }}" - restart_policy: unless-stopped - memory: "{{ mylar_memory }}" - labels: - traefik.enable: "{{ mylar_available_externally | string }}" - traefik.http.routers.mylar.rule: "Host(`{{ mylar_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.mylar.tls.certresolver: "letsencrypt" - traefik.http.routers.mylar.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.mylar.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.mylar.loadbalancer.server.port: "8090" + - name: Mylar Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ mylar_container_name }}" + image: "{{ mylar_image_name }}:{{ mylar_image_version }}" + pull: true + volumes: + - "{{ mylar_comics_directory }}:/comics:rw" + - "{{ mylar_downloads_directory }}:/downloads:rw" + - "{{ mylar_data_directory }}/config:/config:rw" + network_mode: "bridge" + ports: + - "{{ mylar_port_http }}:8090" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ mylar_user_id }}" + PGID: "{{ mylar_group_id }}" + restart_policy: unless-stopped + memory: "{{ mylar_memory }}" + labels: + traefik.enable: "{{ mylar_available_externally | string }}" + traefik.http.routers.mylar.rule: "Host(`{{ mylar_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.mylar.tls.certresolver: "letsencrypt" + traefik.http.routers.mylar.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.mylar.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.mylar.loadbalancer.server.port: "8090" + when: mylar_enabled is true + +- name: Stop Mylar + block: + - name: Stop Mylar + community.docker.docker_container: + name: "{{ mylar_container_name }}" + state: absent + when: mylar_enabled is false diff --git a/roles/mymediaforalexa/defaults/main.yml b/roles/mymediaforalexa/defaults/main.yml index 048b401003..f95a7ec019 100644 --- a/roles/mymediaforalexa/defaults/main.yml +++ b/roles/mymediaforalexa/defaults/main.yml @@ -6,5 +6,10 @@ mymediaforalexa_enabled: false mymediaforalexa_media_directory: "{{ music_root }}" mymediaforalexa_data_directory: "{{ docker_home }}/mymediaforalexa" +# docker +mymediaforalexa_container_name: "mymediaforalexa" +mymediaforalexa_image_name: "bizmodeller/mymediaforalexa" +mymediaforalexa_image_version: "latest" + # specs mymediaforalexa_memory: "1g" diff --git a/roles/mymediaforalexa/docs/mymediaforalexa.md b/roles/mymediaforalexa/docs/mymediaforalexa.md new file mode 100644 index 0000000000..174f19d71c --- /dev/null +++ b/roles/mymediaforalexa/docs/mymediaforalexa.md @@ -0,0 +1,11 @@ +# My Media for Alexa + +Homepage: + +My Media lets you stream your music collection to your Amazon Echo or Amazon Dot without having to upload all your music collection to the Cloud. This keeps your music under your control. + +## Usage + +Set `mymediaforalexa_enabled: true` in your `inventories//nas.yml` file. + +The My Media for Alexa web interface can be found at . diff --git a/roles/mymediaforalexa/molecule/default/molecule.yml b/roles/mymediaforalexa/molecule/default/molecule.yml new file mode 100644 index 0000000000..da34cf39b2 --- /dev/null +++ b/roles/mymediaforalexa/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + mymediaforalexa_enabled: true diff --git a/roles/mymediaforalexa/molecule/default/side_effect.yml b/roles/mymediaforalexa/molecule/default/side_effect.yml new file mode 100644 index 0000000000..c08d3232cc --- /dev/null +++ b/roles/mymediaforalexa/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + mymediaforalexa_enabled: false diff --git a/roles/mymediaforalexa/molecule/default/verify.yml b/roles/mymediaforalexa/molecule/default/verify.yml new file mode 100644 index 0000000000..c9a5e4bdf8 --- /dev/null +++ b/roles/mymediaforalexa/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get mymediaforalexa container state + community.docker.docker_container: + name: "{{ mymediaforalexa_container_name }}" + register: result + + - name: Check if mymediaforalexa containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/mymediaforalexa/molecule/default/verify_stopped.yml b/roles/mymediaforalexa/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..6d26c297a3 --- /dev/null +++ b/roles/mymediaforalexa/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove mymediaforalexa + community.docker.docker_container: + name: "{{ mymediaforalexa_container_name }}" + state: absent + register: result + + - name: Check if mymediaforalexa is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/mymediaforalexa/tasks/main.yml b/roles/mymediaforalexa/tasks/main.yml index 4c2264d7c6..540e6abaf0 100644 --- a/roles/mymediaforalexa/tasks/main.yml +++ b/roles/mymediaforalexa/tasks/main.yml @@ -1,20 +1,32 @@ --- -- name: Create Mymediaforalexa Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ mymediaforalexa_media_directory }}" - - "{{ mymediaforalexa_data_directory }}" +- name: Start Mymediaforalexa + block: + - name: Create Mymediaforalexa Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ mymediaforalexa_media_directory }}" + - "{{ mymediaforalexa_data_directory }}" -- name: Mymediaforalexa Docker Container - docker_container: - name: mymediaforalexa - image: bizmodeller/mymediaforalexa - pull: true - volumes: - - "{{ mymediaforalexa_media_directory }}:/medialibrary:rw" - - "{{ mymediaforalexa_data_directory }}:/datadir:rw" - network_mode: host - restart_policy: unless-stopped - memory: "{{ mymediaforalexa_memory }}" + - name: Mymediaforalexa Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ mymediaforalexa_container_name }}" + image: "{{ mymediaforalexa_image_name }}:{{ mymediaforalexa_image_version }}" + pull: true + volumes: + - "{{ mymediaforalexa_media_directory }}:/medialibrary:rw" + - "{{ mymediaforalexa_data_directory }}:/datadir:rw" + network_mode: host + restart_policy: unless-stopped + memory: "{{ mymediaforalexa_memory }}" + when: mymediaforalexa_enabled is true + +- name: Stop Mymediaforalexa + block: + - name: Stop Mymediaforalexa + community.docker.docker_container: + name: "{{ mymediaforalexa_container_name }}" + state: absent + when: mymediaforalexa_enabled is false diff --git a/roles/n8n/defaults/main.yml b/roles/n8n/defaults/main.yml index eec8392570..aebb7fa10e 100644 --- a/roles/n8n/defaults/main.yml +++ b/roles/n8n/defaults/main.yml @@ -13,5 +13,10 @@ n8n_data_directory: "{{ docker_home }}/n8n" n8n_basic_auth_user: "n8n_user" n8n_basic_auth_password: "n8n_change_me" +# docker +n8n_container_name: "n8n" +n8n_image_name: "n8nio/n8n" +n8n_image_version: "latest" + # specs n8n_memory: 1g diff --git a/roles/n8n/docs/n8n.md b/roles/n8n/docs/n8n.md new file mode 100644 index 0000000000..5f531246d7 --- /dev/null +++ b/roles/n8n/docs/n8n.md @@ -0,0 +1,18 @@ +# Nodemation (n8n) + +Homepage: + +Extendable workflow automation tool that enables you to connect anything to everything. More pragrmatically, it helps you interconnect API with each other to build your own information / work flows. + +## Usage + +Set `n8n_enabled: true` in your `inventories//nas.yml` file. + +n8n is secured by default, he user and password can be set with: + +```yaml + n8n_basic_auth_user: "" + n8n_basic_auth_password: "" +``` + +The default for these is "n8n_user" and "n8n_change_me" respectively, it is recommended to change these. diff --git a/roles/n8n/molecule/default/molecule.yml b/roles/n8n/molecule/default/molecule.yml new file mode 100644 index 0000000000..3ae3f608cc --- /dev/null +++ b/roles/n8n/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + n8n_enabled: true diff --git a/roles/n8n/molecule/default/side_effect.yml b/roles/n8n/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5e5f2fb295 --- /dev/null +++ b/roles/n8n/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + n8n_enabled: false diff --git a/roles/n8n/molecule/default/verify.yml b/roles/n8n/molecule/default/verify.yml new file mode 100644 index 0000000000..3ea8d266c3 --- /dev/null +++ b/roles/n8n/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get n8n container state + community.docker.docker_container: + name: "{{ n8n_container_name }}" + register: result + + - name: Check if n8n containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/n8n/molecule/default/verify_stopped.yml b/roles/n8n/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e6081311d9 --- /dev/null +++ b/roles/n8n/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove n8n + community.docker.docker_container: + name: "{{ n8n_container_name }}" + state: absent + register: result + + - name: Check if n8n is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/n8n/tasks/main.yml b/roles/n8n/tasks/main.yml index 8d6fd8a289..f2b59ca016 100644 --- a/roles/n8n/tasks/main.yml +++ b/roles/n8n/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create n8n Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ n8n_data_directory }}" +- name: Start n8n + block: + - name: Create n8n Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ n8n_data_directory }}" -- name: Create n8n Docker Container - docker_container: - name: n8n - image: n8nio/n8n - pull: true - ports: - - "{{ n8n_port }}:5678" - volumes: - - "{{ n8n_data_directory }}:/home/node/.n8n:rw" - - "/etc/timezone:/etc/timezone:ro" - restart_policy: unless-stopped - memory: "{{ n8n_memory }}" - env: - N8N_BASIC_AUTH_ACTIVE: "true" - N8N_BASIC_AUTH_USER: "{{ n8n_basic_auth_user }}" - N8N_BASIC_AUTH_PASSWORD: "{{ n8n_basic_auth_password }}" - labels: - traefik.enable: "{{ n8n_available_externally | string }}" - traefik.http.routers.n8n.rule: "Host(`{{ n8n_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.n8n.tls.certresolver: "letsencrypt" - traefik.http.routers.n8n.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.n8n.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.n8n.loadbalancer.server.port: "5678" + - name: Create n8n Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ n8n_container_name }}" + image: "{{ n8n_image_name }}:{{ n8n_image_version }}" + pull: true + ports: + - "{{ n8n_port }}:5678" + volumes: + - "{{ n8n_data_directory }}:/home/node/.n8n:rw" + - "/etc/timezone:/etc/timezone:ro" + restart_policy: unless-stopped + memory: "{{ n8n_memory }}" + env: + N8N_BASIC_AUTH_ACTIVE: "true" + N8N_BASIC_AUTH_USER: "{{ n8n_basic_auth_user }}" + N8N_BASIC_AUTH_PASSWORD: "{{ n8n_basic_auth_password }}" + labels: + traefik.enable: "{{ n8n_available_externally | string }}" + traefik.http.routers.n8n.rule: "Host(`{{ n8n_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.n8n.tls.certresolver: "letsencrypt" + traefik.http.routers.n8n.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.n8n.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.n8n.loadbalancer.server.port: "5678" + when: n8n_enabled is true + +- name: Stop n8n + block: + - name: Stop n8n + community.docker.docker_container: + name: "{{ n8n_container_name }}" + state: absent + when: n8n_enabled is false diff --git a/roles/navidrome/defaults/main.yml b/roles/navidrome/defaults/main.yml index a5c894a875..9bb8140362 100644 --- a/roles/navidrome/defaults/main.yml +++ b/roles/navidrome/defaults/main.yml @@ -10,6 +10,11 @@ navidrome_music_directory: "{{ music_root }}" navidrome_port: "4533" navidrome_hostname: "navidrome" +# docker +navidrome_container_name: "navidrome" +navidrome_image_name: "deluan/navidrome" +navidrome_image_version: "latest" + # specs navidrome_memory: 1g diff --git a/roles/navidrome/docs/navidrome.md b/roles/navidrome/docs/navidrome.md new file mode 100644 index 0000000000..bd8bb18053 --- /dev/null +++ b/roles/navidrome/docs/navidrome.md @@ -0,0 +1,11 @@ +# Navidrome + +Homepage: + +Navidrome is an open source web-based music collection server and streamer that is compatible with Subsonic/Airsonic. It gives you freedom to listen to your music collection from any browser or mobile device. It's like your personal Spotify! + +## Usage + +Set `navidrome_enabled: true` in your `inventories//nas.yml` file. + +The Navidrome web interface can be found at . diff --git a/roles/navidrome/molecule/default/molecule.yml b/roles/navidrome/molecule/default/molecule.yml new file mode 100644 index 0000000000..0b83fc56a8 --- /dev/null +++ b/roles/navidrome/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + navidrome_enabled: true diff --git a/roles/navidrome/molecule/default/side_effect.yml b/roles/navidrome/molecule/default/side_effect.yml new file mode 100644 index 0000000000..302d634fe1 --- /dev/null +++ b/roles/navidrome/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + navidrome_enabled: false diff --git a/roles/navidrome/molecule/default/verify.yml b/roles/navidrome/molecule/default/verify.yml new file mode 100644 index 0000000000..e791e779f1 --- /dev/null +++ b/roles/navidrome/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get navidrome container state + community.docker.docker_container: + name: "{{ navidrome_container_name }}" + register: result + + - name: Check if navidrome containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/navidrome/molecule/default/verify_stopped.yml b/roles/navidrome/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..b26f69ba34 --- /dev/null +++ b/roles/navidrome/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove navidrome + community.docker.docker_container: + name: "{{ navidrome_container_name }}" + state: absent + register: result + + - name: Check if navidrome is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/navidrome/tasks/main.yml b/roles/navidrome/tasks/main.yml index 9913c80711..c4a8e92efb 100644 --- a/roles/navidrome/tasks/main.yml +++ b/roles/navidrome/tasks/main.yml @@ -1,35 +1,47 @@ --- -- name: Create Navidrome Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ navidrome_data_directory }}/data" - - "{{ navidrome_data_directory }}/playlists" +- name: Start Navidrome + block: + - name: Create Navidrome Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ navidrome_data_directory }}/data" + - "{{ navidrome_data_directory }}/playlists" -- name: Navidrome Docker Container - docker_container: - name: navidrome - image: deluan/navidrome:latest - pull: true - volumes: - - "{{ navidrome_data_directory }}/data:/navidrome/data:rw" - - "{{ navidrome_music_directory }}:/navidrome/music:rw" - ports: - - "{{ navidrome_port }}:4533" - env: - ND_MUSICFOLDER: "/navidrome/music" - ND_DATAFOLDER: "/navidrome/data" - ND_SCANSCHEDULE: "{{ navidrome_scan_schedule }}" - ND_LOGLEVEL: "{{ navidrome_log_level }}" - ND_SESSIONTIMEOUT: "{{ navidrome_session_timeout }}" - restart_policy: unless-stopped - memory: "{{ navidrome_memory }}" - labels: - traefik.enable: "{{ navidrome_available_externally | string }}" - traefik.http.routers.navidrome.rule: "Host(`{{ navidrome_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.navidrome.tls.certresolver: "letsencrypt" - traefik.http.routers.navidrome.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.navidrome.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.navidrome.loadbalancer.server.port: "4533" + - name: Navidrome Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ navidrome_container_name }}" + image: "{{ navidrome_image_name }}:{{ navidrome_image_version }}" + pull: true + volumes: + - "{{ navidrome_data_directory }}/data:/navidrome/data:rw" + - "{{ navidrome_music_directory }}:/navidrome/music:rw" + ports: + - "{{ navidrome_port }}:4533" + env: + ND_MUSICFOLDER: "/navidrome/music" + ND_DATAFOLDER: "/navidrome/data" + ND_SCANSCHEDULE: "{{ navidrome_scan_schedule }}" + ND_LOGLEVEL: "{{ navidrome_log_level }}" + ND_SESSIONTIMEOUT: "{{ navidrome_session_timeout }}" + restart_policy: unless-stopped + memory: "{{ navidrome_memory }}" + labels: + traefik.enable: "{{ navidrome_available_externally | string }}" + traefik.http.routers.navidrome.rule: "Host(`{{ navidrome_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.navidrome.tls.certresolver: "letsencrypt" + traefik.http.routers.navidrome.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.navidrome.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.navidrome.loadbalancer.server.port: "4533" + when: navidrome_enabled is true + +- name: Stop Navidrome + block: + - name: Stop Navidrome + community.docker.docker_container: + name: "{{ navidrome_container_name }}" + state: absent + when: navidrome_enabled is false diff --git a/roles/netbootxyz/defaults/main.yml b/roles/netbootxyz/defaults/main.yml index d07a21bb01..9664eacd3c 100644 --- a/roles/netbootxyz/defaults/main.yml +++ b/roles/netbootxyz/defaults/main.yml @@ -12,7 +12,10 @@ netbootxyz_port_http: "3002" netbootxyz_port_http2: "5803" netbootxyz_port_tftp: "69" -# uid/gid +# docker +netbootxyz_container_name: "netbootxyz" +netbootxyz_image_name: "linuxserver/netbootxyz" +netbootxyz_image_version: "latest" netbootxyz_user_id: "1000" netbootxyz_group_id: "1000" diff --git a/roles/netbootxyz/docs/netbootxyz.md b/roles/netbootxyz/docs/netbootxyz.md new file mode 100644 index 0000000000..cff9c1d4e6 --- /dev/null +++ b/roles/netbootxyz/docs/netbootxyz.md @@ -0,0 +1,15 @@ +# netboot.xyz + +Homepage: + +Docker Container: + +netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool. [iPXE](https://ipxe.org/) is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags. + +You can remote attach the ISO to servers, set it up as a rescue option in Grub, or even set up your home network to boot to it by default so that it's always available. + +## Usage + +Set `netbootxyz_enabled: true` in your `inventories//nas.yml` file. + +The netbooxyz web interface can be found at . diff --git a/roles/netbootxyz/molecule/default/molecule.yml b/roles/netbootxyz/molecule/default/molecule.yml new file mode 100644 index 0000000000..c563631fec --- /dev/null +++ b/roles/netbootxyz/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + netbootxyz_enabled: true diff --git a/roles/netbootxyz/molecule/default/side_effect.yml b/roles/netbootxyz/molecule/default/side_effect.yml new file mode 100644 index 0000000000..aa02d185ed --- /dev/null +++ b/roles/netbootxyz/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + netbootxyz_enabled: false diff --git a/roles/netbootxyz/molecule/default/verify.yml b/roles/netbootxyz/molecule/default/verify.yml new file mode 100644 index 0000000000..2f2efee870 --- /dev/null +++ b/roles/netbootxyz/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get netbootxyz container state + community.docker.docker_container: + name: "{{ netbootxyz_container_name }}" + register: result + + - name: Check if netbootxyz containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/netbootxyz/molecule/default/verify_stopped.yml b/roles/netbootxyz/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..86e1213397 --- /dev/null +++ b/roles/netbootxyz/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove netbootxyz + community.docker.docker_container: + name: "{{ netbootxyz_container_name }}" + state: absent + register: result + + - name: Check if netbootxyz is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/netbootxyz/tasks/main.yml b/roles/netbootxyz/tasks/main.yml index 4247a50c07..e135ddb340 100644 --- a/roles/netbootxyz/tasks/main.yml +++ b/roles/netbootxyz/tasks/main.yml @@ -1,34 +1,46 @@ --- -- name: Netbootxyz Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ netbootxyz_config_directory }}" - - "{{ netbootxyz_assets_directory }}" +- name: Start Netbootxyz + block: + - name: Netbootxyz Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ netbootxyz_config_directory }}" + - "{{ netbootxyz_assets_directory }}" -- name: Netbootxyz Docker Container - docker_container: - name: netbootxyz - image: linuxserver/netbootxyz:latest - pull: true - volumes: - - "{{ netbootxyz_config_directory }}:/config:rw" - - "{{ netbootxyz_assets_directory }}:/assets:rw" - ports: - - "{{ netbootxyz_port_http }}:3000" - - "{{ netbootxyz_port_http2 }}:80" - - "{{ netbootxyz_port_tftp }}:69/udp" - memory: "{{ netbootxyz_memory }}" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ netbootxyz_user_id }}" - PGID: "{{ netbootxyz_group_id }}" - restart_policy: unless-stopped - labels: - traefik.enable: "{{ netbootxyz_available_externally | string }}" - traefik.http.routers.netbootxyz.rule: "Host(`{{ netbootxyz_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.netbootxyz.tls.certresolver: "letsencrypt" - traefik.http.routers.netbootxyz.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.netbootxyz.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.netbootxyz.loadbalancer.server.port: "3000" + - name: Netbootxyz Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ netbootxyz_container_name }}" + image: "{{ netbootxyz_image_name }}:{{ netbootxyz_image_version }}" + pull: true + volumes: + - "{{ netbootxyz_config_directory }}:/config:rw" + - "{{ netbootxyz_assets_directory }}:/assets:rw" + ports: + - "{{ netbootxyz_port_http }}:3000" + - "{{ netbootxyz_port_http2 }}:80" + - "{{ netbootxyz_port_tftp }}:69/udp" + memory: "{{ netbootxyz_memory }}" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ netbootxyz_user_id }}" + PGID: "{{ netbootxyz_group_id }}" + restart_policy: unless-stopped + labels: + traefik.enable: "{{ netbootxyz_available_externally | string }}" + traefik.http.routers.netbootxyz.rule: "Host(`{{ netbootxyz_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.netbootxyz.tls.certresolver: "letsencrypt" + traefik.http.routers.netbootxyz.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.netbootxyz.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.netbootxyz.loadbalancer.server.port: "3000" + when: netbootxyz_enabled is true + +- name: Stop Netbootxyz + block: + - name: Stop Netbootxyz + community.docker.docker_container: + name: "{{ netbootxyz_container_name }}" + state: absent + when: netbootxyz_enabled is false diff --git a/roles/netdata/defaults/main.yml b/roles/netdata/defaults/main.yml index 148e8b111a..80135fb298 100644 --- a/roles/netdata/defaults/main.yml +++ b/roles/netdata/defaults/main.yml @@ -6,5 +6,10 @@ netdata_available_externally: false netdata_hostname: "netdata" netdata_port: "19999" +# docker +netdata_container_name: "netdata" +netdata_image_name: "netdata/netdata" +netdata_image_version: "latest" + # specs netdata_memory: 1g diff --git a/roles/netdata/docs/netdata.md b/roles/netdata/docs/netdata.md new file mode 100644 index 0000000000..e8ef688400 --- /dev/null +++ b/roles/netdata/docs/netdata.md @@ -0,0 +1,11 @@ +# Netdata + +Homepage: + +An extremely comprehensive system monitoring solution. + +## Usage + +Set `netdata_enabled: true` in your `inventories//nas.yml` file. + +Netdata web interface can be found at . diff --git a/roles/netdata/molecule/default/molecule.yml b/roles/netdata/molecule/default/molecule.yml new file mode 100644 index 0000000000..ac74c328bb --- /dev/null +++ b/roles/netdata/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + netdata_enabled: true + ansible_nas_hostname: ansible-nas diff --git a/roles/netdata/molecule/default/side_effect.yml b/roles/netdata/molecule/default/side_effect.yml new file mode 100644 index 0000000000..49ed1fb68c --- /dev/null +++ b/roles/netdata/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + netdata_enabled: false diff --git a/roles/netdata/molecule/default/verify.yml b/roles/netdata/molecule/default/verify.yml new file mode 100644 index 0000000000..6094369d84 --- /dev/null +++ b/roles/netdata/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get netdata container state + community.docker.docker_container: + name: "{{ netdata_container_name }}" + register: result + + - name: Check if netdata containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/netdata/molecule/default/verify_stopped.yml b/roles/netdata/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..7fe1d29246 --- /dev/null +++ b/roles/netdata/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove netdata + community.docker.docker_container: + name: "{{ netdata_container_name }}" + state: absent + register: result + + - name: Check if netdata is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/netdata/tasks/main.yml b/roles/netdata/tasks/main.yml index d41c3486f6..d1e2063f95 100644 --- a/roles/netdata/tasks/main.yml +++ b/roles/netdata/tasks/main.yml @@ -1,34 +1,46 @@ --- -- name: Get docker group id - group: - name: docker - register: docker_group +- name: Start Netdata + block: + - name: Get docker group id + ansible.builtin.group: + name: docker + register: docker_group -- name: Netdata Docker Container - docker_container: - name: netdata - hostname: "{{ ansible_nas_hostname }}.{{ ansible_nas_domain }}" - image: netdata/netdata - state: started - pull: true - ports: - - "{{ netdata_port }}:19999" - volumes: - - "/proc:/host/proc:ro" - - "/sys:/host/sys:ro" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - env: - PGID: "{{ docker_group.gid }}" - capabilities: - - SYS_PTRACE - security_opts: - - apparmor:unconfined - restart_policy: unless-stopped - memory: "{{ netdata_memory }}" - labels: - traefik.enable: "{{ netdata_available_externally | string }}" - traefik.http.routers.netdata.rule: "Host(`{{ netdata_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.netdata.tls.certresolver: "letsencrypt" - traefik.http.routers.netdata.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.netdata.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.netdata.loadbalancer.server.port: "19999" + - name: Netdata Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ netdata_container_name }}" + image: "{{ netdata_image_name }}:{{ netdata_image_version }}" + hostname: "{{ ansible_nas_hostname }}.{{ ansible_nas_domain }}" + state: started + pull: true + ports: + - "{{ netdata_port }}:19999" + volumes: + - "/proc:/host/proc:ro" + - "/sys:/host/sys:ro" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + env: + PGID: "{{ docker_group.gid }}" + capabilities: + - SYS_PTRACE + security_opts: + - apparmor:unconfined + restart_policy: unless-stopped + memory: "{{ netdata_memory }}" + labels: + traefik.enable: "{{ netdata_available_externally | string }}" + traefik.http.routers.netdata.rule: "Host(`{{ netdata_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.netdata.tls.certresolver: "letsencrypt" + traefik.http.routers.netdata.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.netdata.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.netdata.loadbalancer.server.port: "19999" + when: netdata_enabled is true + +- name: Stop Netdata + block: + - name: Stop Netdata + community.docker.docker_container: + name: "{{ netdata_container_name }}" + state: absent + when: netdata_enabled is false diff --git a/roles/nextcloud/defaults/main.yml b/roles/nextcloud/defaults/main.yml index adfe0cfa36..802fe36544 100644 --- a/roles/nextcloud/defaults/main.yml +++ b/roles/nextcloud/defaults/main.yml @@ -5,13 +5,18 @@ nextcloud_available_externally: false # directories nextcloud_data_directory: "{{ docker_home }}/nextcloud" -# images -nextcloud_image: "nextcloud:stable" -nextcloud_mysql_image: "mysql:5.7" - # network nextcloud_port: "8080" nextcloud_hostname: "nextcloud" +nextcloud_network_name: "nextcloud" + +# docker +nextcloud_container_name: "nextcloud" +nextcloud_image_name: "nextcloud" +nextcloud_image_version: "stable" +nextcloud_db_container_name: "nextcloud-db" +nextcloud_db_image_name: "mysql" +nextcloud_db_image_version: "5.7" # username / passwords nextcloud_sql_user: "nextcloud-user" @@ -20,4 +25,4 @@ nextcloud_sql_root_password: "nextcloud-secret" # specs nextcloud_memory: 1g -nextcloud_mysql_memory: 1g +nextcloud_db_memory: 1g diff --git a/roles/nextcloud/docs/nextcloud.md b/roles/nextcloud/docs/nextcloud.md new file mode 100644 index 0000000000..842839affd --- /dev/null +++ b/roles/nextcloud/docs/nextcloud.md @@ -0,0 +1,25 @@ +# Nextcloud + +Homepage: + +## Usage + +Set `nextcloud_enabled: true` in your `inventories//nas.yml` file. + +Tread carefully. + +External access may require that you manually configure your Fully Qualified Domain Name (FQDN) as a trusted domain within the application. There is an environment variable set up for this in the "nextcloud task" which will most likely make manual configuration unnecessary. If you get the following [screenshot](https://docs.nextcloud.com/server/14/admin_manual/installation/installation_wizard.html#trusted-domains) warning when trying to access nextcloud externally you'll need to manually set it up. + +This can be accomplished in two commands. + +```bash +# On the server where the docker containers are running +$ docker exec -it --user www-data nextcloud /bin/bash +$ php occ config:system:set trusted_domains INDEX_FOR_NEW_ENTRY_SEE_DOCS_LINK_BELOW --value=YOUR_FQDN_HERE --update-only +``` + +The above commands are documented in the administration guide for Nextcloud: + +* [set array values](https://docs.nextcloud.com/server/14/admin_manual/configuration_server/occ_command.html#setting-an-array-configuration-value) + +* [docker container docs, references environment variables](https://github.com/nextcloud/docker) diff --git a/roles/nextcloud/molecule/default/molecule.yml b/roles/nextcloud/molecule/default/molecule.yml new file mode 100644 index 0000000000..16ec0be58d --- /dev/null +++ b/roles/nextcloud/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + nextcloud_enabled: true diff --git a/roles/nextcloud/molecule/default/side_effect.yml b/roles/nextcloud/molecule/default/side_effect.yml new file mode 100644 index 0000000000..e760bb55be --- /dev/null +++ b/roles/nextcloud/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + nextcloud_enabled: false diff --git a/roles/nextcloud/molecule/default/verify.yml b/roles/nextcloud/molecule/default/verify.yml new file mode 100644 index 0000000000..d42137260b --- /dev/null +++ b/roles/nextcloud/molecule/default/verify.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get nextcloud db container state + community.docker.docker_container: + name: "{{ nextcloud_db_container_name }}" + register: result_db + + - name: Get nextcloud container state + community.docker.docker_container: + name: "{{ nextcloud_container_name }}" + register: result + + - name: Check if nextcloud containers are running + ansible.builtin.assert: + that: + - result_db.container['State']['Status'] == "running" + - result_db.container['State']['Restarting'] == false + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/nextcloud/molecule/default/verify_stopped.yml b/roles/nextcloud/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..26edbcab2b --- /dev/null +++ b/roles/nextcloud/molecule/default/verify_stopped.yml @@ -0,0 +1,26 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove nextcloud + community.docker.docker_container: + name: "{{ nextcloud_container_name }}" + state: absent + register: result + + - name: Try and stop and remove nextcloud db + community.docker.docker_container: + name: "{{ nextcloud_db_container_name }}" + state: absent + register: result_db + + - name: Check if nextcloud is stopped + ansible.builtin.assert: + that: + - not result.changed + - not result_db.changed diff --git a/roles/nextcloud/tasks/main.yml b/roles/nextcloud/tasks/main.yml index 48f162868a..5841354bd3 100644 --- a/roles/nextcloud/tasks/main.yml +++ b/roles/nextcloud/tasks/main.yml @@ -1,50 +1,75 @@ --- -- name: Create Nextcloud directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ nextcloud_data_directory }}/nextcloud" - - "{{ nextcloud_data_directory }}/mysql" +- name: Start Nextcloud + block: + - name: Create Nextcloud directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ nextcloud_data_directory }}/nextcloud" + - "{{ nextcloud_data_directory }}/mysql" -- name: Nextcloud Mysql Docker Container - docker_container: - name: nextcloud-mysql - image: "{{ nextcloud_mysql_image }}" - pull: true - volumes: - - "{{ nextcloud_data_directory }}/mysql:/var/lib/mysql:rw" - env: - MYSQL_DATABASE: "nextcloud" - MYSQL_USER: "{{ nextcloud_sql_user }}" - MYSQL_PASSWORD: "{{ nextcloud_sql_password }}" - MYSQL_ROOT_PASSWORD: "{{ nextcloud_sql_root_password }}" - restart_policy: unless-stopped - memory: "{{ nextcloud_mysql_memory }}" + - name: Create Nextcloud network + community.docker.docker_network: + name: "{{ nextcloud_network_name }}" -- name: Nextcloud Docker Container - docker_container: - name: nextcloud - image: "{{ nextcloud_image }}" - pull: true - links: - - nextcloud-mysql:mysql - volumes: - - "{{ nextcloud_data_directory }}/nextcloud:/var/www/html:rw" - ports: - - "{{ nextcloud_port }}:80" - env: - MYSQL_HOST: "mysql" - MYSQL_DATABASE: "nextcloud" - MYSQL_USER: "{{ nextcloud_sql_user }}" - MYSQL_PASSWORD: "{{ nextcloud_sql_password }}" - NEXTCLOUD_TRUSTED_DOMAINS: "{{ nextcloud_hostname }}.{{ ansible_nas_domain }}" - restart_policy: unless-stopped - memory: "{{ nextcloud_memory }}" - labels: - traefik.enable: "{{ nextcloud_available_externally | string }}" - traefik.http.routers.nextcloud.rule: "Host(`{{ nextcloud_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.nextcloud.tls.certresolver: "letsencrypt" - traefik.http.routers.nextcloud.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.nextcloud.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.nextcloud.loadbalancer.server.port: "80" + - name: Nextcloud Mysql Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ nextcloud_db_container_name }}" + image: "{{ nextcloud_db_image_name }}:{{ nextcloud_db_image_version }}" + networks: + - name: "{{ nextcloud_network_name }}" + network_mode: "{{ nextcloud_network_name }}" + pull: true + volumes: + - "{{ nextcloud_data_directory }}/mysql:/var/lib/mysql:rw" + env: + MYSQL_DATABASE: "nextcloud" + MYSQL_USER: "{{ nextcloud_sql_user }}" + MYSQL_PASSWORD: "{{ nextcloud_sql_password }}" + MYSQL_ROOT_PASSWORD: "{{ nextcloud_sql_root_password }}" + restart_policy: unless-stopped + memory: "{{ nextcloud_db_memory }}" + + - name: Nextcloud Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ nextcloud_container_name }}" + image: "{{ nextcloud_image_name }}:{{ nextcloud_image_version }}" + networks: + - name: "{{ nextcloud_network_name }}" + network_mode: "{{ nextcloud_network_name }}" + pull: true + volumes: + - "{{ nextcloud_data_directory }}/nextcloud:/var/www/html:rw" + ports: + - "{{ nextcloud_port }}:80" + env: + MYSQL_HOST: "{{ nextcloud_db_container_name }}" + MYSQL_DATABASE: "nextcloud" + MYSQL_USER: "{{ nextcloud_sql_user }}" + MYSQL_PASSWORD: "{{ nextcloud_sql_password }}" + NEXTCLOUD_TRUSTED_DOMAINS: "{{ nextcloud_hostname }}.{{ ansible_nas_domain }}" + restart_policy: unless-stopped + memory: "{{ nextcloud_memory }}" + labels: + traefik.enable: "{{ nextcloud_available_externally | string }}" + traefik.http.routers.nextcloud.rule: "Host(`{{ nextcloud_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.nextcloud.tls.certresolver: "letsencrypt" + traefik.http.routers.nextcloud.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.nextcloud.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.nextcloud.loadbalancer.server.port: "80" + when: nextcloud_enabled is true + +- name: Stop Nextcloud + block: + - name: Stop Nextcloud + community.docker.docker_container: + name: "{{ nextcloud_container_name }}" + state: absent + - name: Stop Nextcloud DB + community.docker.docker_container: + name: "{{ nextcloud_db_container_name }}" + state: absent + when: nextcloud_enabled is false diff --git a/roles/nomad/docs/nomad.md b/roles/nomad/docs/nomad.md new file mode 100644 index 0000000000..17e9569b0c --- /dev/null +++ b/roles/nomad/docs/nomad.md @@ -0,0 +1,11 @@ +# Nomad + +Homepage: + +A simple and flexible scheduler and orchestrator to deploy and manage containers and non-containerised applications across on-prem and clouds at scale. + +## Usage + +Set `nomad_enabled: true` in your `inventories//nas.yml` file. + +Nomad's web interface can be found at diff --git a/roles/nomad/molecule/default/molecule.yml b/roles/nomad/molecule/default/molecule.yml new file mode 100644 index 0000000000..232bcfee62 --- /dev/null +++ b/roles/nomad/molecule/default/molecule.yml @@ -0,0 +1,16 @@ +--- +provisioner: + inventory: + group_vars: + all: + nomad_enabled: true +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + cgroupns_mode: host + command: "/usr/sbin/init" + privileged: true + pre_build_image: true diff --git a/roles/nomad/molecule/default/side_effect.yml b/roles/nomad/molecule/default/side_effect.yml new file mode 100644 index 0000000000..c9375ee0b8 --- /dev/null +++ b/roles/nomad/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + nomad_enabled: false diff --git a/roles/nomad/molecule/default/verify.yml b/roles/nomad/molecule/default/verify.yml new file mode 100644 index 0000000000..717a7d473d --- /dev/null +++ b/roles/nomad/molecule/default/verify.yml @@ -0,0 +1,21 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get Nomad service state + ansible.builtin.systemd: + name: nomad + state: started + register: service_result + + - name: Check that Nomad service is running + ansible.builtin.assert: + that: + - service_result.status['ActiveState'] == "active" + - service_result.status['Result'] == "success" + - service_result.state == "started" diff --git a/roles/nomad/molecule/default/verify_stopped.yml b/roles/nomad/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e51d9c9fa3 --- /dev/null +++ b/roles/nomad/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Nomad - retrieve information + ansible.builtin.stat: + path: /usr/bin/nomad + register: nomad_file + + - name: Nomad - assert that file is removed + ansible.builtin.assert: + that: not nomad_file.stat.exists + fail_msg: "The file /usr/bin/nomad still exists!" diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index f11a764e71..f0ea6b28f0 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -2,13 +2,21 @@ - name: Install and start Nomad block: - name: Add Hashicorp GPG key - ansible.builtin.apt_key: + ansible.builtin.get_url: url: https://apt.releases.hashicorp.com/gpg - state: present + dest: /etc/apt/trusted.gpg.d/hashicorp.asc + # dest: /usr/share/keyrings/hashicorp-nomad-keyring.gpg + mode: '0644' + force: true + # - name: Add Hashicorp GPG key + # ansible.builtin.apt_key: + # url: https://apt.releases.hashicorp.com/gpg + # state: present - name: Add Hashicorp apt repository ansible.builtin.apt_repository: repo: "deb https://apt.releases.hashicorp.com {{ ansible_facts['lsb']['codename'] }} main" + # repo: "deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-nomad-keyring.gpg] https://apt.releases.hashicorp.com {{ ansible_facts['lsb']['codename'] }} main" state: present filename: hashicorp diff --git a/roles/nzbget/defaults/main.yml b/roles/nzbget/defaults/main.yml index d18e7ddf72..6fb474d24e 100644 --- a/roles/nzbget/defaults/main.yml +++ b/roles/nzbget/defaults/main.yml @@ -14,5 +14,10 @@ nzbget_group_id: "0" nzbget_port: "6789" nzbget_hostname: "nzbget" +# docker +nzbget_container_name: "nzbget" +nzbget_image_name: "linuxserver/nzbget" +nzbget_image_version: "latest" + # specs nzbget_memory: "1g" diff --git a/roles/nzbget/docs/nzbget.md b/roles/nzbget/docs/nzbget.md new file mode 100644 index 0000000000..a0d82adcdc --- /dev/null +++ b/roles/nzbget/docs/nzbget.md @@ -0,0 +1,11 @@ +# NZBGet + +Homepage: + +The most efficient Usenet downloader. NZBGet is written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources. + +## Usage + +Set `nzbget_enabled: true` in your `inventories//nas.yml` file. + +The NZBget web interface can be found at , the default username is `nzbget` and password `tegbzn6789`. Change this once you've logged in! diff --git a/roles/nzbget/molecule/default/molecule.yml b/roles/nzbget/molecule/default/molecule.yml new file mode 100644 index 0000000000..b05e1d507f --- /dev/null +++ b/roles/nzbget/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + nzbget_enabled: true diff --git a/roles/nzbget/molecule/default/side_effect.yml b/roles/nzbget/molecule/default/side_effect.yml new file mode 100644 index 0000000000..32a100e210 --- /dev/null +++ b/roles/nzbget/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + nzbget_enabled: false diff --git a/roles/nzbget/molecule/default/verify.yml b/roles/nzbget/molecule/default/verify.yml new file mode 100644 index 0000000000..b9d7422e39 --- /dev/null +++ b/roles/nzbget/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get nzbget container state + community.docker.docker_container: + name: "{{ nzbget_container_name }}" + register: result + + - name: Check if nzbget containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/nzbget/molecule/default/verify_stopped.yml b/roles/nzbget/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..1c228aec60 --- /dev/null +++ b/roles/nzbget/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove nzbget + community.docker.docker_container: + name: "{{ nzbget_container_name }}" + state: absent + register: result + + - name: Check if nzbget is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/nzbget/tasks/main.yml b/roles/nzbget/tasks/main.yml index d951041d12..767ea62522 100644 --- a/roles/nzbget/tasks/main.yml +++ b/roles/nzbget/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create NZBget Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ nzbget_data_directory }}" +- name: Start NZBget + block: + - name: Create NZBget Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ nzbget_data_directory }}" -- name: NZBGet - docker_container: - name: nzbget - image: linuxserver/nzbget - pull: true - volumes: - - "{{ nzbget_download_directory }}:/downloads:rw" - - "{{ nzbget_data_directory }}:/config:rw" - ports: - - "{{ nzbget_port }}:6789" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ nzbget_user_id }}" - PGID: "{{ nzbget_group_id }}" - restart_policy: unless-stopped - memory: "{{ nzbget_memory }}" - labels: - traefik.enable: "{{ nzbget_available_externally | string }}" - traefik.http.routers.nzbget.rule: "Host(`{{ nzbget_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.nzbget.tls.certresolver: "letsencrypt" - traefik.http.routers.nzbget.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.nzbget.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.nzbget.loadbalancer.server.port: "6789" + - name: NZBGet + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ nzbget_container_name }}" + image: "{{ nzbget_image_name }}:{{ nzbget_image_version }}" + pull: true + volumes: + - "{{ nzbget_download_directory }}:/downloads:rw" + - "{{ nzbget_data_directory }}:/config:rw" + ports: + - "{{ nzbget_port }}:6789" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ nzbget_user_id }}" + PGID: "{{ nzbget_group_id }}" + restart_policy: unless-stopped + memory: "{{ nzbget_memory }}" + labels: + traefik.enable: "{{ nzbget_available_externally | string }}" + traefik.http.routers.nzbget.rule: "Host(`{{ nzbget_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.nzbget.tls.certresolver: "letsencrypt" + traefik.http.routers.nzbget.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.nzbget.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.nzbget.loadbalancer.server.port: "6789" + when: nzbget_enabled is true + +- name: Stop NZBget + block: + - name: Stop NZBget + community.docker.docker_container: + name: "{{ nzbget_container_name }}" + state: absent + when: nzbget_enabled is false diff --git a/roles/octoprint/defaults/main.yml b/roles/octoprint/defaults/main.yml index 91bf467f23..7bb80e4d50 100644 --- a/roles/octoprint/defaults/main.yml +++ b/roles/octoprint/defaults/main.yml @@ -9,6 +9,11 @@ octoprint_data_directory: "{{ docker_home }}/octoprint" octoprint_port: "8095" octoprint_hostname: "octoprint" +# docker +octoprint_container_name: "octoprint" +octoprint_image_name: "octoprint/octoprint" +octoprint_image_version: "latest" + # devices octoprint_printer_mountpoint: "/dev/ttyUSB0" diff --git a/roles/octoprint/docs/octoprint.md b/roles/octoprint/docs/octoprint.md new file mode 100644 index 0000000000..7545064582 --- /dev/null +++ b/roles/octoprint/docs/octoprint.md @@ -0,0 +1,11 @@ +# Octoprint + +Homepage: + +Octoprint is a control and monitoring application for your 3D printer. You can start and stop print jobs, view your webcam feed, move the print head and extruder manually and check your gcode files, all from a single web interface. Octoprint doesn't require modifications on the printer firmware, just make sure your NAS is phisically connected to it with a usb cable. + +## Usage + +Connect the printer to your NAS, and take note of where the serial interface is mounted (usually it's automounted in `/dev/ttyUSB0`). Set `octoprint_enabled: true` in your `inventories//nas.yml` file, as well as the `octoprint_printer_mountpoint` variable if your printer doesn't mount to the default location. + +If you want to also have a webcam feed, attach one to your NAS and take note of its mountpoint as well (usually `/dev/video0`). Set `octoprint_enable_webcam: true` and add a `octoprint_webcam_mountpoint` variable if the webcam doesn't mount to the default location. diff --git a/roles/octoprint/molecule/default/molecule.yml b/roles/octoprint/molecule/default/molecule.yml new file mode 100644 index 0000000000..7d54b88fae --- /dev/null +++ b/roles/octoprint/molecule/default/molecule.yml @@ -0,0 +1,19 @@ +--- +provisioner: + inventory: + group_vars: + all: + octoprint_enabled: true + octoprint_printer_mountpoint: "/dev/null" + octoprint_webcam_mountpoint: "/dev/null" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + - /dev/null:/dev/null + cgroupns_mode: host + privileged: true + pre_build_image: true + diff --git a/roles/octoprint/molecule/default/side_effect.yml b/roles/octoprint/molecule/default/side_effect.yml new file mode 100644 index 0000000000..c9f53c2ed7 --- /dev/null +++ b/roles/octoprint/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + octoprint_enabled: false diff --git a/roles/octoprint/molecule/default/verify.yml b/roles/octoprint/molecule/default/verify.yml new file mode 100644 index 0000000000..e7b628f8be --- /dev/null +++ b/roles/octoprint/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get octoprint container state + community.docker.docker_container: + name: "{{ octoprint_container_name }}" + register: result + + - name: Check if octoprint containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/octoprint/molecule/default/verify_stopped.yml b/roles/octoprint/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..23dca6fc92 --- /dev/null +++ b/roles/octoprint/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove octoprint + community.docker.docker_container: + name: "{{ octoprint_container_name }}" + state: absent + register: result + + - name: Check if octoprint is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/octoprint/tasks/main.yml b/roles/octoprint/tasks/main.yml index 40d84fce8b..77cf2b1630 100644 --- a/roles/octoprint/tasks/main.yml +++ b/roles/octoprint/tasks/main.yml @@ -1,33 +1,45 @@ --- -- name: Create Octoprint Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ octoprint_data_directory }}" +- name: Start Octoprint + block: + - name: Create Octoprint Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ octoprint_data_directory }}" -- name: Octoprint Docker Container - docker_container: - name: octoprint - image: octoprint/octoprint - pull: true - volumes: - - "{{ octoprint_data_directory }}:/octoprint:rw" - ports: - - "{{ octoprint_port }}:80" - devices: - - "{{ octoprint_printer_mountpoint }}" - - "{{ octoprint_enable_webcam | ternary(octoprint_webcam_mountpoint, '/dev/null') }}" - restart_policy: unless-stopped - memory: "{{ octoprint_memory }}" - env: - TZ: "{{ ansible_nas_timezone }}" - MJPG_STREAMER_INPUT: "-n -r 1080x1024 -f 30" - ENABLE_MJPG_STREAMER: "{{ octoprint_enable_webcam | string }}" - labels: - traefik.enable: "{{ octoprint_available_externally | string }}" - traefik.http.routers.octoprint.rule: "Host(`{{ octoprint_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.octoprint.tls.certresolver: "letsencrypt" - traefik.http.routers.octoprint.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.octoprint.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.octoprint.loadbalancer.server.port: "80" + - name: Octoprint Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ octoprint_container_name }}" + image: "{{ octoprint_image_name }}:{{ octoprint_image_version }}" + pull: true + volumes: + - "{{ octoprint_data_directory }}:/octoprint:rw" + ports: + - "{{ octoprint_port }}:80" + devices: + - "{{ octoprint_printer_mountpoint }}" + - "{{ octoprint_enable_webcam | ternary(octoprint_webcam_mountpoint, '/dev/null') }}" + restart_policy: unless-stopped + memory: "{{ octoprint_memory }}" + env: + TZ: "{{ ansible_nas_timezone }}" + MJPG_STREAMER_INPUT: "-n -r 1080x1024 -f 30" + ENABLE_MJPG_STREAMER: "{{ octoprint_enable_webcam | string }}" + labels: + traefik.enable: "{{ octoprint_available_externally | string }}" + traefik.http.routers.octoprint.rule: "Host(`{{ octoprint_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.octoprint.tls.certresolver: "letsencrypt" + traefik.http.routers.octoprint.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.octoprint.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.octoprint.loadbalancer.server.port: "80" + when: octoprint_enabled is true + +- name: Stop Octoprint + block: + - name: Stop Octoprint + community.docker.docker_container: + name: "{{ octoprint_container_name }}" + state: absent + when: octoprint_enabled is false diff --git a/roles/ombi/defaults/main.yml b/roles/ombi/defaults/main.yml index 7de3e157c8..c29a1cbe3d 100644 --- a/roles/ombi/defaults/main.yml +++ b/roles/ombi/defaults/main.yml @@ -9,7 +9,10 @@ ombi_config_directory: "{{ docker_home }}/ombi/config" ombi_port: "3579" ombi_hostname: "ombi" -# uid / gid +# docker +ombi_container_name: "ombi" +ombi_image_name: "linuxserver/ombi" +ombi_image_version: "latest" ombi_user_id: "0" ombi_group_id: "0" diff --git a/roles/ombi/docs/ombi.md b/roles/ombi/docs/ombi.md new file mode 100644 index 0000000000..e4ba888454 --- /dev/null +++ b/roles/ombi/docs/ombi.md @@ -0,0 +1,9 @@ +# Ombi + +Homepage: + +Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users. + +## Usage + +Set `ombi_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/ombi/molecule/default/molecule.yml b/roles/ombi/molecule/default/molecule.yml new file mode 100644 index 0000000000..01f8b45118 --- /dev/null +++ b/roles/ombi/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + ombi_enabled: true diff --git a/roles/ombi/molecule/default/side_effect.yml b/roles/ombi/molecule/default/side_effect.yml new file mode 100644 index 0000000000..aa51bb8d56 --- /dev/null +++ b/roles/ombi/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + ombi_enabled: false diff --git a/roles/ombi/molecule/default/verify.yml b/roles/ombi/molecule/default/verify.yml new file mode 100644 index 0000000000..91f442a830 --- /dev/null +++ b/roles/ombi/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get ombi container state + community.docker.docker_container: + name: "{{ ombi_container_name }}" + register: result + + - name: Check if ombi containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/ombi/molecule/default/verify_stopped.yml b/roles/ombi/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..2ee8ef5355 --- /dev/null +++ b/roles/ombi/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove ombi + community.docker.docker_container: + name: "{{ ombi_container_name }}" + state: absent + register: result + + - name: Check if ombi is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/ombi/tasks/main.yml b/roles/ombi/tasks/main.yml index 226a368e70..140d2e42ab 100644 --- a/roles/ombi/tasks/main.yml +++ b/roles/ombi/tasks/main.yml @@ -1,28 +1,40 @@ --- -- name: Create Ombi Directories - file: - path: "{{ ombi_config_directory }}" - state: directory +- name: Start Ombi + block: + - name: Create Ombi Directories + ansible.builtin.file: + path: "{{ ombi_config_directory }}" + state: directory -- name: Ombi Docker Container - docker_container: - name: ombi - image: linuxserver/ombi - pull: true - volumes: - - "{{ ombi_config_directory }}:/config:rw" - ports: - - "{{ ombi_port }}:3579" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ ombi_user_id }}" - PGID: "{{ ombi_group_id }}" - restart_policy: unless-stopped - memory: "{{ ombi_memory }}" - labels: - traefik.enable: "{{ ombi_available_externally | string }}" - traefik.http.routers.ombi.rule: "Host(`{{ ombi_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.ombi.tls.certresolver: "letsencrypt" - traefik.http.routers.ombi.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.ombi.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.ombi.loadbalancer.server.port: "3579" + - name: Ombi Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ ombi_container_name }}" + image: "{{ ombi_image_name }}:{{ ombi_image_version }}" + pull: true + volumes: + - "{{ ombi_config_directory }}:/config:rw" + ports: + - "{{ ombi_port }}:3579" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ ombi_user_id }}" + PGID: "{{ ombi_group_id }}" + restart_policy: unless-stopped + memory: "{{ ombi_memory }}" + labels: + traefik.enable: "{{ ombi_available_externally | string }}" + traefik.http.routers.ombi.rule: "Host(`{{ ombi_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.ombi.tls.certresolver: "letsencrypt" + traefik.http.routers.ombi.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.ombi.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.ombi.loadbalancer.server.port: "3579" + when: ombi_enabled is true + +- name: Stop Ombi + block: + - name: Stop Ombi + community.docker.docker_container: + name: "{{ ombi_container_name }}" + state: absent + when: ombi_enabled is false diff --git a/roles/openhab/defaults/main.yml b/roles/openhab/defaults/main.yml index 0e62c63888..97193ed633 100644 --- a/roles/openhab/defaults/main.yml +++ b/roles/openhab/defaults/main.yml @@ -10,5 +10,10 @@ openhab_port_http: "7777" openhab_port_https: "7778" openhab_hostname: "openhab" +# docker +openhab_container_name: "openhab" +openhab_image_name: "openhab/openhab" +openhab_image_version: "latest" + # specs openhab_memory: 1g diff --git a/roles/openhab/docs/openhab.md b/roles/openhab/docs/openhab.md new file mode 100644 index 0000000000..2ea46ddffb --- /dev/null +++ b/roles/openhab/docs/openhab.md @@ -0,0 +1,15 @@ +# openHAB + +Homepage: + +OpenHab is a vendor and technology agnostic open source automation software for your home. +It allows you to connect many different IoT-Devices (which in this case means "Intranet of Things") using custom bindings made by the community. + +## Usage + +Set `openhab_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +The openHAB Webinterface is available at port 7777 (HTTP) and 7778 (HTTPS). +Visit the webinterface and follow the setup instructions found in the [openHAB Documentation](https://www.openhab.org/docs/tutorial/1sttimesetup.html) diff --git a/roles/openhab/molecule/default/molecule.yml b/roles/openhab/molecule/default/molecule.yml new file mode 100644 index 0000000000..eba46adfb2 --- /dev/null +++ b/roles/openhab/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + openhab_enabled: true diff --git a/roles/openhab/molecule/default/side_effect.yml b/roles/openhab/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f8d54f8bb8 --- /dev/null +++ b/roles/openhab/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + openhab_enabled: false diff --git a/roles/openhab/molecule/default/verify.yml b/roles/openhab/molecule/default/verify.yml new file mode 100644 index 0000000000..78a330015b --- /dev/null +++ b/roles/openhab/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get openhab container state + community.docker.docker_container: + name: "{{ openhab_container_name }}" + register: result + + - name: Check if openhab containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/openhab/molecule/default/verify_stopped.yml b/roles/openhab/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..d7aeec1000 --- /dev/null +++ b/roles/openhab/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove openhab + community.docker.docker_container: + name: "{{ openhab_container_name }}" + state: absent + register: result + + - name: Check if openhab is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/openhab/tasks/main.yml b/roles/openhab/tasks/main.yml index 2b463247fb..ecfe75e40e 100644 --- a/roles/openhab/tasks/main.yml +++ b/roles/openhab/tasks/main.yml @@ -1,53 +1,65 @@ --- -- name: Create openHAB group - group: - name: openhab - gid: 9001 - state: present +- name: Start openHAB + block: + - name: Create openHAB group + ansible.builtin.group: + name: openhab + gid: 9001 + state: present -- name: Create openHAB user - user: - name: openhab - uid: 9001 - state: present - system: yes - update_password: on_create - create_home: no - group: openhab + - name: Create openHAB user + ansible.builtin.user: + name: openhab + uid: 9001 + state: present + system: yes + update_password: on_create + create_home: no + group: openhab -- name: Create openHAB Directories - file: - path: "{{ item }}" - state: directory - owner: openhab - group: openhab - with_items: - - "{{ openhab_data_directory }}" - - "{{ openhab_data_directory }}/conf" - - "{{ openhab_data_directory }}/userdata" - - "{{ openhab_data_directory }}/addons" + - name: Create openHAB Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: openhab + group: openhab + with_items: + - "{{ openhab_data_directory }}" + - "{{ openhab_data_directory }}/conf" + - "{{ openhab_data_directory }}/userdata" + - "{{ openhab_data_directory }}/addons" -- name: Create openHAB container - docker_container: - name: openHAB - image: openhab/openhab - pull: true - network_mode: "host" - volumes: - - "{{ openhab_data_directory }}/conf:/openhab/conf:rw" - - "{{ openhab_data_directory }}/userdata:/openhab/userdata:rw" - - "{{ openhab_data_directory }}/addons:/openhab/addons:rw" - - "/etc/localtime:/etc/localtime:ro" - - "/etc/timezone:/etc/timezone:ro" - env: - OPENHAB_HTTP_PORT: "{{ openhab_port_http }}" - OPENHAB_HTTPS_PORT: "{{ openhab_port_https }}" - restart_policy: unless-stopped - memory: "{{ openhab_memory }}" - labels: - traefik.enable: "{{ openhab_available_externally | string }}" - traefik.http.routers.openhab.rule: "Host(`{{ openhab_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.openhab.tls.certresolver: "letsencrypt" - traefik.http.routers.openhab.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.openhab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.openhab.loadbalancer.server.port: "7777" + - name: Create openHAB container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ openhab_container_name }}" + image: "{{ openhab_image_name }}:{{ openhab_image_version }}" + pull: true + network_mode: "host" + volumes: + - "{{ openhab_data_directory }}/conf:/openhab/conf:rw" + - "{{ openhab_data_directory }}/userdata:/openhab/userdata:rw" + - "{{ openhab_data_directory }}/addons:/openhab/addons:rw" + - "/etc/localtime:/etc/localtime:ro" + - "/etc/timezone:/etc/timezone:ro" + env: + OPENHAB_HTTP_PORT: "{{ openhab_port_http }}" + OPENHAB_HTTPS_PORT: "{{ openhab_port_https }}" + restart_policy: unless-stopped + memory: "{{ openhab_memory }}" + labels: + traefik.enable: "{{ openhab_available_externally | string }}" + traefik.http.routers.openhab.rule: "Host(`{{ openhab_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.openhab.tls.certresolver: "letsencrypt" + traefik.http.routers.openhab.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.openhab.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.openhab.loadbalancer.server.port: "7777" + when: openhab_enabled is true + +- name: Stop openHAB + block: + - name: Stop openHAB + community.docker.docker_container: + name: "{{ openhab_container_name }}" + state: absent + when: openhab_enabled is false diff --git a/roles/organizr/defaults/main.yml b/roles/organizr/defaults/main.yml index 9e0f7a9bda..27ed930f9f 100644 --- a/roles/organizr/defaults/main.yml +++ b/roles/organizr/defaults/main.yml @@ -10,7 +10,10 @@ organizr_port_http: "10081" organizr_port_https: "10444" organizr_hostname: "organizr" -# uid / gid +# docker +organizr_container_name: "organizr" +organizr_image_name: "organizr/organizr" +organizr_image_version: "latest" organizr_user_id: "1000" organizr_group_id: "1000" diff --git a/roles/organizr/docs/organizr.md b/roles/organizr/docs/organizr.md new file mode 100644 index 0000000000..df1b293f08 --- /dev/null +++ b/roles/organizr/docs/organizr.md @@ -0,0 +1,15 @@ +# Organizr + +Homepage: + +ORGANIZR aims to be your one stop shop for your Servers Frontend. + +Do you have quite a bit of services running on your computer or server? Do you have a lot of bookmarks or have to memor$ + +TODO: finish this truncated description + +## Usage + +Set `organizr_enabled: true` in your `inventories//nas.yml` file. + +The Organizr web interface can be found at . diff --git a/roles/organizr/molecule/default/molecule.yml b/roles/organizr/molecule/default/molecule.yml new file mode 100644 index 0000000000..b9bf48dcef --- /dev/null +++ b/roles/organizr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + organizr_enabled: true diff --git a/roles/organizr/molecule/default/side_effect.yml b/roles/organizr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..06e293f393 --- /dev/null +++ b/roles/organizr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + organizr_enabled: false diff --git a/roles/organizr/molecule/default/verify.yml b/roles/organizr/molecule/default/verify.yml new file mode 100644 index 0000000000..7777f61418 --- /dev/null +++ b/roles/organizr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get organizr container state + community.docker.docker_container: + name: "{{ organizr_container_name }}" + register: result + + - name: Check if organizr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/organizr/molecule/default/verify_stopped.yml b/roles/organizr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..3001c7c51e --- /dev/null +++ b/roles/organizr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove organizr + community.docker.docker_container: + name: "{{ organizr_container_name }}" + state: absent + register: result + + - name: Check if organizr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/organizr/tasks/main.yml b/roles/organizr/tasks/main.yml index a6e197b317..9c1d97c564 100644 --- a/roles/organizr/tasks/main.yml +++ b/roles/organizr/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create Organizr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ organizr_data_directory }}" +- name: Start Organizr + block: + - name: Create Organizr Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ organizr_data_directory }}" -- name: Create Organizr container - docker_container: - name: organizr - image: organizr/organizr:latest - pull: true - volumes: - - "{{ organizr_data_directory }}:/config:rw" - env: - PUID: "{{ organizr_user_id }}" - PGID: "{{ organizr_group_id }}" - TZ: "{{ ansible_nas_timezone }}" - ports: - - "{{ organizr_port_http }}:80" - - "{{ organizr_port_https }}:443" - restart_policy: unless-stopped - memory: "{{ organizr_memory }}" - labels: - traefik.enable: "{{ organizr_available_externally | string }}" - traefik.http.routers.organizr.rule: "Host(`{{ organizr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.organizr.tls.certresolver: "letsencrypt" - traefik.http.routers.organizr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.organizr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.organizr.loadbalancer.server.port: "80" + - name: Create Organizr container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ organizr_container_name }}" + image: "{{ organizr_image_name }}:{{ organizr_image_version }}" + pull: true + volumes: + - "{{ organizr_data_directory }}:/config:rw" + env: + PUID: "{{ organizr_user_id }}" + PGID: "{{ organizr_group_id }}" + TZ: "{{ ansible_nas_timezone }}" + ports: + - "{{ organizr_port_http }}:80" + - "{{ organizr_port_https }}:443" + restart_policy: unless-stopped + memory: "{{ organizr_memory }}" + labels: + traefik.enable: "{{ organizr_available_externally | string }}" + traefik.http.routers.organizr.rule: "Host(`{{ organizr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.organizr.tls.certresolver: "letsencrypt" + traefik.http.routers.organizr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.organizr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.organizr.loadbalancer.server.port: "80" + when: organizr_enabled is true + +- name: Stop Organizr + block: + - name: Stop Organizr + community.docker.docker_container: + name: "{{ organizr_container_name }}" + state: absent + when: organizr_enabled is false diff --git a/roles/overseerr/defaults/main.yml b/roles/overseerr/defaults/main.yml index e5b14a41e3..6a051e09aa 100644 --- a/roles/overseerr/defaults/main.yml +++ b/roles/overseerr/defaults/main.yml @@ -5,7 +5,10 @@ overseerr_available_externally: false # directories overseerr_data_directory: "{{ docker_home }}/overseerr" -# uid / gid +# docker +overseerr_container_name: "overseerr" +overseerr_image_name: "sctx/overseerr" +overseerr_image_version: "latest" overseerr_user_id: "1000" overseerr_group_id: "1000" diff --git a/roles/overseerr/docs/overseerr.md b/roles/overseerr/docs/overseerr.md new file mode 100644 index 0000000000..8a017edba8 --- /dev/null +++ b/roles/overseerr/docs/overseerr.md @@ -0,0 +1,13 @@ +# Overseerr + + Homepage: + + Docker Container: + + Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services, such as Sonarr, Radarr, and Plex! + +## Usage + + Using overseerr: Set `overseerr_enabled: true` in your `inventories//nas.yml` file. + + The overseerr web interface can be found at . diff --git a/roles/overseerr/molecule/default/molecule.yml b/roles/overseerr/molecule/default/molecule.yml new file mode 100644 index 0000000000..c63d210963 --- /dev/null +++ b/roles/overseerr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + overseerr_enabled: true diff --git a/roles/overseerr/molecule/default/side_effect.yml b/roles/overseerr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..ced8fa266c --- /dev/null +++ b/roles/overseerr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + overseerr_enabled: false diff --git a/roles/overseerr/molecule/default/verify.yml b/roles/overseerr/molecule/default/verify.yml new file mode 100644 index 0000000000..26215c95cb --- /dev/null +++ b/roles/overseerr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get overseerr container state + community.docker.docker_container: + name: "{{ overseerr_container_name }}" + register: result + + - name: Check if overseerr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/overseerr/molecule/default/verify_stopped.yml b/roles/overseerr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..63b0dabc6f --- /dev/null +++ b/roles/overseerr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove overseerr + community.docker.docker_container: + name: "{{ overseerr_container_name }}" + state: absent + register: result + + - name: Check if overseerr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/overseerr/tasks/main.yml b/roles/overseerr/tasks/main.yml index 1f5138754c..9af6f9424c 100644 --- a/roles/overseerr/tasks/main.yml +++ b/roles/overseerr/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create overseerr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ overseerr_data_directory }}" - - "{{ overseerr_data_directory }}/config" +- name: Start Overseerr + block: + - name: Create Overseerr Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ overseerr_data_directory }}" + - "{{ overseerr_data_directory }}/config" -- name: Overseerr - docker_container: - name: overseerr - image: sctx/overseerr:latest - pull: true - volumes: - - "{{ overseerr_data_directory }}/config:/app/config:rw" - ports: - - "{{ overseerr_webui_port }}:5055" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ overseerr_user_id }}" - PGID: "{{ overseerr_group_id }}" - restart_policy: unless-stopped - memory: "{{ overseerr_memory }}" - labels: - traefik.enable: "{{ overseerr_available_externally | string }}" - traefik.http.routers.overseerr.rule: "Host(`{{ overseerr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.overseerr.tls.certresolver: "letsencrypt" - traefik.http.routers.overseerr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.overseerr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.overseerr.loadbalancer.server.port: "5055" + - name: Overseerr + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ overseerr_container_name }}" + image: "{{ overseerr_image_name }}:{{ overseerr_image_version }}" + pull: true + volumes: + - "{{ overseerr_data_directory }}/config:/app/config:rw" + ports: + - "{{ overseerr_webui_port }}:5055" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ overseerr_user_id }}" + PGID: "{{ overseerr_group_id }}" + restart_policy: unless-stopped + memory: "{{ overseerr_memory }}" + labels: + traefik.enable: "{{ overseerr_available_externally | string }}" + traefik.http.routers.overseerr.rule: "Host(`{{ overseerr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.overseerr.tls.certresolver: "letsencrypt" + traefik.http.routers.overseerr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.overseerr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.overseerr.loadbalancer.server.port: "5055" + when: overseerr_enabled is true + +- name: Stop Overseerr + block: + - name: Stop Overseerr + community.docker.docker_container: + name: "{{ overseerr_container_name }}" + state: absent + when: overseerr_enabled is false diff --git a/roles/paperless_ng/docs/trilium.md b/roles/paperless_ng/docs/trilium.md new file mode 100644 index 0000000000..333cf7fbed --- /dev/null +++ b/roles/paperless_ng/docs/trilium.md @@ -0,0 +1,11 @@ +# Trilium + +Homepage: + +A hierarchical note taking application with focus on building large personal knowledge bases. + +## Usage + +Set `trilium_enabled: true` in your `inventories//nas.yml` file. + +Trilium web interface can be found at . diff --git a/roles/paperless_ng/molecule/default/molecule.yml b/roles/paperless_ng/molecule/default/molecule.yml new file mode 100644 index 0000000000..91b053f0b7 --- /dev/null +++ b/roles/paperless_ng/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + trilium_enabled: true diff --git a/roles/paperless_ng/molecule/default/side_effect.yml b/roles/paperless_ng/molecule/default/side_effect.yml new file mode 100644 index 0000000000..92e031516c --- /dev/null +++ b/roles/paperless_ng/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + trilium_enabled: false diff --git a/roles/paperless_ng/molecule/default/verify.yml b/roles/paperless_ng/molecule/default/verify.yml new file mode 100644 index 0000000000..9080137d52 --- /dev/null +++ b/roles/paperless_ng/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get trilium container state + community.docker.docker_container: + name: "{{ trilium_container_name }}" + register: result + + - name: Check if trilium containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/paperless_ng/molecule/default/verify_stopped.yml b/roles/paperless_ng/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e82fff9574 --- /dev/null +++ b/roles/paperless_ng/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove trilium + community.docker.docker_container: + name: "{{ trilium_container_name }}" + state: absent + register: result + + - name: Check if trilium is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/piwigo/docs/trilium.md b/roles/piwigo/docs/trilium.md new file mode 100644 index 0000000000..333cf7fbed --- /dev/null +++ b/roles/piwigo/docs/trilium.md @@ -0,0 +1,11 @@ +# Trilium + +Homepage: + +A hierarchical note taking application with focus on building large personal knowledge bases. + +## Usage + +Set `trilium_enabled: true` in your `inventories//nas.yml` file. + +Trilium web interface can be found at . diff --git a/roles/piwigo/molecule/default/molecule.yml b/roles/piwigo/molecule/default/molecule.yml new file mode 100644 index 0000000000..91b053f0b7 --- /dev/null +++ b/roles/piwigo/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + trilium_enabled: true diff --git a/roles/piwigo/molecule/default/side_effect.yml b/roles/piwigo/molecule/default/side_effect.yml new file mode 100644 index 0000000000..92e031516c --- /dev/null +++ b/roles/piwigo/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + trilium_enabled: false diff --git a/roles/piwigo/molecule/default/verify.yml b/roles/piwigo/molecule/default/verify.yml new file mode 100644 index 0000000000..9080137d52 --- /dev/null +++ b/roles/piwigo/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get trilium container state + community.docker.docker_container: + name: "{{ trilium_container_name }}" + register: result + + - name: Check if trilium containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/piwigo/molecule/default/verify_stopped.yml b/roles/piwigo/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e82fff9574 --- /dev/null +++ b/roles/piwigo/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove trilium + community.docker.docker_container: + name: "{{ trilium_container_name }}" + state: absent + register: result + + - name: Check if trilium is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/plex/docs/trilium.md b/roles/plex/docs/trilium.md new file mode 100644 index 0000000000..333cf7fbed --- /dev/null +++ b/roles/plex/docs/trilium.md @@ -0,0 +1,11 @@ +# Trilium + +Homepage: + +A hierarchical note taking application with focus on building large personal knowledge bases. + +## Usage + +Set `trilium_enabled: true` in your `inventories//nas.yml` file. + +Trilium web interface can be found at . diff --git a/roles/plex/molecule/default/molecule.yml b/roles/plex/molecule/default/molecule.yml new file mode 100644 index 0000000000..91b053f0b7 --- /dev/null +++ b/roles/plex/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + trilium_enabled: true diff --git a/roles/plex/molecule/default/side_effect.yml b/roles/plex/molecule/default/side_effect.yml new file mode 100644 index 0000000000..92e031516c --- /dev/null +++ b/roles/plex/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + trilium_enabled: false diff --git a/roles/plex/molecule/default/verify.yml b/roles/plex/molecule/default/verify.yml new file mode 100644 index 0000000000..9080137d52 --- /dev/null +++ b/roles/plex/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get trilium container state + community.docker.docker_container: + name: "{{ trilium_container_name }}" + register: result + + - name: Check if trilium containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/plex/molecule/default/verify_stopped.yml b/roles/plex/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e82fff9574 --- /dev/null +++ b/roles/plex/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove trilium + community.docker.docker_container: + name: "{{ trilium_container_name }}" + state: absent + register: result + + - name: Check if trilium is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/portainer/docs/trilium.md b/roles/portainer/docs/trilium.md new file mode 100644 index 0000000000..333cf7fbed --- /dev/null +++ b/roles/portainer/docs/trilium.md @@ -0,0 +1,11 @@ +# Trilium + +Homepage: + +A hierarchical note taking application with focus on building large personal knowledge bases. + +## Usage + +Set `trilium_enabled: true` in your `inventories//nas.yml` file. + +Trilium web interface can be found at . diff --git a/roles/portainer/molecule/default/molecule.yml b/roles/portainer/molecule/default/molecule.yml new file mode 100644 index 0000000000..91b053f0b7 --- /dev/null +++ b/roles/portainer/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + trilium_enabled: true diff --git a/roles/portainer/molecule/default/side_effect.yml b/roles/portainer/molecule/default/side_effect.yml new file mode 100644 index 0000000000..92e031516c --- /dev/null +++ b/roles/portainer/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + trilium_enabled: false diff --git a/roles/portainer/molecule/default/verify.yml b/roles/portainer/molecule/default/verify.yml new file mode 100644 index 0000000000..9080137d52 --- /dev/null +++ b/roles/portainer/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get trilium container state + community.docker.docker_container: + name: "{{ trilium_container_name }}" + register: result + + - name: Check if trilium containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/portainer/molecule/default/verify_stopped.yml b/roles/portainer/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e82fff9574 --- /dev/null +++ b/roles/portainer/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove trilium + community.docker.docker_container: + name: "{{ trilium_container_name }}" + state: absent + register: result + + - name: Check if trilium is stopped + ansible.builtin.assert: + that: + - not result.changed From 2cddba35c48178490098b391229bcbc5884a4cfa Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 14:18:19 +0100 Subject: [PATCH 103/286] Another batch: from paperless-ng to portainer --- roles/paperless_ng/defaults/main.yml | 18 ++- roles/paperless_ng/docs/paperless_ng.md | 23 +++ roles/paperless_ng/docs/trilium.md | 11 -- .../molecule/default/molecule.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- .../paperless_ng/molecule/default/verify.yml | 20 ++- .../molecule/default/verify_stopped.yml | 20 ++- roles/paperless_ng/tasks/main.yml | 151 +++++++++++------- roles/piwigo/defaults/main.yml | 9 ++ roles/piwigo/docs/piwigo.md | 28 ++++ roles/piwigo/docs/trilium.md | 11 -- roles/piwigo/molecule/default/molecule.yml | 2 +- roles/piwigo/molecule/default/side_effect.yml | 2 +- roles/piwigo/molecule/default/verify.yml | 13 +- .../molecule/default/verify_stopped.yml | 13 +- roles/piwigo/tasks/main.yml | 121 ++++++++------ roles/plex/defaults/main.yml | 5 + roles/plex/docs/plex.md | 16 ++ roles/plex/docs/trilium.md | 11 -- roles/plex/molecule/default/molecule.yml | 2 +- roles/plex/molecule/default/side_effect.yml | 2 +- roles/plex/molecule/default/verify.yml | 6 +- .../plex/molecule/default/verify_stopped.yml | 6 +- roles/plex/tasks/main.yml | 88 +++++----- roles/portainer/defaults/main.yml | 5 + roles/portainer/docs/portainer.md | 9 ++ roles/portainer/docs/trilium.md | 11 -- roles/portainer/molecule/default/molecule.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- roles/portainer/molecule/default/verify.yml | 6 +- .../molecule/default/verify_stopped.yml | 6 +- roles/portainer/tasks/main.yml | 64 +++++--- 32 files changed, 434 insertions(+), 253 deletions(-) create mode 100644 roles/paperless_ng/docs/paperless_ng.md delete mode 100644 roles/paperless_ng/docs/trilium.md create mode 100644 roles/piwigo/docs/piwigo.md delete mode 100644 roles/piwigo/docs/trilium.md create mode 100644 roles/plex/docs/plex.md delete mode 100644 roles/plex/docs/trilium.md create mode 100644 roles/portainer/docs/portainer.md delete mode 100644 roles/portainer/docs/trilium.md diff --git a/roles/paperless_ng/defaults/main.yml b/roles/paperless_ng/defaults/main.yml index fb2a8be66a..d7ff6d369f 100644 --- a/roles/paperless_ng/defaults/main.yml +++ b/roles/paperless_ng/defaults/main.yml @@ -1,5 +1,6 @@ --- paperless_ng_enabled: false +paperless_ng_available_externally: false # directories paperless_ng_config_directory: "{{ docker_home }}/paperless_ng" @@ -14,6 +15,7 @@ paperless_ng_consume_directory: "{{ paperless_ng_files_directory }}/consume" # network paperless_ng_port: "16922" paperless_ng_hostname: "paperless_ng" +paperless_ng_network_name: "paperless_ng" # postgres paperless_ng_postgres_db: "paperless" @@ -21,10 +23,18 @@ paperless_ng_postgres_user: "paperless" paperless_ng_postgres_password: "paperless" # container names -paperless_ng_container_network_name: "paperless_ng_network" -paperless_ng_container_name_redis: "paperless_ng_redis" -paperless_ng_container_name_postgres: "paperless_ng_postgres" -paperless_ng_container_name_uiserver: "paperless_ng_uiserver" + +paperless_ng_redis_container_name: "paperless-redis" +paperless_ng_redis_image_name: "redis" +paperless_ng_redis_image_version: "6.0" + +paperless_ng_db_container_name: "paperless-db" +paperless_ng_db_image_name: "postgres" +paperless_ng_db_image_version: "13" + +paperless_ng_uiserver_container_name: "paperless-uiserver" +paperless_ng_uiserver_image_name: "jonaswinkler/paperless-ng" +paperless_ng_uiserver_image_version: "latest" # uid/guid paperless_ng_user_id: "1000" diff --git a/roles/paperless_ng/docs/paperless_ng.md b/roles/paperless_ng/docs/paperless_ng.md new file mode 100644 index 0000000000..5adabc3182 --- /dev/null +++ b/roles/paperless_ng/docs/paperless_ng.md @@ -0,0 +1,23 @@ +# Paperless-ng + +Homepage: + +Paperless is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents. + +Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood + +## Usage + +Set `paperless_ng_enabled: true` in your `inventories//nas.yml` file. + +The paperless-ng web interface can be found at . + +### Create the superuser + +To be able to login, you will need a super user. To create it, execute the following command: + +```bash +docker exec -it paperless_ng_uiserver python manage.py createsuperuser +``` + +This will prompt you to set a username, an optional e-mail address and finally a password (at least 8 characters). diff --git a/roles/paperless_ng/docs/trilium.md b/roles/paperless_ng/docs/trilium.md deleted file mode 100644 index 333cf7fbed..0000000000 --- a/roles/paperless_ng/docs/trilium.md +++ /dev/null @@ -1,11 +0,0 @@ -# Trilium - -Homepage: - -A hierarchical note taking application with focus on building large personal knowledge bases. - -## Usage - -Set `trilium_enabled: true` in your `inventories//nas.yml` file. - -Trilium web interface can be found at . diff --git a/roles/paperless_ng/molecule/default/molecule.yml b/roles/paperless_ng/molecule/default/molecule.yml index 91b053f0b7..e009fab602 100644 --- a/roles/paperless_ng/molecule/default/molecule.yml +++ b/roles/paperless_ng/molecule/default/molecule.yml @@ -3,4 +3,4 @@ provisioner: inventory: group_vars: all: - trilium_enabled: true + paperless_ng_enabled: true diff --git a/roles/paperless_ng/molecule/default/side_effect.yml b/roles/paperless_ng/molecule/default/side_effect.yml index 92e031516c..5a9810b7b4 100644 --- a/roles/paperless_ng/molecule/default/side_effect.yml +++ b/roles/paperless_ng/molecule/default/side_effect.yml @@ -7,4 +7,4 @@ ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: - trilium_enabled: false + paperless_ng_enabled: false diff --git a/roles/paperless_ng/molecule/default/verify.yml b/roles/paperless_ng/molecule/default/verify.yml index 9080137d52..500fae123b 100644 --- a/roles/paperless_ng/molecule/default/verify.yml +++ b/roles/paperless_ng/molecule/default/verify.yml @@ -7,13 +7,27 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Get trilium container state + - name: Get paperless_ng redis container state community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ paperless_ng_redis_container_name }}" + register: result_redis + + - name: Get paperless_ng db container state + community.docker.docker_container: + name: "{{ paperless_ng_db_container_name }}" + register: result_db + + - name: Get paperless_ng container state + community.docker.docker_container: + name: "{{ paperless_ng_uiserver_container_name }}" register: result - - name: Check if trilium containers are running + - name: Check if paperless_ng containers are running ansible.builtin.assert: that: + - result_redis.container['State']['Status'] == "running" + - result_redis.container['State']['Restarting'] == false + - result_db.container['State']['Status'] == "running" + - result_db.container['State']['Restarting'] == false - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/paperless_ng/molecule/default/verify_stopped.yml b/roles/paperless_ng/molecule/default/verify_stopped.yml index e82fff9574..24f8793259 100644 --- a/roles/paperless_ng/molecule/default/verify_stopped.yml +++ b/roles/paperless_ng/molecule/default/verify_stopped.yml @@ -7,13 +7,27 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Try and stop and remove trilium + - name: Try and stop and remove paperless_ng community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ paperless_ng_uiserver_container_name }}" state: absent register: result - - name: Check if trilium is stopped + - name: Try and stop and remove paperless_ng db + community.docker.docker_container: + name: "{{ paperless_ng_db_container_name }}" + state: absent + register: result_db + + - name: Try and stop and remove paperless_ng redis + community.docker.docker_container: + name: "{{ paperless_ng_redis_container_name }}" + state: absent + register: result_redis + + - name: Check if paperless_ng is stopped ansible.builtin.assert: that: - not result.changed + - not result_db.changed + - not result_redis.changed diff --git a/roles/paperless_ng/tasks/main.yml b/roles/paperless_ng/tasks/main.yml index fe3cedb6d3..bca48846a7 100644 --- a/roles/paperless_ng/tasks/main.yml +++ b/roles/paperless_ng/tasks/main.yml @@ -1,67 +1,96 @@ --- -- name: Create paperless_ng directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ paperless_ng_config_directory }}" - - "{{ paperless_ng_files_directory }}" - - "{{ paperless_ng_postgres_directory }}" - - "{{ paperless_ng_data_directory }}" - - "{{ paperless_ng_export_directory }}" - - "{{ paperless_ng_media_directory }}" - - "{{ paperless_ng_consume_directory }}" +- name: Start paperless_ng + block: + - name: Create paperless_ng directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ paperless_ng_config_directory }}" + - "{{ paperless_ng_files_directory }}" + - "{{ paperless_ng_postgres_directory }}" + - "{{ paperless_ng_data_directory }}" + - "{{ paperless_ng_export_directory }}" + - "{{ paperless_ng_media_directory }}" + - "{{ paperless_ng_consume_directory }}" + - name: Create paperless_ng network + community.docker.docker_network: + name: "{{ paperless_ng_network_name }}" -- name: Create paperless_ng network - docker_network: - name: "{{ paperless_ng_container_network_name }}" + - name: Create paperless_ng redis broker + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ paperless_ng_redis_container_name }}" + image: "{{ paperless_ng_redis_image_name }}:{{ paperless_ng_redis_image_version }}" + pull: true + restart_policy: unless-stopped + memory: "{{ paperless_ng_redis_memory }}" + networks: + - name: "{{ paperless_ng_network_name }}" + network_mode: "{{ paperless_ng_network_name }}" -- name: Create paperless_ng redis broker - docker_container: - name: "{{ paperless_ng_container_name_redis }}" - image: redis:6.0 - pull: true - restart_policy: unless-stopped - memory: "{{ paperless_ng_redis_memory }}" - networks: - - name: "{{ paperless_ng_container_network_name }}" + - name: Create paperless_ng postgres Docker Container + community.docker.docker_container: + name: "{{ paperless_ng_db_container_name }}" + image: "{{ paperless_ng_db_image_name }}:{{ paperless_ng_db_image_version }}" + pull: true + volumes: + - "{{ paperless_ng_postgres_directory }}:/var/lib/postgresql/data" + env: + POSTGRES_DB: "{{ paperless_ng_postgres_db }}" + POSTGRES_USER: "{{ paperless_ng_postgres_user }}" + POSTGRES_PASSWORD: "{{ paperless_ng_postgres_password }}" + restart_policy: unless-stopped + memory: "{{ paperless_ng_postgres_memory }}" + networks: + - name: "{{ paperless_ng_network_name }}" + network_mode: "{{ paperless_ng_network_name }}" -- name: Create paperless_ng postgres Docker Container - docker_container: - name: "{{ paperless_ng_container_name_postgres }}" - image: postgres:13 - pull: true - volumes: - - "{{ paperless_ng_postgres_directory }}:/var/lib/postgresql/data" - env: - POSTGRES_DB: "{{ paperless_ng_postgres_db }}" - POSTGRES_USER: "{{ paperless_ng_postgres_user }}" - POSTGRES_PASSWORD: "{{ paperless_ng_postgres_password }}" - restart_policy: unless-stopped - memory: "{{ paperless_ng_postgres_memory }}" - networks: - - name: "{{ paperless_ng_container_network_name }}" + - name: Create paperless_ng UI Docker Container + community.docker.docker_container: + name: "{{ paperless_ng_uiserver_container_name }}" + image: "{{ paperless_ng_uiserver_image_name }}:{{ paperless_ng_uiserver_image_version }}" + pull: true + volumes: + - "{{ paperless_ng_data_directory }}:/usr/src/paperless/data" + - "{{ paperless_ng_media_directory }}:/usr/src/paperless/media" + - "{{ paperless_ng_export_directory }}:/usr/src/paperless/export" + - "{{ paperless_ng_consume_directory }}:/usr/src/paperless/consume" + ports: + - "{{ paperless_ng_port }}:8000" + env: + PAPERLESS_REDIS: "redis://{{ paperless_ng_redis_container_name | string }}:6379" + PAPERLESS_DBHOST: "{{ paperless_ng_db_container_name | string }}" + USERMAP_UID: "{{ paperless_ng_user_id }}" + USERMAP_GID: "{{ paperless_ng_group_id }}" + PAPERLESS_OCR_LANGUAGES: "{{ paperless_ng_languages }}" + restart_policy: unless-stopped + memory: "{{ paperless_ng_ui_memory }}" + networks: + - name: "{{ paperless_ng_network_name }}" + network_mode: "{{ paperless_ng_network_name }}" + labels: + traefik.enable: "{{ paperless_ng_available_externally | string }}" + traefik.http.routers.paperless_ng.rule: "Host(`{{ paperless_ng_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.paperless_ng.tls.certresolver: "letsencrypt" + traefik.http.routers.paperless_ng.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.paperless_ng.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.paperless_ng.loadbalancer.server.port: "8080" + when: paperless_ng_enabled is true -- name: Create paperless_ng UI Docker Container - docker_container: - name: "{{ paperless_ng_container_name_uiserver }}" - image: jonaswinkler/paperless-ng:latest - pull: true - volumes: - - "{{ paperless_ng_data_directory }}:/usr/src/paperless/data" - - "{{ paperless_ng_media_directory }}:/usr/src/paperless/media" - - "{{ paperless_ng_export_directory }}:/usr/src/paperless/export" - - "{{ paperless_ng_consume_directory }}:/usr/src/paperless/consume" - ports: - - "{{ paperless_ng_port }}:8000" - env: - PAPERLESS_REDIS: "redis://{{ paperless_ng_container_name_redis | string }}:6379" - PAPERLESS_DBHOST: "{{ paperless_ng_container_name_postgres | string }}" - USERMAP_UID: "{{ paperless_ng_user_id }}" - USERMAP_GID: "{{ paperless_ng_group_id }}" - PAPERLESS_OCR_LANGUAGES: "{{ paperless_ng_languages }}" - restart_policy: unless-stopped - memory: "{{ paperless_ng_ui_memory }}" - networks: - - name: "{{ paperless_ng_container_network_name }}" +- name: Stop paperless_ng + block: + - name: Stop paperless_ng + community.docker.docker_container: + name: "{{ paperless_ng_uiserver_container_name }}" + state: absent + - name: Stop paperless_ng redis + community.docker.docker_container: + name: "{{ paperless_ng_redis_container_name }}" + state: absent + - name: Stop paperless_ng db + community.docker.docker_container: + name: "{{ paperless_ng_db_container_name }}" + state: absent + when: paperless_ng_enabled is false diff --git a/roles/piwigo/defaults/main.yml b/roles/piwigo/defaults/main.yml index 82a9add63a..efdcfd7c54 100644 --- a/roles/piwigo/defaults/main.yml +++ b/roles/piwigo/defaults/main.yml @@ -18,8 +18,17 @@ piwigo_photos_permission: "rw" # network piwigo_hostname: "piwigo" +piwigo_network_name: "piwigo" piwigo_port: "16923" +# docker +piwigo_db_container_name: "piwigo-db" +piwigo_db_image_name: "mysql" +piwigo_db_image_version: "5.7" +piwigo_container_name: "piwigo" +piwigo_image_name: "linuxserver/piwigo" +piwigo_image_version: "latest" + # specs piwigo_memory: "1g" piwigo_mysql_memory: "1g" diff --git a/roles/piwigo/docs/piwigo.md b/roles/piwigo/docs/piwigo.md new file mode 100644 index 0000000000..f691ba2798 --- /dev/null +++ b/roles/piwigo/docs/piwigo.md @@ -0,0 +1,28 @@ +# Piwigo + +Homepage: [Piwigo.org](https://piwigo.org) + +Piwigo is open source photo gallery software for the web. Designed for organisations, teams and individuals. + +## Usage + +Set `piwigo_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Piwigo externally, set `piwigo_available_externally: true` in your `inventories//nas.yml` file. + +The Piwigo web interface can be found at . + +## Specific Configuration + +Optional configurations: + +- Set `piwigo_mysql_user` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". +- Set `piwigo_mysql_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". +- Set `piwigo_mysql_root_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". + +- On first run you'll need to enter database details: + - Host: `db:3306` + - Username: the value of piwigo_mysql_user, defaults to "piwigo" + - Password: the value of piwigo_password, defaults to "piwigo" + - Database Name: `piwigo` + - Database tables prefix: should be prefilled with `piwigo_` diff --git a/roles/piwigo/docs/trilium.md b/roles/piwigo/docs/trilium.md deleted file mode 100644 index 333cf7fbed..0000000000 --- a/roles/piwigo/docs/trilium.md +++ /dev/null @@ -1,11 +0,0 @@ -# Trilium - -Homepage: - -A hierarchical note taking application with focus on building large personal knowledge bases. - -## Usage - -Set `trilium_enabled: true` in your `inventories//nas.yml` file. - -Trilium web interface can be found at . diff --git a/roles/piwigo/molecule/default/molecule.yml b/roles/piwigo/molecule/default/molecule.yml index 91b053f0b7..33909c2934 100644 --- a/roles/piwigo/molecule/default/molecule.yml +++ b/roles/piwigo/molecule/default/molecule.yml @@ -3,4 +3,4 @@ provisioner: inventory: group_vars: all: - trilium_enabled: true + piwigo_enabled: true diff --git a/roles/piwigo/molecule/default/side_effect.yml b/roles/piwigo/molecule/default/side_effect.yml index 92e031516c..b100aed67d 100644 --- a/roles/piwigo/molecule/default/side_effect.yml +++ b/roles/piwigo/molecule/default/side_effect.yml @@ -7,4 +7,4 @@ ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: - trilium_enabled: false + piwigo_enabled: false diff --git a/roles/piwigo/molecule/default/verify.yml b/roles/piwigo/molecule/default/verify.yml index 9080137d52..323430699b 100644 --- a/roles/piwigo/molecule/default/verify.yml +++ b/roles/piwigo/molecule/default/verify.yml @@ -7,13 +7,20 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Get trilium container state + - name: Get piwigo db container state community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ piwigo_db_container_name }}" + register: result_db + + - name: Get piwigo container state + community.docker.docker_container: + name: "{{ piwigo_container_name }}" register: result - - name: Check if trilium containers are running + - name: Check if piwigo containers are running ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false + - result_db.container['State']['Status'] == "running" + - result_db.container['State']['Restarting'] == false diff --git a/roles/piwigo/molecule/default/verify_stopped.yml b/roles/piwigo/molecule/default/verify_stopped.yml index e82fff9574..750ae3d49f 100644 --- a/roles/piwigo/molecule/default/verify_stopped.yml +++ b/roles/piwigo/molecule/default/verify_stopped.yml @@ -7,13 +7,20 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Try and stop and remove trilium + - name: Try and stop and remove piwigo community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ piwigo_container_name }}" state: absent register: result - - name: Check if trilium is stopped + - name: Try and stop and remove piwigo db + community.docker.docker_container: + name: "{{ piwigo_db_container_name }}" + state: absent + register: result_db + + - name: Check if piwigo is stopped ansible.builtin.assert: that: - not result.changed + - not result_db.changed diff --git a/roles/piwigo/tasks/main.yml b/roles/piwigo/tasks/main.yml index 67c02ea9b7..9c5dd0de63 100644 --- a/roles/piwigo/tasks/main.yml +++ b/roles/piwigo/tasks/main.yml @@ -1,51 +1,76 @@ --- -- name: Create Piwigo Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ piwigo_config_directory }}" - - "{{ piwigo_data_directory }}" - - "{{ piwigo_photos }}" +- name: Start Piwigo + block: + - name: Create Piwigo Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ piwigo_config_directory }}" + - "{{ piwigo_data_directory }}" + - "{{ piwigo_photos }}" -- name: Create MySQL container for Piwigo - docker_container: - name: piwigo-mysql - image: mysql:5.7 - pull: true - volumes: - - "{{ piwigo_data_directory }}/mysql:/var/lib/mysql:rw" - env: - MYSQL_DATABASE: "piwigo" - MYSQL_USER: "{{ piwigo_mysql_user }}" - MYSQL_PASSWORD: "{{ piwigo_mysql_password }}" - MYSQL_ROOT_PASSWORD: "{{ piwigo_mysql_root_password }}" - restart_policy: unless-stopped - memory: "{{ piwigo_mysql_memory }}" + - name: Create Piwigo network + community.docker.docker_network: + name: "{{ piwigo_network_name }}" -- name: Piwigo Docker Container - docker_container: - name: piwigo - image: linuxserver/piwigo - pull: true - volumes: - - "{{ piwigo_config_directory }}:/config:rw" - - "{{ piwigo_photos }}:/gallery:rw" - links: - - piwigo-mysql:db - ports: - - "{{ piwigo_port }}:80" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ piwigo_user_id }}" - PGID: "{{ piwigo_group_id }}" - VERSION: "{{ piwigo_version }}" - restart_policy: unless-stopped - memory: "{{ piwigo_memory }}" - labels: - traefik.enable: "{{ piwigo_available_externally | string }}" - traefik.http.routers.piwigo.rule: "Host(`{{ piwigo_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.piwigo.tls.certresolver: "letsencrypt" - traefik.http.routers.piwigo.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.piwigo.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.piwigo.loadbalancer.server.port: "80" + - name: Create MySQL container for Piwigo + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ piwigo_db_container_name }}" + image: "{{ piwigo_db_image_name }}:{{ piwigo_db_image_version }}" + pull: true + volumes: + - "{{ piwigo_data_directory }}/mysql:/var/lib/mysql:rw" + env: + MYSQL_DATABASE: "piwigo" + MYSQL_USER: "{{ piwigo_mysql_user }}" + MYSQL_PASSWORD: "{{ piwigo_mysql_password }}" + MYSQL_ROOT_PASSWORD: "{{ piwigo_mysql_root_password }}" + restart_policy: unless-stopped + memory: "{{ piwigo_mysql_memory }}" + networks: + - name: "{{ piwigo_network_name }}" + network_mode: "{{ piwigo_network_name }}" + + - name: Piwigo Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ piwigo_container_name }}" + image: "{{ piwigo_image_name }}:{{ piwigo_image_version }}" + pull: true + volumes: + - "{{ piwigo_config_directory }}:/config:rw" + - "{{ piwigo_photos }}:/gallery:rw" + ports: + - "{{ piwigo_port }}:80" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ piwigo_user_id }}" + PGID: "{{ piwigo_group_id }}" + VERSION: "{{ piwigo_version }}" + restart_policy: unless-stopped + memory: "{{ piwigo_memory }}" + networks: + - name: "{{ piwigo_network_name }}" + network_mode: "{{ piwigo_network_name }}" + labels: + traefik.enable: "{{ piwigo_available_externally | string }}" + traefik.http.routers.piwigo.rule: "Host(`{{ piwigo_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.piwigo.tls.certresolver: "letsencrypt" + traefik.http.routers.piwigo.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.piwigo.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.piwigo.loadbalancer.server.port: "80" + when: piwigo_enabled is true + +- name: Stop Piwigo + block: + - name: Stop Piwigo + community.docker.docker_container: + name: "{{ piwigo_container_name }}" + state: absent + - name: Stop Piwigo Db + community.docker.docker_container: + name: "{{ piwigo_db_container_name }}" + state: absent + when: piwigo_enabled is false diff --git a/roles/plex/defaults/main.yml b/roles/plex/defaults/main.yml index 220ebb6be2..a53135cafd 100644 --- a/roles/plex/defaults/main.yml +++ b/roles/plex/defaults/main.yml @@ -28,6 +28,11 @@ plex_audiobooks_permissions: "rw" # network plex_hostname: "plex" +# docker +plex_container_name: "plex" +plex_image_name: "linuxserver/plex" +plex_image_version: "latest" + # specs plex_memory: "2g" diff --git a/roles/plex/docs/plex.md b/roles/plex/docs/plex.md new file mode 100644 index 0000000000..be9a37e017 --- /dev/null +++ b/roles/plex/docs/plex.md @@ -0,0 +1,16 @@ +# Plex + +Homepage: + +Plex is a personal media server that also provides access to several external movie, web show, and podcast services. Allows you to stream music too. Apps for many devices, including e.g. chromecast integration. + +## Usage + +Set `plex_enabled: true` in your `inventories//nas.yml` file. + +The Plex web interface can be found at . + +## Specific Configuration + +You'll need to log in with a plex account, (or possibly claim your server). +You'll need to set up your local file store - go to settings > Manage > Libraries, and add your libraries. These are mounted in the root directory by default. diff --git a/roles/plex/docs/trilium.md b/roles/plex/docs/trilium.md deleted file mode 100644 index 333cf7fbed..0000000000 --- a/roles/plex/docs/trilium.md +++ /dev/null @@ -1,11 +0,0 @@ -# Trilium - -Homepage: - -A hierarchical note taking application with focus on building large personal knowledge bases. - -## Usage - -Set `trilium_enabled: true` in your `inventories//nas.yml` file. - -Trilium web interface can be found at . diff --git a/roles/plex/molecule/default/molecule.yml b/roles/plex/molecule/default/molecule.yml index 91b053f0b7..4611624d67 100644 --- a/roles/plex/molecule/default/molecule.yml +++ b/roles/plex/molecule/default/molecule.yml @@ -3,4 +3,4 @@ provisioner: inventory: group_vars: all: - trilium_enabled: true + plex_enabled: true diff --git a/roles/plex/molecule/default/side_effect.yml b/roles/plex/molecule/default/side_effect.yml index 92e031516c..597eb871ad 100644 --- a/roles/plex/molecule/default/side_effect.yml +++ b/roles/plex/molecule/default/side_effect.yml @@ -7,4 +7,4 @@ ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: - trilium_enabled: false + plex_enabled: false diff --git a/roles/plex/molecule/default/verify.yml b/roles/plex/molecule/default/verify.yml index 9080137d52..d971c288c6 100644 --- a/roles/plex/molecule/default/verify.yml +++ b/roles/plex/molecule/default/verify.yml @@ -7,12 +7,12 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Get trilium container state + - name: Get plex container state community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ plex_container_name }}" register: result - - name: Check if trilium containers are running + - name: Check if plex containers are running ansible.builtin.assert: that: - result.container['State']['Status'] == "running" diff --git a/roles/plex/molecule/default/verify_stopped.yml b/roles/plex/molecule/default/verify_stopped.yml index e82fff9574..37859b3c64 100644 --- a/roles/plex/molecule/default/verify_stopped.yml +++ b/roles/plex/molecule/default/verify_stopped.yml @@ -7,13 +7,13 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Try and stop and remove trilium + - name: Try and stop and remove plex community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ plex_container_name }}" state: absent register: result - - name: Check if trilium is stopped + - name: Check if plex is stopped ansible.builtin.assert: that: - not result.changed diff --git a/roles/plex/tasks/main.yml b/roles/plex/tasks/main.yml index b22961a807..7597d22ce6 100644 --- a/roles/plex/tasks/main.yml +++ b/roles/plex/tasks/main.yml @@ -1,40 +1,52 @@ --- -- name: Create Plex Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ plex_config_directory }}" - - "{{ plex_logs }}" +- name: Start Plex + block: + - name: Create Plex Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ plex_config_directory }}" + - "{{ plex_logs }}" -- name: Create Plex Docker Container - docker_container: - name: plex - image: linuxserver/plex - pull: true - volumes: - - "{{ plex_config_directory }}:/config:rw" - - "{{ plex_logs }}:/opt/plex/Library/Application Support/Plex Media Server/Logs:rw" - - "{{ plex_movies_directory }}:/movies:{{ plex_movies_permissions }}" - - "{{ plex_tv_directory }}:/tv:{{ plex_tv_permissions }}" - - "{{ plex_photos_directory }}:/photos:{{ plex_photos_permissions }}" - - "{{ plex_podcasts_directory }}:/podcasts:{{ plex_podcasts_permissions }}" - - "{{ plex_music_directory }}:/music:{{ plex_music_permissions }}" - - "{{ plex_audiobooks_directory }}:/audiobooks:{{ plex_audiobooks_permissions }}" - network_mode: "host" - devices: "{{ plex_devices | default(omit) }}" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ plex_user_id }}" - PGID: "{{ plex_group_id }}" - VERSION: "{{ plex_version }}" - restart_policy: unless-stopped - memory: "{{ plex_memory }}" - labels: - traefik.enable: "{{ plex_available_externally | string }}" - traefik.http.routers.plex.rule: "Host(`{{ plex_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.plex.tls.certresolver: "letsencrypt" - traefik.http.routers.plex.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.plex.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.plex.loadbalancer.server.port: "32400" + - name: Create Plex Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ plex_container_name }}" + image: "{{ plex_image_name }}:{{ plex_image_version }}" + pull: true + volumes: + - "{{ plex_config_directory }}:/config:rw" + - "{{ plex_logs }}:/opt/plex/Library/Application Support/Plex Media Server/Logs:rw" + - "{{ plex_movies_directory }}:/movies:{{ plex_movies_permissions }}" + - "{{ plex_tv_directory }}:/tv:{{ plex_tv_permissions }}" + - "{{ plex_photos_directory }}:/photos:{{ plex_photos_permissions }}" + - "{{ plex_podcasts_directory }}:/podcasts:{{ plex_podcasts_permissions }}" + - "{{ plex_music_directory }}:/music:{{ plex_music_permissions }}" + - "{{ plex_audiobooks_directory }}:/audiobooks:{{ plex_audiobooks_permissions }}" + network_mode: "host" + devices: "{{ plex_devices | default(omit) }}" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ plex_user_id }}" + PGID: "{{ plex_group_id }}" + VERSION: "{{ plex_version }}" + restart_policy: unless-stopped + memory: "{{ plex_memory }}" + labels: + traefik.enable: "{{ plex_available_externally | string }}" + traefik.http.routers.plex.rule: "Host(`{{ plex_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.plex.tls.certresolver: "letsencrypt" + traefik.http.routers.plex.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.plex.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.plex.loadbalancer.server.port: "32400" + when: plex_enabled is true + +- name: Stop Plex + block: + - name: Stop Plex + community.docker.docker_container: + name: "{{ plex_container_name }}" + state: absent + when: plex_enabled is false diff --git a/roles/portainer/defaults/main.yml b/roles/portainer/defaults/main.yml index 7c3443d652..e5dd813898 100644 --- a/roles/portainer/defaults/main.yml +++ b/roles/portainer/defaults/main.yml @@ -9,5 +9,10 @@ portainer_data_directory: "{{ docker_home }}/portainer/config" portainer_port: "9000" portainer_hostname: "portainer" +# docker +portainer_container_name: "portainer" +portainer_image_name: "portainer/portainer-ce" +portainer_image_version: "latest" + # specs portainer_memory: 1g diff --git a/roles/portainer/docs/portainer.md b/roles/portainer/docs/portainer.md new file mode 100644 index 0000000000..d9d9fe77e4 --- /dev/null +++ b/roles/portainer/docs/portainer.md @@ -0,0 +1,9 @@ +# Portainer + +Homepage: + +## Usage + +Set `portainer_enabled: true` in your `inventories//nas.yml` file. + +The Portainer web interface can be found at . diff --git a/roles/portainer/docs/trilium.md b/roles/portainer/docs/trilium.md deleted file mode 100644 index 333cf7fbed..0000000000 --- a/roles/portainer/docs/trilium.md +++ /dev/null @@ -1,11 +0,0 @@ -# Trilium - -Homepage: - -A hierarchical note taking application with focus on building large personal knowledge bases. - -## Usage - -Set `trilium_enabled: true` in your `inventories//nas.yml` file. - -Trilium web interface can be found at . diff --git a/roles/portainer/molecule/default/molecule.yml b/roles/portainer/molecule/default/molecule.yml index 91b053f0b7..9c88debc5e 100644 --- a/roles/portainer/molecule/default/molecule.yml +++ b/roles/portainer/molecule/default/molecule.yml @@ -3,4 +3,4 @@ provisioner: inventory: group_vars: all: - trilium_enabled: true + portainer_enabled: true diff --git a/roles/portainer/molecule/default/side_effect.yml b/roles/portainer/molecule/default/side_effect.yml index 92e031516c..db6a99fb0f 100644 --- a/roles/portainer/molecule/default/side_effect.yml +++ b/roles/portainer/molecule/default/side_effect.yml @@ -7,4 +7,4 @@ ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: - trilium_enabled: false + portainer_enabled: false diff --git a/roles/portainer/molecule/default/verify.yml b/roles/portainer/molecule/default/verify.yml index 9080137d52..a53be8a4d3 100644 --- a/roles/portainer/molecule/default/verify.yml +++ b/roles/portainer/molecule/default/verify.yml @@ -7,12 +7,12 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Get trilium container state + - name: Get portainer container state community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ portainer_container_name }}" register: result - - name: Check if trilium containers are running + - name: Check if portainer containers are running ansible.builtin.assert: that: - result.container['State']['Status'] == "running" diff --git a/roles/portainer/molecule/default/verify_stopped.yml b/roles/portainer/molecule/default/verify_stopped.yml index e82fff9574..5add0bf72e 100644 --- a/roles/portainer/molecule/default/verify_stopped.yml +++ b/roles/portainer/molecule/default/verify_stopped.yml @@ -7,13 +7,13 @@ ansible.builtin.include_vars: file: ../../defaults/main.yml - - name: Try and stop and remove trilium + - name: Try and stop and remove portainer community.docker.docker_container: - name: "{{ trilium_container_name }}" + name: "{{ portainer_container_name }}" state: absent register: result - - name: Check if trilium is stopped + - name: Check if portainer is stopped ansible.builtin.assert: that: - not result.changed diff --git a/roles/portainer/tasks/main.yml b/roles/portainer/tasks/main.yml index d49f1e7896..665f8483dd 100644 --- a/roles/portainer/tasks/main.yml +++ b/roles/portainer/tasks/main.yml @@ -1,28 +1,40 @@ --- -- name: Create Portainer Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ portainer_data_directory }}" +- name: Start Portainer + block: + - name: Create Portainer Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ portainer_data_directory }}" -- name: Portainer Docker Container - docker_container: - name: portainer - image: portainer/portainer-ce - pull: true - volumes: - - "{{ portainer_data_directory }}:/data:rw" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "/etc/timezone:/etc/timezone:ro" - ports: - - "{{ portainer_port }}:9000" - restart_policy: unless-stopped - memory: "{{ portainer_memory }}" - labels: - traefik.enable: "{{ portainer_available_externally | string }}" - traefik.http.routers.portainer.rule: "Host(`{{ portainer_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.portainer.tls.certresolver: "letsencrypt" - traefik.http.routers.portainer.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.portainer.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.portainer.loadbalancer.server.port: "9000" + - name: Portainer Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ portainer_container_name }}" + image: "{{ portainer_image_name }}:{{ portainer_image_version }}" + pull: true + volumes: + - "{{ portainer_data_directory }}:/data:rw" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "/etc/timezone:/etc/timezone:ro" + ports: + - "{{ portainer_port }}:9000" + restart_policy: unless-stopped + memory: "{{ portainer_memory }}" + labels: + traefik.enable: "{{ portainer_available_externally | string }}" + traefik.http.routers.portainer.rule: "Host(`{{ portainer_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.portainer.tls.certresolver: "letsencrypt" + traefik.http.routers.portainer.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.portainer.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.portainer.loadbalancer.server.port: "9000" + when: portainer_enabled is true + +- name: Stop Portainer + block: + - name: Stop Portainer + community.docker.docker_container: + name: "{{ portainer_container_name }}" + state: absent + when: portainer_enabled is false From cf77fb6e5781621dae8ff888db7edf0c896917ff Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 16:07:16 +0100 Subject: [PATCH 104/286] Update Krusader after old image no longer available --- roles/krusader/defaults/main.yml | 15 +++++++++------ roles/krusader/tasks/main.yml | 14 ++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/roles/krusader/defaults/main.yml b/roles/krusader/defaults/main.yml index c68c443248..11741ae2c7 100644 --- a/roles/krusader/defaults/main.yml +++ b/roles/krusader/defaults/main.yml @@ -1,9 +1,6 @@ --- krusader_enabled: false -krusader_available_externally: false - -krusader_secure_connection: "0" -krusader_vnc_password: "topsecret" +krusader_available_externally: "false" # uid / gid krusader_user_id: "0" @@ -14,14 +11,20 @@ krusader_config_directory: "{{ docker_home }}/krusader/config" krusader_browse_directory: "/" # network -krusader_port_http: "5800" +krusader_port_http: "6080" krusader_port_vnc: "5900" krusader_hostname: "krusader" # docker krusader_container_name: "krusader" -krusader_image_name: "djaydev/krusader" +krusader_image_name: "binhex/arch-krusader" krusader_image_version: "latest" # specs krusader_memory: 1g + +# krusader +krusader_umask: "000" +krusader_webpage_title: "Tower" +krusader_temp_folder: "/config/krusader/tmp" +krusader_vnc_password: "topsecret" diff --git a/roles/krusader/tasks/main.yml b/roles/krusader/tasks/main.yml index 2832fd3875..36b1c5bd52 100644 --- a/roles/krusader/tasks/main.yml +++ b/roles/krusader/tasks/main.yml @@ -14,18 +14,20 @@ name: "{{ krusader_container_name }}" image: "{{ krusader_image_name }}:{{ krusader_image_version }}" pull: true + privileged: true volumes: - "{{ krusader_config_directory }}:/config:rw" - "{{ krusader_browse_directory }}:/mnt/fs" ports: - - "{{ krusader_port_http }}:5800" + - "{{ krusader_port_http }}:6080" - "{{ krusader_port_vnc }}:5900" env: - USER_ID: "{{ krusader_user_id }}" - GROUP_ID: "{{ krusader_group_id }}" - SECURE_CONNECTION: "{{ krusader_secure_connection }}" - TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ krusader_user_id }}" + PGID: "{{ krusader_group_id }}" VNC_PASSWORD: "{{ krusader_vnc_password }}" + TEMP_FOLDER: "{{ krusader_temp_folder }}" + WEBPAGE_TITLE: "{{ krusader_webpage_title }}" + UMASK: "{{ krusader_umask }}" restart_policy: unless-stopped memory: "{{ krusader_memory }}" labels: @@ -34,7 +36,7 @@ traefik.http.routers.krusader.tls.certresolver: "letsencrypt" traefik.http.routers.krusader.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.krusader.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.krusader.loadbalancer.server.port: "5800" + traefik.http.services.krusader.loadbalancer.server.port: "6080" when: krusader_enabled is true - name: Stop Krusader From d54e1acf3062e7dd11689f0b5f4cc352db0f70c9 Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 16:40:33 +0100 Subject: [PATCH 105/286] Another barch: from prowlarr to sickchill --- nas.yml | 20 ----- roles/prowlarr/defaults/main.yml | 5 ++ roles/prowlarr/docs/prowlarr.md | 15 ++++ roles/prowlarr/molecule/default/molecule.yml | 6 ++ .../prowlarr/molecule/default/side_effect.yml | 10 +++ roles/prowlarr/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/prowlarr/tasks/main.yml | 68 ++++++++------- roles/pyload/defaults/main.yml | 5 ++ roles/pyload/docs/pyload.md | 16 ++++ roles/pyload/molecule/default/molecule.yml | 6 ++ roles/pyload/molecule/default/side_effect.yml | 10 +++ roles/pyload/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/pyload/tasks/main.yml | 74 +++++++++------- roles/pytivo/defaults/main.yml | 5 ++ roles/pytivo/docs/pytivo.md | 30 +++++++ roles/pytivo/molecule/default/molecule.yml | 6 ++ roles/pytivo/molecule/default/side_effect.yml | 10 +++ roles/pytivo/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/pytivo/tasks/main.yml | 84 +++++++++++-------- roles/radarr/defaults/main.yml | 5 ++ roles/radarr/docs/radarr.md | 22 +++++ roles/radarr/molecule/default/molecule.yml | 6 ++ roles/radarr/molecule/default/side_effect.yml | 10 +++ roles/radarr/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/radarr/tasks/main.yml | 72 +++++++++------- roles/route53_ddns/defaults/main.yml | 3 + roles/route53_ddns/docs/route53_ddns.md | 40 +++++++++ .../molecule/default/molecule.yml | 19 +++++ .../molecule/default/side_effect.yml | 10 +++ .../route53_ddns/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/route53_ddns/tasks/main.yml | 53 +++++++----- roles/rssbridge/defaults/main.yml | 5 ++ roles/rssbridge/docs/rssbridge.md | 13 +++ roles/rssbridge/molecule/default/molecule.yml | 6 ++ .../molecule/default/side_effect.yml | 10 +++ roles/rssbridge/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/rssbridge/tasks/main.yml | 62 ++++++++------ roles/sabnzbd/defaults/main.yml | 5 ++ roles/sabnzbd/docs/sabnzbd.md | 11 +++ roles/sabnzbd/molecule/default/molecule.yml | 6 ++ .../sabnzbd/molecule/default/side_effect.yml | 10 +++ roles/sabnzbd/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/sabnzbd/tasks/main.yml | 70 +++++++++------- roles/sickchill/defaults/main.yml | 5 ++ roles/sickchill/docs/sickchill.md | 12 +++ roles/sickchill/molecule/default/molecule.yml | 6 ++ .../molecule/default/side_effect.yml | 10 +++ roles/sickchill/molecule/default/verify.yml | 19 +++++ .../molecule/default/verify_stopped.yml | 19 +++++ roles/sickchill/tasks/main.yml | 74 +++++++++------- 57 files changed, 968 insertions(+), 251 deletions(-) create mode 100644 roles/prowlarr/docs/prowlarr.md create mode 100644 roles/prowlarr/molecule/default/molecule.yml create mode 100644 roles/prowlarr/molecule/default/side_effect.yml create mode 100644 roles/prowlarr/molecule/default/verify.yml create mode 100644 roles/prowlarr/molecule/default/verify_stopped.yml create mode 100644 roles/pyload/docs/pyload.md create mode 100644 roles/pyload/molecule/default/molecule.yml create mode 100644 roles/pyload/molecule/default/side_effect.yml create mode 100644 roles/pyload/molecule/default/verify.yml create mode 100644 roles/pyload/molecule/default/verify_stopped.yml create mode 100644 roles/pytivo/docs/pytivo.md create mode 100644 roles/pytivo/molecule/default/molecule.yml create mode 100644 roles/pytivo/molecule/default/side_effect.yml create mode 100644 roles/pytivo/molecule/default/verify.yml create mode 100644 roles/pytivo/molecule/default/verify_stopped.yml create mode 100644 roles/radarr/docs/radarr.md create mode 100644 roles/radarr/molecule/default/molecule.yml create mode 100644 roles/radarr/molecule/default/side_effect.yml create mode 100644 roles/radarr/molecule/default/verify.yml create mode 100644 roles/radarr/molecule/default/verify_stopped.yml create mode 100644 roles/route53_ddns/docs/route53_ddns.md create mode 100644 roles/route53_ddns/molecule/default/molecule.yml create mode 100644 roles/route53_ddns/molecule/default/side_effect.yml create mode 100644 roles/route53_ddns/molecule/default/verify.yml create mode 100644 roles/route53_ddns/molecule/default/verify_stopped.yml create mode 100644 roles/rssbridge/docs/rssbridge.md create mode 100644 roles/rssbridge/molecule/default/molecule.yml create mode 100644 roles/rssbridge/molecule/default/side_effect.yml create mode 100644 roles/rssbridge/molecule/default/verify.yml create mode 100644 roles/rssbridge/molecule/default/verify_stopped.yml create mode 100644 roles/sabnzbd/docs/sabnzbd.md create mode 100644 roles/sabnzbd/molecule/default/molecule.yml create mode 100644 roles/sabnzbd/molecule/default/side_effect.yml create mode 100644 roles/sabnzbd/molecule/default/verify.yml create mode 100644 roles/sabnzbd/molecule/default/verify_stopped.yml create mode 100644 roles/sickchill/docs/sickchill.md create mode 100644 roles/sickchill/molecule/default/molecule.yml create mode 100644 roles/sickchill/molecule/default/side_effect.yml create mode 100644 roles/sickchill/molecule/default/verify.yml create mode 100644 roles/sickchill/molecule/default/verify_stopped.yml diff --git a/nas.yml b/nas.yml index a4d2e4341b..7833c0b0d5 100644 --- a/nas.yml +++ b/nas.yml @@ -220,22 +220,18 @@ - role: navidrome tags: - navidrome - when: (navidrome_enabled | default(False)) - role: netbootxyz tags: - netbootxyz - when: (netbootxyz_enabled | default(False)) - role: netdata tags: - netdata - when: (netdata_enabled | default(False)) - role: nextcloud tags: - nextcloud - when: (nextcloud_enabled | default(False)) - role: nomad tags: @@ -244,82 +240,66 @@ - role: nzbget tags: - nzbget - when: (nzbget_enabled | default(False)) - role: octoprint tags: - octoprint - when: (octoprint_enabled | default(False)) - role: ombi tags: - ombi - when: (ombi_enabled | default(False)) - role: openhab tags: - openhab - when: (openhab_enabled | default(False)) - role: organizr tags: - organizr - when: (organizr_enabled | default(False)) - role: overseerr tags: - overseerr - when: (overseerr_enabled | default(False)) - role: paperless_ng tags: - paperless_ng - when: (paperless_ng_enabled | default(False)) - role: piwigo tags: - piwigo - when: (piwigo_enabled | default(False)) - role: plex tags: - plex - when: (plex_enabled | default(False)) - role: portainer tags: - portainer - when: (portainer_enabled | default(False)) - role: prowlarr tags: - prowlarr - when: (prowlarr_enabled | default(False)) - role: pyload tags: - pyload - when: (pyload_enabled | default(False)) - role: pytivo tags: - pytivo - when: (pytivo_enabled | default(False)) - role: radarr tags: - radarr - when: (radarr_enabled | default(False)) - role: route53_ddns tags: - route53_ddns - when: (route53_ddns_enabled | default(False)) - role: rssbridge tags: - rssbridge - when: (rssbridge_enabled | default(False)) - role: sabnzbd tags: diff --git a/roles/prowlarr/defaults/main.yml b/roles/prowlarr/defaults/main.yml index dc47b86ed0..fbb072cf76 100644 --- a/roles/prowlarr/defaults/main.yml +++ b/roles/prowlarr/defaults/main.yml @@ -13,5 +13,10 @@ prowlarr_group_id: "0" prowlarr_port: "9696" prowlarr_hostname: "prowlarr" +# docker +prowlarr_container_name: "prowlarr" +prowlarr_image_name: "ghcr.io/linuxserver/prowlarr" +prowlarr_image_version: "develop" + # specs prowlarr_memory: 1g diff --git a/roles/prowlarr/docs/prowlarr.md b/roles/prowlarr/docs/prowlarr.md new file mode 100644 index 0000000000..1d5e871eb4 --- /dev/null +++ b/roles/prowlarr/docs/prowlarr.md @@ -0,0 +1,15 @@ +# Prowlarr" + +Homepages: [prowlarr](https://github.com/Prowlarr/Prowlarr) + +**Prowlarr** is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all). + +## Usage + +Set `prowlarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Prowlarr web interface can be found at `http://ansible_nas_host_or_ip:9696` by default + +## Specific Configuration + +For comprehensive configuration instructions see the [Prowlarr wiki](https://wiki.servarr.com/prowlarr) or [Prowlarr Github page](https://github.com/Prowlarr/Prowlarr) diff --git a/roles/prowlarr/molecule/default/molecule.yml b/roles/prowlarr/molecule/default/molecule.yml new file mode 100644 index 0000000000..4d2be851e1 --- /dev/null +++ b/roles/prowlarr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + prowlarr_enabled: true diff --git a/roles/prowlarr/molecule/default/side_effect.yml b/roles/prowlarr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..e7cfcab488 --- /dev/null +++ b/roles/prowlarr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + prowlarr_enabled: false diff --git a/roles/prowlarr/molecule/default/verify.yml b/roles/prowlarr/molecule/default/verify.yml new file mode 100644 index 0000000000..30a19ec67a --- /dev/null +++ b/roles/prowlarr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get prowlarr container state + community.docker.docker_container: + name: "{{ prowlarr_container_name }}" + register: result + + - name: Check if prowlarr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/prowlarr/molecule/default/verify_stopped.yml b/roles/prowlarr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..67d63e38f1 --- /dev/null +++ b/roles/prowlarr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove prowlarr + community.docker.docker_container: + name: "{{ prowlarr_container_name }}" + state: absent + register: result + + - name: Check if prowlarr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/prowlarr/tasks/main.yml b/roles/prowlarr/tasks/main.yml index c4f9c48050..7bc8726ebd 100644 --- a/roles/prowlarr/tasks/main.yml +++ b/roles/prowlarr/tasks/main.yml @@ -1,30 +1,42 @@ --- -- name: Create Prowlarr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ prowlarr_data_directory }}" +- name: Start Prowlarr + block: + - name: Create Prowlarr Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ prowlarr_data_directory }}" -- name: Create Prowlarr Docker Container - docker_container: - name: prowlarr - image: ghcr.io/linuxserver/prowlarr:develop - pull: true - volumes: - - "{{ prowlarr_data_directory }}:/config:rw" - ports: - - "{{ prowlarr_port }}:9696" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ prowlarr_user_id }}" - PGID: "{{ prowlarr_group_id }}" - restart_policy: unless-stopped - memory: "{{ prowlarr_memory }}" - labels: - traefik.enable: "{{ prowlarr_available_externally | string }}" - traefik.http.routers.prowlarr.rule: "Host(`{{ prowlarr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.prowlarr.tls.certresolver: "letsencrypt" - traefik.http.routers.prowlarr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.prowlarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.prowlarr.loadbalancer.server.port: "9696" + - name: Create Prowlarr Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ prowlarr_container_name }}" + image: "{{ prowlarr_image_name }}:{{ prowlarr_image_version }}" + pull: true + volumes: + - "{{ prowlarr_data_directory }}:/config:rw" + ports: + - "{{ prowlarr_port }}:9696" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ prowlarr_user_id }}" + PGID: "{{ prowlarr_group_id }}" + restart_policy: unless-stopped + memory: "{{ prowlarr_memory }}" + labels: + traefik.enable: "{{ prowlarr_available_externally | string }}" + traefik.http.routers.prowlarr.rule: "Host(`{{ prowlarr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.prowlarr.tls.certresolver: "letsencrypt" + traefik.http.routers.prowlarr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.prowlarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.prowlarr.loadbalancer.server.port: "9696" + when: prowlarr_enabled is true + +- name: Stop Prowlarr + block: + - name: Stop Prowlarr + community.docker.docker_container: + name: "{{ prowlarr_container_name }}" + state: absent + when: prowlarr_enabled is false diff --git a/roles/pyload/defaults/main.yml b/roles/pyload/defaults/main.yml index 6da3d9b749..3e30a361aa 100644 --- a/roles/pyload/defaults/main.yml +++ b/roles/pyload/defaults/main.yml @@ -14,5 +14,10 @@ pyload_group_id: "0" pyload_hostname: "pyload" pyload_port: "8000" +# docker +pyload_container_name: "pyload" +pyload_image_name: "writl/pyload" +pyload_image_version: "latest" + # specs pyload_memory: "1g" diff --git a/roles/pyload/docs/pyload.md b/roles/pyload/docs/pyload.md new file mode 100644 index 0000000000..5d0911c514 --- /dev/null +++ b/roles/pyload/docs/pyload.md @@ -0,0 +1,16 @@ +# pyLoad + +Homepage: [https://pyload.net/](https://pyload.net/) + +Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web. + +## Usage + +Set `pyload_enabled: true` in your `inventories//nas.yml` file. + +pyLoad's web interface can be found at . + +## Specific Configuration + +Default username is `pyload` and default password is `pyload` +In order to add or remove users, you will need to access the container from an interactive shell (can easily be done from portainer, if installed) and enter pyLoad's home directory `/opt/pyload` and using the command `python pyLoadCore.py -u` and follow the on-screen prompts. More commands to configure and customize pyLoad can be found on it's website. diff --git a/roles/pyload/molecule/default/molecule.yml b/roles/pyload/molecule/default/molecule.yml new file mode 100644 index 0000000000..141f9e4b98 --- /dev/null +++ b/roles/pyload/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + pyload_enabled: true diff --git a/roles/pyload/molecule/default/side_effect.yml b/roles/pyload/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f609d9e308 --- /dev/null +++ b/roles/pyload/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + pyload_enabled: false diff --git a/roles/pyload/molecule/default/verify.yml b/roles/pyload/molecule/default/verify.yml new file mode 100644 index 0000000000..f6183b3c78 --- /dev/null +++ b/roles/pyload/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get pyload container state + community.docker.docker_container: + name: "{{ pyload_container_name }}" + register: result + + - name: Check if pyload containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/pyload/molecule/default/verify_stopped.yml b/roles/pyload/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..d340dfb46b --- /dev/null +++ b/roles/pyload/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove pyload + community.docker.docker_container: + name: "{{ pyload_container_name }}" + state: absent + register: result + + - name: Check if pyload is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/pyload/tasks/main.yml b/roles/pyload/tasks/main.yml index 39d7a2e204..79ea4e6c78 100644 --- a/roles/pyload/tasks/main.yml +++ b/roles/pyload/tasks/main.yml @@ -1,33 +1,45 @@ --- -- name: Create pyLoad Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ pyload_config_directory }}" - - "{{ pyload_download_directory }}" +- name: Start pyLoad + block: + - name: Create pyLoad Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ pyload_config_directory }}" + - "{{ pyload_download_directory }}" -- name: Create pyLoad Docker Container - docker_container: - name: pyload - image: writl/pyload - pull: true - volumes: - - "{{ pyload_config_directory }}:/opt/pyload/pyload-config:rw" - - "{{ pyload_download_directory }}:/opt/pyload/Downloads:rw" - ports: - - "{{ pyload_port }}:8000" - env: - TZ: "{{ ansible_nas_timezone }}" - UID: "{{ pyload_user_id }}" - GID: "{{ pyload_group_id }}" - restart_policy: unless-stopped - memory: "{{ pyload_memory }}" - labels: - traefik.enable: "{{ pyload_available_externally | string }}" - traefik.http.routers.pyload.rule: "Host(`{{ pyload_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.pyload.tls.certresolver: "letsencrypt" - traefik.http.routers.pyload.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.pyload.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.pyload.loadbalancer.server.port: "8000" + - name: Create pyLoad Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ pyload_container_name }}" + image: "{{ pyload_image_name }}:{{ pyload_image_version }}" + pull: true + volumes: + - "{{ pyload_config_directory }}:/opt/pyload/pyload-config:rw" + - "{{ pyload_download_directory }}:/opt/pyload/Downloads:rw" + ports: + - "{{ pyload_port }}:8000" + env: + TZ: "{{ ansible_nas_timezone }}" + UID: "{{ pyload_user_id }}" + GID: "{{ pyload_group_id }}" + restart_policy: unless-stopped + memory: "{{ pyload_memory }}" + labels: + traefik.enable: "{{ pyload_available_externally | string }}" + traefik.http.routers.pyload.rule: "Host(`{{ pyload_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.pyload.tls.certresolver: "letsencrypt" + traefik.http.routers.pyload.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.pyload.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.pyload.loadbalancer.server.port: "8000" + when: pyload_enabled is true + +- name: Stop pyLoad + block: + - name: Stop pyLoad + community.docker.docker_container: + name: "{{ pyload_container_name }}" + state: absent + when: pyload_enabled is false diff --git a/roles/pytivo/defaults/main.yml b/roles/pytivo/defaults/main.yml index b223e71af8..79a1ff5e61 100644 --- a/roles/pytivo/defaults/main.yml +++ b/roles/pytivo/defaults/main.yml @@ -16,3 +16,8 @@ pytivo_group_id: "0" # network pytivo_hostname: "pytivo" + +# docker +pytivo_container_name: "pytivo" +pytivo_image_name: "pinion/docker-pytivo" +pytivo_image_version: "latest" diff --git a/roles/pytivo/docs/pytivo.md b/roles/pytivo/docs/pytivo.md new file mode 100644 index 0000000000..fda6fa9cb1 --- /dev/null +++ b/roles/pytivo/docs/pytivo.md @@ -0,0 +1,30 @@ +# PyTivo + +Project Homepage: + + +Docker Homepage: + + +PyTivo is both an HMO and GoBack server. Similar to TiVo Desktop pyTivo +loads many standard video compression codecs and outputs mpeg2 video to +the TiVo. However, pyTivo is able to load MANY more file types than TiVo +Desktop. + +## Usage + +Set `pytivo_enabled: true` in your `group_vars/all.yml` file. The PyTivo +web interface can be found at . + +## Specific Configuration + +PyTivo needs to be configured for use. Your ansible-nas media is +available to share via: + +* /movies - Where your movies are stored +* /music - Where your music is stored +* /photos - Where your photos are stored +* /podcasts - Where your podcasts are stored +* /tv - Where your TV episodes are stored + +Configuration help for PyTivo settings can be found at [Configure_pyTivo](https://pytivo.sourceforge.io/wiki/index.php/Configure_pyTivo). diff --git a/roles/pytivo/molecule/default/molecule.yml b/roles/pytivo/molecule/default/molecule.yml new file mode 100644 index 0000000000..7613679b92 --- /dev/null +++ b/roles/pytivo/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + pytivo_enabled: true diff --git a/roles/pytivo/molecule/default/side_effect.yml b/roles/pytivo/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5716e84bf7 --- /dev/null +++ b/roles/pytivo/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + pytivo_enabled: false diff --git a/roles/pytivo/molecule/default/verify.yml b/roles/pytivo/molecule/default/verify.yml new file mode 100644 index 0000000000..b185c87277 --- /dev/null +++ b/roles/pytivo/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get pytivo container state + community.docker.docker_container: + name: "{{ pytivo_container_name }}" + register: result + + - name: Check if pytivo containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/pytivo/molecule/default/verify_stopped.yml b/roles/pytivo/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..591d38672b --- /dev/null +++ b/roles/pytivo/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove pytivo + community.docker.docker_container: + name: "{{ pytivo_container_name }}" + state: absent + register: result + + - name: Check if pytivo is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/pytivo/tasks/main.yml b/roles/pytivo/tasks/main.yml index 219d93cbbc..2e74270ccf 100644 --- a/roles/pytivo/tasks/main.yml +++ b/roles/pytivo/tasks/main.yml @@ -1,38 +1,50 @@ --- -- name: Create Pytivo Directories - file: - path: "{{ item }}" - state: directory - mode: 0777 - with_items: - - "{{ pytivo_config_directory }}" +- name: Start Pytivo + block: + - name: Create Pytivo Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: 0777 + with_items: + - "{{ pytivo_config_directory }}" -- name: Pytivo - docker_container: - name: pytivo - image: pinion/docker-pytivo - pull: true - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "{{ pytivo_config_directory }}:/config:rw" - - "{{ pytivo_movies_directory }}:/movies:ro" - - "{{ pytivo_tv_directory }}:/tv:ro" - - "{{ pytivo_photos_directory }}:/photos:ro" - - "{{ pytivo_music_directory }}:/music:ro" - - "{{ pytivo_podcasts_directory }}:/podcasts:ro" - ports: - - "9032:9032" - - "2190:2190/udp" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ pytivo_user_id }}" - PGID: "{{ pytivo_group_id }}" - restart_policy: unless-stopped - memory: 1g - labels: - traefik.enable: "{{ pytivo_available_externally | string }}" - traefik.http.routers.pytivo.rule: "Host(`{{ pytivo_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.pytivo.tls.certresolver: "letsencrypt" - traefik.http.routers.pytivo.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.pytivo.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.pytivo.loadbalancer.server.port: "9032" + - name: Pytivo + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ pytivo_container_name }}" + image: "{{ pytivo_image_name }}:{{ pytivo_image_version }}" + pull: true + volumes: + - "/etc/localtime:/etc/localtime:ro" + - "{{ pytivo_config_directory }}:/config:rw" + - "{{ pytivo_movies_directory }}:/movies:ro" + - "{{ pytivo_tv_directory }}:/tv:ro" + - "{{ pytivo_photos_directory }}:/photos:ro" + - "{{ pytivo_music_directory }}:/music:ro" + - "{{ pytivo_podcasts_directory }}:/podcasts:ro" + ports: + - "9032:9032" + - "2190:2190/udp" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ pytivo_user_id }}" + PGID: "{{ pytivo_group_id }}" + restart_policy: unless-stopped + memory: 1g + labels: + traefik.enable: "{{ pytivo_available_externally | string }}" + traefik.http.routers.pytivo.rule: "Host(`{{ pytivo_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.pytivo.tls.certresolver: "letsencrypt" + traefik.http.routers.pytivo.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.pytivo.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.pytivo.loadbalancer.server.port: "9032" + when: pytivo_enabled is true + +- name: Stop Pytivo + block: + - name: Stop Pytivo + community.docker.docker_container: + name: "{{ pytivo_container_name }}" + state: absent + when: pytivo_enabled is false diff --git a/roles/radarr/defaults/main.yml b/roles/radarr/defaults/main.yml index 843520b7e4..f77a63299f 100644 --- a/roles/radarr/defaults/main.yml +++ b/roles/radarr/defaults/main.yml @@ -15,5 +15,10 @@ radarr_group_id: "0" radarr_port: "7878" radarr_hostname: "radarr" +# docker +radarr_container_name: "radarr" +radarr_image_name: "linuxserver/radarr" +radarr_image_version: "latest" + # specs radarr_memory: 1g diff --git a/roles/radarr/docs/radarr.md b/roles/radarr/docs/radarr.md new file mode 100644 index 0000000000..141bbebbd0 --- /dev/null +++ b/roles/radarr/docs/radarr.md @@ -0,0 +1,22 @@ +# Radarr + +Homepage: [radarr](https://radarr.video/) + +**Radarr** is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent. + +## Usage + +Set `radarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Radarr web interface can be found at `http://ansible_nas_host_or_ip:7878` by default + +## Specific Configuration + +**First make sure Radarr has permissions to write and read the `/download`, and `/movies` folders**. Do this by ensuring the `radarr_movies_directory:` and `radarr_download_directory` settings are correct. + +Radarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* + +For Radarr to understand that the `/movies` folder is a folder, you'll need to add a new subfolder into it. +You can also do this by adding a random movie to the folder. Keep in mind to have the internal setting **Create empty movie folders** on **yes** + +Comprehensive setup information can be found on the [Radarr GitHub wiki](https://github.com/Radarr/Radarr/wiki/Setup-Guide) diff --git a/roles/radarr/molecule/default/molecule.yml b/roles/radarr/molecule/default/molecule.yml new file mode 100644 index 0000000000..cadf085b8d --- /dev/null +++ b/roles/radarr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + radarr_enabled: true diff --git a/roles/radarr/molecule/default/side_effect.yml b/roles/radarr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..d172923e85 --- /dev/null +++ b/roles/radarr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + radarr_enabled: false diff --git a/roles/radarr/molecule/default/verify.yml b/roles/radarr/molecule/default/verify.yml new file mode 100644 index 0000000000..5083dada46 --- /dev/null +++ b/roles/radarr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get radarr container state + community.docker.docker_container: + name: "{{ radarr_container_name }}" + register: result + + - name: Check if radarr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/radarr/molecule/default/verify_stopped.yml b/roles/radarr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..fd1f933e9a --- /dev/null +++ b/roles/radarr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove radarr + community.docker.docker_container: + name: "{{ radarr_container_name }}" + state: absent + register: result + + - name: Check if radarr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/radarr/tasks/main.yml b/roles/radarr/tasks/main.yml index c7b1dad8a0..c13cdeaa44 100644 --- a/roles/radarr/tasks/main.yml +++ b/roles/radarr/tasks/main.yml @@ -1,32 +1,44 @@ --- -- name: Create Radarr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ radarr_data_directory }}" +- name: Start Radarr + block: + - name: Create Radarr Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ radarr_data_directory }}" -- name: Radarr - docker_container: - name: radarr - image: linuxserver/radarr - pull: true - volumes: - - "{{ radarr_movies_directory }}:/movies:rw" - - "{{ radarr_download_directory }}:/downloads:rw" - - "{{ radarr_data_directory }}:/config:rw" - ports: - - "{{ radarr_port }}:7878" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ radarr_user_id }}" - PGID: "{{ radarr_group_id }}" - restart_policy: unless-stopped - memory: "{{ radarr_memory }}" - labels: - traefik.enable: "{{ radarr_available_externally | string }}" - traefik.http.routers.radarr.rule: "Host(`{{ radarr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.radarr.tls.certresolver: "letsencrypt" - traefik.http.routers.radarr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.radarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.radarr.loadbalancer.server.port: "7878" + - name: Radarr + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ radarr_container_name }}" + image: "{{ radarr_image_name }}:{{ radarr_image_version }}" + pull: true + volumes: + - "{{ radarr_movies_directory }}:/movies:rw" + - "{{ radarr_download_directory }}:/downloads:rw" + - "{{ radarr_data_directory }}:/config:rw" + ports: + - "{{ radarr_port }}:7878" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ radarr_user_id }}" + PGID: "{{ radarr_group_id }}" + restart_policy: unless-stopped + memory: "{{ radarr_memory }}" + labels: + traefik.enable: "{{ radarr_available_externally | string }}" + traefik.http.routers.radarr.rule: "Host(`{{ radarr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.radarr.tls.certresolver: "letsencrypt" + traefik.http.routers.radarr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.radarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.radarr.loadbalancer.server.port: "7878" + when: radarr_enabled is true + +- name: Stop Radarr + block: + - name: Stop Radarr + community.docker.docker_container: + name: "{{ radarr_container_name }}" + state: absent + when: radarr_enabled is false diff --git a/roles/route53_ddns/defaults/main.yml b/roles/route53_ddns/defaults/main.yml index 06507ad011..ea3638ce54 100644 --- a/roles/route53_ddns/defaults/main.yml +++ b/roles/route53_ddns/defaults/main.yml @@ -23,3 +23,6 @@ route53_schedule: "*/30 * * * *" # Container route53_memory: 512MB +route53_container_name: "route53-ddns" +route53_image_name: "crazymax/ddns-route53" +route53_image_version: "latest" diff --git a/roles/route53_ddns/docs/route53_ddns.md b/roles/route53_ddns/docs/route53_ddns.md new file mode 100644 index 0000000000..c0b261d422 --- /dev/null +++ b/roles/route53_ddns/docs/route53_ddns.md @@ -0,0 +1,40 @@ +# AWS Route53 Dynamic DNS Updater + +ddns-route53: + +AWS Route53: + +If you want your Ansible-NAS accessible externally then you need a domain name. You will also need to set a wildcard host `A` record to point to your static IP, or enable this container to automatically update AWS Route53 with your dynamic IP address. + +## Usage + +Set `route53_ddns_enabled: true` in your `inventories//nas.yml` file. + +Set required AWS access credentials from the AWS Console. (See below.) + +## Specific Configuration + +Make sure you set your domain (if different than the `ansible-nas` default) and access details within your `inventories//nas.yml` file. + +To set up Route53 to work with the service, please review the [Prerequisites](https://crazymax.dev/ddns-route53/usage/prerequisites/) page. In short, you will need to set up a Route53 [Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html), an [IAM Policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html), and an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) with API credentials. + +### AWS Access Credentials + +| Parameter | Description | Status | +|--------------------|-------------------|-----------| +| route53_key_id | AWS access key ID | mandatory | +| route53_secret_key | AWS secret key | mandatory | + +### Networking + +| Parameter | Description | Status | +|------------------------|--------------------------------|-----------| +| route53_hosted_zone_id | Route53 hosted zone ID | mandatory | +| route53_ttl | Time-to-live for the DNS entry | | +| route53_host | Wildcard domain to update | | + +### Application + +| Parameter | Description | Status | +|------------------|-----------------------------------------------------|-----------| +| route53_schedule | [CRON](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc#hdr-CRON_Expression_Format) schedule for checking and updating DNS entry | | diff --git a/roles/route53_ddns/molecule/default/molecule.yml b/roles/route53_ddns/molecule/default/molecule.yml new file mode 100644 index 0000000000..fee9222f94 --- /dev/null +++ b/roles/route53_ddns/molecule/default/molecule.yml @@ -0,0 +1,19 @@ +--- +provisioner: + inventory: + group_vars: + all: + route53_enabled: true + route53_key_id: "abcdef" + route53_secret_key: "ghijkl" + route53_hosted_zone_id: "1000" + route53_data_directory: "/tmp/route53" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp:rw + privileged: true + pre_build_image: true diff --git a/roles/route53_ddns/molecule/default/side_effect.yml b/roles/route53_ddns/molecule/default/side_effect.yml new file mode 100644 index 0000000000..4ef789f91d --- /dev/null +++ b/roles/route53_ddns/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + route53_enabled: false diff --git a/roles/route53_ddns/molecule/default/verify.yml b/roles/route53_ddns/molecule/default/verify.yml new file mode 100644 index 0000000000..f64de7d790 --- /dev/null +++ b/roles/route53_ddns/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get route53 container state + community.docker.docker_container: + name: "{{ route53_container_name }}" + register: result + + - name: Check if route53 containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/route53_ddns/molecule/default/verify_stopped.yml b/roles/route53_ddns/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..114d565728 --- /dev/null +++ b/roles/route53_ddns/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove route53 + community.docker.docker_container: + name: "{{ route53_container_name }}" + state: absent + register: result + + - name: Check if route53 is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/route53_ddns/tasks/main.yml b/roles/route53_ddns/tasks/main.yml index 20c0ad2ed3..df25e460fd 100644 --- a/roles/route53_ddns/tasks/main.yml +++ b/roles/route53_ddns/tasks/main.yml @@ -1,25 +1,36 @@ --- +- name: Start AWS Route53 Dynamic DNS + block: + - name: Create AWS Route53 Dynamic DNS Directories + ansible.builtin.file: + path: "{{ route53_data_directory }}" + state: directory -- name: Create AWS Route53 Dynamic DNS Directories - file: - path: "{{ route53_data_directory }}" - state: directory + - name: Generate AWS Route53 Dynamic DNS config file + template: + src: config.yml + dest: "{{ route53_data_directory }}/ddns-route53.yml" + register: template_config -- name: Generate AWS Route53 Dynamic DNS config file - template: - src: config.yml - dest: "{{ route53_data_directory }}/ddns-route53.yml" - register: template_config + - name: AWS Route53 Dynamic DNS Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ route53_container_name }}" + image: "{{ route53_image_name }}:{{ route53_image_version }}" + pull: true + env: + SCHEDULE: "{{ route53_schedule | string }}" + volumes: + - "{{ route53_data_directory }}/ddns-route53.yml:/etc/ddns-route53/ddns-route53.yml" + restart_policy: unless-stopped + memory: "{{ route53_memory }}" + recreate: "{{ template_config is changed }}" + when: route53_enabled is true -- name: AWS Route53 Dynamic DNS Container - docker_container: - name: route53-ddns - image: crazymax/ddns-route53:latest - pull: true - env: - SCHEDULE: "{{ route53_schedule | string }}" - volumes: - - "{{ route53_data_directory }}/ddns-route53.yml:/etc/ddns-route53/ddns-route53.yml" - restart_policy: unless-stopped - memory: "{{ route53_memory }}" - recreate: "{{ template_config is changed }}" +- name: Stop AWS Route53 Dynamic DNS + block: + - name: Stop AWS Route53 Dynamic DNS + community.docker.docker_container: + name: "{{ route53_container_name }}" + state: absent + when: route53_enabled is false diff --git a/roles/rssbridge/defaults/main.yml b/roles/rssbridge/defaults/main.yml index 3c02e8a65c..6c3e251881 100644 --- a/roles/rssbridge/defaults/main.yml +++ b/roles/rssbridge/defaults/main.yml @@ -9,5 +9,10 @@ rssbridge_data_directory: "{{ docker_home }}/rssbridge" rssbridge_port: "8091" rssbridge_hostname: "rssbridge" +# docker +rssbridge_container_name: "rssbridge" +rssbridge_image_name: "rssbridge/rss-bridge" +rssbridge_image_version: "latest" + # specs rssbridge_memory: 1g diff --git a/roles/rssbridge/docs/rssbridge.md b/roles/rssbridge/docs/rssbridge.md new file mode 100644 index 0000000000..517e5bef05 --- /dev/null +++ b/roles/rssbridge/docs/rssbridge.md @@ -0,0 +1,13 @@ +# RSS-Bridge + +Homepage: + +RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. It can be used on webservers or as a stand-alone application in CLI mode. + +Important: RSS-Bridge is not a feed reader or feed aggregator, but a tool to generate feeds that are consumed by feed readers and feed aggregators. + +## Usage + +Set `rssbridge_enabled: true` in your `inventories//nas.yml` file. + +The RSS-Bridge web interface can be found at . diff --git a/roles/rssbridge/molecule/default/molecule.yml b/roles/rssbridge/molecule/default/molecule.yml new file mode 100644 index 0000000000..c044b14405 --- /dev/null +++ b/roles/rssbridge/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + rssbridge_enabled: true diff --git a/roles/rssbridge/molecule/default/side_effect.yml b/roles/rssbridge/molecule/default/side_effect.yml new file mode 100644 index 0000000000..a073e68b62 --- /dev/null +++ b/roles/rssbridge/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + rssbridge_enabled: false diff --git a/roles/rssbridge/molecule/default/verify.yml b/roles/rssbridge/molecule/default/verify.yml new file mode 100644 index 0000000000..20bee845bf --- /dev/null +++ b/roles/rssbridge/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get rssbridge container state + community.docker.docker_container: + name: "{{ rssbridge_container_name }}" + register: result + + - name: Check if rssbridge containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/rssbridge/molecule/default/verify_stopped.yml b/roles/rssbridge/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..2c260381a7 --- /dev/null +++ b/roles/rssbridge/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove rssbridge + community.docker.docker_container: + name: "{{ rssbridge_container_name }}" + state: absent + register: result + + - name: Check if rssbridge is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/rssbridge/tasks/main.yml b/roles/rssbridge/tasks/main.yml index 1c942ce1fd..73b7e090cb 100644 --- a/roles/rssbridge/tasks/main.yml +++ b/roles/rssbridge/tasks/main.yml @@ -1,27 +1,39 @@ --- -- name: Create RSSBridge Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ rssbridge_data_directory }}/data" +- name: Start RSSBridge + block: + - name: Create RSSBridge Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ rssbridge_data_directory }}/data" -- name: RSSBridge Docker Container - docker_container: - name: rssbridge - image: rssbridge/rss-bridge - pull: true - volumes: - - "{{ rssbridge_data_directory }}/data:/config:rw" - ports: - - "{{ rssbridge_port }}:80" - restart_policy: unless-stopped - memory: "{{ rssbridge_memory }}" - labels: - traefik.enable: "{{ rssbridge_available_externally | string }}" - traefik.http.routers.rssbridge.rule: "Host(`{{ rssbridge_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.rssbridge.tls.certresolver: "letsencrypt" - traefik.http.routers.rssbridge.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.rssbridge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.rssbridge.loadbalancer.server.port: "80" + - name: RSSBridge Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ rssbridge_container_name }}" + image: "{{ rssbridge_image_name }}:{{ rssbridge_image_version }}" + pull: true + volumes: + - "{{ rssbridge_data_directory }}/data:/config:rw" + ports: + - "{{ rssbridge_port }}:80" + restart_policy: unless-stopped + memory: "{{ rssbridge_memory }}" + labels: + traefik.enable: "{{ rssbridge_available_externally | string }}" + traefik.http.routers.rssbridge.rule: "Host(`{{ rssbridge_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.rssbridge.tls.certresolver: "letsencrypt" + traefik.http.routers.rssbridge.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.rssbridge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.rssbridge.loadbalancer.server.port: "80" + when: rssbridge_enabled is true + +- name: Stop RSSBridge + block: + - name: Stop RSSBridge + community.docker.docker_container: + name: "{{ rssbridge_container_name }}" + state: absent + when: rssbridge_enabled is false diff --git a/roles/sabnzbd/defaults/main.yml b/roles/sabnzbd/defaults/main.yml index 3a39633ceb..3468a02779 100644 --- a/roles/sabnzbd/defaults/main.yml +++ b/roles/sabnzbd/defaults/main.yml @@ -17,3 +17,8 @@ sabnzbd_memory: 1g # uid / gid sabnzbd_user_id: "0" sabnzbd_group_id: "0" + +# docker +sabnzbd_container_name: "sabnzbd" +sabnzbd_image_name: "linuxserver/sabnzbd" +sabnzbd_image_version: "latest" diff --git a/roles/sabnzbd/docs/sabnzbd.md b/roles/sabnzbd/docs/sabnzbd.md new file mode 100644 index 0000000000..a4ed13d11f --- /dev/null +++ b/roles/sabnzbd/docs/sabnzbd.md @@ -0,0 +1,11 @@ +# Sabnzbd + +Homepage: + +The time tested Usenet downloader provided with FreeNAS. It just works for those migrating from FreeNAS. + +## Usage + +Set `sabnzbd_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Sabnzbd web interface can be found at . Use this interface to configure the software upon first connection. diff --git a/roles/sabnzbd/molecule/default/molecule.yml b/roles/sabnzbd/molecule/default/molecule.yml new file mode 100644 index 0000000000..53d52b074b --- /dev/null +++ b/roles/sabnzbd/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + sabnzbd_enabled: true diff --git a/roles/sabnzbd/molecule/default/side_effect.yml b/roles/sabnzbd/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f7fe0b8eff --- /dev/null +++ b/roles/sabnzbd/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + sabnzbd_enabled: false diff --git a/roles/sabnzbd/molecule/default/verify.yml b/roles/sabnzbd/molecule/default/verify.yml new file mode 100644 index 0000000000..c8f767eb89 --- /dev/null +++ b/roles/sabnzbd/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get sabnzbd container state + community.docker.docker_container: + name: "{{ sabnzbd_container_name }}" + register: result + + - name: Check if sabnzbd containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/sabnzbd/molecule/default/verify_stopped.yml b/roles/sabnzbd/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..d83fa89d43 --- /dev/null +++ b/roles/sabnzbd/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove sabnzbd + community.docker.docker_container: + name: "{{ sabnzbd_container_name }}" + state: absent + register: result + + - name: Check if sabnzbd is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/sabnzbd/tasks/main.yml b/roles/sabnzbd/tasks/main.yml index 914769bdf4..7e5241cd95 100644 --- a/roles/sabnzbd/tasks/main.yml +++ b/roles/sabnzbd/tasks/main.yml @@ -1,31 +1,43 @@ --- -- name: Create Sabnzbd Data Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ sabnzbd_data_directory }}" +- name: Start Sabnzbd + block: + - name: Create Sabnzbd Data Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ sabnzbd_data_directory }}" -- name: Sabnzbd - docker_container: - name: sabnzbd - image: linuxserver/sabnzbd - pull: true - volumes: - - "{{ sabnzbd_data_directory }}:/config:rw" - - "{{ sabnzbd_downloads_directory }}:/downloads" - - "{{ sabnzbd_incomplete_directory }}:/incomplete-downloads" - ports: - - "{{ sabnzbd_port }}:8080" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ sabnzbd_user_id }}" - PGID: "{{ sabnzbd_group_id }}" - restart_policy: unless-stopped - labels: - traefik.enable: "{{ sabnzbd_available_externally | string }}" - traefik.http.routers.sabnzbd.rule: "Host(`{{ sabnzbd_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.sabnzbd.tls.certresolver: "letsencrypt" - traefik.http.routers.sabnzbd.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.sabnzbd.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.sabnzbd.loadbalancer.server.port: "8080" + - name: Sabnzbd + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ sabnzbd_container_name }}" + image: "{{ sabnzbd_image_name }}:{{ sabnzbd_image_version }}" + pull: true + volumes: + - "{{ sabnzbd_data_directory }}:/config:rw" + - "{{ sabnzbd_downloads_directory }}:/downloads" + - "{{ sabnzbd_incomplete_directory }}:/incomplete-downloads" + ports: + - "{{ sabnzbd_port }}:8080" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ sabnzbd_user_id }}" + PGID: "{{ sabnzbd_group_id }}" + restart_policy: unless-stopped + labels: + traefik.enable: "{{ sabnzbd_available_externally | string }}" + traefik.http.routers.sabnzbd.rule: "Host(`{{ sabnzbd_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.sabnzbd.tls.certresolver: "letsencrypt" + traefik.http.routers.sabnzbd.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.sabnzbd.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.sabnzbd.loadbalancer.server.port: "8080" + when: sabnzbd_enabled is true + +- name: Stop Sabnzbd + block: + - name: Stop Sabnzbd + community.docker.docker_container: + name: "{{ sabnzbd_container_name }}" + state: absent + when: sabnzbd_enabled is false diff --git a/roles/sickchill/defaults/main.yml b/roles/sickchill/defaults/main.yml index 483b32d034..e91a12b069 100644 --- a/roles/sickchill/defaults/main.yml +++ b/roles/sickchill/defaults/main.yml @@ -15,5 +15,10 @@ sickchill_group_id: "0" sickchill_port: "8081" sickchill_hostname: "sickchill" +# docker +sickchill_container_name: "sickchill" +sickchill_image_name: "linuxserver/sickchill" +sickchill_image_version: "latest" + # specs sickchill_memory: 1g diff --git a/roles/sickchill/docs/sickchill.md b/roles/sickchill/docs/sickchill.md new file mode 100644 index 0000000000..8fe2b75aec --- /dev/null +++ b/roles/sickchill/docs/sickchill.md @@ -0,0 +1,12 @@ +# Sickchill + +Homepage: [Sickchill](https://sickchill.github.io/) + +SickChill is an automatic Video Library Manager for TV Shows. +It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want. + +## Usage + +Set `sickchill_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The sickchill web interface can be found at `http://ansible_nas_host_or_ip:8081` by default diff --git a/roles/sickchill/molecule/default/molecule.yml b/roles/sickchill/molecule/default/molecule.yml new file mode 100644 index 0000000000..b0c23f3342 --- /dev/null +++ b/roles/sickchill/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + sickchill_enabled: true diff --git a/roles/sickchill/molecule/default/side_effect.yml b/roles/sickchill/molecule/default/side_effect.yml new file mode 100644 index 0000000000..08bdee4672 --- /dev/null +++ b/roles/sickchill/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + sickchill_enabled: false diff --git a/roles/sickchill/molecule/default/verify.yml b/roles/sickchill/molecule/default/verify.yml new file mode 100644 index 0000000000..4a9bc9d170 --- /dev/null +++ b/roles/sickchill/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get sickchill container state + community.docker.docker_container: + name: "{{ sickchill_container_name }}" + register: result + + - name: Check if sickchill containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/sickchill/molecule/default/verify_stopped.yml b/roles/sickchill/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..6da330633a --- /dev/null +++ b/roles/sickchill/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove sickchill + community.docker.docker_container: + name: "{{ sickchill_container_name }}" + state: absent + register: result + + - name: Check if sickchill is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/sickchill/tasks/main.yml b/roles/sickchill/tasks/main.yml index 4c058a5b76..f84dad76df 100644 --- a/roles/sickchill/tasks/main.yml +++ b/roles/sickchill/tasks/main.yml @@ -1,33 +1,45 @@ --- -- name: Create Sickchill Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ sickchill_config_directory }}" +- name: Start Sickchill + block: + - name: Create Sickchill Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ sickchill_config_directory }}" -- name: Sickchill Docker Container - docker_container: - name: sickchill - image: linuxserver/sickchill - pull: true - volumes: - - "{{ sickchill_config_directory }}:/config:rw" - - "{{ sickchill_downloads_directory }}:/downloads:rw" - - "{{ sickchill_tv_directory }}:/tv:rw" - ports: - - "{{ sickchill_port }}:8081" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ sickchill_user_id }}" - PGID: "{{ sickchill_group_id }}" - restart_policy: unless-stopped - memory: "{{ sickchill_memory }}" - labels: - traefik.enable: "{{ sickchill_available_externally | string }}" - traefik.http.routers.sickchill.rule: "Host(`{{ sickchill_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.sickchill.tls.certresolver: "letsencrypt" - traefik.http.routers.sickchill.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.sickchill.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.sickchill.loadbalancer.server.port: "8081" + - name: Sickchill Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ sickchill_container_name }}" + image: "{{ sickchill_image_name }}:{{ sickchill_image_version }}" + pull: true + volumes: + - "{{ sickchill_config_directory }}:/config:rw" + - "{{ sickchill_downloads_directory }}:/downloads:rw" + - "{{ sickchill_tv_directory }}:/tv:rw" + ports: + - "{{ sickchill_port }}:8081" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ sickchill_user_id }}" + PGID: "{{ sickchill_group_id }}" + restart_policy: unless-stopped + memory: "{{ sickchill_memory }}" + labels: + traefik.enable: "{{ sickchill_available_externally | string }}" + traefik.http.routers.sickchill.rule: "Host(`{{ sickchill_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.sickchill.tls.certresolver: "letsencrypt" + traefik.http.routers.sickchill.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.sickchill.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.sickchill.loadbalancer.server.port: "8081" + when: sickchill_enabled is true + +- name: Stop Sickchill + block: + - name: Stop Sickchill + community.docker.docker_container: + name: "{{ sickchill_container_name }}" + state: absent + when: sickchill_enabled is false From defc17eaf3b0dde98685cf3d6126abeb3d8a2c5c Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 16:50:37 +0100 Subject: [PATCH 106/286] "Fix" Guacamole --- roles/guacamole/tasks/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/guacamole/tasks/main.yml b/roles/guacamole/tasks/main.yml index 1eee84fd37..5a3be0040b 100644 --- a/roles/guacamole/tasks/main.yml +++ b/roles/guacamole/tasks/main.yml @@ -52,6 +52,7 @@ name: "{{ guacamole_container_name }}" image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}" restart: true + tags: molecule-idempotence-notest when: guacamole_enabled is true - name: Stop Guacamole From ee6da57325f9a1322b99f565bdf0722498407add Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 22:00:37 +0100 Subject: [PATCH 107/286] Add last batch --- nas.yml | 22 --- roles/gitea/defaults/main.yml | 5 + roles/gitea/docs/gitea.md | 11 ++ roles/gitea/molecule/default/molecule.yml | 7 + roles/gitea/molecule/default/side_effect.yml | 10 ++ roles/gitea/molecule/default/verify.yml | 19 +++ .../gitea/molecule/default/verify_stopped.yml | 19 +++ roles/gitea/tasks/main.yml | 26 +++- roles/sonarr/defaults/main.yml | 5 + roles/sonarr/docs/sonarr.md | 22 +++ roles/sonarr/molecule/default/molecule.yml | 6 + roles/sonarr/molecule/default/side_effect.yml | 10 ++ roles/sonarr/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/sonarr/tasks/main.yml | 72 +++++---- roles/speedtest-tracker/defaults/main.yml | 7 +- roles/speedtest-tracker/docs/speedtest.md | 15 ++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/speedtest-tracker/tasks/main.yml | 76 ++++++---- roles/stats/defaults/main.yml | 17 +++ roles/stats/docs/stats.md | 13 ++ roles/stats/molecule/default/molecule.yml | 24 +++ roles/stats/molecule/default/side_effect.yml | 10 ++ roles/stats/molecule/default/verify.yml | 47 ++++++ .../stats/molecule/default/verify_stopped.yml | 47 ++++++ roles/stats/tasks/exporters.yml | 57 ++++--- roles/stats/tasks/grafana.yml | 106 +++++++------ roles/stats/tasks/prometheus.yml | 96 ++++++------ roles/stats/tasks/telegraf.yml | 102 +++++++------ roles/syncthing/defaults/main.yml | 5 + roles/syncthing/docs/syncthing.md | 27 ++++ roles/syncthing/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/syncthing/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/syncthing/tasks/main.yml | 68 +++++---- roles/tautulli/defaults/main.yml | 5 + roles/tautulli/docs/tautulli.md | 11 ++ roles/tautulli/molecule/default/molecule.yml | 7 + .../tautulli/molecule/default/side_effect.yml | 10 ++ roles/tautulli/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/tautulli/tasks/main.yml | 74 +++++---- roles/thelounge/defaults/main.yml | 3 + roles/thelounge/docs/thelounge.md | 16 ++ roles/thelounge/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/thelounge/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/thelounge/tasks/main.yml | 76 ++++++---- roles/tiddlywiki/defaults/main.yml | 3 + roles/tiddlywiki/docs/tiddlywiki.md | 34 +++++ .../tiddlywiki/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/tiddlywiki/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/tiddlywiki/tasks/main.yml | 66 ++++---- roles/timemachine/defaults/main.yml | 3 + roles/timemachine/docs/timemachine.md | 29 ++++ .../timemachine/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/timemachine/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/timemachine/tasks/main.yml | 84 ++++++----- roles/traefik/defaults/main.yml | 4 +- roles/traefik/docs/traefik.md | 20 +++ roles/traefik/molecule/default/molecule.yml | 18 +++ .../traefik/molecule/default/side_effect.yml | 10 ++ roles/traefik/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/traefik/tasks/main.yml | 64 ++++---- .../defaults/main.yml | 4 + .../docs/transmission.md | 26 ++++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ .../transmission-with-openvpn/tasks/main.yml | 122 ++++++++------- roles/transmission/defaults/main.yml | 4 + roles/transmission/docs/transmission.md | 26 ++++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../transmission/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/transmission/tasks/main.yml | 82 +++++----- roles/ubooquity/defaults/main.yml | 3 + roles/ubooquity/docs/ubooquity.md | 25 +++ roles/ubooquity/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/ubooquity/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/ubooquity/tasks/main.yml | 78 ++++++---- roles/utorrent/defaults/main.yml | 5 + roles/utorrent/docs/utorrent.md | 15 ++ roles/utorrent/molecule/default/molecule.yml | 6 + .../utorrent/molecule/default/side_effect.yml | 10 ++ roles/utorrent/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/utorrent/tasks/main.yml | 86 ++++++----- roles/virtual_desktop/defaults/main.yml | 5 +- roles/virtual_desktop/docs/virtual_desktop.md | 30 ++++ .../molecule/default/molecule.yml | 7 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/virtual_desktop/tasks/main.yml | 66 ++++---- roles/wallabag/defaults/main.yml | 3 + roles/wallabag/docs/wallabag.md | 17 +++ roles/wallabag/molecule/default/molecule.yml | 17 +++ .../wallabag/molecule/default/side_effect.yml | 10 ++ roles/wallabag/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/wallabag/tasks/main.yml | 71 +++++---- roles/watchtower/defaults/main.yml | 4 + roles/watchtower/docs/watchtower.md | 15 ++ .../watchtower/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/watchtower/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/watchtower/tasks/main.yml | 36 +++-- roles/wireshark/defaults/main.yml | 5 + roles/wireshark/docs/wireshark.md | 11 ++ roles/wireshark/molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ roles/wireshark/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/wireshark/tasks/main.yml | 72 +++++---- roles/woodpecker-ci/defaults/main.yml | 9 ++ roles/woodpecker-ci/docs/woodpecker_ci.md | 17 +++ .../molecule/default/molecule.yml | 22 +++ .../molecule/default/prepare.yml | 20 +++ .../molecule/default/side_effect.yml | 10 ++ .../woodpecker-ci/molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/woodpecker-ci/tasks/main.yml | 142 ++++++++++-------- roles/youtubedlmaterial/defaults/main.yml | 5 + .../docs/youtubedlmaterial.md | 17 +++ .../molecule/default/molecule.yml | 6 + .../molecule/default/side_effect.yml | 10 ++ .../molecule/default/verify.yml | 19 +++ .../molecule/default/verify_stopped.yml | 19 +++ roles/youtubedlmaterial/tasks/main.yml | 88 ++++++----- roles/znc/defaults/main.yml | 12 ++ roles/znc/docs/znc.md | 11 ++ roles/znc/molecule/default/molecule.yml | 17 +++ roles/znc/molecule/default/side_effect.yml | 10 ++ roles/znc/molecule/default/verify.yml | 19 +++ roles/znc/molecule/default/verify_stopped.yml | 19 +++ roles/znc/tasks/main.yml | 77 ++++++---- roles/znc/templates/znc.conf.j2 | 35 +++++ 153 files changed, 2932 insertions(+), 817 deletions(-) create mode 100644 roles/gitea/docs/gitea.md create mode 100644 roles/gitea/molecule/default/molecule.yml create mode 100644 roles/gitea/molecule/default/side_effect.yml create mode 100644 roles/gitea/molecule/default/verify.yml create mode 100644 roles/gitea/molecule/default/verify_stopped.yml create mode 100644 roles/sonarr/docs/sonarr.md create mode 100644 roles/sonarr/molecule/default/molecule.yml create mode 100644 roles/sonarr/molecule/default/side_effect.yml create mode 100644 roles/sonarr/molecule/default/verify.yml create mode 100644 roles/sonarr/molecule/default/verify_stopped.yml create mode 100644 roles/speedtest-tracker/docs/speedtest.md create mode 100644 roles/speedtest-tracker/molecule/default/molecule.yml create mode 100644 roles/speedtest-tracker/molecule/default/side_effect.yml create mode 100644 roles/speedtest-tracker/molecule/default/verify.yml create mode 100644 roles/speedtest-tracker/molecule/default/verify_stopped.yml create mode 100644 roles/stats/docs/stats.md create mode 100644 roles/stats/molecule/default/molecule.yml create mode 100644 roles/stats/molecule/default/side_effect.yml create mode 100644 roles/stats/molecule/default/verify.yml create mode 100644 roles/stats/molecule/default/verify_stopped.yml create mode 100644 roles/syncthing/docs/syncthing.md create mode 100644 roles/syncthing/molecule/default/molecule.yml create mode 100644 roles/syncthing/molecule/default/side_effect.yml create mode 100644 roles/syncthing/molecule/default/verify.yml create mode 100644 roles/syncthing/molecule/default/verify_stopped.yml create mode 100644 roles/tautulli/docs/tautulli.md create mode 100644 roles/tautulli/molecule/default/molecule.yml create mode 100644 roles/tautulli/molecule/default/side_effect.yml create mode 100644 roles/tautulli/molecule/default/verify.yml create mode 100644 roles/tautulli/molecule/default/verify_stopped.yml create mode 100644 roles/thelounge/docs/thelounge.md create mode 100644 roles/thelounge/molecule/default/molecule.yml create mode 100644 roles/thelounge/molecule/default/side_effect.yml create mode 100644 roles/thelounge/molecule/default/verify.yml create mode 100644 roles/thelounge/molecule/default/verify_stopped.yml create mode 100644 roles/tiddlywiki/docs/tiddlywiki.md create mode 100644 roles/tiddlywiki/molecule/default/molecule.yml create mode 100644 roles/tiddlywiki/molecule/default/side_effect.yml create mode 100644 roles/tiddlywiki/molecule/default/verify.yml create mode 100644 roles/tiddlywiki/molecule/default/verify_stopped.yml create mode 100644 roles/timemachine/docs/timemachine.md create mode 100644 roles/timemachine/molecule/default/molecule.yml create mode 100644 roles/timemachine/molecule/default/side_effect.yml create mode 100644 roles/timemachine/molecule/default/verify.yml create mode 100644 roles/timemachine/molecule/default/verify_stopped.yml create mode 100644 roles/traefik/docs/traefik.md create mode 100644 roles/traefik/molecule/default/molecule.yml create mode 100644 roles/traefik/molecule/default/side_effect.yml create mode 100644 roles/traefik/molecule/default/verify.yml create mode 100644 roles/traefik/molecule/default/verify_stopped.yml create mode 100644 roles/transmission-with-openvpn/docs/transmission.md create mode 100644 roles/transmission-with-openvpn/molecule/default/molecule.yml create mode 100644 roles/transmission-with-openvpn/molecule/default/side_effect.yml create mode 100644 roles/transmission-with-openvpn/molecule/default/verify.yml create mode 100644 roles/transmission-with-openvpn/molecule/default/verify_stopped.yml create mode 100644 roles/transmission/docs/transmission.md create mode 100644 roles/transmission/molecule/default/molecule.yml create mode 100644 roles/transmission/molecule/default/side_effect.yml create mode 100644 roles/transmission/molecule/default/verify.yml create mode 100644 roles/transmission/molecule/default/verify_stopped.yml create mode 100644 roles/ubooquity/docs/ubooquity.md create mode 100644 roles/ubooquity/molecule/default/molecule.yml create mode 100644 roles/ubooquity/molecule/default/side_effect.yml create mode 100644 roles/ubooquity/molecule/default/verify.yml create mode 100644 roles/ubooquity/molecule/default/verify_stopped.yml create mode 100644 roles/utorrent/docs/utorrent.md create mode 100644 roles/utorrent/molecule/default/molecule.yml create mode 100644 roles/utorrent/molecule/default/side_effect.yml create mode 100644 roles/utorrent/molecule/default/verify.yml create mode 100644 roles/utorrent/molecule/default/verify_stopped.yml create mode 100644 roles/virtual_desktop/docs/virtual_desktop.md create mode 100644 roles/virtual_desktop/molecule/default/molecule.yml create mode 100644 roles/virtual_desktop/molecule/default/side_effect.yml create mode 100644 roles/virtual_desktop/molecule/default/verify.yml create mode 100644 roles/virtual_desktop/molecule/default/verify_stopped.yml create mode 100644 roles/wallabag/docs/wallabag.md create mode 100644 roles/wallabag/molecule/default/molecule.yml create mode 100644 roles/wallabag/molecule/default/side_effect.yml create mode 100644 roles/wallabag/molecule/default/verify.yml create mode 100644 roles/wallabag/molecule/default/verify_stopped.yml create mode 100644 roles/watchtower/docs/watchtower.md create mode 100644 roles/watchtower/molecule/default/molecule.yml create mode 100644 roles/watchtower/molecule/default/side_effect.yml create mode 100644 roles/watchtower/molecule/default/verify.yml create mode 100644 roles/watchtower/molecule/default/verify_stopped.yml create mode 100644 roles/wireshark/docs/wireshark.md create mode 100644 roles/wireshark/molecule/default/molecule.yml create mode 100644 roles/wireshark/molecule/default/side_effect.yml create mode 100644 roles/wireshark/molecule/default/verify.yml create mode 100644 roles/wireshark/molecule/default/verify_stopped.yml create mode 100644 roles/woodpecker-ci/docs/woodpecker_ci.md create mode 100644 roles/woodpecker-ci/molecule/default/molecule.yml create mode 100644 roles/woodpecker-ci/molecule/default/prepare.yml create mode 100644 roles/woodpecker-ci/molecule/default/side_effect.yml create mode 100644 roles/woodpecker-ci/molecule/default/verify.yml create mode 100644 roles/woodpecker-ci/molecule/default/verify_stopped.yml create mode 100644 roles/youtubedlmaterial/docs/youtubedlmaterial.md create mode 100644 roles/youtubedlmaterial/molecule/default/molecule.yml create mode 100644 roles/youtubedlmaterial/molecule/default/side_effect.yml create mode 100644 roles/youtubedlmaterial/molecule/default/verify.yml create mode 100644 roles/youtubedlmaterial/molecule/default/verify_stopped.yml create mode 100644 roles/znc/docs/znc.md create mode 100644 roles/znc/molecule/default/molecule.yml create mode 100644 roles/znc/molecule/default/side_effect.yml create mode 100644 roles/znc/molecule/default/verify.yml create mode 100644 roles/znc/molecule/default/verify_stopped.yml create mode 100644 roles/znc/templates/znc.conf.j2 diff --git a/nas.yml b/nas.yml index 7833c0b0d5..b60460f6a5 100644 --- a/nas.yml +++ b/nas.yml @@ -304,109 +304,87 @@ - role: sabnzbd tags: - sabnzbd - when: (sabnzbd_enabled | default(False)) - role: sickchill tags: - sickchill - when: (sickchill_enabled | default(False)) - role: sonarr tags: - sonarr - when: (sonarr_enabled | default(False)) - role: speedtest-tracker tags: - speedtest-tracker - when: (speedtest_tracker_enabled | default(False)) - role: stats tags: - stats - when: (stats_enabled | default(False)) - role: syncthing tags: - syncthing - when: (syncthing_enabled | default(False)) - role: tautulli tags: - tautulli - when: (tautulli_enabled | default(False)) - role: thelounge tags: - thelounge - when: (thelounge_enabled | default(False)) - role: tiddlywiki tags: - tiddlywiki - when: (tiddlywiki_enabled | default(False)) - role: timemachine tags: - timemachine - when: (timemachine_enabled | default(False)) - role: traefik tags: - traefik - when: (traefik_enabled | default(False)) - role: transmission tags: - transmission - when: (transmission_enabled | default(False)) - role: transmission-with-openvpn tags: - transmission_with_openvpn - when: (transmission_with_openvpn_enabled | default(False)) - role: ubooquity tags: - ubooquity - when: (ubooquity_enabled | default(False)) - role: utorrent tags: - utorrent - when: (utorrent_enabled | default(False)) - role: virtual_desktop tags: - virtual_desktop - when: (virtual_desktop_enabled | default(False)) - role: wallabag tags: - wallabag - when: (wallabag_enabled | default(False)) - role: watchtower tags: - watchtower - when: (watchtower_enabled | default(False)) - role: wireshark tags: - wireshark - when: (wireshark_enabled | default(False)) - role: woodpecker-ci tags: - woodpecker_ci - when: (woodpecker_ci_enabled | default(False)) - role: youtubedlmaterial tags: - youtubedlmaterial - when: (youtubedlmaterial_enabled | default(False)) - role: znc tags: - znc - when: (znc_enabled | default(False)) diff --git a/roles/gitea/defaults/main.yml b/roles/gitea/defaults/main.yml index a83fbe951b..7bb7b97bae 100644 --- a/roles/gitea/defaults/main.yml +++ b/roles/gitea/defaults/main.yml @@ -7,6 +7,7 @@ gitea_data_directory: "{{ docker_home }}/gitea" # network gitea_hostname: "gitea" +gitea_network_name: "gitea" gitea_port_http: "3001" gitea_port_ssh: "222" @@ -16,4 +17,8 @@ gitea_mysql_memory: 1g # docker gitea_container_name: gitea +gitea_image_name: gitea/gitea +gitea_image_version: latest gitea_mysql_container_name: gitea-mysql +gitea_mysql_image_name: mysql +gitea_mysql_image_version: "5.7" diff --git a/roles/gitea/docs/gitea.md b/roles/gitea/docs/gitea.md new file mode 100644 index 0000000000..ed2a20144b --- /dev/null +++ b/roles/gitea/docs/gitea.md @@ -0,0 +1,11 @@ +# Gitea + +Homepage: + +Gitea is a painless self-hosted Git service. + +## Usage + +Set `gitea_enabled: true` in your `inventories//nas.yml` file. + +The Gitea web interface can be found at . diff --git a/roles/gitea/molecule/default/molecule.yml b/roles/gitea/molecule/default/molecule.yml new file mode 100644 index 0000000000..934916d34c --- /dev/null +++ b/roles/gitea/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + gitea_enabled: true + ansible_nas_hostname: ansible-nas diff --git a/roles/gitea/molecule/default/side_effect.yml b/roles/gitea/molecule/default/side_effect.yml new file mode 100644 index 0000000000..7b75a3f9d8 --- /dev/null +++ b/roles/gitea/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + gitea_enabled: false diff --git a/roles/gitea/molecule/default/verify.yml b/roles/gitea/molecule/default/verify.yml new file mode 100644 index 0000000000..d8924eb23e --- /dev/null +++ b/roles/gitea/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get gitea container state + community.docker.docker_container: + name: "{{ gitea_container_name }}" + register: result + + - name: Check if gitea containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/gitea/molecule/default/verify_stopped.yml b/roles/gitea/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..0c3182e888 --- /dev/null +++ b/roles/gitea/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove gitea + community.docker.docker_container: + name: "{{ gitea_container_name }}" + state: absent + register: result + + - name: Check if gitea is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/gitea/tasks/main.yml b/roles/gitea/tasks/main.yml index 0da9f2322e..b7b554bd36 100644 --- a/roles/gitea/tasks/main.yml +++ b/roles/gitea/tasks/main.yml @@ -10,11 +10,19 @@ - "{{ gitea_data_directory }}/gitea" - "{{ gitea_data_directory }}/mysql" + - name: Create gitea network + community.docker.docker_network: + name: "{{ gitea_network_name }}" + - name: Create MySQL container for Gitea - docker_container: + community.docker.docker_container: + container_default_behavior: no_defaults name: "{{ gitea_mysql_container_name }}" - image: mysql:5.7 + image: "{{ gitea_mysql_image_name }}:{{ gitea_mysql_image_version }}" pull: true + networks: + - name: "{{ gitea_network_name }}" + network_mode: "{{ gitea_network_name }}" volumes: - "{{ gitea_data_directory }}/mysql:/var/lib/mysql:rw" env: @@ -26,12 +34,14 @@ memory: "{{ gitea_mysql_memory }}" - name: Create Gitea container - docker_container: - name: gitea - image: gitea/gitea:latest + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ gitea_container_name }}" + image: "{{ gitea_image_name }}:{{ gitea_image_version }}" pull: true - links: - - gitea-mysql:db + networks: + - name: "{{ gitea_network_name }}" + network_mode: "{{ gitea_network_name }}" volumes: - "{{ gitea_data_directory }}/gitea:/data:rw" ports: @@ -39,7 +49,7 @@ - "{{ gitea_port_ssh }}:22" env: DB_TYPE: "mysql" - DB_HOST: "db:3306" + DB_HOST: "{{ gitea_mysql_container_name }}:3306" DB_NAME: "gitea" DB_USER: "gitea" DB_PASSWD: "gitea" diff --git a/roles/sonarr/defaults/main.yml b/roles/sonarr/defaults/main.yml index 256f08fcc2..fe120377e4 100644 --- a/roles/sonarr/defaults/main.yml +++ b/roles/sonarr/defaults/main.yml @@ -15,5 +15,10 @@ sonarr_group_id: "0" sonarr_port: "8989" sonarr_hostname: "sonarr" +# docker +sonarr_container_name: "sonarr" +sonarr_image_name: "linuxserver/sonarr" +sonarr_image_version: "latest" + # specs sonarr_memory: 1g diff --git a/roles/sonarr/docs/sonarr.md b/roles/sonarr/docs/sonarr.md new file mode 100644 index 0000000000..f856f75a60 --- /dev/null +++ b/roles/sonarr/docs/sonarr.md @@ -0,0 +1,22 @@ +# Sonarr + +Homepage: + +**Sonarr** is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. + +## Usage + +Set `sonarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Sonarr web interface can be found at `http://ansible_nas_host_or_ip:8989` by default + +## Specific Configuration + +**First make sure Sonarr has permissions to write and read the `/download` and `/tv` folders**. Do this by ensuring the `sonarr_movies_directory:` and `sonarr_download_directory` settings are correct. + +Sonarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* + +For Sonarr to understand that the `/tv` folder is a folder, you'll need to add a folder into it. +You can also do this by adding a random series to the folder. Keep in mind to have the setting **Create empty movie folders** on **yes** + +For comprehensive configuration instructions see the [Sonarr GitHub wiki](https://github.com/Sonarr/Sonarr/wiki) diff --git a/roles/sonarr/molecule/default/molecule.yml b/roles/sonarr/molecule/default/molecule.yml new file mode 100644 index 0000000000..4c0a6d306c --- /dev/null +++ b/roles/sonarr/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + sonarr_enabled: true diff --git a/roles/sonarr/molecule/default/side_effect.yml b/roles/sonarr/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f3aaf10309 --- /dev/null +++ b/roles/sonarr/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + sonarr_enabled: false diff --git a/roles/sonarr/molecule/default/verify.yml b/roles/sonarr/molecule/default/verify.yml new file mode 100644 index 0000000000..15cbf349f7 --- /dev/null +++ b/roles/sonarr/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get sonarr container state + community.docker.docker_container: + name: "{{ sonarr_container_name }}" + register: result + + - name: Check if sonarr containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/sonarr/molecule/default/verify_stopped.yml b/roles/sonarr/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..76a78fcccb --- /dev/null +++ b/roles/sonarr/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove sonarr + community.docker.docker_container: + name: "{{ sonarr_container_name }}" + state: absent + register: result + + - name: Check if sonarr is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/sonarr/tasks/main.yml b/roles/sonarr/tasks/main.yml index 4eeb70faa5..3e429e8b9a 100644 --- a/roles/sonarr/tasks/main.yml +++ b/roles/sonarr/tasks/main.yml @@ -1,32 +1,44 @@ --- -- name: Create Sonarr Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ sonarr_data_directory }}" +- name: Start Sonarr + block: + - name: Create Sonarr Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ sonarr_data_directory }}" -- name: Sonarr - docker_container: - name: sonarr - image: linuxserver/sonarr - pull: true - volumes: - - "{{ sonarr_tv_directory }}:/tv:rw" - - "{{ sonarr_download_directory }}:/downloads:rw" - - "{{ sonarr_data_directory }}:/config:rw" - ports: - - "{{ sonarr_port }}:8989" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ sonarr_user_id }}" - PGID: "{{ sonarr_group_id }}" - restart_policy: unless-stopped - memory: "{{ sonarr_memory }}" - labels: - traefik.enable: "{{ sonarr_available_externally | string }}" - traefik.http.routers.sonarr.rule: "Host(`{{ sonarr_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.sonarr.tls.certresolver: "letsencrypt" - traefik.http.routers.sonarr.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.sonarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.sonarr.loadbalancer.server.port: "8989" + - name: Sonarr + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ sonarr_container_name }}" + image: "{{ sonarr_image_name }}:{{ sonarr_image_version }}" + pull: true + volumes: + - "{{ sonarr_tv_directory }}:/tv:rw" + - "{{ sonarr_download_directory }}:/downloads:rw" + - "{{ sonarr_data_directory }}:/config:rw" + ports: + - "{{ sonarr_port }}:8989" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ sonarr_user_id }}" + PGID: "{{ sonarr_group_id }}" + restart_policy: unless-stopped + memory: "{{ sonarr_memory }}" + labels: + traefik.enable: "{{ sonarr_available_externally | string }}" + traefik.http.routers.sonarr.rule: "Host(`{{ sonarr_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.sonarr.tls.certresolver: "letsencrypt" + traefik.http.routers.sonarr.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.sonarr.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.sonarr.loadbalancer.server.port: "8989" + when: sonarr_enabled is true + +- name: Stop Sonarr + block: + - name: Stop Sonarr + community.docker.docker_container: + name: "{{ sonarr_container_name }}" + state: absent + when: sonarr_enabled is false diff --git a/roles/speedtest-tracker/defaults/main.yml b/roles/speedtest-tracker/defaults/main.yml index 91505ca1e5..d0ad354f38 100644 --- a/roles/speedtest-tracker/defaults/main.yml +++ b/roles/speedtest-tracker/defaults/main.yml @@ -3,7 +3,7 @@ speedtest_tracker_enabled: false speedtest_tracker_available_externally: false # directories -speedtest_data_directory: "{{ docker_home }}/speedtest_tracker/" +speedtest_data_directory: "{{ docker_home }}/speedtest_tracker" # uid / gid speedtest_tracker_user_id: "0" @@ -13,5 +13,10 @@ speedtest_tracker_group_id: "0" speedtest_tracker_port: "8765" speedtest_tracker_hostname: "speedtest-tracker" +# docker +speedtest_container_name: "speedtest-tracker" +speedtest_image_name: "henrywhitaker3/speedtest-tracker" +speedtest_image_version: "latest" + # specs speedtest_tracker_memory: 1g diff --git a/roles/speedtest-tracker/docs/speedtest.md b/roles/speedtest-tracker/docs/speedtest.md new file mode 100644 index 0000000000..e88eb51f0b --- /dev/null +++ b/roles/speedtest-tracker/docs/speedtest.md @@ -0,0 +1,15 @@ +# Speedtest-Tracker + +Homepage: + +Docker Container: + +Continuously track your internet speed + +## Usage + +Set `speedtest_tracker_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_tracker_available_externally: true` in your `inventories//nas.yml` file. + +The Speedtest-Tracker interface can be found at . diff --git a/roles/speedtest-tracker/molecule/default/molecule.yml b/roles/speedtest-tracker/molecule/default/molecule.yml new file mode 100644 index 0000000000..aeaa6821de --- /dev/null +++ b/roles/speedtest-tracker/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + speedtest_enabled: true diff --git a/roles/speedtest-tracker/molecule/default/side_effect.yml b/roles/speedtest-tracker/molecule/default/side_effect.yml new file mode 100644 index 0000000000..0a92588c21 --- /dev/null +++ b/roles/speedtest-tracker/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + speedtest_enabled: false diff --git a/roles/speedtest-tracker/molecule/default/verify.yml b/roles/speedtest-tracker/molecule/default/verify.yml new file mode 100644 index 0000000000..a8faf3ecd5 --- /dev/null +++ b/roles/speedtest-tracker/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get speedtest container state + community.docker.docker_container: + name: "{{ speedtest_container_name }}" + register: result + + - name: Check if speedtest containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/speedtest-tracker/molecule/default/verify_stopped.yml b/roles/speedtest-tracker/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..8118ee41a9 --- /dev/null +++ b/roles/speedtest-tracker/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove speedtest + community.docker.docker_container: + name: "{{ speedtest_container_name }}" + state: absent + register: result + + - name: Check if speedtest is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/speedtest-tracker/tasks/main.yml b/roles/speedtest-tracker/tasks/main.yml index e59920adb7..bd1096a861 100644 --- a/roles/speedtest-tracker/tasks/main.yml +++ b/roles/speedtest-tracker/tasks/main.yml @@ -1,34 +1,48 @@ --- -- name: Speedtest-Tracker Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ speedtest_data_directory }}/config" +- name: Start Speedtest-Tracker + block: + - name: Speedtest-Tracker Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ speedtest_data_directory }}/config" -- name: Remove old Speedtest-Tracker Docker Container - docker_container: - name: speedtest_tracker - state: absent + - name: Remove old Speedtest-Tracker Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ speedtest_container_name }}" + state: absent + tags: molecule-idempotence-notest -- name: Speedtest-Tracker Docker Container - docker_container: - name: speedtest-tracker - image: henrywhitaker3/speedtest-tracker:latest - pull: true - volumes: - - "{{ speedtest_data_directory }}/config:/config:rw" - ports: - - "{{ speedtest_tracker_port }}:80" - env: - OOKLA_EULA_GDPR: "true" - TZ: "{{ ansible_nas_timezone }}" - restart_policy: unless-stopped - memory: "1g" - labels: - traefik.enable: "{{ speedtest_tracker_available_externally | string }}" - traefik.http.routers.speedtest_tracker.rule: "Host(`{{ speedtest_tracker_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.speedtest_tracker.tls.certresolver: "letsencrypt" - traefik.http.routers.speedtest_tracker.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.speedtest_tracker.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.speedtest_tracker.loadbalancer.server.port: "80" + - name: Speedtest-Tracker Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ speedtest_container_name }}" + image: "{{ speedtest_image_name }}:{{ speedtest_image_version }}" + pull: true + volumes: + - "{{ speedtest_data_directory }}/config:/config:rw" + ports: + - "{{ speedtest_tracker_port }}:80" + env: + OOKLA_EULA_GDPR: "true" + TZ: "{{ ansible_nas_timezone }}" + restart_policy: unless-stopped + memory: "1g" + labels: + traefik.enable: "{{ speedtest_tracker_available_externally | string }}" + traefik.http.routers.speedtest_tracker.rule: "Host(`{{ speedtest_tracker_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.speedtest_tracker.tls.certresolver: "letsencrypt" + traefik.http.routers.speedtest_tracker.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.speedtest_tracker.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.speedtest_tracker.loadbalancer.server.port: "80" + when: speedtest_enabled is true + +- name: Stop Speedtest-Tracker + block: + - name: Stop Speedtest-Tracker + community.docker.docker_container: + name: "{{ speedtest_container_name }}" + state: absent + when: speedtest_enabled is false diff --git a/roles/stats/defaults/main.yml b/roles/stats/defaults/main.yml index a0bd81f953..202531ca77 100644 --- a/roles/stats/defaults/main.yml +++ b/roles/stats/defaults/main.yml @@ -21,6 +21,23 @@ stats_prometheus_hostname: "prometheus" stats_grafana_port: "3000" stats_grafana_hostname: "grafana" +# docker: +stats_grafana_container_name: "stats-grafana" +stats_grafana_image_name: "grafana/grafana" +stats_grafana_image_version: "latest" +stats_prometheus_container_name: "stats-prometheus" +stats_prometheus_image_name: "prom/prometheus" +stats_prometheus_image_version: "latest" +stats_telegraf_container_name: "stats-telegraf" +stats_telegraf_image_name: "telegraf" +stats_telegraf_image_version: "latest" +stats_smartctl_container_name: "stats-smartctl" +stats_smartctl_docker_image_name: "matusnovak/prometheus-smartctl" +stats_smartctl_docker_image_version: "latest" +stats_speedtest_container_name: "stats-speedtest" +stats_speedtest_docker_image_name: "miguelndecarvalho/speedtest-exporter" +stats_speedtest_docker_image_version: "latest" + # specs stats_telegraf_memory: 1g stats_prometheus_memory: 1g diff --git a/roles/stats/docs/stats.md b/roles/stats/docs/stats.md new file mode 100644 index 0000000000..256209597f --- /dev/null +++ b/roles/stats/docs/stats.md @@ -0,0 +1,13 @@ +# Stats + +The stats role uses Prometheus, Grafana, Telegraf and a number of metrics exporters to collect and record lots of metrics about your NAS. + +Telegraf also exposes an InfluxDB endpoint for applications that require it. + +## Usage + +Set `stats_enabled: true` in your `inventories//nas.yml` file. If you want to gather metrics on your internet connection, enable `stats_internet_speed_test_enabled` too. + +If you want to access Grafana externally, set `stats_grafana_available_externally: true` in your `inventories//nas.yml` file. If you want to access Promethehus externally, set `stats_prometheus_available_externally: true` in your `inventories//nas.yml` file. + +The Grafana web interface can be found at , Prometheus can be found at diff --git a/roles/stats/molecule/default/molecule.yml b/roles/stats/molecule/default/molecule.yml new file mode 100644 index 0000000000..d253635e29 --- /dev/null +++ b/roles/stats/molecule/default/molecule.yml @@ -0,0 +1,24 @@ +--- +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp:rw + privileged: true + pre_build_image: true +provisioner: + inventory: + group_vars: + all: + stats_enabled: true + stats_prometheus_enabled: true + stats_internet_speed_test_enabled: true + ansible_nas_hostname: "ansible-nas" + stats_grafana_data_directory: "/tmp/grafana/data" + stats_grafana_config_directory: "/tmp/grafana/config" + stats_prometheus_data_directory: "/tmp/prometheus/data" + stats_prometheus_config_directory: "/tmp/prometheus/config" + stats_telegraf_config_directory: "/tmp/telegraf/config" + stats_collection_interval: 15s diff --git a/roles/stats/molecule/default/side_effect.yml b/roles/stats/molecule/default/side_effect.yml new file mode 100644 index 0000000000..887ccf167b --- /dev/null +++ b/roles/stats/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + stats_enabled: false diff --git a/roles/stats/molecule/default/verify.yml b/roles/stats/molecule/default/verify.yml new file mode 100644 index 0000000000..4b08158d05 --- /dev/null +++ b/roles/stats/molecule/default/verify.yml @@ -0,0 +1,47 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Get Grafana container state + docker_container_info: + name: "{{ stats_grafana_container_name }}" + register: result_grafana + + - name: Get Prometheus container state + docker_container_info: + name: "{{ stats_prometheus_container_name }}" + register: result_prometheus + + - name: Get Telegraf container state + docker_container_info: + name: "{{ stats_telegraf_container_name }}" + register: result_telegraf + + - name: Get Smartctl container state + docker_container_info: + name: "{{ stats_smartctl_container_name }}" + register: result_smartctl + + - name: Get Speedtest container state + docker_container_info: + name: "{{ stats_speedtest_container_name }}" + register: result_speedtest + + - name: Check if stats docker containers are running + assert: + that: + - result_grafana.container['State']['Status'] == "running" + - result_grafana.container['State']['Restarting'] == false + - result_prometheus.container['State']['Status'] == "running" + - result_prometheus.container['State']['Restarting'] == false + - result_telegraf.container['State']['Status'] == "running" + - result_telegraf.container['State']['Restarting'] == false + - result_smartctl.container['State']['Status'] == "running" + - result_smartctl.container['State']['Restarting'] == false + - result_speedtest.container['State']['Status'] == "running" + - result_speedtest.container['State']['Restarting'] == false diff --git a/roles/stats/molecule/default/verify_stopped.yml b/roles/stats/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..7e04cfdb10 --- /dev/null +++ b/roles/stats/molecule/default/verify_stopped.yml @@ -0,0 +1,47 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove Grafana + docker_container: + name: "{{ stats_grafana_container_name }}" + state: absent + register: result_grafana + + - name: Try and stop and remove Prometheus + docker_container: + name: "{{ stats_prometheus_container_name }}" + state: absent + register: result_prometheus + + - name: Try and stop and remove Telegraf + docker_container: + name: "{{ stats_telegraf_container_name }}" + state: absent + register: result_telegraf + + - name: Try and stop and remove Smartctl + docker_container: + name: "{{ stats_smartctl_container_name }}" + state: absent + register: result_smartctl + + - name: Try and stop and remove Speedtest + docker_container: + name: "{{ stats_speedtest_container_name }}" + state: absent + register: result_speedtest + + - name: Check if stats containers are stopped + assert: + that: + - not result_grafana.changed + - not result_prometheus.changed + - not result_telegraf.changed + - not result_smartctl.changed + - not result_speedtest.changed diff --git a/roles/stats/tasks/exporters.yml b/roles/stats/tasks/exporters.yml index 79965817e0..9e3a3313ef 100644 --- a/roles/stats/tasks/exporters.yml +++ b/roles/stats/tasks/exporters.yml @@ -1,22 +1,39 @@ --- -- name: Smartctl Exporter Docker Container - docker_container: - name: stats-smartctl - image: matusnovak/prometheus-smartctl:latest - pull: true - privileged: true - ports: - - "{{ stats_prometheus_smartctl_port }}:9902" - restart_policy: unless-stopped - memory: "{{ stats_prometheus_smartctl_memory }}" +- name: Start Exporters + block: + - name: Smartctl Exporter Docker Container + docker_container: + name: "{{ stats_smartctl_container_name }}" + image: "{{ stats_smartctl_docker_image_name }}:{{ stats_smartctl_docker_image_version }}" + container_default_behavior: no_defaults + pull: true + privileged: true + ports: + - "{{ stats_prometheus_smartctl_port }}:9902" + restart_policy: unless-stopped + memory: "{{ stats_prometheus_smartctl_memory }}" -- name: Speedtest Exporter Docker Container - docker_container: - name: stats-speedtest - image: miguelndecarvalho/speedtest-exporter - pull: true - ports: - "{{ stats_speedtest_exporter_port }}:9798" - restart_policy: unless-stopped - memory: "{{ stats_speedtest_exporter_memory }}" - when: stats_internet_speed_test_enabled + - name: Speedtest Exporter Docker Container + docker_container: + name: "{{ stats_speedtest_container_name }}" + image: "{{ stats_speedtest_docker_image_name }}:{{ stats_speedtest_docker_image_version }}" + container_default_behavior: no_defaults + pull: true + ports: + "{{ stats_speedtest_exporter_port }}:9798" + restart_policy: unless-stopped + memory: "{{ stats_speedtest_exporter_memory }}" + when: stats_internet_speed_test_enabled + when: stats_enabled is true + +- name: Stop Exporters + block: + - name: Stop Smartctl Exporter + docker_container: + name: "{{ stats_smartctl_container_name }}" + state: absent + - name: Stop Speedtest Exporter + docker_container: + name: "{{ stats_speedtest_container_name }}" + state: absent + when: stats_enabled is false diff --git a/roles/stats/tasks/grafana.yml b/roles/stats/tasks/grafana.yml index 78aab599f8..7d6b8b67c0 100644 --- a/roles/stats/tasks/grafana.yml +++ b/roles/stats/tasks/grafana.yml @@ -1,52 +1,64 @@ --- -- name: Create Grafana Directories - file: - path: "{{ item }}" - state: directory - owner: "472" - recurse: yes - with_items: - - "{{ stats_grafana_data_directory }}" - - "{{ stats_grafana_config_directory }}" - - "{{ stats_grafana_config_directory }}/dashboards" - - "{{ stats_grafana_config_directory }}/provisioning/datasources" - - "{{ stats_grafana_config_directory }}/provisioning/dashboards" +- name: Start Grafana + block: + - name: Create Grafana Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "472" + recurse: yes + with_items: + - "{{ stats_grafana_data_directory }}" + - "{{ stats_grafana_config_directory }}" + - "{{ stats_grafana_config_directory }}/dashboards" + - "{{ stats_grafana_config_directory }}/provisioning/datasources" + - "{{ stats_grafana_config_directory }}/provisioning/dashboards" -- name: Template Grafana data source - template: - src: datasources/ansible-nas.yml - dest: "{{ stats_grafana_config_directory }}/provisioning/datasources/ansible-nas.yml" + - name: Template Grafana data source + ansible.builtin.template: + src: datasources/ansible-nas.yml + dest: "{{ stats_grafana_config_directory }}/provisioning/datasources/ansible-nas.yml" -- name: Copy Grafana dashboards configuration - copy: - src: dashboards/ansible-nas.yml - dest: "{{ stats_grafana_config_directory }}/provisioning/dashboards/ansible-nas.yml" + - name: Copy Grafana dashboards configuration + ansible.builtin.copy: + src: dashboards/ansible-nas.yml + dest: "{{ stats_grafana_config_directory }}/provisioning/dashboards/ansible-nas.yml" -- name: Copy Grafana Ansible-NAS dashboard - copy: - src: dashboards/ansible-nas-overview.json - dest: "{{ stats_grafana_config_directory }}/dashboards/ansible-nas-overview.json" + - name: Copy Grafana Ansible-NAS dashboard + ansible.builtin.copy: + src: dashboards/ansible-nas-overview.json + dest: "{{ stats_grafana_config_directory }}/dashboards/ansible-nas-overview.json" -- name: Grafana Docker Container - docker_container: - name: grafana - image: grafana/grafana - pull: true - volumes: - - "{{ stats_grafana_data_directory }}:/var/lib/grafana:rw" - - "{{ stats_grafana_config_directory }}/provisioning:/etc/grafana/provisioning:ro" - - "{{ stats_grafana_config_directory }}/dashboards:/etc/dashboards:ro" - ports: - - "{{ stats_grafana_port }}:3000" - env: - GF_PLUGINS_ENABLE_ALPHA: "true" - GF_UNIFIED_ALERTING_ENABLED: "true" - restart_policy: unless-stopped - memory: 1g - labels: - traefik.enable: "{{ stats_grafana_available_externally | string }}" - traefik.http.routers.grafana.rule: "Host(`grafana.{{ ansible_nas_domain }}`) " - traefik.http.routers.grafana.tls.certresolver: "letsencrypt" - traefik.http.routers.grafana.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.grafana.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.grafana.loadbalancer.server.port: "3000" + - name: Grafana Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ stats_grafana_container_name }}" + image: "{{ stats_grafana_image_name }}:{{ stats_grafana_image_version }}" + pull: true + volumes: + - "{{ stats_grafana_data_directory }}:/var/lib/grafana:rw" + - "{{ stats_grafana_config_directory }}/provisioning:/etc/grafana/provisioning:ro" + - "{{ stats_grafana_config_directory }}/dashboards:/etc/dashboards:ro" + ports: + - "{{ stats_grafana_port }}:3000" + env: + GF_PLUGINS_ENABLE_ALPHA: "true" + GF_UNIFIED_ALERTING_ENABLED: "true" + restart_policy: unless-stopped + memory: 1g + labels: + traefik.enable: "{{ stats_grafana_available_externally | string }}" + traefik.http.routers.grafana.rule: "Host(`grafana.{{ ansible_nas_domain }}`) " + traefik.http.routers.grafana.tls.certresolver: "letsencrypt" + traefik.http.routers.grafana.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.grafana.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.grafana.loadbalancer.server.port: "3000" + when: stats_enabled is true + +- name: Stop Grafana + block: + - name: Stop Grafana + community.docker.docker_container: + name: "{{ stats_grafana_container_name }}" + state: absent + when: stats_enabled is false diff --git a/roles/stats/tasks/prometheus.yml b/roles/stats/tasks/prometheus.yml index f4a8c062e9..e3ac25ae9e 100644 --- a/roles/stats/tasks/prometheus.yml +++ b/roles/stats/tasks/prometheus.yml @@ -1,46 +1,58 @@ --- -- name: Create Prometheus Config Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ stats_prometheus_data_directory }}" - - "{{ stats_prometheus_config_directory }}" +- name: Start Prometheus + block: + - name: Create Prometheus Config Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ stats_prometheus_data_directory }}" + - "{{ stats_prometheus_config_directory }}" -- name: Create Prometheus Data Directory - file: - path: "{{ item }}" - state: directory - mode: 0777 - with_items: - - "{{ stats_prometheus_data_directory }}" - - "{{ stats_prometheus_config_directory }}" + - name: Create Prometheus Data Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: 0777 + with_items: + - "{{ stats_prometheus_data_directory }}" + - "{{ stats_prometheus_config_directory }}" -- name: Template Prometheus config - template: - src: prometheus.yml - dest: "{{ stats_prometheus_config_directory }}/prometheus.yml" - register: prometheus_config + - name: Template Prometheus config + ansible.builtin.template: + src: prometheus.yml + dest: "{{ stats_prometheus_config_directory }}/prometheus.yml" + register: prometheus_config -- name: Prometheus Docker Container - docker_container: - name: stats-prometheus - image: prom/prometheus - pull: true - volumes: - - "{{ stats_prometheus_config_directory }}/prometheus.yml:/etc/prometheus/prometheus.yml:ro" - - "{{ stats_prometheus_data_directory }}:/prometheus:rw" - - "/etc/timezone:/etc/timezone:ro" - ports: - - "{{ stats_prometheus_port }}:9090" - restart_policy: unless-stopped - memory: "{{ stats_prometheus_memory }}" - restart: "{{ prometheus_config is changed }}" - command: "--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.retention.size={{ stats_prometheus_retention_size }} --storage.tsdb.retention.time={{ stats_prometheus_retention_time }}" - labels: - traefik.enable: "{{ stats_prometheus_available_externally | string }}" - traefik.http.routers.prometheus.rule: "Host(`{{ stats_prometheus_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.prometheus.tls.certresolver: "letsencrypt" - traefik.http.routers.prometheus.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.prometheus.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.prometheus.loadbalancer.server.port: "9090" + - name: Prometheus Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ stats_prometheus_container_name }}" + image: "{{ stats_prometheus_image_name }}:{{ stats_prometheus_image_version }}" + pull: true + volumes: + - "{{ stats_prometheus_config_directory }}/prometheus.yml:/etc/prometheus/prometheus.yml:ro" + - "{{ stats_prometheus_data_directory }}:/prometheus:rw" + - "/etc/timezone:/etc/timezone:ro" + ports: + - "{{ stats_prometheus_port }}:9090" + restart_policy: unless-stopped + memory: "{{ stats_prometheus_memory }}" + restart: "{{ prometheus_config is changed }}" + command: "--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.retention.size={{ stats_prometheus_retention_size }} --storage.tsdb.retention.time={{ stats_prometheus_retention_time }}" + labels: + traefik.enable: "{{ stats_prometheus_available_externally | string }}" + traefik.http.routers.prometheus.rule: "Host(`{{ stats_prometheus_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.prometheus.tls.certresolver: "letsencrypt" + traefik.http.routers.prometheus.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.prometheus.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.prometheus.loadbalancer.server.port: "9090" + when: stats_enabled is true + +- name: Stop Prometheus + block: + - name: Stop Prometheus + community.docker.docker_container: + name: "{{ stats_prometheus_container_name }}" + state: absent + when: stats_enabled is false diff --git a/roles/stats/tasks/telegraf.yml b/roles/stats/tasks/telegraf.yml index 0f08795777..7d0bc71610 100644 --- a/roles/stats/tasks/telegraf.yml +++ b/roles/stats/tasks/telegraf.yml @@ -1,49 +1,61 @@ --- -- name: Create Telegraf Directory - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ stats_telegraf_config_directory }}" +- name: Start Telegraf + block: + - name: Create Telegraf Directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ stats_telegraf_config_directory }}" -- name: Template telegraf.conf - template: - src: telegraf.conf.j2 - dest: "{{ stats_telegraf_config_directory }}/telegraf.conf" - register: telegraf_config + - name: Template telegraf.conf + ansible.builtin.template: + src: telegraf.conf.j2 + dest: "{{ stats_telegraf_config_directory }}/telegraf.conf" + register: telegraf_config -- name: Get Docker daemon uid - command: stat -c '%g' /var/run/docker.sock - register: docker_uid - changed_when: false + - name: Get Docker daemon uid + ansible.builtin.command: stat -c '%g' /var/run/docker.sock + register: docker_uid + changed_when: false -- name: Telegraf Docker Container - docker_container: - name: stats-telegraf - image: telegraf - pull: true - privileged: true - ipc_mode: host - ports: - - "{{ stats_telegraf_influxdb_port }}:8086" - - "{{ stats_telegraf_port }}:9273" - user: "telegraf:{{ docker_uid.stdout }}" - volumes: - - "{{ stats_telegraf_config_directory }}/telegraf.conf:/etc/telegraf/telegraf.conf:ro" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - - "/:/hostfs:ro" - - "/etc:/hostfs/etc:ro" - - "/proc:/hostfs/proc:ro" - - "/sys:/hostfs/sys:ro" - - "/var:/hostfs/var:ro" - - "/run:/hostfs/run:ro" - env: - HOST_ETC: "/hostfs/etc" - HOST_PROC: "/hostfs/proc" - HOST_SYS: "/hostfs/sys" - HOST_VAR: "/hostfs/var" - HOST_RUN: "/hostfs/run" - HOST_MOUNT_PREFIX: "/hostfs" - restart_policy: unless-stopped - memory: 1g - restart: "{{ telegraf_config is changed }}" + - name: Telegraf Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ stats_telegraf_container_name }}" + image: "{{ stats_telegraf_image_name }}:{{ stats_telegraf_image_version }}" + pull: true + privileged: true + ipc_mode: host + ports: + - "{{ stats_telegraf_influxdb_port }}:8086" + - "{{ stats_telegraf_port }}:9273" + user: "telegraf:{{ docker_uid.stdout }}" + volumes: + - "{{ stats_telegraf_config_directory }}:/etc/telegraf/:ro" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + - "/:/hostfs:ro" + - "/etc:/hostfs/etc:ro" + - "/proc:/hostfs/proc:ro" + - "/sys:/hostfs/sys:ro" + - "/var:/hostfs/var:ro" + - "/run:/hostfs/run:ro" + env: + HOST_ETC: "/hostfs/etc" + HOST_PROC: "/hostfs/proc" + HOST_SYS: "/hostfs/sys" + HOST_VAR: "/hostfs/var" + HOST_RUN: "/hostfs/run" + HOST_MOUNT_PREFIX: "/hostfs" + restart_policy: unless-stopped + memory: 1g + restart: "{{ telegraf_config is changed }}" + when: stats_enabled is true + +- name: Stop Telegraf + block: + - name: Stop stats_telegraf + community.docker.docker_container: + name: "{{ stats_telegraf_container_name }}" + state: absent + when: stats_enabled is false diff --git a/roles/syncthing/defaults/main.yml b/roles/syncthing/defaults/main.yml index 1d139a0c14..de977b96b7 100644 --- a/roles/syncthing/defaults/main.yml +++ b/roles/syncthing/defaults/main.yml @@ -19,5 +19,10 @@ syncthing_group_id: "0" syncthing_port: 8384 syncthing_hostname: syncthing +# docker +syncthing_container_name: "syncthing" +syncthing_image_name: "syncthing/syncthing" +syncthing_image_version: "latest" + # specs syncthing_memory: 1g diff --git a/roles/syncthing/docs/syncthing.md b/roles/syncthing/docs/syncthing.md new file mode 100644 index 0000000000..27d0ad9e73 --- /dev/null +++ b/roles/syncthing/docs/syncthing.md @@ -0,0 +1,27 @@ +# Syncthing + +Homepage: + +Github: + +Docker: + +Syncthing is a continuous file synchronization program. It synchronizes files +between two or more computers. It strives to fulfill the goals below in summary. +Syncthing should be: + +1. Safe From Data Loss +2. Secure Against Attackers +3. Easy to Use +4. Automatic +5. Universally Available +6. For Individuals +7. For eveything else see the goals document + +## Usage + +Set `syncthing_enabled: true` in your `\inventories\[my inventory]\group_vars\nas.yml` file. + +## Specific Configuration + +Open the web interface at :8384 to configure. diff --git a/roles/syncthing/molecule/default/molecule.yml b/roles/syncthing/molecule/default/molecule.yml new file mode 100644 index 0000000000..488a27b00d --- /dev/null +++ b/roles/syncthing/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + syncthing_enabled: true diff --git a/roles/syncthing/molecule/default/side_effect.yml b/roles/syncthing/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f34fce7e43 --- /dev/null +++ b/roles/syncthing/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + syncthing_enabled: false diff --git a/roles/syncthing/molecule/default/verify.yml b/roles/syncthing/molecule/default/verify.yml new file mode 100644 index 0000000000..09439f5dcb --- /dev/null +++ b/roles/syncthing/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get syncthing container state + community.docker.docker_container: + name: "{{ syncthing_container_name }}" + register: result + + - name: Check if syncthing containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/syncthing/molecule/default/verify_stopped.yml b/roles/syncthing/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e751187399 --- /dev/null +++ b/roles/syncthing/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove syncthing + community.docker.docker_container: + name: "{{ syncthing_container_name }}" + state: absent + register: result + + - name: Check if syncthing is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/syncthing/tasks/main.yml b/roles/syncthing/tasks/main.yml index da7f69fa3b..b3ce9c6c85 100644 --- a/roles/syncthing/tasks/main.yml +++ b/roles/syncthing/tasks/main.yml @@ -1,30 +1,42 @@ --- -- name: Create Syncthing Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ syncthing_data_directory }}" +- name: Start Syncthing + block: + - name: Create Syncthing Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ syncthing_data_directory }}" -- name: Syncthing Docker Container - docker_container: - name: syncthing - image: syncthing/syncthing:latest - pull: true - ports: - - "{{ syncthing_port }}:8384" - - "22000:22000/tcp" - - "22000:22000/udp" - env: - PUID: "{{ syncthing_user_id }}" - PGID: "{{ syncthing_group_id }}" - volumes: "{{ syncthing_volumes }}" - restart_policy: unless-stopped - memory: "{{ syncthing_memory }}" - labels: - traefik.enable: "{{ syncthing_available_externally | string }}" - traefik.http.routers.syncthing.rule: "Host(`{{ syncthing_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.syncthing.tls.certresolver: "letsencrypt" - traefik.http.routers.syncthing.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.syncthing.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.syncthing.loadbalancer.server.port: "8384" + - name: Syncthing Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ syncthing_container_name }}" + image: "{{ syncthing_image_name }}:{{ syncthing_image_version }}" + pull: true + ports: + - "{{ syncthing_port }}:8384" + - "22000:22000/tcp" + - "22000:22000/udp" + env: + PUID: "{{ syncthing_user_id }}" + PGID: "{{ syncthing_group_id }}" + volumes: "{{ syncthing_volumes }}" + restart_policy: unless-stopped + memory: "{{ syncthing_memory }}" + labels: + traefik.enable: "{{ syncthing_available_externally | string }}" + traefik.http.routers.syncthing.rule: "Host(`{{ syncthing_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.syncthing.tls.certresolver: "letsencrypt" + traefik.http.routers.syncthing.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.syncthing.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.syncthing.loadbalancer.server.port: "8384" + when: syncthing_enabled is true + +- name: Stop Syncthing + block: + - name: Stop Syncthing + community.docker.docker_container: + name: "{{ syncthing_container_name }}" + state: absent + when: syncthing_enabled is false diff --git a/roles/tautulli/defaults/main.yml b/roles/tautulli/defaults/main.yml index b908d1be5e..35ab1ac07a 100644 --- a/roles/tautulli/defaults/main.yml +++ b/roles/tautulli/defaults/main.yml @@ -13,5 +13,10 @@ tautulli_group_id: "0" tautulli_hostname: "tautulli" tautulli_port: "8185" +# docker +tautulli_container_name: "tautulli" +tautulli_image_name: "linuxserver/tautulli" +tautulli_image_version: "latest" + # specs tautulli_memory: "1g" diff --git a/roles/tautulli/docs/tautulli.md b/roles/tautulli/docs/tautulli.md new file mode 100644 index 0000000000..3f1ce59f21 --- /dev/null +++ b/roles/tautulli/docs/tautulli.md @@ -0,0 +1,11 @@ +# Tautulli + +Homepage: + +Tautulli allows you to monitor your Plex Media Server. + +## Usage + +Set `tautulli_enabled: true` in your `inventories//nas.yml` file. + +The Tautulli web interface can be found at . diff --git a/roles/tautulli/molecule/default/molecule.yml b/roles/tautulli/molecule/default/molecule.yml new file mode 100644 index 0000000000..00030527cb --- /dev/null +++ b/roles/tautulli/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + tautulli_enabled: true + plex_logs: "/tmp/log" \ No newline at end of file diff --git a/roles/tautulli/molecule/default/side_effect.yml b/roles/tautulli/molecule/default/side_effect.yml new file mode 100644 index 0000000000..5d26b19a5f --- /dev/null +++ b/roles/tautulli/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + tautulli_enabled: false diff --git a/roles/tautulli/molecule/default/verify.yml b/roles/tautulli/molecule/default/verify.yml new file mode 100644 index 0000000000..7fe57d0556 --- /dev/null +++ b/roles/tautulli/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get tautulli container state + community.docker.docker_container: + name: "{{ tautulli_container_name }}" + register: result + + - name: Check if tautulli containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/tautulli/molecule/default/verify_stopped.yml b/roles/tautulli/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..c47aaab911 --- /dev/null +++ b/roles/tautulli/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove tautulli + community.docker.docker_container: + name: "{{ tautulli_container_name }}" + state: absent + register: result + + - name: Check if tautulli is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/tautulli/tasks/main.yml b/roles/tautulli/tasks/main.yml index ae986bcff7..66e293f0f1 100644 --- a/roles/tautulli/tasks/main.yml +++ b/roles/tautulli/tasks/main.yml @@ -1,33 +1,45 @@ --- -- name: Create Tautulli Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ tautulli_config_directory }}" - - "{{ plex_logs }}" +- name: Start Tautulli + block: + - name: Create Tautulli Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ tautulli_config_directory }}" + - "{{ plex_logs }}" -- name: Tautulli Docker Container - docker_container: - name: tautulli - image: linuxserver/tautulli - pull: true - volumes: - - "{{ tautulli_config_directory }}:/config:rw" - - "{{ plex_logs }}:/logs:ro" - ports: - - "{{ tautulli_port }}:8181" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ tautulli_user_id }}" - PGID: "{{ tautulli_group_id }}" - restart_policy: unless-stopped - memory: "{{ tautulli_memory }}" - labels: - traefik.enable: "{{ tautulli_available_externally | string }}" - traefik.http.routers.tautulli.rule: "Host(`{{ tautulli_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.tautulli.tls.certresolver: "letsencrypt" - traefik.http.routers.tautulli.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.tautulli.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.tautulli.loadbalancer.server.port: "8181" + - name: Tautulli Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ tautulli_container_name }}" + image: "{{ tautulli_image_name }}:{{ tautulli_image_version }}" + pull: true + volumes: + - "{{ tautulli_config_directory }}:/config:rw" + - "{{ plex_logs }}:/logs:ro" + ports: + - "{{ tautulli_port }}:8181" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ tautulli_user_id }}" + PGID: "{{ tautulli_group_id }}" + restart_policy: unless-stopped + memory: "{{ tautulli_memory }}" + labels: + traefik.enable: "{{ tautulli_available_externally | string }}" + traefik.http.routers.tautulli.rule: "Host(`{{ tautulli_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.tautulli.tls.certresolver: "letsencrypt" + traefik.http.routers.tautulli.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.tautulli.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.tautulli.loadbalancer.server.port: "8181" + when: tautulli_enabled is true + +- name: Stop Tautulli + block: + - name: Stop Tautulli + community.docker.docker_container: + name: "{{ tautulli_container_name }}" + state: absent + when: tautulli_enabled is false diff --git a/roles/thelounge/defaults/main.yml b/roles/thelounge/defaults/main.yml index 96b91dbf36..50b74fe75a 100644 --- a/roles/thelounge/defaults/main.yml +++ b/roles/thelounge/defaults/main.yml @@ -12,3 +12,6 @@ thelounge_hostname: thelounge # Container thelounge_memory: 1g +thelounge_container_name: "thelounge" +thelounge_image_name: "thelounge/thelounge" +thelounge_image_version: "latest" diff --git a/roles/thelounge/docs/thelounge.md b/roles/thelounge/docs/thelounge.md new file mode 100644 index 0000000000..2dadc2120b --- /dev/null +++ b/roles/thelounge/docs/thelounge.md @@ -0,0 +1,16 @@ +# The Lounge" + + +Homepage: + +The Lounge is a self-hosted web IRC client. + +## Usage + +Set `thelounge_enabled: true` in your `inventories//nas.yml` file. + +The Lounge web interface can be found at . + +## Specific Configuration + +The default username and password is `admin`. Change this once you've logged in! diff --git a/roles/thelounge/molecule/default/molecule.yml b/roles/thelounge/molecule/default/molecule.yml new file mode 100644 index 0000000000..417212a19a --- /dev/null +++ b/roles/thelounge/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + thelounge_enabled: true diff --git a/roles/thelounge/molecule/default/side_effect.yml b/roles/thelounge/molecule/default/side_effect.yml new file mode 100644 index 0000000000..7aa48bcc4c --- /dev/null +++ b/roles/thelounge/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + thelounge_enabled: false diff --git a/roles/thelounge/molecule/default/verify.yml b/roles/thelounge/molecule/default/verify.yml new file mode 100644 index 0000000000..ad0b83cc5a --- /dev/null +++ b/roles/thelounge/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get thelounge container state + community.docker.docker_container: + name: "{{ thelounge_container_name }}" + register: result + + - name: Check if thelounge containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/thelounge/molecule/default/verify_stopped.yml b/roles/thelounge/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..8dbdaa1d49 --- /dev/null +++ b/roles/thelounge/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove thelounge + community.docker.docker_container: + name: "{{ thelounge_container_name }}" + state: absent + register: result + + - name: Check if thelounge is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/thelounge/tasks/main.yml b/roles/thelounge/tasks/main.yml index b7cd3d052f..3f32a4b9ad 100644 --- a/roles/thelounge/tasks/main.yml +++ b/roles/thelounge/tasks/main.yml @@ -1,35 +1,47 @@ --- -- name: The Lounge Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ thelounge_data_directory }}" - - "{{ thelounge_data_directory }}/users" +- name: Start The Lounge + block: + - name: The Lounge Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ thelounge_data_directory }}" + - "{{ thelounge_data_directory }}/users" -- name: Set up admin user - copy: - src: admin.json - dest: "{{ thelounge_data_directory }}/users/admin.json" - mode: 0777 + - name: Set up admin user + ansible.builtin.copy: + src: admin.json + dest: "{{ thelounge_data_directory }}/users/admin.json" + mode: 0777 -- name: The Lounge Docker Container - docker_container: - name: thelounge - image: thelounge/thelounge:latest - pull: true - ports: - - "{{ thelounge_port_one }}:9001" - - "{{ thelounge_port_two }}:9000" - volumes: - - "{{ thelounge_data_directory }}:/var/opt/thelounge" - - "/var/run/dbus:/var/run/dbus" - restart_policy: unless-stopped - memory: "{{ thelounge_memory }}" - labels: - traefik.enable: "{{ thelounge_available_externally | string }}" - traefik.http.routers.thelounge.rule: "Host(`{{ thelounge_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.thelounge.tls.certresolver: "letsencrypt" - traefik.http.routers.thelounge.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.thelounge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.thelounge.loadbalancer.server.port: "9000" + - name: The Lounge Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ thelounge_container_name }}" + image: "{{ thelounge_image_name }}:{{ thelounge_image_version }}" + pull: true + ports: + - "{{ thelounge_port_one }}:9001" + - "{{ thelounge_port_two }}:9000" + volumes: + - "{{ thelounge_data_directory }}:/var/opt/thelounge" + - "/var/run/dbus:/var/run/dbus" + restart_policy: unless-stopped + memory: "{{ thelounge_memory }}" + labels: + traefik.enable: "{{ thelounge_available_externally | string }}" + traefik.http.routers.thelounge.rule: "Host(`{{ thelounge_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.thelounge.tls.certresolver: "letsencrypt" + traefik.http.routers.thelounge.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.thelounge.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.thelounge.loadbalancer.server.port: "9000" + when: thelounge_enabled is true + +- name: Stop The Lounge + block: + - name: Stop The Lounge + community.docker.docker_container: + name: "{{ thelounge_container_name }}" + state: absent + when: thelounge_enabled is false diff --git a/roles/tiddlywiki/defaults/main.yml b/roles/tiddlywiki/defaults/main.yml index 9b4b69f175..c5ef746817 100644 --- a/roles/tiddlywiki/defaults/main.yml +++ b/roles/tiddlywiki/defaults/main.yml @@ -21,3 +21,6 @@ tiddlywiki_hostname: tiddlywiki # Container tiddlywiki_memory: 512MB +tiddlywiki_container_name: "tiddlywiki" +tiddlywiki_image_name: "wmudge/tiddlywiki" +tiddlywiki_image_version: "latest" diff --git a/roles/tiddlywiki/docs/tiddlywiki.md b/roles/tiddlywiki/docs/tiddlywiki.md new file mode 100644 index 0000000000..cb161d5d84 --- /dev/null +++ b/roles/tiddlywiki/docs/tiddlywiki.md @@ -0,0 +1,34 @@ +# TiddlyWiki + +Homepage: + +TiddlyWiki is a unique non-linear notebook for capturing, organizing, and sharing complex information. Use it to keep your to-do list, to plan an essay or novel, or to organise your wedding. Record every thought that crosses your brain, or build a flexible and responsive website. Unlike conventional online services, TiddlyWiki lets you choose where to keep your data, guaranteeing that in the decades to come you will still be able to use the notes you take today. + +## Usage + +Set `tiddlywiki_enabled: true` in your `inventories//nas.yml` file. + +If you want to access TiddlyWiki externally, set `tiddlywiki_available_externally: true` in your `inventories//nas.yml` file. + +The TiddlyWiki web interface can be found at . + +## Specific Configuration + +The TiddlyWiki role has several configuration parameters. All parameters are optional. + +### Data and Networking + +| Parameter | Description | +|---------------------------|-------------------------------| +| tiddlywiki_data_directory | Host location to store data | +| tiddlywiki_port | Host port for internal access | +| tiddlywiki_hostname | Subdomain for external access | + +### Server Configuration + +| Parameter | Description | +|------------------------|--------------------------| +| tiddlywiki_username | Basic Auth username | +| tiddlywiki_password | Basic Auth password | +| tiddlywiki_node_memory | NodeJS memory allocation | +| tiddlywiki_debug_level | Service debugging | diff --git a/roles/tiddlywiki/molecule/default/molecule.yml b/roles/tiddlywiki/molecule/default/molecule.yml new file mode 100644 index 0000000000..42fbe1c535 --- /dev/null +++ b/roles/tiddlywiki/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + tiddlywiki_enabled: true diff --git a/roles/tiddlywiki/molecule/default/side_effect.yml b/roles/tiddlywiki/molecule/default/side_effect.yml new file mode 100644 index 0000000000..78c74abf8f --- /dev/null +++ b/roles/tiddlywiki/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + tiddlywiki_enabled: false diff --git a/roles/tiddlywiki/molecule/default/verify.yml b/roles/tiddlywiki/molecule/default/verify.yml new file mode 100644 index 0000000000..cefc8177e6 --- /dev/null +++ b/roles/tiddlywiki/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get tiddlywiki container state + community.docker.docker_container: + name: "{{ tiddlywiki_container_name }}" + register: result + + - name: Check if tiddlywiki containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/tiddlywiki/molecule/default/verify_stopped.yml b/roles/tiddlywiki/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..debf551c44 --- /dev/null +++ b/roles/tiddlywiki/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove tiddlywiki + community.docker.docker_container: + name: "{{ tiddlywiki_container_name }}" + state: absent + register: result + + - name: Check if tiddlywiki is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/tiddlywiki/tasks/main.yml b/roles/tiddlywiki/tasks/main.yml index 220d1f224f..4be056a57f 100644 --- a/roles/tiddlywiki/tasks/main.yml +++ b/roles/tiddlywiki/tasks/main.yml @@ -1,29 +1,41 @@ --- -- name: Create Tiddlywiki Directory - file: - path: "{{ tiddlywiki_data_directory }}" - state: directory +- name: Start Tiddlywiki + block: + - name: Create Tiddlywiki Directory + ansible.builtin.file: + path: "{{ tiddlywiki_data_directory }}" + state: directory -- name: Create Tiddlywiki Container - docker_container: - name: tiddlywiki - image: wmudge/tiddlywiki:latest - ports: - - "{{ tiddlywiki_port }}:8080" - volumes: - - "{{ tiddlywiki_data_directory }}:/var/lib/tiddlywiki" - env: - NODE_MEM: "{{ tiddlywiki_node_memory | default(omit) }}" - USERNAME: "{{ tiddlywiki_username | default(omit) }}" - PASSWORD: "{{ tiddlywiki_password | default(omit) }}" - DEBUG: "{{ tiddlywiki_debug_level | default(omit) }}" - pull: true - restart_policy: unless-stopped - memory: "{{ tiddlywiki_memory }}" - labels: - traefik.enable: "{{ tiddlywiki_available_externally | string }}" - traefik.http.routers.tiddlywiki.rule: "Host(`{{ tiddlywiki_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.tiddlywiki.tls.certresolver: "letsencrypt" - traefik.http.routers.tiddlywiki.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.tiddlywiki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.tiddlywiki.loadbalancer.server.port: "8080" + - name: Create Tiddlywiki Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ tiddlywiki_container_name }}" + image: "{{ tiddlywiki_image_name }}:{{ tiddlywiki_image_version }}" + ports: + - "{{ tiddlywiki_port }}:8080" + volumes: + - "{{ tiddlywiki_data_directory }}:/var/lib/tiddlywiki" + env: + NODE_MEM: "{{ tiddlywiki_node_memory | default(omit) }}" + USERNAME: "{{ tiddlywiki_username | default(omit) }}" + PASSWORD: "{{ tiddlywiki_password | default(omit) }}" + DEBUG: "{{ tiddlywiki_debug_level | default(omit) }}" + pull: true + restart_policy: unless-stopped + memory: "{{ tiddlywiki_memory }}" + labels: + traefik.enable: "{{ tiddlywiki_available_externally | string }}" + traefik.http.routers.tiddlywiki.rule: "Host(`{{ tiddlywiki_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.tiddlywiki.tls.certresolver: "letsencrypt" + traefik.http.routers.tiddlywiki.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.tiddlywiki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.tiddlywiki.loadbalancer.server.port: "8080" + when: tiddlywiki_enabled is true + +- name: Stop Tiddlywiki + block: + - name: Stop Tiddlywiki + community.docker.docker_container: + name: "{{ tiddlywiki_container_name }}" + state: absent + when: tiddlywiki_enabled is false diff --git a/roles/timemachine/defaults/main.yml b/roles/timemachine/defaults/main.yml index 9c26bf4c2c..87abd6fb95 100644 --- a/roles/timemachine/defaults/main.yml +++ b/roles/timemachine/defaults/main.yml @@ -14,3 +14,6 @@ timemachine_port: "10445" # Container timemachine_memory: 1g +timemachine_container_name: "timemachine" +timemachine_image_name: "awlnx/samba-timemachine" +timemachine_image_version: "latest" diff --git a/roles/timemachine/docs/timemachine.md b/roles/timemachine/docs/timemachine.md new file mode 100644 index 0000000000..468ca43ff5 --- /dev/null +++ b/roles/timemachine/docs/timemachine.md @@ -0,0 +1,29 @@ +# Time Machine + + +Apple docs: + +Docker image: + +Time Machine is an application that allows you to backup files from your Mac. + +Older versions of Time Machine relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. + +## Usage + +Set `timemachine_enabled: true` in your `inventories//nas.yml` file. + +Enabling Time Machine will result in the installation of Avahi on the NAS system (if it is not already installed) and a Time Machine service configuration file for Avahi will be added to the system (at `/etc/avahi/services/timemachine.service`) to allow for Time Machine discovery by Macs on the local network. Avahi runs on the system, rather than in a container, as the same Avahi instance can be used to announce any number of services. + +The Samba server included in the Time Machine docker container logs to `STDOUT` and is compatible with [Docker's built-in logging infrastructure.](https://docs.docker.com/config/containers/logging/) + +## Specific Configuration + +- `timemachine_data_directory`: The absolute path on Ansible NAS where the backup files will be stored +- `timemachine_volume_size_limit`: The maximum amount of space Time Machine can use for the backups in units of MiB. Set it to 0 for no limit. +- `timemachine_share_name`: The name of the share as it will appear in the Time Machine application. Default is 'Data' +- `timemachine_password`: The password used to access the share. Default is 'timemachine' + +## Upgrading from AFP to SMB-based Time Machine + +Older versions of Time Machine included in Ansible-NAS relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS with the AFP-based Time Machine, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. diff --git a/roles/timemachine/molecule/default/molecule.yml b/roles/timemachine/molecule/default/molecule.yml new file mode 100644 index 0000000000..79d6365554 --- /dev/null +++ b/roles/timemachine/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + timemachine_enabled: true diff --git a/roles/timemachine/molecule/default/side_effect.yml b/roles/timemachine/molecule/default/side_effect.yml new file mode 100644 index 0000000000..d98cda620d --- /dev/null +++ b/roles/timemachine/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + timemachine_enabled: false diff --git a/roles/timemachine/molecule/default/verify.yml b/roles/timemachine/molecule/default/verify.yml new file mode 100644 index 0000000000..ff6c026502 --- /dev/null +++ b/roles/timemachine/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get timemachine container state + community.docker.docker_container: + name: "{{ timemachine_container_name }}" + register: result + + - name: Check if timemachine containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/timemachine/molecule/default/verify_stopped.yml b/roles/timemachine/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..e916db5fe7 --- /dev/null +++ b/roles/timemachine/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove timemachine + community.docker.docker_container: + name: "{{ timemachine_container_name }}" + state: absent + register: result + + - name: Check if timemachine is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/timemachine/tasks/main.yml b/roles/timemachine/tasks/main.yml index 284ceb62d6..85f735cd0a 100644 --- a/roles/timemachine/tasks/main.yml +++ b/roles/timemachine/tasks/main.yml @@ -1,41 +1,53 @@ --- -- name: Time Machine Directories - file: - path: "{{ timemachine_data_directory }}" - state: directory +- name: Start Time Machine + block: + - name: Time Machine Directories + ansible.builtin.file: + path: "{{ timemachine_data_directory }}" + state: directory -- name: Time Machine Docker Container - docker_container: - name: timemachine - image: awlnx/samba-timemachine:latest - pull: true - ports: - - "{{ timemachine_port }}:445" - env: - TMSIZE: "{{ timemachine_volume_size_limit }}" - PASS: "{{ timemachine_password }}" - SHARENAME: "{{ timemachine_share_name }}" - volumes: - - "{{ timemachine_data_directory }}/data:/backups" - ulimits: - - "nofile:1048576:1048576" - network_mode: bridge - restart_policy: unless-stopped - memory: "{{ timemachine_memory }}" + - name: Time Machine Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ timemachine_container_name }}" + image: "{{ timemachine_image_name }}:{{ timemachine_image_version }}" + pull: true + ports: + - "{{ timemachine_port }}:445" + env: + TMSIZE: "{{ timemachine_volume_size_limit }}" + PASS: "{{ timemachine_password }}" + SHARENAME: "{{ timemachine_share_name }}" + volumes: + - "{{ timemachine_data_directory }}/data:/backups" + ulimits: + - "nofile:1048576:1048576" + network_mode: bridge + restart_policy: unless-stopped + memory: "{{ timemachine_memory }}" -- name: Install avahi - apt: - name: "avahi-daemon" - state: present - register: result - until: result is succeeded + - name: Install avahi + ansible.builtin.apt: + name: "avahi-daemon" + state: present + register: result + until: result is succeeded -- name: Setup timemachine service for avahi - template: - src: timemachine.service - dest: "/etc/avahi/services/timemachine.service" + - name: Setup timemachine service for avahi + ansible.builtin.template: + src: timemachine.service + dest: "/etc/avahi/services/timemachine.service" -- name: Reload avahi configuration - service: - name: avahi-daemon - state: reloaded + - name: Reload avahi configuration + ansible.builtin.service: + name: avahi-daemon + state: reloaded + when: timemachine_enabled is true + +- name: Stop Time Machine + block: + - name: Stop Time Machine + community.docker.docker_container: + name: "{{ timemachine_container_name }}" + state: absent + when: timemachine_enabled is false diff --git a/roles/traefik/defaults/main.yml b/roles/traefik/defaults/main.yml index a85fd4aaa1..63561dd801 100644 --- a/roles/traefik/defaults/main.yml +++ b/roles/traefik/defaults/main.yml @@ -14,7 +14,9 @@ traefik_port_http: "80" traefik_port_https: "443" traefik_port_ui: "8083" -traefik_docker_image: traefik:latest +traefik_container_name: "traefik" +traefik_image_name: "traefik" +traefik_image_version: "latest" traefik_log_level: "INFO" # find the relevant name and environment variables for your DNS provider at https://go-acme.github.io/lego/dns/ diff --git a/roles/traefik/docs/traefik.md b/roles/traefik/docs/traefik.md new file mode 100644 index 0000000000..8b552f2836 --- /dev/null +++ b/roles/traefik/docs/traefik.md @@ -0,0 +1,20 @@ +# Traefik + +Homepage: + +Traefik is a reverse proxy used to provide external access to your Ansible-NAS box. Additionally, Traefik will automatically request and renew SSL certificates for you. + +You can configure which applications are available externally by enabling the `_available_externally` setting +for each application in the Advanced Settings section of your `all.yml`. + +See [External Access](../../getting-started/external-access.md) for more info. + +## Usage + +Set `traefik_enabled: true` in your `inventories//nas.yml` file. + +Traefik's web interface can be found at . + +## Specific Configuration + +You'll need to map port 80 and 443 from your router to your Ansible-NAS box. A quick search should reveal instruction for your model of router. diff --git a/roles/traefik/molecule/default/molecule.yml b/roles/traefik/molecule/default/molecule.yml new file mode 100644 index 0000000000..c083c5c267 --- /dev/null +++ b/roles/traefik/molecule/default/molecule.yml @@ -0,0 +1,18 @@ +--- +provisioner: + inventory: + group_vars: + all: + traefik_enabled: true + ansible_nas_email: me@example.com + traefik_data_directory: "/tmp/traefik" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + - /dev/null:/dev/null + cgroupns_mode: host + privileged: true + pre_build_image: true diff --git a/roles/traefik/molecule/default/side_effect.yml b/roles/traefik/molecule/default/side_effect.yml new file mode 100644 index 0000000000..709ed0ebdd --- /dev/null +++ b/roles/traefik/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + traefik_enabled: false diff --git a/roles/traefik/molecule/default/verify.yml b/roles/traefik/molecule/default/verify.yml new file mode 100644 index 0000000000..94510931c4 --- /dev/null +++ b/roles/traefik/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get traefik container state + community.docker.docker_container: + name: "{{ traefik_container_name }}" + register: result + + - name: Check if traefik containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/traefik/molecule/default/verify_stopped.yml b/roles/traefik/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..ab92055078 --- /dev/null +++ b/roles/traefik/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove traefik + community.docker.docker_container: + name: "{{ traefik_container_name }}" + state: absent + register: result + + - name: Check if traefik is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/traefik/tasks/main.yml b/roles/traefik/tasks/main.yml index 451112e4b7..bc06b97a33 100644 --- a/roles/traefik/tasks/main.yml +++ b/roles/traefik/tasks/main.yml @@ -1,29 +1,41 @@ --- -- name: Create Traefik Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ traefik_data_directory }}" - - "{{ traefik_data_directory }}/letsencrypt" +- name: Start Traefik + block: + - name: Create Traefik Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ traefik_data_directory }}" + - "{{ traefik_data_directory }}/letsencrypt" -- name: Template Traefik config.toml - template: - src: traefik.toml - dest: "{{ traefik_data_directory }}/traefik.toml" - register: template_config + - name: Template Traefik config.toml + ansible.builtin.template: + src: traefik.toml + dest: "{{ traefik_data_directory }}/traefik.toml" + register: template_config -- name: Traefik Docker Container - docker_container: - name: traefik - image: "{{ traefik_docker_image }}" - pull: true - network_mode: host - volumes: - - "{{ traefik_data_directory }}/traefik.toml:/etc/traefik/traefik.toml:ro" - - "{{ traefik_data_directory }}/letsencrypt:/letsencrypt:rw" - - "/var/run/docker.sock:/var/run/docker.sock:ro" - env: "{{ traefik_environment_variables }}" - restart_policy: unless-stopped - memory: "{{ traefik_memory }}" - recreate: "{{ template_config is changed }}" + - name: Traefik Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ traefik_container_name }}" + image: "{{ traefik_image_name }}:{{ traefik_image_version }}" + pull: true + network_mode: host + volumes: + - "{{ traefik_data_directory }}/traefik.toml:/etc/traefik/traefik.toml:ro" + - "{{ traefik_data_directory }}/letsencrypt:/letsencrypt:rw" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + env: "{{ traefik_environment_variables }}" + restart_policy: unless-stopped + memory: "{{ traefik_memory }}" + recreate: "{{ template_config is changed }}" + when: traefik_enabled is true + +- name: Stop Traefik + block: + - name: Stop Traefik + community.docker.docker_container: + name: "{{ traefik_container_name }}" + state: absent + when: traefik_enabled is false diff --git a/roles/transmission-with-openvpn/defaults/main.yml b/roles/transmission-with-openvpn/defaults/main.yml index 80f3335130..574f3ce24c 100644 --- a/roles/transmission-with-openvpn/defaults/main.yml +++ b/roles/transmission-with-openvpn/defaults/main.yml @@ -22,6 +22,10 @@ transmission_openvpn_external_port: "51415" transmission_openvpn_proxy_port: "3128" transmission_openvpn_hostname: "transmission_openvpn" +transmission_openvpn_container_name: "transmission-openvpn" +transmission_openvpn_image_name: "haugene/transmission-openvpn" +transmission_openvpn_image_version: "latest" + # Transmission VPN Credentials # If you're using Transmission with a VPN, you'll need to set these credentials. # See https://github.com/haugene/docker-transmission-openvpn/ for supported VPN providers. diff --git a/roles/transmission-with-openvpn/docs/transmission.md b/roles/transmission-with-openvpn/docs/transmission.md new file mode 100644 index 0000000000..aa79341ef6 --- /dev/null +++ b/roles/transmission-with-openvpn/docs/transmission.md @@ -0,0 +1,26 @@ +# Transmission + + +Homepage: + +Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects +directly. + +## Usage + +Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. + +Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). + +## Specific Configuration + +If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: + +```yaml +openvpn_username: super_secret_username +openvpn_password: super_secret_password +openvpn_provider: NORDVPN +openvpn_config: uk686.nordvpn.com.udp +``` + +See for supported VPN providers. diff --git a/roles/transmission-with-openvpn/molecule/default/molecule.yml b/roles/transmission-with-openvpn/molecule/default/molecule.yml new file mode 100644 index 0000000000..7cbfd31778 --- /dev/null +++ b/roles/transmission-with-openvpn/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + transmission_with_openvpn_enabled: true diff --git a/roles/transmission-with-openvpn/molecule/default/side_effect.yml b/roles/transmission-with-openvpn/molecule/default/side_effect.yml new file mode 100644 index 0000000000..f3aa26e111 --- /dev/null +++ b/roles/transmission-with-openvpn/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + transmission_with_openvpn_enabled: false diff --git a/roles/transmission-with-openvpn/molecule/default/verify.yml b/roles/transmission-with-openvpn/molecule/default/verify.yml new file mode 100644 index 0000000000..748aef0778 --- /dev/null +++ b/roles/transmission-with-openvpn/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get transmission container state + community.docker.docker_container: + name: "{{ transmission_openvpn_container_name }}" + register: result + + - name: Check if transmission containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml b/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..fa5d60dc48 --- /dev/null +++ b/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove transmission + community.docker.docker_container: + name: "{{ transmission_openvpn_container_name }}" + state: absent + register: result + + - name: Check if transmission is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/transmission-with-openvpn/tasks/main.yml b/roles/transmission-with-openvpn/tasks/main.yml index 5a67fbd978..6b9cd705a5 100644 --- a/roles/transmission-with-openvpn/tasks/main.yml +++ b/roles/transmission-with-openvpn/tasks/main.yml @@ -1,57 +1,69 @@ --- -- name: Create Transmission Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ transmission_config_directory }}" - - "{{ transmission_download_directory }}" - - "{{ transmission_watch_directory }}" +- name: Start Transmission with OpenVPM + block: + - name: Create Transmission Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ transmission_config_directory }}" + - "{{ transmission_download_directory }}" + - "{{ transmission_watch_directory }}" -- name: Transmission with VPN - docker_container: - name: transmission-openvpn - image: haugene/transmission-openvpn - pull: true - volumes: - - "/etc/localtime:/etc/localtime:ro" - - "{{ transmission_download_directory }}:/downloads:rw" - - "{{ transmission_config_directory }}:/config:rw" - - "{{ transmission_watch_directory }}:/watch:rw" - - "/etc/timezone:/etc/timezone:ro" - ports: - - "{{ transmission_openvpn_webui_port }}:9091" - - "{{ transmission_openvpn_external_port }}:51413" - - "{{ transmission_openvpn_external_port }}:51413/udp" - - "{{ transmission_openvpn_proxy_port }}:3128" - env: - TRANSMISSION_HOME: "/config" - TRANSMISSION_DOWNLOAD_DIR: "/downloads" - TRANSMISSION_INCOMPLETE_DIR: "/downloads/.incomplete" - TRANSMISSION_WATCH_DIR: "/watch" - TRANSMISSION_RATIO_LIMIT: "{{ transmission_openvpn_ratio_limit }}" - TRANSMISSION_RATIO_LIMIT_ENABLED: "{{ transmission_openvpn_ratio_limit_enabled | string }}" - OPENVPN_PROVIDER: "{{ openvpn_provider }}" - OPENVPN_USERNAME: "{{ openvpn_username }}" - OPENVPN_PASSWORD: "{{ openvpn_password }}" - OPENVPN_CONFIG: "{{ openvpn_config }}" - WEBPROXY_ENABLED: "true" - WEBPROXY_PORT: "3128" - PUID: "{{ transmission_openvpn_user_id }}" - PGID: "{{ transmission_openvpn_group_id }}" - LOCAL_NETWORK: "{{ transmission_openvpn_local_network }}" - ENABLE_UFW: "false" - devices: - - /dev/net/tun - capabilities: - - NET_ADMIN - restart_policy: unless-stopped - memory: "{{ transmission_openvpn_memory }}" - labels: - traefik.enable: "{{ transmission_openvpn_available_externally | string }}" - traefik.http.routers.transmission_openvpn.rule: "Host(`{{ transmission_openvpn_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.transmission_openvpn.tls.certresolver: "letsencrypt" - traefik.http.routers.transmission_openvpn.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.transmission_openvpn.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.transmission_openvpn.loadbalancer.server.port: "9091" + - name: Transmission with VPN + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ transmission_openvpn_container_name }}" + image: "{{ transmission_openvpn_image_name }}:{{ transmission_openvpn_image_version }}" + pull: true + volumes: + - "/etc/localtime:/etc/localtime:ro" + - "{{ transmission_download_directory }}:/downloads:rw" + - "{{ transmission_config_directory }}:/config:rw" + - "{{ transmission_watch_directory }}:/watch:rw" + - "/etc/timezone:/etc/timezone:ro" + ports: + - "{{ transmission_openvpn_webui_port }}:9091" + - "{{ transmission_openvpn_external_port }}:51413" + - "{{ transmission_openvpn_external_port }}:51413/udp" + - "{{ transmission_openvpn_proxy_port }}:3128" + env: + TRANSMISSION_HOME: "/config" + TRANSMISSION_DOWNLOAD_DIR: "/downloads" + TRANSMISSION_INCOMPLETE_DIR: "/downloads/.incomplete" + TRANSMISSION_WATCH_DIR: "/watch" + TRANSMISSION_RATIO_LIMIT: "{{ transmission_openvpn_ratio_limit }}" + TRANSMISSION_RATIO_LIMIT_ENABLED: "{{ transmission_openvpn_ratio_limit_enabled | string }}" + OPENVPN_PROVIDER: "{{ openvpn_provider }}" + OPENVPN_USERNAME: "{{ openvpn_username }}" + OPENVPN_PASSWORD: "{{ openvpn_password }}" + OPENVPN_CONFIG: "{{ openvpn_config }}" + WEBPROXY_ENABLED: "true" + WEBPROXY_PORT: "3128" + PUID: "{{ transmission_openvpn_user_id }}" + PGID: "{{ transmission_openvpn_group_id }}" + LOCAL_NETWORK: "{{ transmission_openvpn_local_network }}" + ENABLE_UFW: "false" + devices: + - /dev/net/tun + capabilities: + - NET_ADMIN + restart_policy: unless-stopped + memory: "{{ transmission_openvpn_memory }}" + labels: + traefik.enable: "{{ transmission_with_openvpn_available_externally | string }}" + traefik.http.routers.transmission_openvpn.rule: "Host(`{{ transmission_openvpn_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.transmission_openvpn.tls.certresolver: "letsencrypt" + traefik.http.routers.transmission_openvpn.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.transmission_openvpn.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.transmission_openvpn.loadbalancer.server.port: "9091" + when: transmission_with_openvpn_enabled is true + +- name: Stop Transmission with OpenVPM + block: + - name: Stop Transmission with OpenVPM + community.docker.docker_container: + name: "{{ transmission_openvpn_container_name }}" + state: absent + when: transmission_with_openvpn_enabled is false diff --git a/roles/transmission/defaults/main.yml b/roles/transmission/defaults/main.yml index e8721a95b1..dd5d275926 100644 --- a/roles/transmission/defaults/main.yml +++ b/roles/transmission/defaults/main.yml @@ -18,5 +18,9 @@ transmission_hostname: "transmission" transmission_timezone: "{{ ansible_nas_timezone }}" +transmission_container_name: "transmission" +transmission_image_name: "linuxserver/transmission" +transmission_image_version: "latest" + # specs transmission_memory: 1g diff --git a/roles/transmission/docs/transmission.md b/roles/transmission/docs/transmission.md new file mode 100644 index 0000000000..aa79341ef6 --- /dev/null +++ b/roles/transmission/docs/transmission.md @@ -0,0 +1,26 @@ +# Transmission + + +Homepage: + +Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects +directly. + +## Usage + +Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. + +Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). + +## Specific Configuration + +If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: + +```yaml +openvpn_username: super_secret_username +openvpn_password: super_secret_password +openvpn_provider: NORDVPN +openvpn_config: uk686.nordvpn.com.udp +``` + +See for supported VPN providers. diff --git a/roles/transmission/molecule/default/molecule.yml b/roles/transmission/molecule/default/molecule.yml new file mode 100644 index 0000000000..8427977733 --- /dev/null +++ b/roles/transmission/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + transmission_enabled: true diff --git a/roles/transmission/molecule/default/side_effect.yml b/roles/transmission/molecule/default/side_effect.yml new file mode 100644 index 0000000000..29ef54a603 --- /dev/null +++ b/roles/transmission/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + transmission_enabled: false diff --git a/roles/transmission/molecule/default/verify.yml b/roles/transmission/molecule/default/verify.yml new file mode 100644 index 0000000000..101dceb538 --- /dev/null +++ b/roles/transmission/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get transmission container state + community.docker.docker_container: + name: "{{ transmission_container_name }}" + register: result + + - name: Check if transmission containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/transmission/molecule/default/verify_stopped.yml b/roles/transmission/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..bea8a2edb8 --- /dev/null +++ b/roles/transmission/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove transmission + community.docker.docker_container: + name: "{{ transmission_container_name }}" + state: absent + register: result + + - name: Check if transmission is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/transmission/tasks/main.yml b/roles/transmission/tasks/main.yml index aeaf5e2914..d85184216f 100644 --- a/roles/transmission/tasks/main.yml +++ b/roles/transmission/tasks/main.yml @@ -1,37 +1,49 @@ --- -- name: Create Transmission Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ transmission_config_directory }}" - - "{{ transmission_download_directory }}" - - "{{ transmission_watch_directory }}" +- name: Start Transmission + block: + - name: Create Transmission Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ transmission_config_directory }}" + - "{{ transmission_download_directory }}" + - "{{ transmission_watch_directory }}" -- name: Transmission Docker Container - docker_container: - name: transmission - image: linuxserver/transmission - pull: true - volumes: - - "{{ transmission_config_directory }}:/config:rw" - - "{{ transmission_download_directory }}:/downloads:rw" - - "{{ transmission_watch_directory }}:/watch:rw" - ports: - - "{{ transmission_webui_port }}:9091" - - "{{ transmission_external_port }}:51413" - - "{{ transmission_external_port }}:51413/udp" - env: - TZ: "{{ transmission_timezone }}" - PUID: "{{ transmission_user_id }}" - PGID: "{{ transmission_group_id }}" - restart_policy: unless-stopped - memory: "{{ transmission_memory }}" - labels: - traefik.enable: "{{ transmission_available_externally | string }}" - traefik.http.routers.transmission.rule: "Host(`{{ transmission_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.transmission.tls.certresolver: "letsencrypt" - traefik.http.routers.transmission.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.transmission.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.transmission.loadbalancer.server.port: "9091" + - name: Transmission Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ transmission_container_name }}" + image: "{{ transmission_image_name }}:{{ transmission_image_version }}" + pull: true + volumes: + - "{{ transmission_config_directory }}:/config:rw" + - "{{ transmission_download_directory }}:/downloads:rw" + - "{{ transmission_watch_directory }}:/watch:rw" + ports: + - "{{ transmission_webui_port }}:9091" + - "{{ transmission_external_port }}:51413" + - "{{ transmission_external_port }}:51413/udp" + env: + TZ: "{{ transmission_timezone }}" + PUID: "{{ transmission_user_id }}" + PGID: "{{ transmission_group_id }}" + restart_policy: unless-stopped + memory: "{{ transmission_memory }}" + labels: + traefik.enable: "{{ transmission_available_externally | string }}" + traefik.http.routers.transmission.rule: "Host(`{{ transmission_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.transmission.tls.certresolver: "letsencrypt" + traefik.http.routers.transmission.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.transmission.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.transmission.loadbalancer.server.port: "9091" + when: transmission_enabled is true + +- name: Stop Transmission + block: + - name: Stop Transmission + community.docker.docker_container: + name: "{{ transmission_container_name }}" + state: absent + when: transmission_enabled is false diff --git a/roles/ubooquity/defaults/main.yml b/roles/ubooquity/defaults/main.yml index de44714551..106917b46c 100644 --- a/roles/ubooquity/defaults/main.yml +++ b/roles/ubooquity/defaults/main.yml @@ -16,3 +16,6 @@ ubooquity_hostname: ubooquity # Container ubooquity_memory: 1g +ubooquity_container_name: "ubooquity" +ubooquity_image_name: "linuxserver/ubooquity" +ubooquity_image_version: "latest" diff --git a/roles/ubooquity/docs/ubooquity.md b/roles/ubooquity/docs/ubooquity.md new file mode 100644 index 0000000000..24397c09e2 --- /dev/null +++ b/roles/ubooquity/docs/ubooquity.md @@ -0,0 +1,25 @@ +# Ubooquity + +Homepage: + +Documentation: + +Docker Image: + +Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer. + +## Usage + +Set `ubooquity_enabled: true` in your `inventories//nas.yml` file. + +Access the webui at by default. See specific configuration section below for information on setting up external access. + +## Specific Configuration + +Important note: if you want to access Ubooquity externally through Traefik (at ubooquity.yourdomain.tld), you need to go to and set the reverse proxy prefix to blank under "Advanced". Otherwise you will need to append "/ubooquity" to the url in order to access. + +### Admin login + +The admin portal is not exposed through Traefik. You can access the admin portal on port 2203. + +Upon your first run, the address is . You will be able to set the admin password here. diff --git a/roles/ubooquity/molecule/default/molecule.yml b/roles/ubooquity/molecule/default/molecule.yml new file mode 100644 index 0000000000..2d3b098669 --- /dev/null +++ b/roles/ubooquity/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + ubooquity_enabled: true diff --git a/roles/ubooquity/molecule/default/side_effect.yml b/roles/ubooquity/molecule/default/side_effect.yml new file mode 100644 index 0000000000..da6776f567 --- /dev/null +++ b/roles/ubooquity/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + ubooquity_enabled: false diff --git a/roles/ubooquity/molecule/default/verify.yml b/roles/ubooquity/molecule/default/verify.yml new file mode 100644 index 0000000000..4471805a1c --- /dev/null +++ b/roles/ubooquity/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get ubooquity container state + community.docker.docker_container: + name: "{{ ubooquity_container_name }}" + register: result + + - name: Check if ubooquity containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/ubooquity/molecule/default/verify_stopped.yml b/roles/ubooquity/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..ecdd6f81a9 --- /dev/null +++ b/roles/ubooquity/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove ubooquity + community.docker.docker_container: + name: "{{ ubooquity_container_name }}" + state: absent + register: result + + - name: Check if ubooquity is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/ubooquity/tasks/main.yml b/roles/ubooquity/tasks/main.yml index 8e254a4dde..82309851bc 100644 --- a/roles/ubooquity/tasks/main.yml +++ b/roles/ubooquity/tasks/main.yml @@ -1,35 +1,47 @@ --- -- name: Create Ubooquity Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ ubooquity_data_directory }}" +- name: Start Ubooquity + block: + - name: Create Ubooquity Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ ubooquity_data_directory }}" -- name: Ubooquity Docker Container - docker_container: - name: ubooquity - image: linuxserver/ubooquity:latest - pull: true - volumes: - - "{{ ubooquity_data_directory }}/config:/config:rw" - - "{{ ubooquity_data_directory }}/files:/files:rw" - - "{{ comics_root }}:/comics" - - "{{ books_root }}:/books" - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ ubooquity_user_id }}" - PGID: "{{ ubooquity_group_id }}" - MAXMEM: "1024" - ports: - - "{{ ubooquity_port_webui }}:2202" - - "{{ ubooquity_port_admin }}:2203" - restart_policy: unless-stopped - memory: "{{ ubooquity_memory }}" - labels: - traefik.enable: "{{ ubooquity_available_externally | string }}" - traefik.http.routers.ubooquity.rule: "Host(`{{ ubooquity_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.ubooquity.tls.certresolver: "letsencrypt" - traefik.http.routers.ubooquity.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.ubooquity.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.ubooquity.loadbalancer.server.port: "2202" + - name: Ubooquity Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ ubooquity_container_name }}" + image: "{{ ubooquity_image_name }}:{{ ubooquity_image_version }}" + pull: true + volumes: + - "{{ ubooquity_data_directory }}/config:/config:rw" + - "{{ ubooquity_data_directory }}/files:/files:rw" + - "{{ comics_root }}:/comics" + - "{{ books_root }}:/books" + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ ubooquity_user_id }}" + PGID: "{{ ubooquity_group_id }}" + MAXMEM: "1024" + ports: + - "{{ ubooquity_port_webui }}:2202" + - "{{ ubooquity_port_admin }}:2203" + restart_policy: unless-stopped + memory: "{{ ubooquity_memory }}" + labels: + traefik.enable: "{{ ubooquity_available_externally | string }}" + traefik.http.routers.ubooquity.rule: "Host(`{{ ubooquity_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.ubooquity.tls.certresolver: "letsencrypt" + traefik.http.routers.ubooquity.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.ubooquity.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.ubooquity.loadbalancer.server.port: "2202" + when: ubooquity_enabled is true + +- name: Stop Ubooquity + block: + - name: Stop Ubooquity + community.docker.docker_container: + name: "{{ ubooquity_container_name }}" + state: absent + when: ubooquity_enabled is false diff --git a/roles/utorrent/defaults/main.yml b/roles/utorrent/defaults/main.yml index aba2fe7384..df3170ebef 100644 --- a/roles/utorrent/defaults/main.yml +++ b/roles/utorrent/defaults/main.yml @@ -16,5 +16,10 @@ utorrent_port_http: "8111" utorrent_port_bt: "6881" utorrent_hostname: "utorrent" +# docker +utorrent_container_name: "utorrent" +utorrent_image_name: "ekho/utorrent" +utorrent_image_version: "latest" + # specs utorrent_memory: 1g diff --git a/roles/utorrent/docs/utorrent.md b/roles/utorrent/docs/utorrent.md new file mode 100644 index 0000000000..18845365a8 --- /dev/null +++ b/roles/utorrent/docs/utorrent.md @@ -0,0 +1,15 @@ +# uTorrent + +Homepage: +Docker Container: + +## Usage + +Set `utorrent_enabled: true` in your `inventories//nas.yml` file. + +If you want to access uTorrent externally, don't forget to set `utorrent_available_externally: true` in your `inventories//nas.yml` file. + +The uTorrent web interface can be found at : + +- Username: admin +- Password: *leave blank* diff --git a/roles/utorrent/molecule/default/molecule.yml b/roles/utorrent/molecule/default/molecule.yml new file mode 100644 index 0000000000..f4fa84ef5e --- /dev/null +++ b/roles/utorrent/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + utorrent_enabled: true diff --git a/roles/utorrent/molecule/default/side_effect.yml b/roles/utorrent/molecule/default/side_effect.yml new file mode 100644 index 0000000000..d496124e1c --- /dev/null +++ b/roles/utorrent/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + utorrent_enabled: false diff --git a/roles/utorrent/molecule/default/verify.yml b/roles/utorrent/molecule/default/verify.yml new file mode 100644 index 0000000000..b2f6d3ec43 --- /dev/null +++ b/roles/utorrent/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get utorrent container state + community.docker.docker_container: + name: "{{ utorrent_container_name }}" + register: result + + - name: Check if utorrent containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/utorrent/molecule/default/verify_stopped.yml b/roles/utorrent/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..76d5347dbd --- /dev/null +++ b/roles/utorrent/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove utorrent + community.docker.docker_container: + name: "{{ utorrent_container_name }}" + state: absent + register: result + + - name: Check if utorrent is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/utorrent/tasks/main.yml b/roles/utorrent/tasks/main.yml index 5aa5a8edc2..1a7c99e005 100644 --- a/roles/utorrent/tasks/main.yml +++ b/roles/utorrent/tasks/main.yml @@ -1,39 +1,51 @@ --- -- name: Create uTorrent Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ utorrent_config_directory }}" - - "{{ utorrent_download_directory }}" - - "{{ utorrent_download_directory_active }}" +- name: Start uTorrent + block: + - name: Create uTorrent Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ utorrent_config_directory }}" + - "{{ utorrent_download_directory }}" + - "{{ utorrent_download_directory_active }}" -- name: Create uTorrent Docker Container - docker_container: - name: utorrent - image: ekho/utorrent:latest - pull: true - volumes: - - "{{ utorrent_download_directory }}:/data:rw" - - "{{ utorrent_config_directory }}:/utorrent/settings:rw" - - "{{ torrents_root }}:/utorrent/torrents:rw" - ports: - - "{{ utorrent_port_http }}:8080" - - "{{ utorrent_port_bt }}:6881" - - "{{ utorrent_port_bt }}:6881/udp" - env: - TZ: "{{ ansible_nas_timezone }}" - UID: "{{ utorrent_user_id }}" - GID: "{{ utorrent_group_id }}" - webui: "ng" - dir_active: "/data/.incomplete" - dir_completed: "/data" - restart_policy: unless-stopped - memory: "{{ utorrent_memory }}" - labels: - traefik.enable: "{{ utorrent_available_externally | string }}" - traefik.http.routers.utorrent.rule: "Host(`{{ utorrent_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.utorrent.tls.certresolver: "letsencrypt" - traefik.http.routers.utorrent.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.utorrent.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.utorrent.loadbalancer.server.port: "8080" + - name: Create uTorrent Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ utorrent_container_name }}" + image: "{{ utorrent_image_name }}:{{ utorrent_image_version }}" + pull: true + volumes: + - "{{ utorrent_download_directory }}:/data:rw" + - "{{ utorrent_config_directory }}:/utorrent/settings:rw" + - "{{ torrents_root }}:/utorrent/torrents:rw" + ports: + - "{{ utorrent_port_http }}:8080" + - "{{ utorrent_port_bt }}:6881" + - "{{ utorrent_port_bt }}:6881/udp" + env: + TZ: "{{ ansible_nas_timezone }}" + UID: "{{ utorrent_user_id }}" + GID: "{{ utorrent_group_id }}" + webui: "ng" + dir_active: "/data/.incomplete" + dir_completed: "/data" + restart_policy: unless-stopped + memory: "{{ utorrent_memory }}" + labels: + traefik.enable: "{{ utorrent_available_externally | string }}" + traefik.http.routers.utorrent.rule: "Host(`{{ utorrent_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.utorrent.tls.certresolver: "letsencrypt" + traefik.http.routers.utorrent.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.utorrent.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.utorrent.loadbalancer.server.port: "8080" + when: utorrent_enabled is true + +- name: Stop uTorrent + block: + - name: Stop uTorrent + community.docker.docker_container: + name: "{{ utorrent_container_name }}" + state: absent + when: utorrent_enabled is false diff --git a/roles/virtual_desktop/defaults/main.yml b/roles/virtual_desktop/defaults/main.yml index 0cd61c7926..effb7b3fd8 100644 --- a/roles/virtual_desktop/defaults/main.yml +++ b/roles/virtual_desktop/defaults/main.yml @@ -1,8 +1,6 @@ --- virtual_desktop_enabled: false -virtual_desktop_docker_image: "rattydave/docker-ubuntu-xrdp-mate-custom:20.04-tools" - virtual_desktop_users: - username: "{{ ansible_nas_user }}" password: "topsecret" @@ -20,3 +18,6 @@ virtual_desktop_rdp_port: 3389 # Container virtual_desktop_memory: 2g +virtual_desktop_container_name: "virtual_desktop" +virtual_desktop_image_name: "rattydave/docker-ubuntu-xrdp-mate-custom" +virtual_desktop_image_version: "20.04-tools" diff --git a/roles/virtual_desktop/docs/virtual_desktop.md b/roles/virtual_desktop/docs/virtual_desktop.md new file mode 100644 index 0000000000..0b84170db1 --- /dev/null +++ b/roles/virtual_desktop/docs/virtual_desktop.md @@ -0,0 +1,30 @@ +# Virtual Desktop + +It's possible to run a cut down desktop within a Docker container. We use [RattyDAVE's custom Ubuntu Mate image](https://github.com/RattyDAVE/docker-ubuntu-xrdp-mate-custom). + +## Usage + +Set `virtual_desktop_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +By default `ansible_nas_user` will be granted access with a password of `topsecret` with sudo rights. To change or add additional users override `vd_users` in your `nas.yml`: + +```yaml +vd_users: + - username: "{{ ansible_nas_user }}" + password: "topsecret" + sudo: "Y" + - username: "larrylaffer" + password: "kensentme" + sudo: "Y" +``` + +## Mounts + +`samba_shares_root` is mounted to `/samba`. +`docker_home` is mounted to `/docker`. + +## Remote Access + +It's possible to access your virtual desktop through a web browser! Check out [Guacamole](guacamole.md). diff --git a/roles/virtual_desktop/molecule/default/molecule.yml b/roles/virtual_desktop/molecule/default/molecule.yml new file mode 100644 index 0000000000..b9f24f260d --- /dev/null +++ b/roles/virtual_desktop/molecule/default/molecule.yml @@ -0,0 +1,7 @@ +--- +provisioner: + inventory: + group_vars: + all: + virtual_desktop_enabled: true + ansible_nas_user: ansible-nas diff --git a/roles/virtual_desktop/molecule/default/side_effect.yml b/roles/virtual_desktop/molecule/default/side_effect.yml new file mode 100644 index 0000000000..b73186e17b --- /dev/null +++ b/roles/virtual_desktop/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + virtual_desktop_enabled: false diff --git a/roles/virtual_desktop/molecule/default/verify.yml b/roles/virtual_desktop/molecule/default/verify.yml new file mode 100644 index 0000000000..0058aa983b --- /dev/null +++ b/roles/virtual_desktop/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get virtual_desktop container state + community.docker.docker_container: + name: "{{ virtual_desktop_container_name }}" + register: result + + - name: Check if virtual_desktop containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/virtual_desktop/molecule/default/verify_stopped.yml b/roles/virtual_desktop/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..0d8468587f --- /dev/null +++ b/roles/virtual_desktop/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove virtual_desktop + community.docker.docker_container: + name: "{{ virtual_desktop_container_name }}" + state: absent + register: result + + - name: Check if virtual_desktop is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/virtual_desktop/tasks/main.yml b/roles/virtual_desktop/tasks/main.yml index 167dd08ad0..90ccb1c251 100644 --- a/roles/virtual_desktop/tasks/main.yml +++ b/roles/virtual_desktop/tasks/main.yml @@ -1,30 +1,42 @@ --- -- name: Create Virtual Desktop Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ virtual_desktop_data_directory }}" - - "{{ virtual_desktop_data_directory }}/home" +- name: Start Virtual Desktop + block: + - name: Create Virtual Desktop Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ virtual_desktop_data_directory }}" + - "{{ virtual_desktop_data_directory }}/home" -- name: Create users file - template: - src: "users.txt.j2" - dest: "{{ virtual_desktop_data_directory }}/users.txt" + - name: Create users file + ansible.builtin.template: + src: "users.txt.j2" + dest: "{{ virtual_desktop_data_directory }}/users.txt" -- name: Virtual Desktop Container - docker_container: - name: virtual_desktop - image: "{{ virtual_desktop_docker_image }}" - pull: true - volumes: - - "{{ virtual_desktop_data_directory }}/users.txt:/root/createusers.txt:ro" - - "{{ virtual_desktop_data_directory }}/home:/home:rw" - - "{{ samba_shares_root }}:/samba:rw" - - "{{ docker_home }}:/docker:rw" - - "/etc/timezone:/etc/timezone:ro" - ports: - - "{{ virtual_desktop_rdp_port }}:3389" - privileged: true - restart_policy: unless-stopped - memory: "{{ virtual_desktop_memory }}" + - name: Virtual Desktop Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ virtual_desktop_container_name }}" + image: "{{ virtual_desktop_image_name }}:{{ virtual_desktop_image_version }}" + pull: true + volumes: + - "{{ virtual_desktop_data_directory }}/users.txt:/root/createusers.txt:ro" + - "{{ virtual_desktop_data_directory }}/home:/home:rw" + - "{{ samba_shares_root }}:/samba:rw" + - "{{ docker_home }}:/docker:rw" + - "/etc/timezone:/etc/timezone:ro" + ports: + - "{{ virtual_desktop_rdp_port }}:3389" + privileged: true + restart_policy: unless-stopped + memory: "{{ virtual_desktop_memory }}" + when: virtual_desktop_enabled is true + +- name: Stop Virtual Desktop + block: + - name: Stop Virtual Desktop + community.docker.docker_container: + name: "{{ virtual_desktop_container_name }}" + state: absent + when: virtual_desktop_enabled is false diff --git a/roles/wallabag/defaults/main.yml b/roles/wallabag/defaults/main.yml index b96f280b65..fd5a5488c7 100644 --- a/roles/wallabag/defaults/main.yml +++ b/roles/wallabag/defaults/main.yml @@ -11,3 +11,6 @@ wallabag_hostname: wallabag # Container wallabag_memory: 1g +wallabag_container_name: "wallabag" +wallabag_image_name: "wallabag/wallabag" +wallabag_image_version: "latest" diff --git a/roles/wallabag/docs/wallabag.md b/roles/wallabag/docs/wallabag.md new file mode 100644 index 0000000000..e5ffd3a3f0 --- /dev/null +++ b/roles/wallabag/docs/wallabag.md @@ -0,0 +1,17 @@ +# Wallabag + +Homepage: + +wallabag is a self-hostable PHP application allowing you to not miss any content anymore. Click, save and read it when you can. It extracts content so that you can read it when you have time. + +## Usage + +Set `wallabag_enabled: true` in your `inventories//nas.yml` file. + +If you want to access wallabag externally, don't forget to set `wallabag_available_externally: true` in your `inventories//nas.yml` file. + +I recommend using the mobile app, which will sync with this installation so you have access to your saved articles even if you don't have signal or wifi access. + +The default credentials are wallabag:wallabag + +The wallabag web interface can be found at . diff --git a/roles/wallabag/molecule/default/molecule.yml b/roles/wallabag/molecule/default/molecule.yml new file mode 100644 index 0000000000..3e2adc759c --- /dev/null +++ b/roles/wallabag/molecule/default/molecule.yml @@ -0,0 +1,17 @@ +--- +provisioner: + inventory: + group_vars: + all: + wallabag_enabled: true + wallabag_data_directory: "/tmp/wallabag" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp + cgroupns_mode: host + privileged: true + pre_build_image: true diff --git a/roles/wallabag/molecule/default/side_effect.yml b/roles/wallabag/molecule/default/side_effect.yml new file mode 100644 index 0000000000..7bd20b86d4 --- /dev/null +++ b/roles/wallabag/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + wallabag_enabled: false diff --git a/roles/wallabag/molecule/default/verify.yml b/roles/wallabag/molecule/default/verify.yml new file mode 100644 index 0000000000..b710d9f531 --- /dev/null +++ b/roles/wallabag/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get wallabag container state + community.docker.docker_container: + name: "{{ wallabag_container_name }}" + register: result + + - name: Check if wallabag containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/wallabag/molecule/default/verify_stopped.yml b/roles/wallabag/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..2fdd59b86c --- /dev/null +++ b/roles/wallabag/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove wallabag + community.docker.docker_container: + name: "{{ wallabag_container_name }}" + state: absent + register: result + + - name: Check if wallabag is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/wallabag/tasks/main.yml b/roles/wallabag/tasks/main.yml index eb1e67e77a..a296c2c342 100644 --- a/roles/wallabag/tasks/main.yml +++ b/roles/wallabag/tasks/main.yml @@ -1,30 +1,45 @@ --- -- name: Create Wallabag Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ wallabag_data_directory }}/data" - - "{{ wallabag_data_directory }}/images" +- name: Start Wallabag + block: + - name: Create Wallabag Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: 65534 + group: 65534 + with_items: + - "{{ wallabag_data_directory }}/data" + - "{{ wallabag_data_directory }}/data/db" + - "{{ wallabag_data_directory }}/images" -- name: Wallabag Docker Container - docker_container: - name: wallabag - image: wallabag/wallabag:latest - pull: true - volumes: - - "{{ wallabag_data_directory }}/data:/var/www/wallabag/data:rw" - - "{{ wallabag_data_directory }}/images:/var/www/wallabag/web/assets/images:rw" - ports: - - "{{ wallabag_port }}:80" - env: - SYMFONY__ENV__DOMAIN_NAME: "https://wallabag.{{ ansible_nas_domain }}" - restart_policy: unless-stopped - memory: "{{ wallabag_memory }}" - labels: - traefik.enable: "{{ wallabag_available_externally | string }}" - traefik.http.routers.wallabag.rule: "Host(`{{ wallabag_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.wallabag.tls.certresolver: "letsencrypt" - traefik.http.routers.wallabag.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.wallabag.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.wallabag.loadbalancer.server.port: "80" + - name: Wallabag Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ wallabag_container_name }}" + image: "{{ wallabag_image_name }}:{{ wallabag_image_version }}" + pull: true + volumes: + - "{{ wallabag_data_directory }}/data:/var/www/wallabag/data:rw" + - "{{ wallabag_data_directory }}/images:/var/www/wallabag/web/assets/images:rw" + ports: + - "{{ wallabag_port }}:80" + env: + SYMFONY__ENV__DOMAIN_NAME: "https://wallabag.{{ ansible_nas_domain }}" + restart_policy: unless-stopped + memory: "{{ wallabag_memory }}" + labels: + traefik.enable: "{{ wallabag_available_externally | string }}" + traefik.http.routers.wallabag.rule: "Host(`{{ wallabag_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.wallabag.tls.certresolver: "letsencrypt" + traefik.http.routers.wallabag.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.wallabag.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.wallabag.loadbalancer.server.port: "80" + when: wallabag_enabled is true + +- name: Stop Wallabag + block: + - name: Stop Wallabag + community.docker.docker_container: + name: "{{ wallabag_container_name }}" + state: absent + when: wallabag_enabled is false diff --git a/roles/watchtower/defaults/main.yml b/roles/watchtower/defaults/main.yml index cdb8bcd98b..4fe8816b0d 100644 --- a/roles/watchtower/defaults/main.yml +++ b/roles/watchtower/defaults/main.yml @@ -18,3 +18,7 @@ watchtower_command: "--schedule '{{ watchtower_cron_schedule }}'" # specs watchtower_memory: 1g + +watchtower_container_name: "watchtower" +watchtower_image_name: "containrrr/watchtower" +watchtower_image_version: "latest" diff --git a/roles/watchtower/docs/watchtower.md b/roles/watchtower/docs/watchtower.md new file mode 100644 index 0000000000..283bc72ff0 --- /dev/null +++ b/roles/watchtower/docs/watchtower.md @@ -0,0 +1,15 @@ +# Watchtower + +Homepage: + +A process for watching your Docker containers and automatically updating and restarting them whenever their base image is refreshed. + +## Usage + +Set `watchtower_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +By default Watchtower is configured to check daily at 5am for updates. + +Various notification options are available, and can be configured by updating `watchtower_command` in your `inventories//nas.yml` file. A few examples are provided. The full set of options can be found at the [Watchtower GitHub project page](https://github.com/v2tec/watchtower). diff --git a/roles/watchtower/molecule/default/molecule.yml b/roles/watchtower/molecule/default/molecule.yml new file mode 100644 index 0000000000..74e78e02ad --- /dev/null +++ b/roles/watchtower/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + watchtower_enabled: true diff --git a/roles/watchtower/molecule/default/side_effect.yml b/roles/watchtower/molecule/default/side_effect.yml new file mode 100644 index 0000000000..754cd6fbc6 --- /dev/null +++ b/roles/watchtower/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + watchtower_enabled: false diff --git a/roles/watchtower/molecule/default/verify.yml b/roles/watchtower/molecule/default/verify.yml new file mode 100644 index 0000000000..11e56dd085 --- /dev/null +++ b/roles/watchtower/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get watchtower container state + community.docker.docker_container: + name: "{{ watchtower_container_name }}" + register: result + + - name: Check if watchtower containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/watchtower/molecule/default/verify_stopped.yml b/roles/watchtower/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..d935558031 --- /dev/null +++ b/roles/watchtower/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove watchtower + community.docker.docker_container: + name: "{{ watchtower_container_name }}" + state: absent + register: result + + - name: Check if watchtower is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/watchtower/tasks/main.yml b/roles/watchtower/tasks/main.yml index 7b8f1a1665..0e0212b15a 100644 --- a/roles/watchtower/tasks/main.yml +++ b/roles/watchtower/tasks/main.yml @@ -1,13 +1,25 @@ --- -- name: Watchtower Docker Container - docker_container: - name: watchtower - image: containrrr/watchtower - pull: true - volumes: - - "/var/run/docker.sock:/var/run/docker.sock" - env: - TZ: "{{ ansible_nas_timezone }}" - command: "{{ watchtower_command }}" - restart_policy: unless-stopped - memory: "{{ watchtower_memory }}" +- name: Start Watchtower + block: + - name: Watchtower Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ watchtower_container_name }}" + image: "{{ watchtower_image_name }}:{{ watchtower_image_version }}" + pull: true + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + env: + TZ: "{{ ansible_nas_timezone }}" + command: "{{ watchtower_command }}" + restart_policy: unless-stopped + memory: "{{ watchtower_memory }}" + when: watchtower_enabled is true + +- name: Stop Watchtower + block: + - name: Stop Watchtower + community.docker.docker_container: + name: "{{ watchtower_container_name }}" + state: absent + when: watchtower_enabled is false diff --git a/roles/wireshark/defaults/main.yml b/roles/wireshark/defaults/main.yml index 30e729ecfa..0a3ea1cf85 100644 --- a/roles/wireshark/defaults/main.yml +++ b/roles/wireshark/defaults/main.yml @@ -13,5 +13,10 @@ wireshark_group_id: "1000" # network wireshark_hostname: "wireshark" +# docker +wireshark_container_name: "wireshark" +wireshark_image_name: "linuxserver/wireshark" +wireshark_image_version: "latest" + # specs wireshark_memory: "512m" diff --git a/roles/wireshark/docs/wireshark.md b/roles/wireshark/docs/wireshark.md new file mode 100644 index 0000000000..34442ab1f8 --- /dev/null +++ b/roles/wireshark/docs/wireshark.md @@ -0,0 +1,11 @@ +# Wireshark + +Homepage: + +Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998. + +## Usage + +Set `wireshark_enabled: true` in your `inventories//nas.yml` file. + +The Wireshark web interface can be found at . diff --git a/roles/wireshark/molecule/default/molecule.yml b/roles/wireshark/molecule/default/molecule.yml new file mode 100644 index 0000000000..840106cefd --- /dev/null +++ b/roles/wireshark/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + wireshark_enabled: true diff --git a/roles/wireshark/molecule/default/side_effect.yml b/roles/wireshark/molecule/default/side_effect.yml new file mode 100644 index 0000000000..98514c9aaf --- /dev/null +++ b/roles/wireshark/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + wireshark_enabled: false diff --git a/roles/wireshark/molecule/default/verify.yml b/roles/wireshark/molecule/default/verify.yml new file mode 100644 index 0000000000..5595dbd452 --- /dev/null +++ b/roles/wireshark/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get wireshark container state + community.docker.docker_container: + name: "{{ wireshark_container_name }}" + register: result + + - name: Check if wireshark containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/wireshark/molecule/default/verify_stopped.yml b/roles/wireshark/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..572d11d108 --- /dev/null +++ b/roles/wireshark/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove wireshark + community.docker.docker_container: + name: "{{ wireshark_container_name }}" + state: absent + register: result + + - name: Check if wireshark is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/wireshark/tasks/main.yml b/roles/wireshark/tasks/main.yml index 318ecaaefc..e094a8e1da 100644 --- a/roles/wireshark/tasks/main.yml +++ b/roles/wireshark/tasks/main.yml @@ -1,32 +1,44 @@ --- -- name: Create Wireshark Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ wireshark_data_directory }}" - - "{{ wireshark_data_directory }}/config" +- name: Start Wireshark + block: + - name: Create Wireshark Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ wireshark_data_directory }}" + - "{{ wireshark_data_directory }}/config" -- name: Create Wireshark Docker Container - docker_container: - name: wireshark - image: linuxserver/wireshark:latest - pull: true - volumes: - - "{{ wireshark_data_directory }}/config:/config:rw" - network_mode: host - env: - TZ: "{{ ansible_nas_timezone }}" - PUID: "{{ wireshark_user_id }}" - PGID: "{{ wireshark_group_id }}" - capabilities: - - NET_ADMIN - restart_policy: unless-stopped - memory: "{{ wireshark_memory }}" - labels: - traefik.enable: "{{ wireshark_available_externally | string }}" - traefik.http.routers.wireshark.rule: "Host(`{{ wireshark_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.wireshark.tls.certresolver: "letsencrypt" - traefik.http.routers.wireshark.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.wireshark.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.wireshark.loadbalancer.server.port: "3000" + - name: Create Wireshark Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ wireshark_container_name }}" + image: "{{ wireshark_image_name }}:{{ wireshark_image_version }}" + pull: true + volumes: + - "{{ wireshark_data_directory }}/config:/config:rw" + network_mode: host + env: + TZ: "{{ ansible_nas_timezone }}" + PUID: "{{ wireshark_user_id }}" + PGID: "{{ wireshark_group_id }}" + capabilities: + - NET_ADMIN + restart_policy: unless-stopped + memory: "{{ wireshark_memory }}" + labels: + traefik.enable: "{{ wireshark_available_externally | string }}" + traefik.http.routers.wireshark.rule: "Host(`{{ wireshark_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.wireshark.tls.certresolver: "letsencrypt" + traefik.http.routers.wireshark.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.wireshark.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.wireshark.loadbalancer.server.port: "3000" + when: wireshark_enabled is true + +- name: Stop Wireshark + block: + - name: Stop Wireshark + community.docker.docker_container: + name: "{{ wireshark_container_name }}" + state: absent + when: wireshark_enabled is false diff --git a/roles/woodpecker-ci/defaults/main.yml b/roles/woodpecker-ci/defaults/main.yml index 75252387a5..1616d77826 100644 --- a/roles/woodpecker-ci/defaults/main.yml +++ b/roles/woodpecker-ci/defaults/main.yml @@ -11,6 +11,15 @@ woodpecker_ci_port_grpc: 9000 woodpecker_ci_address: "http://{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ woodpecker_ci_port_ui }}" woodpecker_ci_hostname: woodpecker-ci +# docker +woodpecker_ci_container_name: "woodpecker-ci" +woodpecker_ci_image_name: "woodpeckerci/woodpecker-server" +woodpecker_ci_image_version: "latest" + +woodpecker_ci_agent_container_name: "woodpecker-ci-agent" +woodpecker_ci_agent_image_name: "woodpeckerci/woodpecker-agent" +woodpecker_ci_agent_image_version: "latest" + # memory woodpecker_ci_memory: 1g woodpecker_ci_agent_memory: 1g diff --git a/roles/woodpecker-ci/docs/woodpecker_ci.md b/roles/woodpecker-ci/docs/woodpecker_ci.md new file mode 100644 index 0000000000..216b4f538a --- /dev/null +++ b/roles/woodpecker-ci/docs/woodpecker_ci.md @@ -0,0 +1,17 @@ +# Woodpecker CI + +Woodpecker is a simple CI engine with great extensibility. + +Check it out at . + +## Usage + +Set `woodpecker_ci_enabled: true` in your `inventories//nas.yml` file. + +Gitea (`gitea_enabled: true`) must be set up and running before attempting to set up Woodpecker CI. + +## Setup Tasks + +An Oauth2 application must be set up in Gitea. Visit for more info, then set `woodpecker_ci_gitea_client` and `woodpecker_ci_gitea_secret` accordingly. + +Set `woodpecker_ci_admin_user` to the same username as your user in Gitea. diff --git a/roles/woodpecker-ci/molecule/default/molecule.yml b/roles/woodpecker-ci/molecule/default/molecule.yml new file mode 100644 index 0000000000..b11404844f --- /dev/null +++ b/roles/woodpecker-ci/molecule/default/molecule.yml @@ -0,0 +1,22 @@ +--- +provisioner: + inventory: + group_vars: + all: + woodpecker_ci_enabled: true + gitea_enabled: true + woodpecker_ci_gitea_client: "test" + gitea_port_http: "8080" + gitea_data_directory: "/tmp/gitea" + playbooks: + prepare: prepare.yml +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp + cgroupns_mode: host + privileged: true + pre_build_image: true diff --git a/roles/woodpecker-ci/molecule/default/prepare.yml b/roles/woodpecker-ci/molecule/default/prepare.yml new file mode 100644 index 0000000000..2ada4b0692 --- /dev/null +++ b/roles/woodpecker-ci/molecule/default/prepare.yml @@ -0,0 +1,20 @@ +--- +- name: Prepare + hosts: all + tasks: + - name: Install docker python module + ansible.builtin.pip: + name: docker + + - name: Create a dummy gitea config directory + ansible.builtin.file: + path: "{{ item }}" + state: directory + recurse: yes + with_items: + - "{{ gitea_data_directory }}/gitea/gitea/conf" + + - name: Create a dummy gitea config file + ansible.builtin.file: + path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + state: touch diff --git a/roles/woodpecker-ci/molecule/default/side_effect.yml b/roles/woodpecker-ci/molecule/default/side_effect.yml new file mode 100644 index 0000000000..61d1c23c78 --- /dev/null +++ b/roles/woodpecker-ci/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + woodpecker_ci_enabled: false diff --git a/roles/woodpecker-ci/molecule/default/verify.yml b/roles/woodpecker-ci/molecule/default/verify.yml new file mode 100644 index 0000000000..7d01d15c66 --- /dev/null +++ b/roles/woodpecker-ci/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get woodpecker_ci container state + community.docker.docker_container: + name: "{{ woodpecker_ci_container_name }}" + register: result + + - name: Check if woodpecker_ci containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/woodpecker-ci/molecule/default/verify_stopped.yml b/roles/woodpecker-ci/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..887373bd2c --- /dev/null +++ b/roles/woodpecker-ci/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove woodpecker_ci + community.docker.docker_container: + name: "{{ woodpecker_ci_container_name }}" + state: absent + register: result + + - name: Check if woodpecker_ci is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/woodpecker-ci/tasks/main.yml b/roles/woodpecker-ci/tasks/main.yml index 8e9d227056..9b0dbb86a1 100644 --- a/roles/woodpecker-ci/tasks/main.yml +++ b/roles/woodpecker-ci/tasks/main.yml @@ -1,70 +1,84 @@ --- -- name: Check for Gitea installation - fail: - msg: "Woodpecker-CI requires Gitea enabled and running for authentication, please set that up first." - when: gitea_enabled is false +- name: Start Woodpecker-CI + block: + - name: Check for Gitea installation + ansible.builtin.fail: + msg: "Woodpecker-CI requires Gitea enabled and running for authentication, please set that up first." + when: gitea_enabled is false -- name: Check for Gitea config - fail: - msg: "Missing Gitea Oauth2 config! Read https://woodpecker-ci.org/docs/administration/forges/gitea and set woodpecker_ci_gitea_client and woodpecker_ci_gitea_secret." - when: woodpecker_ci_gitea_client == "notset" + - name: Check for Gitea config + ansible.builtin.fail: + msg: "Missing Gitea Oauth2 config! Read https://woodpecker-ci.org/docs/administration/forges/gitea and set woodpecker_ci_gitea_client and woodpecker_ci_gitea_secret." + when: woodpecker_ci_gitea_client == "notset" -- name: Create Woodpecker-CI Directories - file: - path: "{{ item }}" - state: directory - with_items: - - "{{ woodpecker_ci_data_directory }}" + - name: Create Woodpecker-CI Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ woodpecker_ci_data_directory }}" -- name: Create Woodpecker-CI container - docker_container: - name: woodpecker-ci - image: woodpeckerci/woodpecker-server:latest - pull: true - volumes: - - "{{ woodpecker_ci_data_directory }}:/var/lib/woodpecker:rw" - ports: - - "{{ woodpecker_ci_port_ui }}:8000" - - "{{ woodpecker_ci_port_grpc }}:9000" - env: - WOODPECKER_ADMIN: "{{ woodpecker_ci_admin_user }}" - WOODPECKER_OPEN: "true" - WOODPECKER_HOST: "{{ woodpecker_ci_address }}" - WOODPECKER_AGENT_SECRET: "{{ woodpecker_ci_agent_secret }}" - WOODPECKER_GITEA: "true" - WOODPECKER_GITEA_URL: "{{ woodpecker_ci_gitea_url }}" - WOODPECKER_GITEA_CLIENT: "{{ woodpecker_ci_gitea_client }}" - WOODPECKER_GITEA_SECRET: "{{ woodpecker_ci_gitea_secret }}" - WOODPECKER_LOG_LEVEL: "{{ woodpecker_ci_log_level }}" - restart_policy: unless-stopped - memory: "{{ woodpecker_ci_memory }}" - labels: - traefik.enable: "{{ woodpecker_ci_available_externally | string }}" - traefik.http.routers.woodpecker_ci.rule: "Host(`{{ woodpecker_ci_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.woodpecker_ci.tls.certresolver: "letsencrypt" - traefik.http.routers.woodpecker_ci.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.woodpecker_ci.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.woodpecker_ci.loadbalancer.server.port: "8000" + - name: Create Woodpecker-CI container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ woodpecker_ci_container_name }}" + image: "{{ woodpecker_ci_image_name }}:{{ woodpecker_ci_image_version }}" + pull: true + volumes: + - "{{ woodpecker_ci_data_directory }}:/var/lib/woodpecker:rw" + ports: + - "{{ woodpecker_ci_port_ui }}:8000" + - "{{ woodpecker_ci_port_grpc }}:9000" + env: + WOODPECKER_ADMIN: "{{ woodpecker_ci_admin_user }}" + WOODPECKER_OPEN: "true" + WOODPECKER_HOST: "{{ woodpecker_ci_address }}" + WOODPECKER_AGENT_SECRET: "{{ woodpecker_ci_agent_secret }}" + WOODPECKER_GITEA: "true" + WOODPECKER_GITEA_URL: "{{ woodpecker_ci_gitea_url }}" + WOODPECKER_GITEA_CLIENT: "{{ woodpecker_ci_gitea_client }}" + WOODPECKER_GITEA_SECRET: "{{ woodpecker_ci_gitea_secret }}" + WOODPECKER_LOG_LEVEL: "{{ woodpecker_ci_log_level }}" + restart_policy: unless-stopped + memory: "{{ woodpecker_ci_memory }}" + labels: + traefik.enable: "{{ woodpecker_ci_available_externally | string }}" + traefik.http.routers.woodpecker_ci.rule: "Host(`{{ woodpecker_ci_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.woodpecker_ci.tls.certresolver: "letsencrypt" + traefik.http.routers.woodpecker_ci.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.woodpecker_ci.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.woodpecker_ci.loadbalancer.server.port: "8000" -- name: Create Woodpecker-CI agent container - docker_container: - name: woodpecker-ci-agent - image: woodpeckerci/woodpecker-agent:latest - pull: true - volumes: - - "/var/run/docker.sock:/var/run/docker.sock:rw" - env: - WOODPECKER_SERVER: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ woodpecker_ci_port_grpc }}" - WOODPECKER_AGENT_SECRET: "{{ woodpecker_ci_agent_secret }}" - WOODPECKER_LOG_LEVEL: "{{ woodpecker_ci_log_level }}" - restart_policy: unless-stopped - memory: "{{ woodpecker_ci_agent_memory }}" + - name: Create Woodpecker-CI agent container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ woodpecker_ci_agent_container_name }}" + image: "{{ woodpecker_ci_agent_image_name }}:{{ woodpecker_ci_agent_image_version }}" + pull: true + volumes: + - "/var/run/docker.sock:/var/run/docker.sock:rw" + env: + WOODPECKER_SERVER: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ woodpecker_ci_port_grpc }}" + WOODPECKER_AGENT_SECRET: "{{ woodpecker_ci_agent_secret }}" + WOODPECKER_LOG_LEVEL: "{{ woodpecker_ci_log_level }}" + restart_policy: unless-stopped + memory: "{{ woodpecker_ci_agent_memory }}" -- name: Add webhook allowed hosts to Gitea - blockinfile: - path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" - block: | - [webhook] - ALLOWED_HOST_LIST=private - SKIP_TLS_VERIFY=true - notify: restart gitea + - name: Add webhook allowed hosts to Gitea + ansible.builtin.blockinfile: + path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" + block: | + [webhook] + ALLOWED_HOST_LIST=private + SKIP_TLS_VERIFY=true + notify: restart + tags: molecule-notest + when: woodpecker_ci_enabled is true + +- name: Stop Woodpecker-CI + block: + - name: Stop Woodpecker-CI + community.docker.docker_container: + name: "{{ woodpecker_ci_container_name }}" + state: absent + when: woodpecker_ci_enabled is false diff --git a/roles/youtubedlmaterial/defaults/main.yml b/roles/youtubedlmaterial/defaults/main.yml index d62a73b00c..bb1fe73c5d 100644 --- a/roles/youtubedlmaterial/defaults/main.yml +++ b/roles/youtubedlmaterial/defaults/main.yml @@ -13,5 +13,10 @@ youtubedlmaterial_dl_subscriptions_directory: "{{ downloads_root }}/youtube/subs youtubedlmaterial_hostname: "youtubedlmaterial" youtubedlmaterial_port_http: "8998" +# docker +youtubedlmaterial_container_name: "youtubedlmaterial" +youtubedlmaterial_image_name: "tzahi12345/youtubedl-material" +youtubedlmaterial_image_version: "latest" + # specs youtubedlmaterial_memory: "1g" diff --git a/roles/youtubedlmaterial/docs/youtubedlmaterial.md b/roles/youtubedlmaterial/docs/youtubedlmaterial.md new file mode 100644 index 0000000000..cea68c4217 --- /dev/null +++ b/roles/youtubedlmaterial/docs/youtubedlmaterial.md @@ -0,0 +1,17 @@ +# YouTubeDL-Material + +Homepage: +Docker Container: + +YoutubeDL-Material is a Material Design frontend for youtube-dl. It's coded using Angular 9 for the frontend, and Node.js on the backend. + +## Usage + +Set `youtubedlmaterial_enabled: true` in your `inventories//nas.yml` file. + +The YouTubeDL-Material web interface can be found at . + +## Specific Configuration + +A YouTube directory will be created in your configured downloads spot. YouTubeDL-Material downloads will be placed there. +You can change the download location via `inventories//nas.yml` file. diff --git a/roles/youtubedlmaterial/molecule/default/molecule.yml b/roles/youtubedlmaterial/molecule/default/molecule.yml new file mode 100644 index 0000000000..cc425dbfd3 --- /dev/null +++ b/roles/youtubedlmaterial/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + youtubedlmaterial_enabled: true diff --git a/roles/youtubedlmaterial/molecule/default/side_effect.yml b/roles/youtubedlmaterial/molecule/default/side_effect.yml new file mode 100644 index 0000000000..3e097c11f0 --- /dev/null +++ b/roles/youtubedlmaterial/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + youtubedlmaterial_enabled: false diff --git a/roles/youtubedlmaterial/molecule/default/verify.yml b/roles/youtubedlmaterial/molecule/default/verify.yml new file mode 100644 index 0000000000..274e3501d8 --- /dev/null +++ b/roles/youtubedlmaterial/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get youtubedlmaterial container state + community.docker.docker_container: + name: "{{ youtubedlmaterial_container_name }}" + register: result + + - name: Check if youtubedlmaterial containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/youtubedlmaterial/molecule/default/verify_stopped.yml b/roles/youtubedlmaterial/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..c033588db7 --- /dev/null +++ b/roles/youtubedlmaterial/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove youtubedlmaterial + community.docker.docker_container: + name: "{{ youtubedlmaterial_container_name }}" + state: absent + register: result + + - name: Check if youtubedlmaterial is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/youtubedlmaterial/tasks/main.yml b/roles/youtubedlmaterial/tasks/main.yml index 48a174b0fc..941838a0d7 100644 --- a/roles/youtubedlmaterial/tasks/main.yml +++ b/roles/youtubedlmaterial/tasks/main.yml @@ -1,40 +1,52 @@ --- -- name: Create Youtubedlmaterial Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ youtubedlmaterial_data_directory }}/appdata" - - "{{ youtubedlmaterial_data_directory }}/audio" - - "{{ youtubedlmaterial_data_directory }}/video" - - "{{ youtubedlmaterial_data_directory }}/subscriptions" - - "{{ youtubedlmaterial_dl_audio_directory }}" - - "{{ youtubedlmaterial_dl_video_directory }}" - - "{{ youtubedlmaterial_dl_subscriptions_directory }}" +- name: Start Youtubedlmaterial + block: + - name: Create Youtubedlmaterial Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ youtubedlmaterial_data_directory }}/appdata" + - "{{ youtubedlmaterial_data_directory }}/audio" + - "{{ youtubedlmaterial_data_directory }}/video" + - "{{ youtubedlmaterial_data_directory }}/subscriptions" + - "{{ youtubedlmaterial_dl_audio_directory }}" + - "{{ youtubedlmaterial_dl_video_directory }}" + - "{{ youtubedlmaterial_dl_subscriptions_directory }}" -- name: Create Youtubedlmaterial Docker Container - docker_container: - name: youtubedlmaterial - image: tzahi12345/youtubedl-material:latest - pull: true - volumes: - - "{{ youtubedlmaterial_data_directory }}/appdata:/app/appdata:rw" - - "{{ youtubedlmaterial_dl_audio_directory }}:/app/audio:rw" - - "{{ youtubedlmaterial_dl_video_directory }}:/app/video:rw" - - "{{ youtubedlmaterial_dl_subscriptions_directory }}:/app/subscriptions:rw" - network_mode: "bridge" - ports: - - "{{ youtubedlmaterial_port_http }}:17442" - env: - ALLOW_CONFIG_MUTATIONS: "true" - TZ: "{{ ansible_nas_timezone }}" - restart_policy: unless-stopped - memory: "{{ youtubedlmaterial_memory }}" - labels: - traefik.enable: "{{ youtubedlmaterial_available_externally | string }}" - traefik.http.routers.youtubedlmaterial.rule: "Host(`{{ youtubedlmaterial_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.youtubedlmaterial.tls.certresolver: "letsencrypt" - traefik.http.routers.youtubedlmaterial.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.youtubedlmaterial.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.youtubedlmaterial.loadbalancer.server.port: "17442" + - name: Create Youtubedlmaterial Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ youtubedlmaterial_container_name }}" + image: "{{ youtubedlmaterial_image_name }}:{{ youtubedlmaterial_image_version }}" + pull: true + volumes: + - "{{ youtubedlmaterial_data_directory }}/appdata:/app/appdata:rw" + - "{{ youtubedlmaterial_dl_audio_directory }}:/app/audio:rw" + - "{{ youtubedlmaterial_dl_video_directory }}:/app/video:rw" + - "{{ youtubedlmaterial_dl_subscriptions_directory }}:/app/subscriptions:rw" + network_mode: "bridge" + ports: + - "{{ youtubedlmaterial_port_http }}:17442" + env: + ALLOW_CONFIG_MUTATIONS: "true" + TZ: "{{ ansible_nas_timezone }}" + restart_policy: unless-stopped + memory: "{{ youtubedlmaterial_memory }}" + labels: + traefik.enable: "{{ youtubedlmaterial_available_externally | string }}" + traefik.http.routers.youtubedlmaterial.rule: "Host(`{{ youtubedlmaterial_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.youtubedlmaterial.tls.certresolver: "letsencrypt" + traefik.http.routers.youtubedlmaterial.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.youtubedlmaterial.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.youtubedlmaterial.loadbalancer.server.port: "17442" + when: youtubedlmaterial_enabled is true + +- name: Stop Youtubedlmaterial + block: + - name: Stop Youtubedlmaterial + community.docker.docker_container: + name: "{{ youtubedlmaterial_container_name }}" + state: absent + when: youtubedlmaterial_enabled is false diff --git a/roles/znc/defaults/main.yml b/roles/znc/defaults/main.yml index 3c4b5fbf77..09666202d1 100644 --- a/roles/znc/defaults/main.yml +++ b/roles/znc/defaults/main.yml @@ -14,5 +14,17 @@ znc_group_id: "0" znc_hostname: "znc" znc_port: "6677" +# docker +znc_container_name: "znc" +znc_image_name: "znc" +znc_image_version: "latest" + # specs znc_memory: "1g" + +# znc +znc_user_password: "password" +znc_user_nick: "user" +znc_user_altnick: "user_" +znc_user_ident: "user" +znc_user_real_name: "User Name" diff --git a/roles/znc/docs/znc.md b/roles/znc/docs/znc.md new file mode 100644 index 0000000000..bbcb5b54b6 --- /dev/null +++ b/roles/znc/docs/znc.md @@ -0,0 +1,11 @@ +# Znc + +Homepage: + +ZNC is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC. It supports Transport Layer Security connections and IPv6. + +## Usage + +Set `znc_enabled: true` in your `inventories//nas.yml` file. Edit `znc_*` variables to suit your needs. For more advanced needs, edit the template config file (`templates\znc.conf.j2`) directly. + +Connect to ZNC using IRC at ansible_nas_host_or_ip:6677. diff --git a/roles/znc/molecule/default/molecule.yml b/roles/znc/molecule/default/molecule.yml new file mode 100644 index 0000000000..00edf7f39f --- /dev/null +++ b/roles/znc/molecule/default/molecule.yml @@ -0,0 +1,17 @@ +--- +provisioner: + inventory: + group_vars: + all: + znc_enabled: true + znc_data_directory: "/tmp/znc" +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + - /tmp:/tmp + cgroupns_mode: host + privileged: true + pre_build_image: true diff --git a/roles/znc/molecule/default/side_effect.yml b/roles/znc/molecule/default/side_effect.yml new file mode 100644 index 0000000000..267eb126d0 --- /dev/null +++ b/roles/znc/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + znc_enabled: false diff --git a/roles/znc/molecule/default/verify.yml b/roles/znc/molecule/default/verify.yml new file mode 100644 index 0000000000..8756c9540c --- /dev/null +++ b/roles/znc/molecule/default/verify.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get znc container state + community.docker.docker_container: + name: "{{ znc_container_name }}" + register: result + + - name: Check if znc containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/znc/molecule/default/verify_stopped.yml b/roles/znc/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..8a5d3ef9c9 --- /dev/null +++ b/roles/znc/molecule/default/verify_stopped.yml @@ -0,0 +1,19 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - name: Include vars + ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove znc + community.docker.docker_container: + name: "{{ znc_container_name }}" + state: absent + register: result + + - name: Check if znc is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/znc/tasks/main.yml b/roles/znc/tasks/main.yml index 9469afd8ae..08ccec03dd 100644 --- a/roles/znc/tasks/main.yml +++ b/roles/znc/tasks/main.yml @@ -1,31 +1,50 @@ --- -- name: Create ZNC Directories - file: - path: "{{ item }}" - state: directory - # mode: 0755 - with_items: - - "{{ znc_data_directory }}" +- name: Start ZNC + block: + - name: Create ZNC Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + # mode: 0755 + with_items: + - "{{ znc_data_directory }}" + - "{{ znc_data_directory }}/configs" -- name: Create ZNC Docker Container - docker_container: - name: znc - image: znc - pull: true - volumes: - - "{{ znc_data_directory }}:/znc-data:rw" - - "/etc/timezone:/etc/timezone:ro" - ports: - - "{{ znc_port }}:6677" - env: - PUID: "{{ znc_user_id }}" - PGID: "{{ znc_group_id }}" - restart_policy: unless-stopped - memory: "{{ znc_memory }}" - labels: - traefik.enable: "{{ znc_available_externally | string }}" - traefik.http.routers.znc.rule: "Host(`{{ znc_hostname }}.{{ ansible_nas_domain }}`)" - traefik.http.routers.znc.tls.certresolver: "letsencrypt" - traefik.http.routers.znc.tls.domains[0].main: "{{ ansible_nas_domain }}" - traefik.http.routers.znc.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.znc.loadbalancer.server.port: "6677" + - name: Template Znc config + ansible.builtin.template: + src: znc.conf.j2 + dest: "{{ znc_data_directory }}/configs/znc.conf" + register: template_config + + - name: Create ZNC Docker Container + community.docker.docker_container: + container_default_behavior: no_defaults + name: "{{ znc_container_name }}" + image: "{{ znc_image_name }}:{{ znc_image_version }}" + pull: true + volumes: + - "{{ znc_data_directory }}:/znc-data:rw" + - "/etc/timezone:/etc/timezone:ro" + ports: + - "{{ znc_port }}:6677" + env: + PUID: "{{ znc_user_id }}" + PGID: "{{ znc_group_id }}" + restart_policy: unless-stopped + memory: "{{ znc_memory }}" + labels: + traefik.enable: "{{ znc_available_externally | string }}" + traefik.http.routers.znc.rule: "Host(`{{ znc_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.znc.tls.certresolver: "letsencrypt" + traefik.http.routers.znc.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.znc.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.znc.loadbalancer.server.port: "6677" + when: znc_enabled is true + +- name: Stop ZNC + block: + - name: Stop ZNC + community.docker.docker_container: + name: "{{ znc_container_name }}" + state: absent + when: znc_enabled is false diff --git a/roles/znc/templates/znc.conf.j2 b/roles/znc/templates/znc.conf.j2 new file mode 100644 index 0000000000..edfb74b774 --- /dev/null +++ b/roles/znc/templates/znc.conf.j2 @@ -0,0 +1,35 @@ +// WARNING +// +// Do NOT edit this file while ZNC is running! +// Use webadmin or *controlpanel instead. +// +// Altering this file by hand will forfeit all support. +// +// But if you feel risky, you might want to read help on /znc saveconfig and /znc rehash. +// Also check https://wiki.znc.in/Configuration + +Version = 1.8.2 + + Port = 6677 + IPv4 = true + IPv6 = true + SSL = false + +LoadModule = webadmin + + + Pass = plain#{{ znc_user_password }} + Admin = true + Nick = {{ znc_user_nick }} + AltNick = {{ znc_user_altnick }} + Ident = {{ znc_user_ident }} + RealName = {{ znc_user_real_name }} + LoadModule = chansaver + LoadModule = controlpanel + LoadModule = webadmin + + + LoadModule = simple_away + Server = chat.freenode.net +6697 + + From ea989200186804b92ecdcfad4f6fd3d478b4435b Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 22:24:14 +0100 Subject: [PATCH 108/286] Fix lint --- roles/airsonic/molecule/default/verify.yml | 3 ++- roles/airsonic/molecule/default/verify_stopped.yml | 3 ++- roles/bazarr/molecule/default/verify.yml | 3 ++- roles/bazarr/molecule/default/verify_stopped.yml | 3 ++- roles/bitwarden/molecule/default/verify.yml | 3 ++- roles/bitwarden/molecule/default/verify_stopped.yml | 3 ++- roles/booksonic/molecule/default/verify.yml | 3 ++- roles/booksonic/molecule/default/verify_stopped.yml | 3 ++- roles/calibre/molecule/default/verify.yml | 3 ++- roles/calibre/molecule/default/verify_stopped.yml | 3 ++- roles/cloudcmd/molecule/default/verify.yml | 3 ++- roles/cloudcmd/molecule/default/verify_stopped.yml | 3 ++- roles/cloudflare_ddns/molecule/default/verify.yml | 3 ++- roles/cloudflare_ddns/molecule/default/verify_stopped.yml | 3 ++- roles/code-server/molecule/default/verify.yml | 3 ++- roles/code-server/molecule/default/verify_stopped.yml | 3 ++- roles/couchpotato/molecule/default/verify.yml | 3 ++- roles/couchpotato/molecule/default/verify_stopped.yml | 3 ++- roles/dashy/molecule/default/verify.yml | 3 ++- roles/dashy/molecule/default/verify_stopped.yml | 3 ++- roles/deluge/molecule/default/verify.yml | 3 ++- roles/deluge/molecule/default/verify_stopped.yml | 3 ++- roles/dokuwiki/molecule/default/verify.yml | 3 ++- roles/dokuwiki/molecule/default/verify_stopped.yml | 3 ++- roles/duplicacy/molecule/default/verify.yml | 3 ++- roles/duplicacy/molecule/default/verify_stopped.yml | 3 ++- roles/emby/molecule/default/verify.yml | 3 ++- roles/esphome/molecule/default/verify.yml | 3 ++- roles/esphome/molecule/default/verify_stopped.yml | 3 ++- roles/firefly/molecule/default/verify.yml | 3 ++- roles/firefly/molecule/default/verify_stopped.yml | 3 ++- roles/heimdall/molecule/default/verify.yml | 3 ++- roles/heimdall/molecule/default/verify_stopped.yml | 3 ++- roles/hello_world/molecule/default/verify.yml | 3 ++- roles/hello_world/molecule/default/verify_stopped.yml | 3 ++- roles/mealie/tasks/main.yml | 1 - roles/octoprint/molecule/default/molecule.yml | 1 - roles/tautulli/molecule/default/molecule.yml | 2 +- 38 files changed, 71 insertions(+), 38 deletions(-) diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index 5dc0a7c49e..4b3472e787 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index a642055718..2a42b6dd94 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Airsonic diff --git a/roles/bazarr/molecule/default/verify.yml b/roles/bazarr/molecule/default/verify.yml index b29244084d..65df9389fb 100644 --- a/roles/bazarr/molecule/default/verify.yml +++ b/roles/bazarr/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/bazarr/molecule/default/verify_stopped.yml b/roles/bazarr/molecule/default/verify_stopped.yml index 7b316fdbb3..a82a3746d1 100644 --- a/roles/bazarr/molecule/default/verify_stopped.yml +++ b/roles/bazarr/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bazarr diff --git a/roles/bitwarden/molecule/default/verify.yml b/roles/bitwarden/molecule/default/verify.yml index c62702be65..797499d0a1 100644 --- a/roles/bitwarden/molecule/default/verify.yml +++ b/roles/bitwarden/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/bitwarden/molecule/default/verify_stopped.yml b/roles/bitwarden/molecule/default/verify_stopped.yml index debe83588a..ca08d06444 100644 --- a/roles/bitwarden/molecule/default/verify_stopped.yml +++ b/roles/bitwarden/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bitwarden diff --git a/roles/booksonic/molecule/default/verify.yml b/roles/booksonic/molecule/default/verify.yml index 98400317b7..145ab469bf 100644 --- a/roles/booksonic/molecule/default/verify.yml +++ b/roles/booksonic/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/booksonic/molecule/default/verify_stopped.yml b/roles/booksonic/molecule/default/verify_stopped.yml index 7b68fe984a..aa5ad01896 100644 --- a/roles/booksonic/molecule/default/verify_stopped.yml +++ b/roles/booksonic/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Booksonic diff --git a/roles/calibre/molecule/default/verify.yml b/roles/calibre/molecule/default/verify.yml index 77267b9d52..b911fb6686 100644 --- a/roles/calibre/molecule/default/verify.yml +++ b/roles/calibre/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/calibre/molecule/default/verify_stopped.yml b/roles/calibre/molecule/default/verify_stopped.yml index bd3ccf6e30..3ee9c51f27 100644 --- a/roles/calibre/molecule/default/verify_stopped.yml +++ b/roles/calibre/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Calibre diff --git a/roles/cloudcmd/molecule/default/verify.yml b/roles/cloudcmd/molecule/default/verify.yml index abef5b4ac7..14dd662ae4 100644 --- a/roles/cloudcmd/molecule/default/verify.yml +++ b/roles/cloudcmd/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/cloudcmd/molecule/default/verify_stopped.yml b/roles/cloudcmd/molecule/default/verify_stopped.yml index 68ad0d3b93..b5beda3821 100644 --- a/roles/cloudcmd/molecule/default/verify_stopped.yml +++ b/roles/cloudcmd/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudcmd diff --git a/roles/cloudflare_ddns/molecule/default/verify.yml b/roles/cloudflare_ddns/molecule/default/verify.yml index 0e92e82ee9..bbcff3a651 100644 --- a/roles/cloudflare_ddns/molecule/default/verify.yml +++ b/roles/cloudflare_ddns/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml index e2273930e4..ea05fd7552 100644 --- a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml +++ b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudflare DDNS diff --git a/roles/code-server/molecule/default/verify.yml b/roles/code-server/molecule/default/verify.yml index 970070c650..0abf9488c6 100644 --- a/roles/code-server/molecule/default/verify.yml +++ b/roles/code-server/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/code-server/molecule/default/verify_stopped.yml b/roles/code-server/molecule/default/verify_stopped.yml index 5cba43ccf5..87973991d7 100644 --- a/roles/code-server/molecule/default/verify_stopped.yml +++ b/roles/code-server/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Code Server diff --git a/roles/couchpotato/molecule/default/verify.yml b/roles/couchpotato/molecule/default/verify.yml index 3031e9025e..c4acee8c49 100644 --- a/roles/couchpotato/molecule/default/verify.yml +++ b/roles/couchpotato/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/couchpotato/molecule/default/verify_stopped.yml b/roles/couchpotato/molecule/default/verify_stopped.yml index 213afef491..f9546dfe54 100644 --- a/roles/couchpotato/molecule/default/verify_stopped.yml +++ b/roles/couchpotato/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Couchpotato diff --git a/roles/dashy/molecule/default/verify.yml b/roles/dashy/molecule/default/verify.yml index 6c1bc594eb..dd68450bfa 100644 --- a/roles/dashy/molecule/default/verify.yml +++ b/roles/dashy/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/dashy/molecule/default/verify_stopped.yml b/roles/dashy/molecule/default/verify_stopped.yml index 1748897f7c..872ba4f4e6 100644 --- a/roles/dashy/molecule/default/verify_stopped.yml +++ b/roles/dashy/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dashy diff --git a/roles/deluge/molecule/default/verify.yml b/roles/deluge/molecule/default/verify.yml index 6d815a897f..021229fa8e 100644 --- a/roles/deluge/molecule/default/verify.yml +++ b/roles/deluge/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/deluge/molecule/default/verify_stopped.yml b/roles/deluge/molecule/default/verify_stopped.yml index 9d4abcbe0a..daa3bbe7b5 100644 --- a/roles/deluge/molecule/default/verify_stopped.yml +++ b/roles/deluge/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Deluge diff --git a/roles/dokuwiki/molecule/default/verify.yml b/roles/dokuwiki/molecule/default/verify.yml index 676a5e79c2..d5e4fd9a9c 100644 --- a/roles/dokuwiki/molecule/default/verify.yml +++ b/roles/dokuwiki/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/dokuwiki/molecule/default/verify_stopped.yml b/roles/dokuwiki/molecule/default/verify_stopped.yml index 60151b02c4..e8101a35c9 100644 --- a/roles/dokuwiki/molecule/default/verify_stopped.yml +++ b/roles/dokuwiki/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dokuwiki diff --git a/roles/duplicacy/molecule/default/verify.yml b/roles/duplicacy/molecule/default/verify.yml index 7eaee192b0..e1421406dc 100644 --- a/roles/duplicacy/molecule/default/verify.yml +++ b/roles/duplicacy/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/duplicacy/molecule/default/verify_stopped.yml b/roles/duplicacy/molecule/default/verify_stopped.yml index 487edf7010..bf7c63aa7b 100644 --- a/roles/duplicacy/molecule/default/verify_stopped.yml +++ b/roles/duplicacy/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Duplicacy diff --git a/roles/emby/molecule/default/verify.yml b/roles/emby/molecule/default/verify.yml index ce3037bff7..49fb383632 100644 --- a/roles/emby/molecule/default/verify.yml +++ b/roles/emby/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/esphome/molecule/default/verify.yml b/roles/esphome/molecule/default/verify.yml index a80b586783..12154f92fd 100644 --- a/roles/esphome/molecule/default/verify.yml +++ b/roles/esphome/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/esphome/molecule/default/verify_stopped.yml b/roles/esphome/molecule/default/verify_stopped.yml index dad14d096a..b92cbdd094 100644 --- a/roles/esphome/molecule/default/verify_stopped.yml +++ b/roles/esphome/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove EspHome diff --git a/roles/firefly/molecule/default/verify.yml b/roles/firefly/molecule/default/verify.yml index 7da64ee713..aa3877057d 100644 --- a/roles/firefly/molecule/default/verify.yml +++ b/roles/firefly/molecule/default/verify.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/firefly/molecule/default/verify_stopped.yml b/roles/firefly/molecule/default/verify_stopped.yml index eecb620322..831693bff7 100644 --- a/roles/firefly/molecule/default/verify_stopped.yml +++ b/roles/firefly/molecule/default/verify_stopped.yml @@ -3,7 +3,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Firefly diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml index fbeb602193..e812328e51 100644 --- a/roles/heimdall/molecule/default/verify.yml +++ b/roles/heimdall/molecule/default/verify.yml @@ -5,7 +5,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml index 2be7a52dce..1181dd362d 100644 --- a/roles/heimdall/molecule/default/verify_stopped.yml +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -5,7 +5,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Heimdall diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml index 1cf221a3a3..d0345f309c 100644 --- a/roles/hello_world/molecule/default/verify.yml +++ b/roles/hello_world/molecule/default/verify.yml @@ -5,7 +5,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml index 4f4cc4dd44..1360f1a481 100644 --- a/roles/hello_world/molecule/default/verify_stopped.yml +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -5,7 +5,8 @@ hosts: all gather_facts: false tasks: - - include_vars: + - name: Include vars + include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Hello World diff --git a/roles/mealie/tasks/main.yml b/roles/mealie/tasks/main.yml index 9978441c8c..7683d4f708 100644 --- a/roles/mealie/tasks/main.yml +++ b/roles/mealie/tasks/main.yml @@ -47,4 +47,3 @@ name: "{{ mealie_container_name }}" state: absent when: mealie_enabled is false - diff --git a/roles/octoprint/molecule/default/molecule.yml b/roles/octoprint/molecule/default/molecule.yml index 7d54b88fae..3589c73f90 100644 --- a/roles/octoprint/molecule/default/molecule.yml +++ b/roles/octoprint/molecule/default/molecule.yml @@ -16,4 +16,3 @@ platforms: cgroupns_mode: host privileged: true pre_build_image: true - diff --git a/roles/tautulli/molecule/default/molecule.yml b/roles/tautulli/molecule/default/molecule.yml index 00030527cb..e21b67bad5 100644 --- a/roles/tautulli/molecule/default/molecule.yml +++ b/roles/tautulli/molecule/default/molecule.yml @@ -4,4 +4,4 @@ provisioner: group_vars: all: tautulli_enabled: true - plex_logs: "/tmp/log" \ No newline at end of file + plex_logs: "/tmp/log" From 5409640a1244778b0622cb2d0cb1a09f7ac96380 Mon Sep 17 00:00:00 2001 From: Anarion Date: Fri, 10 Mar 2023 22:36:46 +0100 Subject: [PATCH 109/286] Fix timemachine and its tests --- roles/timemachine/handlers/main.yml | 6 ++++++ roles/timemachine/molecule/default/molecule.yml | 10 ++++++++++ roles/timemachine/tasks/main.yml | 7 ++----- 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 roles/timemachine/handlers/main.yml diff --git a/roles/timemachine/handlers/main.yml b/roles/timemachine/handlers/main.yml new file mode 100644 index 0000000000..4e1a1ff1b2 --- /dev/null +++ b/roles/timemachine/handlers/main.yml @@ -0,0 +1,6 @@ +--- +- name: Reload Avahi Configuration + ansible.builtin.service: + name: avahi-daemon + state: reloaded + listen: "reload avahi configuration" diff --git a/roles/timemachine/molecule/default/molecule.yml b/roles/timemachine/molecule/default/molecule.yml index 79d6365554..4beec8085e 100644 --- a/roles/timemachine/molecule/default/molecule.yml +++ b/roles/timemachine/molecule/default/molecule.yml @@ -4,3 +4,13 @@ provisioner: group_vars: all: timemachine_enabled: true +platforms: + - name: instance + image: geerlingguy/docker-ubuntu2204-ansible:latest + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + - /var/run/docker.sock:/var/run/docker.sock + cgroupns_mode: host + command: "/usr/sbin/init" + privileged: true + pre_build_image: true diff --git a/roles/timemachine/tasks/main.yml b/roles/timemachine/tasks/main.yml index 85f735cd0a..a05bd01f2a 100644 --- a/roles/timemachine/tasks/main.yml +++ b/roles/timemachine/tasks/main.yml @@ -30,6 +30,7 @@ ansible.builtin.apt: name: "avahi-daemon" state: present + update_cache: yes register: result until: result is succeeded @@ -37,11 +38,7 @@ ansible.builtin.template: src: timemachine.service dest: "/etc/avahi/services/timemachine.service" - - - name: Reload avahi configuration - ansible.builtin.service: - name: avahi-daemon - state: reloaded + notify: reload avahi configuration when: timemachine_enabled is true - name: Stop Time Machine From 7e1149beaac8659c52acfeda9919a494c658f7cb Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 13:21:09 +0100 Subject: [PATCH 110/286] Fix grafana test idempotence --- roles/stats/tasks/grafana.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/roles/stats/tasks/grafana.yml b/roles/stats/tasks/grafana.yml index 7d6b8b67c0..cb0a5492a6 100644 --- a/roles/stats/tasks/grafana.yml +++ b/roles/stats/tasks/grafana.yml @@ -7,6 +7,7 @@ state: directory owner: "472" recurse: yes + changed_when: false with_items: - "{{ stats_grafana_data_directory }}" - "{{ stats_grafana_config_directory }}" From 59958915aab05fb775f0fda668d67b7e98f60e17 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 13:58:05 +0100 Subject: [PATCH 111/286] Fix traefik test --- roles/traefik/molecule/default/molecule.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/traefik/molecule/default/molecule.yml b/roles/traefik/molecule/default/molecule.yml index c083c5c267..9e1a5958d9 100644 --- a/roles/traefik/molecule/default/molecule.yml +++ b/roles/traefik/molecule/default/molecule.yml @@ -12,7 +12,7 @@ platforms: volumes: - /sys/fs/cgroup:/sys/fs/cgroup:rw - /var/run/docker.sock:/var/run/docker.sock - - /dev/null:/dev/null + - /tmp:/tmp cgroupns_mode: host privileged: true pre_build_image: true From 4b70a087dac3292e7aebd512b2146666a515911a Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 14:14:51 +0100 Subject: [PATCH 112/286] Remove .code-workspace --- ansible-nas.code-workspace | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 ansible-nas.code-workspace diff --git a/ansible-nas.code-workspace b/ansible-nas.code-workspace deleted file mode 100644 index cec4ab85f1..0000000000 --- a/ansible-nas.code-workspace +++ /dev/null @@ -1,15 +0,0 @@ -{ - "folders": [ - { - "path": "." - } - ], - "settings": { - "yaml.schemas": { - "https://raw.githubusercontent.com/ansible/ansible-lint/main/src/ansiblelint/schemas/ansible.json#/$defs/tasks": "file:///c%3A/Users/anarion/Documents/repos/ansible-nas/roles/immich/tasks/main.yml" - }, - "files.associations": { - "*.yaml": "home-assistant" - } - }, -} \ No newline at end of file From 4b5218986193f45490b6c5bbfe6e54b280fda36e Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 14:31:35 +0100 Subject: [PATCH 113/286] Add network to miniflux --- roles/miniflux/defaults/main.yml | 1 + roles/miniflux/tasks/main.yml | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/roles/miniflux/defaults/main.yml b/roles/miniflux/defaults/main.yml index 010223fd2e..b89a8fc427 100644 --- a/roles/miniflux/defaults/main.yml +++ b/roles/miniflux/defaults/main.yml @@ -12,6 +12,7 @@ miniflux_admin_password: supersecure # network miniflux_hostname: "miniflux" +miniflux_network_name: "miniflux" miniflux_port: "8070" # docker diff --git a/roles/miniflux/tasks/main.yml b/roles/miniflux/tasks/main.yml index 664813df37..f70b1c91b3 100644 --- a/roles/miniflux/tasks/main.yml +++ b/roles/miniflux/tasks/main.yml @@ -8,12 +8,19 @@ with_items: - "{{ miniflux_data_directory }}/postgres" + - name: Create Miniflux network + community.docker.docker_network: + name: "{{ miniflux_network_name }}" + - name: Create Postgres for Miniflux community.docker.docker_container: container_default_behavior: no_defaults name: "{{ miniflux_db_container_name }}" image: "{{ miniflux_db_image_name }}:{{ miniflux_db_image_version }}" pull: true + networks: + - name: "{{ miniflux_network_name }}" + network_mode: "{{ miniflux_network_name }}" volumes: - "{{ miniflux_data_directory }}/postgres:/var/lib/postgresql/data:rw" env: @@ -28,12 +35,13 @@ name: "{{ miniflux_container_name }}" image: "{{ miniflux_image_name }}:{{ miniflux_image_version }}" pull: true - links: - - miniflux-postgres:db + networks: + - name: "{{ miniflux_network_name }}" + network_mode: "{{ miniflux_network_name }}" ports: - "{{ miniflux_port }}:8080" env: - DATABASE_URL: "postgres://miniflux:supersecure@db/miniflux?sslmode=disable" + DATABASE_URL: "postgres://miniflux:supersecure@{{ miniflux_db_container_name }}/miniflux?sslmode=disable" RUN_MIGRATIONS: "1" CREATE_ADMIN: "1" ADMIN_USERNAME: "{{ miniflux_admin_username }}" From 150f90ad61bc3a3311723dda1658a3aa2b3c2503 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 14:35:56 +0100 Subject: [PATCH 114/286] Remove comments --- roles/nomad/tasks/main.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index f0ea6b28f0..2b19bf722f 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -5,18 +5,12 @@ ansible.builtin.get_url: url: https://apt.releases.hashicorp.com/gpg dest: /etc/apt/trusted.gpg.d/hashicorp.asc - # dest: /usr/share/keyrings/hashicorp-nomad-keyring.gpg mode: '0644' force: true - # - name: Add Hashicorp GPG key - # ansible.builtin.apt_key: - # url: https://apt.releases.hashicorp.com/gpg - # state: present - name: Add Hashicorp apt repository ansible.builtin.apt_repository: repo: "deb https://apt.releases.hashicorp.com {{ ansible_facts['lsb']['codename'] }} main" - # repo: "deb [arch=amd64 signed-by=/usr/share/keyrings/hashicorp-nomad-keyring.gpg] https://apt.releases.hashicorp.com {{ ansible_facts['lsb']['codename'] }} main" state: present filename: hashicorp From 12461c1d63048456701f6a66acd55af3b7489fa6 Mon Sep 17 00:00:00 2001 From: Anarion Date: Sat, 11 Mar 2023 14:52:30 +0100 Subject: [PATCH 115/286] Fix website docs lint --- roles/thelounge/docs/thelounge.md | 1 - roles/timemachine/docs/timemachine.md | 1 - roles/transmission-with-openvpn/docs/transmission.md | 1 - roles/transmission/docs/transmission.md | 1 - 4 files changed, 4 deletions(-) diff --git a/roles/thelounge/docs/thelounge.md b/roles/thelounge/docs/thelounge.md index 2dadc2120b..1b15ea7098 100644 --- a/roles/thelounge/docs/thelounge.md +++ b/roles/thelounge/docs/thelounge.md @@ -1,6 +1,5 @@ # The Lounge" - Homepage: The Lounge is a self-hosted web IRC client. diff --git a/roles/timemachine/docs/timemachine.md b/roles/timemachine/docs/timemachine.md index 468ca43ff5..37c2cbc723 100644 --- a/roles/timemachine/docs/timemachine.md +++ b/roles/timemachine/docs/timemachine.md @@ -1,6 +1,5 @@ # Time Machine - Apple docs: Docker image: diff --git a/roles/transmission-with-openvpn/docs/transmission.md b/roles/transmission-with-openvpn/docs/transmission.md index aa79341ef6..456e741dfa 100644 --- a/roles/transmission-with-openvpn/docs/transmission.md +++ b/roles/transmission-with-openvpn/docs/transmission.md @@ -1,6 +1,5 @@ # Transmission - Homepage: Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects diff --git a/roles/transmission/docs/transmission.md b/roles/transmission/docs/transmission.md index aa79341ef6..456e741dfa 100644 --- a/roles/transmission/docs/transmission.md +++ b/roles/transmission/docs/transmission.md @@ -1,6 +1,5 @@ # Transmission - Homepage: Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects From bab7d34afef1f91f14332a857832e9c62bbc41f0 Mon Sep 17 00:00:00 2001 From: Shawn Treichel Date: Sat, 18 Mar 2023 17:06:49 -0500 Subject: [PATCH 116/286] Update installation.md Fix Ubutu typo --- website/docs/getting-started/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/getting-started/installation.md b/website/docs/getting-started/installation.md index 5ace4e903a..10e7e20c21 100644 --- a/website/docs/getting-started/installation.md +++ b/website/docs/getting-started/installation.md @@ -9,7 +9,7 @@ Ansible-NAS is an Ansible playbook that sets up applications of your choice on y ## Requirements - A Linux environment with Ansible installed (in Ansible terms the "control node"). See the official [Installing Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) docs for more info. -- SSH access to an Ubuntu 22.04 server that'll become your Ansible-NAS box. It's recommended to use a fresh Ubutu Server 22.04 installation. Do not use non-LTS releases. +- SSH access to an Ubuntu 22.04 server that'll become your Ansible-NAS box. It's recommended to use a fresh Ubuntu Server 22.04 installation. Do not use non-LTS releases. :::tip From 9f3f684d01ed65080c1974d835434c7f8753f017 Mon Sep 17 00:00:00 2001 From: Anarion Date: Tue, 28 Mar 2023 13:09:42 +0200 Subject: [PATCH 117/286] =?UTF-8?q?=E2=9C=85=20Update=20Nomad=20test=20to?= =?UTF-8?q?=20check=20variable=20service=20name?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roles/nomad/molecule/default/verify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/nomad/molecule/default/verify.yml b/roles/nomad/molecule/default/verify.yml index 717a7d473d..2efc7cd6e6 100644 --- a/roles/nomad/molecule/default/verify.yml +++ b/roles/nomad/molecule/default/verify.yml @@ -9,7 +9,7 @@ - name: Get Nomad service state ansible.builtin.systemd: - name: nomad + name: "{{ nomad_service_name }}" state: started register: service_result From d0b6fcbb9fac89edc03f5aa4bc8df97e7c8529c5 Mon Sep 17 00:00:00 2001 From: Anarion Date: Tue, 28 Mar 2023 13:19:33 +0200 Subject: [PATCH 118/286] =?UTF-8?q?=F0=9F=93=9D=20Remove=20docs=20in=20pre?= =?UTF-8?q?paration=20to=20git=20cp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roles/freshrss/docs/freshrss.md | 21 ------ roles/get_iplayer/docs/get_iplayer.md | 11 ---- roles/gitea/docs/gitea.md | 11 ---- roles/gitlab/docs/gitlab.md | 13 ---- roles/glances/docs/glances.md | 15 ----- roles/gotify/docs/gotify.md | 16 ----- roles/guacamole/docs/guacamole.md | 17 ----- roles/healthchecks.io/docs/healthchecks.io.md | 11 ---- roles/heimdall/docs/heimdall.md | 15 ----- roles/homeassistant/docs/homeassistant.md | 13 ---- roles/homebridge/docs/homebridge.md | 11 ---- roles/jackett/docs/jackett.md | 11 ---- roles/jellyfin/docs/jellyfin.md | 65 ------------------- roles/joomla/docs/joomla.md | 23 ------- roles/komga/docs/komga.md | 13 ---- roles/krusader/docs/krusader.md | 13 ---- roles/lidarr/docs/lidarr.md | 9 --- roles/mealie/docs/mealie.md | 11 ---- .../minecraft-server/docs/minecraft-server.md | 13 ---- roles/minidlna/docs/minidlna.md | 11 ---- roles/miniflux/docs/miniflux.md | 15 ----- roles/mosquitto/docs/mosquitto.md | 9 --- roles/mylar/docs/mylar.md | 15 ----- roles/mymediaforalexa/docs/mymediaforalexa.md | 11 ---- roles/n8n/docs/n8n.md | 18 ----- roles/navidrome/docs/navidrome.md | 11 ---- roles/netbootxyz/docs/netbootxyz.md | 15 ----- roles/netdata/docs/netdata.md | 11 ---- roles/nextcloud/docs/nextcloud.md | 25 ------- roles/nomad/docs/nomad.md | 11 ---- roles/nzbget/docs/nzbget.md | 11 ---- roles/octoprint/docs/octoprint.md | 11 ---- roles/ombi/docs/ombi.md | 9 --- roles/openhab/docs/openhab.md | 15 ----- roles/organizr/docs/organizr.md | 15 ----- roles/overseerr/docs/overseerr.md | 13 ---- roles/paperless_ng/docs/paperless_ng.md | 23 ------- roles/piwigo/docs/piwigo.md | 28 -------- roles/plex/docs/plex.md | 16 ----- roles/portainer/docs/portainer.md | 9 --- roles/prowlarr/docs/prowlarr.md | 15 ----- roles/pyload/docs/pyload.md | 16 ----- roles/pytivo/docs/pytivo.md | 30 --------- roles/radarr/docs/radarr.md | 22 ------- roles/route53_ddns/docs/route53_ddns.md | 40 ------------ roles/rssbridge/docs/rssbridge.md | 13 ---- roles/sabnzbd/docs/sabnzbd.md | 11 ---- roles/sickchill/docs/sickchill.md | 12 ---- roles/sonarr/docs/sonarr.md | 22 ------- roles/speedtest-tracker/docs/speedtest.md | 15 ----- roles/stats/docs/stats.md | 13 ---- roles/syncthing/docs/syncthing.md | 27 -------- roles/tautulli/docs/tautulli.md | 11 ---- roles/thelounge/docs/thelounge.md | 15 ----- roles/tiddlywiki/docs/tiddlywiki.md | 34 ---------- roles/timemachine/docs/timemachine.md | 28 -------- roles/traefik/docs/traefik.md | 20 ------ .../docs/transmission.md | 25 ------- roles/transmission/docs/transmission.md | 25 ------- roles/ubooquity/docs/ubooquity.md | 25 ------- roles/utorrent/docs/utorrent.md | 15 ----- roles/virtual_desktop/docs/virtual_desktop.md | 30 --------- roles/wallabag/docs/wallabag.md | 17 ----- roles/watchtower/docs/watchtower.md | 15 ----- roles/wireshark/docs/wireshark.md | 11 ---- roles/woodpecker-ci/docs/woodpecker_ci.md | 17 ----- .../docs/youtubedlmaterial.md | 17 ----- roles/znc/docs/znc.md | 11 ---- 68 files changed, 1166 deletions(-) delete mode 100644 roles/freshrss/docs/freshrss.md delete mode 100644 roles/get_iplayer/docs/get_iplayer.md delete mode 100644 roles/gitea/docs/gitea.md delete mode 100644 roles/gitlab/docs/gitlab.md delete mode 100644 roles/glances/docs/glances.md delete mode 100644 roles/gotify/docs/gotify.md delete mode 100644 roles/guacamole/docs/guacamole.md delete mode 100644 roles/healthchecks.io/docs/healthchecks.io.md delete mode 100644 roles/heimdall/docs/heimdall.md delete mode 100644 roles/homeassistant/docs/homeassistant.md delete mode 100644 roles/homebridge/docs/homebridge.md delete mode 100644 roles/jackett/docs/jackett.md delete mode 100644 roles/jellyfin/docs/jellyfin.md delete mode 100644 roles/joomla/docs/joomla.md delete mode 100644 roles/komga/docs/komga.md delete mode 100644 roles/krusader/docs/krusader.md delete mode 100644 roles/lidarr/docs/lidarr.md delete mode 100644 roles/mealie/docs/mealie.md delete mode 100644 roles/minecraft-server/docs/minecraft-server.md delete mode 100644 roles/minidlna/docs/minidlna.md delete mode 100644 roles/miniflux/docs/miniflux.md delete mode 100644 roles/mosquitto/docs/mosquitto.md delete mode 100644 roles/mylar/docs/mylar.md delete mode 100644 roles/mymediaforalexa/docs/mymediaforalexa.md delete mode 100644 roles/n8n/docs/n8n.md delete mode 100644 roles/navidrome/docs/navidrome.md delete mode 100644 roles/netbootxyz/docs/netbootxyz.md delete mode 100644 roles/netdata/docs/netdata.md delete mode 100644 roles/nextcloud/docs/nextcloud.md delete mode 100644 roles/nomad/docs/nomad.md delete mode 100644 roles/nzbget/docs/nzbget.md delete mode 100644 roles/octoprint/docs/octoprint.md delete mode 100644 roles/ombi/docs/ombi.md delete mode 100644 roles/openhab/docs/openhab.md delete mode 100644 roles/organizr/docs/organizr.md delete mode 100644 roles/overseerr/docs/overseerr.md delete mode 100644 roles/paperless_ng/docs/paperless_ng.md delete mode 100644 roles/piwigo/docs/piwigo.md delete mode 100644 roles/plex/docs/plex.md delete mode 100644 roles/portainer/docs/portainer.md delete mode 100644 roles/prowlarr/docs/prowlarr.md delete mode 100644 roles/pyload/docs/pyload.md delete mode 100644 roles/pytivo/docs/pytivo.md delete mode 100644 roles/radarr/docs/radarr.md delete mode 100644 roles/route53_ddns/docs/route53_ddns.md delete mode 100644 roles/rssbridge/docs/rssbridge.md delete mode 100644 roles/sabnzbd/docs/sabnzbd.md delete mode 100644 roles/sickchill/docs/sickchill.md delete mode 100644 roles/sonarr/docs/sonarr.md delete mode 100644 roles/speedtest-tracker/docs/speedtest.md delete mode 100644 roles/stats/docs/stats.md delete mode 100644 roles/syncthing/docs/syncthing.md delete mode 100644 roles/tautulli/docs/tautulli.md delete mode 100644 roles/thelounge/docs/thelounge.md delete mode 100644 roles/tiddlywiki/docs/tiddlywiki.md delete mode 100644 roles/timemachine/docs/timemachine.md delete mode 100644 roles/traefik/docs/traefik.md delete mode 100644 roles/transmission-with-openvpn/docs/transmission.md delete mode 100644 roles/transmission/docs/transmission.md delete mode 100644 roles/ubooquity/docs/ubooquity.md delete mode 100644 roles/utorrent/docs/utorrent.md delete mode 100644 roles/virtual_desktop/docs/virtual_desktop.md delete mode 100644 roles/wallabag/docs/wallabag.md delete mode 100644 roles/watchtower/docs/watchtower.md delete mode 100644 roles/wireshark/docs/wireshark.md delete mode 100644 roles/woodpecker-ci/docs/woodpecker_ci.md delete mode 100644 roles/youtubedlmaterial/docs/youtubedlmaterial.md delete mode 100644 roles/znc/docs/znc.md diff --git a/roles/freshrss/docs/freshrss.md b/roles/freshrss/docs/freshrss.md deleted file mode 100644 index d9cc30c990..0000000000 --- a/roles/freshrss/docs/freshrss.md +++ /dev/null @@ -1,21 +0,0 @@ -# Freshrss - -Homepage: - -FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed. - -It is lightweight, easy to work with, powerful, and customizable. - -It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface. - -Thanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc. - -FreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed. - -Finally, it supports extensions for further tuning. - -## Usage - -Set `freshrss_enabled: true` in your `inventories//nas.yml` file. - -The FreshRSS web interface can be found at . diff --git a/roles/get_iplayer/docs/get_iplayer.md b/roles/get_iplayer/docs/get_iplayer.md deleted file mode 100644 index 48173c248d..0000000000 --- a/roles/get_iplayer/docs/get_iplayer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Get_iPlayer - -Homepage: - -Downloads TV and radio programmes from BBC iPlayer. - -## Usage - -Set `get_iplayer_enabled: true` in your `inventories//nas.yml` file. - -The get_iplayer web interface can be found at . diff --git a/roles/gitea/docs/gitea.md b/roles/gitea/docs/gitea.md deleted file mode 100644 index ed2a20144b..0000000000 --- a/roles/gitea/docs/gitea.md +++ /dev/null @@ -1,11 +0,0 @@ -# Gitea - -Homepage: - -Gitea is a painless self-hosted Git service. - -## Usage - -Set `gitea_enabled: true` in your `inventories//nas.yml` file. - -The Gitea web interface can be found at . diff --git a/roles/gitlab/docs/gitlab.md b/roles/gitlab/docs/gitlab.md deleted file mode 100644 index f1b6873fdd..0000000000 --- a/roles/gitlab/docs/gitlab.md +++ /dev/null @@ -1,13 +0,0 @@ -# GitLab - -Homepage: - -If Gitea isn't powerful enough for you then consider GitLab. It's a much more powerful (and consequently bigger) Git repository solution that includes a suite of code analytics. On the other hand it requires more RAM. - -## Usage - -Set `gitlab_enabled: true` in your `inventories//nas.yml` file. - -To make GitLab available externally via Traefik set `gitlab_available_externally: true` in your `inventories//nas.yml` file. - -The first time you run GitLab you'll be prompted for an account's password. The password is for GitLab's `root` administrator account. From there you can log in to create additional users and further configure the application. diff --git a/roles/glances/docs/glances.md b/roles/glances/docs/glances.md deleted file mode 100644 index 382a549044..0000000000 --- a/roles/glances/docs/glances.md +++ /dev/null @@ -1,15 +0,0 @@ -# Glances - -Homepage: - -Glances is a cross-platform system monitoring tool written in Python. - -## Usage - -Set `glances_enabled: true` in your `inventories//nas.yml` file. - -The Glances web interface can be found at . - -## Specific Configuration - -Glances can be integrated with InfluxDB and Grafana. diff --git a/roles/gotify/docs/gotify.md b/roles/gotify/docs/gotify.md deleted file mode 100644 index a440b5df41..0000000000 --- a/roles/gotify/docs/gotify.md +++ /dev/null @@ -1,16 +0,0 @@ -# Gotify - -Homepage: - -A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui) - -## Usage - -Set `gotify_enabled: true` in your `inventories//nas.yml` file. - -The Gotify web interface can be found at . - -Android client: [https://play.google.com/store/apps/details?id=com.github.gotify](https://play.google.com/store/apps/details?id=com.github.gotify) -iOS client: n/a -Chrome extension: n/a -Firefox extension: diff --git a/roles/guacamole/docs/guacamole.md b/roles/guacamole/docs/guacamole.md deleted file mode 100644 index 11e022e36d..0000000000 --- a/roles/guacamole/docs/guacamole.md +++ /dev/null @@ -1,17 +0,0 @@ -# Guacamole - -Homepage: - -Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. - -## Usage - -Set `guacamole_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -The default username and password is `guacadmin`. Change it! - -## What to connect to? - -You can run a virtual desktop from your Ansible-NAS box, check out the [Virtual Desktop docs](virtual_desktop.md). diff --git a/roles/healthchecks.io/docs/healthchecks.io.md b/roles/healthchecks.io/docs/healthchecks.io.md deleted file mode 100644 index 3c9db8ebaf..0000000000 --- a/roles/healthchecks.io/docs/healthchecks.io.md +++ /dev/null @@ -1,11 +0,0 @@ -# Healthchecks.io - -Homepage: - -A simple cronjob that uses `curl` to ping a given endpoint on the `healthchecks.io` servers. You can choose how often it should ping the endpoint, and what happens when it doesn't. Email/Slack/Telegram and many more services can be integrated. - -## Usage - -Create your own project on , and set both the time between pings and the grace time. Set your prefered integration such as email. - -Set `healthchecks_enabled: true` in your `inventories//nas.yml` file, and if your time between pings is different than the default `healthchecks_ping_minutes`, change it. Finally, set your ping url in the `healthchecks_url` variable. diff --git a/roles/heimdall/docs/heimdall.md b/roles/heimdall/docs/heimdall.md deleted file mode 100644 index ff2417ddef..0000000000 --- a/roles/heimdall/docs/heimdall.md +++ /dev/null @@ -1,15 +0,0 @@ -# Heimdall - -Homepage: - -Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like - -## Usage - -Set `heimdall_enabled: true` in your `inventories//nas.yml` file. - -The Heimdall web interface can be found at . - -## Specific Configuration - -Heimdall defaults to port 10080 - some browsers block this port. Override `heimdall_port_http` to move it somewhere else. diff --git a/roles/homeassistant/docs/homeassistant.md b/roles/homeassistant/docs/homeassistant.md deleted file mode 100644 index f7163cb25b..0000000000 --- a/roles/homeassistant/docs/homeassistant.md +++ /dev/null @@ -1,13 +0,0 @@ -# Home Assistant - -Homepage: - -Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. - -## Usage - -Set `homeassistant_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Home Assistant externally, don't forget to set `homeassistant_available_externally: true` in your `inventories//nas.yml` file. - -The Home Assistant web interface can be found at . diff --git a/roles/homebridge/docs/homebridge.md b/roles/homebridge/docs/homebridge.md deleted file mode 100644 index cbb9b329bc..0000000000 --- a/roles/homebridge/docs/homebridge.md +++ /dev/null @@ -1,11 +0,0 @@ -# Homebridge - -Homepage: - -Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices. - -## Usage - -Set `homebridge_enabled: true` in your `inventories//nas.yml` file. - -The Homebridge web interface can be found at . The default username and password is 'admin' - change this after your first login! diff --git a/roles/jackett/docs/jackett.md b/roles/jackett/docs/jackett.md deleted file mode 100644 index 919d8daa8b..0000000000 --- a/roles/jackett/docs/jackett.md +++ /dev/null @@ -1,11 +0,0 @@ -# Jackett - -Homepage: - -Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, qBittorrent, Nefarious etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. - -## Usage - -Set `jackett_enabled: true` in your `inventories//nas.yml` file. - -The Jackett web interface can be found at . diff --git a/roles/jellyfin/docs/jellyfin.md b/roles/jellyfin/docs/jellyfin.md deleted file mode 100644 index dfe89533b1..0000000000 --- a/roles/jellyfin/docs/jellyfin.md +++ /dev/null @@ -1,65 +0,0 @@ -# Jellyfin - -Homepage: - -Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! - -Note that [Plex](https://www.plex.tv/), also included in Ansible-NAS, has a very -similar functionality. - -## Usage - -Set `jellyfin_enabled: true` in your `inventories//nas.yml` file. There are further -parameters you can edit such as `movies_root`, `tv_root` or `music_root` lower down - -## Specific Configuration - -The jellyfin web interface can be found at port 8896 (http) or 8928 (https, if -configured) of your NAS. - -By default, Ansible-NAS gives jellyfin read/write access to the folders where your -movies, TV shows and music are stored. To change this to read-only, edit the following -lines in `all.yml`: - -```yaml - jellyfin_movies_permissions: "rw" - jellyfin_tv_permissions: "rw" - jellyfin_books_permissions: "rw" - jellyfin_audiobooks_permissions: "rw" - jellyfin_music_permissions: "rw" -``` - -so that they end in `ro` instead of `rw`. Note that jellyfin will not be able to -delete files then, which might be exactly what you want. However, you will not -have the option to store cover art in the related folders. Always leave the -configuration directory read/write - -## Naming movies and TV shows - -jellyfin is very fussy about how movies and TV shows must be named to enable -automatic downloads of cover art and metadata. In short, movie files should -follow how movies are listed in the [IMDb](https://www.imdb.com/), including the -year of publication: - -```raw - movies/Bride of Frankenstein (1935).mp4 -``` - -Note the spaces. You should probably remove colons and other special characters -TV shows require a folder structure with the name of the series - again if -possible with the year of publication - followed by sub-folders for the -individual seasons. For example, the first episode of the first season of -the original "Doctor Who" could be stored as: - -```raw - tv/Doctor Who (1963)/Season 1/Doctor Who - s01e01.mp4 -``` - -The [TVDB](https://www.thetvdb.com/) is one source for the exact names of TV -shows. - -Unfortunately, there are number of special cases, especially related to split -movies and older series. See the [movie -naming](https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming) and [TV -naming](https://github.com/MediaBrowser/Wiki/wiki/TV-naming) guides for further -information. diff --git a/roles/joomla/docs/joomla.md b/roles/joomla/docs/joomla.md deleted file mode 100644 index e0ad95a4c1..0000000000 --- a/roles/joomla/docs/joomla.md +++ /dev/null @@ -1,23 +0,0 @@ -# Joomla - -Homepage: - -Joomla! is an award-winning content management system (CMS), which enables you to build web sites and powerful online applications. - -## Usage - -Set `joomla_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Joomla externally, set `joomla_available_externally: true` in your `inventories//nas.yml` file. - -The Joomla web interface can be found at . - -## Specific Configuration - -- Set `joomla_database_password` in your `all.yml` before installing Joomla. - -- On first run you'll need to enter database details: - - Host: `mysql` - - Database: `joomla` - - Username: `root` - - Password: whatever you set for `joomla_database_password`. diff --git a/roles/komga/docs/komga.md b/roles/komga/docs/komga.md deleted file mode 100644 index 3c0b3c7de7..0000000000 --- a/roles/komga/docs/komga.md +++ /dev/null @@ -1,13 +0,0 @@ -# Komga - -Homepage: - -Docker Image: - -Komga is a media server for your comics, mangas, BDs and magazines. - -## Usage - -Set `komga_enabled: true` in your `inventories//nas.yml` file. - -Access the webui at by default. diff --git a/roles/krusader/docs/krusader.md b/roles/krusader/docs/krusader.md deleted file mode 100644 index fc020a1077..0000000000 --- a/roles/krusader/docs/krusader.md +++ /dev/null @@ -1,13 +0,0 @@ -# Krusader - -Homepage: - -Docker Container: [Krusader](https://hub.docker.com/r/djaydev/krusader) - -Krusader provides twin panel file management for your ansible-nas via browser and VNC. - -## Usage - -Set `krusader_enabled: true` in your `inventories//nas.yml` file. - -The Krusader web interface can be found at . diff --git a/roles/lidarr/docs/lidarr.md b/roles/lidarr/docs/lidarr.md deleted file mode 100644 index 3956445491..0000000000 --- a/roles/lidarr/docs/lidarr.md +++ /dev/null @@ -1,9 +0,0 @@ -# Lidarr - -Homepage: - -Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. - -## Usage - -Set `lidarr_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/mealie/docs/mealie.md b/roles/mealie/docs/mealie.md deleted file mode 100644 index 6e6a1c265a..0000000000 --- a/roles/mealie/docs/mealie.md +++ /dev/null @@ -1,11 +0,0 @@ -# Mealie - -Homepage: - -A self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. - -## Usage - -Set `mealie_enabled: true` in your `inventories//nas.yml` file. - -The Mealie web interface can be found at . diff --git a/roles/minecraft-server/docs/minecraft-server.md b/roles/minecraft-server/docs/minecraft-server.md deleted file mode 100644 index e2ac52f8c0..0000000000 --- a/roles/minecraft-server/docs/minecraft-server.md +++ /dev/null @@ -1,13 +0,0 @@ -# Minecraft Server - -Homepage: - -The server version of the game Minecraft, running in a container. "Prepare for an adventure of limitless possibilities as you build, mine, battle mobs, and explore the ever-changing Minecraft landscape." - -## Usage - -Set `minecraft_server_enabled: true` in your `inventories//nas.yml` file. - -The Ansible NAS host or ip address should then be usable as a server within the Minecraft multiplayer game menu. - -The image `itzg/minecraft-server` has [documentation](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) with further details on how to manage the Minecraft server instance. diff --git a/roles/minidlna/docs/minidlna.md b/roles/minidlna/docs/minidlna.md deleted file mode 100644 index 1f030d3d15..0000000000 --- a/roles/minidlna/docs/minidlna.md +++ /dev/null @@ -1,11 +0,0 @@ -# MiniDLNA - -Homepage: - -MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP clients. The MiniDNLA daemon serves media files (music, pictures, and video) to clients on a network. Example clients include applications such as Totem and Kodi, and devices such as portable media players, Smartphones, Televisions, and gaming systems (such as PS3 and Xbox 360). - -## Usage - -Set `minidlna_enabled: true` in your `inventories//nas.yml` file. - -The very basic MiniDLNA web interface can be found at . diff --git a/roles/miniflux/docs/miniflux.md b/roles/miniflux/docs/miniflux.md deleted file mode 100644 index 92890158b9..0000000000 --- a/roles/miniflux/docs/miniflux.md +++ /dev/null @@ -1,15 +0,0 @@ -# Miniflux - -Homepage: - -Miniflux is a minimalist and opinionated feed reader. - -## Usage - -Set `miniflux_enabled: true` in your `inventories//nas.yml` file. - -The Miniflux web interface can be found at , the default username is `admin` and password `supersecure`. - -## Specific Configuration - -An admin user will be created with the username and password of `miniflux_admin_username` and `miniflux_admin_password` respectively. These can be found in the Miniflux section within `all.yml.dist`. diff --git a/roles/mosquitto/docs/mosquitto.md b/roles/mosquitto/docs/mosquitto.md deleted file mode 100644 index 4015613e01..0000000000 --- a/roles/mosquitto/docs/mosquitto.md +++ /dev/null @@ -1,9 +0,0 @@ -# Mosquitto - -Homepage: - -Mosquitto is a lightweight open source MQTT message broker. - -## Usage - -Set `mosquitto_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/mylar/docs/mylar.md b/roles/mylar/docs/mylar.md deleted file mode 100644 index 0ddf2e913c..0000000000 --- a/roles/mylar/docs/mylar.md +++ /dev/null @@ -1,15 +0,0 @@ -# Mylar - -Homepage: - -Docker Container: - -An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents - -## Usage - -Set `mylar_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Mylar externally, don't forget to set `mylar_available_externally: true` in your `inventories//nas.yml` file. - -The Mylar web interface can be found at . diff --git a/roles/mymediaforalexa/docs/mymediaforalexa.md b/roles/mymediaforalexa/docs/mymediaforalexa.md deleted file mode 100644 index 174f19d71c..0000000000 --- a/roles/mymediaforalexa/docs/mymediaforalexa.md +++ /dev/null @@ -1,11 +0,0 @@ -# My Media for Alexa - -Homepage: - -My Media lets you stream your music collection to your Amazon Echo or Amazon Dot without having to upload all your music collection to the Cloud. This keeps your music under your control. - -## Usage - -Set `mymediaforalexa_enabled: true` in your `inventories//nas.yml` file. - -The My Media for Alexa web interface can be found at . diff --git a/roles/n8n/docs/n8n.md b/roles/n8n/docs/n8n.md deleted file mode 100644 index 5f531246d7..0000000000 --- a/roles/n8n/docs/n8n.md +++ /dev/null @@ -1,18 +0,0 @@ -# Nodemation (n8n) - -Homepage: - -Extendable workflow automation tool that enables you to connect anything to everything. More pragrmatically, it helps you interconnect API with each other to build your own information / work flows. - -## Usage - -Set `n8n_enabled: true` in your `inventories//nas.yml` file. - -n8n is secured by default, he user and password can be set with: - -```yaml - n8n_basic_auth_user: "" - n8n_basic_auth_password: "" -``` - -The default for these is "n8n_user" and "n8n_change_me" respectively, it is recommended to change these. diff --git a/roles/navidrome/docs/navidrome.md b/roles/navidrome/docs/navidrome.md deleted file mode 100644 index bd8bb18053..0000000000 --- a/roles/navidrome/docs/navidrome.md +++ /dev/null @@ -1,11 +0,0 @@ -# Navidrome - -Homepage: - -Navidrome is an open source web-based music collection server and streamer that is compatible with Subsonic/Airsonic. It gives you freedom to listen to your music collection from any browser or mobile device. It's like your personal Spotify! - -## Usage - -Set `navidrome_enabled: true` in your `inventories//nas.yml` file. - -The Navidrome web interface can be found at . diff --git a/roles/netbootxyz/docs/netbootxyz.md b/roles/netbootxyz/docs/netbootxyz.md deleted file mode 100644 index cff9c1d4e6..0000000000 --- a/roles/netbootxyz/docs/netbootxyz.md +++ /dev/null @@ -1,15 +0,0 @@ -# netboot.xyz - -Homepage: - -Docker Container: - -netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool. [iPXE](https://ipxe.org/) is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags. - -You can remote attach the ISO to servers, set it up as a rescue option in Grub, or even set up your home network to boot to it by default so that it's always available. - -## Usage - -Set `netbootxyz_enabled: true` in your `inventories//nas.yml` file. - -The netbooxyz web interface can be found at . diff --git a/roles/netdata/docs/netdata.md b/roles/netdata/docs/netdata.md deleted file mode 100644 index e8ef688400..0000000000 --- a/roles/netdata/docs/netdata.md +++ /dev/null @@ -1,11 +0,0 @@ -# Netdata - -Homepage: - -An extremely comprehensive system monitoring solution. - -## Usage - -Set `netdata_enabled: true` in your `inventories//nas.yml` file. - -Netdata web interface can be found at . diff --git a/roles/nextcloud/docs/nextcloud.md b/roles/nextcloud/docs/nextcloud.md deleted file mode 100644 index 842839affd..0000000000 --- a/roles/nextcloud/docs/nextcloud.md +++ /dev/null @@ -1,25 +0,0 @@ -# Nextcloud - -Homepage: - -## Usage - -Set `nextcloud_enabled: true` in your `inventories//nas.yml` file. - -Tread carefully. - -External access may require that you manually configure your Fully Qualified Domain Name (FQDN) as a trusted domain within the application. There is an environment variable set up for this in the "nextcloud task" which will most likely make manual configuration unnecessary. If you get the following [screenshot](https://docs.nextcloud.com/server/14/admin_manual/installation/installation_wizard.html#trusted-domains) warning when trying to access nextcloud externally you'll need to manually set it up. - -This can be accomplished in two commands. - -```bash -# On the server where the docker containers are running -$ docker exec -it --user www-data nextcloud /bin/bash -$ php occ config:system:set trusted_domains INDEX_FOR_NEW_ENTRY_SEE_DOCS_LINK_BELOW --value=YOUR_FQDN_HERE --update-only -``` - -The above commands are documented in the administration guide for Nextcloud: - -* [set array values](https://docs.nextcloud.com/server/14/admin_manual/configuration_server/occ_command.html#setting-an-array-configuration-value) - -* [docker container docs, references environment variables](https://github.com/nextcloud/docker) diff --git a/roles/nomad/docs/nomad.md b/roles/nomad/docs/nomad.md deleted file mode 100644 index 17e9569b0c..0000000000 --- a/roles/nomad/docs/nomad.md +++ /dev/null @@ -1,11 +0,0 @@ -# Nomad - -Homepage: - -A simple and flexible scheduler and orchestrator to deploy and manage containers and non-containerised applications across on-prem and clouds at scale. - -## Usage - -Set `nomad_enabled: true` in your `inventories//nas.yml` file. - -Nomad's web interface can be found at diff --git a/roles/nzbget/docs/nzbget.md b/roles/nzbget/docs/nzbget.md deleted file mode 100644 index a0d82adcdc..0000000000 --- a/roles/nzbget/docs/nzbget.md +++ /dev/null @@ -1,11 +0,0 @@ -# NZBGet - -Homepage: - -The most efficient Usenet downloader. NZBGet is written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources. - -## Usage - -Set `nzbget_enabled: true` in your `inventories//nas.yml` file. - -The NZBget web interface can be found at , the default username is `nzbget` and password `tegbzn6789`. Change this once you've logged in! diff --git a/roles/octoprint/docs/octoprint.md b/roles/octoprint/docs/octoprint.md deleted file mode 100644 index 7545064582..0000000000 --- a/roles/octoprint/docs/octoprint.md +++ /dev/null @@ -1,11 +0,0 @@ -# Octoprint - -Homepage: - -Octoprint is a control and monitoring application for your 3D printer. You can start and stop print jobs, view your webcam feed, move the print head and extruder manually and check your gcode files, all from a single web interface. Octoprint doesn't require modifications on the printer firmware, just make sure your NAS is phisically connected to it with a usb cable. - -## Usage - -Connect the printer to your NAS, and take note of where the serial interface is mounted (usually it's automounted in `/dev/ttyUSB0`). Set `octoprint_enabled: true` in your `inventories//nas.yml` file, as well as the `octoprint_printer_mountpoint` variable if your printer doesn't mount to the default location. - -If you want to also have a webcam feed, attach one to your NAS and take note of its mountpoint as well (usually `/dev/video0`). Set `octoprint_enable_webcam: true` and add a `octoprint_webcam_mountpoint` variable if the webcam doesn't mount to the default location. diff --git a/roles/ombi/docs/ombi.md b/roles/ombi/docs/ombi.md deleted file mode 100644 index e4ba888454..0000000000 --- a/roles/ombi/docs/ombi.md +++ /dev/null @@ -1,9 +0,0 @@ -# Ombi - -Homepage: - -Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users. - -## Usage - -Set `ombi_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/openhab/docs/openhab.md b/roles/openhab/docs/openhab.md deleted file mode 100644 index 2ea46ddffb..0000000000 --- a/roles/openhab/docs/openhab.md +++ /dev/null @@ -1,15 +0,0 @@ -# openHAB - -Homepage: - -OpenHab is a vendor and technology agnostic open source automation software for your home. -It allows you to connect many different IoT-Devices (which in this case means "Intranet of Things") using custom bindings made by the community. - -## Usage - -Set `openhab_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -The openHAB Webinterface is available at port 7777 (HTTP) and 7778 (HTTPS). -Visit the webinterface and follow the setup instructions found in the [openHAB Documentation](https://www.openhab.org/docs/tutorial/1sttimesetup.html) diff --git a/roles/organizr/docs/organizr.md b/roles/organizr/docs/organizr.md deleted file mode 100644 index df1b293f08..0000000000 --- a/roles/organizr/docs/organizr.md +++ /dev/null @@ -1,15 +0,0 @@ -# Organizr - -Homepage: - -ORGANIZR aims to be your one stop shop for your Servers Frontend. - -Do you have quite a bit of services running on your computer or server? Do you have a lot of bookmarks or have to memor$ - -TODO: finish this truncated description - -## Usage - -Set `organizr_enabled: true` in your `inventories//nas.yml` file. - -The Organizr web interface can be found at . diff --git a/roles/overseerr/docs/overseerr.md b/roles/overseerr/docs/overseerr.md deleted file mode 100644 index 8a017edba8..0000000000 --- a/roles/overseerr/docs/overseerr.md +++ /dev/null @@ -1,13 +0,0 @@ -# Overseerr - - Homepage: - - Docker Container: - - Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services, such as Sonarr, Radarr, and Plex! - -## Usage - - Using overseerr: Set `overseerr_enabled: true` in your `inventories//nas.yml` file. - - The overseerr web interface can be found at . diff --git a/roles/paperless_ng/docs/paperless_ng.md b/roles/paperless_ng/docs/paperless_ng.md deleted file mode 100644 index 5adabc3182..0000000000 --- a/roles/paperless_ng/docs/paperless_ng.md +++ /dev/null @@ -1,23 +0,0 @@ -# Paperless-ng - -Homepage: - -Paperless is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents. - -Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood - -## Usage - -Set `paperless_ng_enabled: true` in your `inventories//nas.yml` file. - -The paperless-ng web interface can be found at . - -### Create the superuser - -To be able to login, you will need a super user. To create it, execute the following command: - -```bash -docker exec -it paperless_ng_uiserver python manage.py createsuperuser -``` - -This will prompt you to set a username, an optional e-mail address and finally a password (at least 8 characters). diff --git a/roles/piwigo/docs/piwigo.md b/roles/piwigo/docs/piwigo.md deleted file mode 100644 index f691ba2798..0000000000 --- a/roles/piwigo/docs/piwigo.md +++ /dev/null @@ -1,28 +0,0 @@ -# Piwigo - -Homepage: [Piwigo.org](https://piwigo.org) - -Piwigo is open source photo gallery software for the web. Designed for organisations, teams and individuals. - -## Usage - -Set `piwigo_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Piwigo externally, set `piwigo_available_externally: true` in your `inventories//nas.yml` file. - -The Piwigo web interface can be found at . - -## Specific Configuration - -Optional configurations: - -- Set `piwigo_mysql_user` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". -- Set `piwigo_mysql_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". -- Set `piwigo_mysql_root_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". - -- On first run you'll need to enter database details: - - Host: `db:3306` - - Username: the value of piwigo_mysql_user, defaults to "piwigo" - - Password: the value of piwigo_password, defaults to "piwigo" - - Database Name: `piwigo` - - Database tables prefix: should be prefilled with `piwigo_` diff --git a/roles/plex/docs/plex.md b/roles/plex/docs/plex.md deleted file mode 100644 index be9a37e017..0000000000 --- a/roles/plex/docs/plex.md +++ /dev/null @@ -1,16 +0,0 @@ -# Plex - -Homepage: - -Plex is a personal media server that also provides access to several external movie, web show, and podcast services. Allows you to stream music too. Apps for many devices, including e.g. chromecast integration. - -## Usage - -Set `plex_enabled: true` in your `inventories//nas.yml` file. - -The Plex web interface can be found at . - -## Specific Configuration - -You'll need to log in with a plex account, (or possibly claim your server). -You'll need to set up your local file store - go to settings > Manage > Libraries, and add your libraries. These are mounted in the root directory by default. diff --git a/roles/portainer/docs/portainer.md b/roles/portainer/docs/portainer.md deleted file mode 100644 index d9d9fe77e4..0000000000 --- a/roles/portainer/docs/portainer.md +++ /dev/null @@ -1,9 +0,0 @@ -# Portainer - -Homepage: - -## Usage - -Set `portainer_enabled: true` in your `inventories//nas.yml` file. - -The Portainer web interface can be found at . diff --git a/roles/prowlarr/docs/prowlarr.md b/roles/prowlarr/docs/prowlarr.md deleted file mode 100644 index 1d5e871eb4..0000000000 --- a/roles/prowlarr/docs/prowlarr.md +++ /dev/null @@ -1,15 +0,0 @@ -# Prowlarr" - -Homepages: [prowlarr](https://github.com/Prowlarr/Prowlarr) - -**Prowlarr** is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all). - -## Usage - -Set `prowlarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Prowlarr web interface can be found at `http://ansible_nas_host_or_ip:9696` by default - -## Specific Configuration - -For comprehensive configuration instructions see the [Prowlarr wiki](https://wiki.servarr.com/prowlarr) or [Prowlarr Github page](https://github.com/Prowlarr/Prowlarr) diff --git a/roles/pyload/docs/pyload.md b/roles/pyload/docs/pyload.md deleted file mode 100644 index 5d0911c514..0000000000 --- a/roles/pyload/docs/pyload.md +++ /dev/null @@ -1,16 +0,0 @@ -# pyLoad - -Homepage: [https://pyload.net/](https://pyload.net/) - -Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web. - -## Usage - -Set `pyload_enabled: true` in your `inventories//nas.yml` file. - -pyLoad's web interface can be found at . - -## Specific Configuration - -Default username is `pyload` and default password is `pyload` -In order to add or remove users, you will need to access the container from an interactive shell (can easily be done from portainer, if installed) and enter pyLoad's home directory `/opt/pyload` and using the command `python pyLoadCore.py -u` and follow the on-screen prompts. More commands to configure and customize pyLoad can be found on it's website. diff --git a/roles/pytivo/docs/pytivo.md b/roles/pytivo/docs/pytivo.md deleted file mode 100644 index fda6fa9cb1..0000000000 --- a/roles/pytivo/docs/pytivo.md +++ /dev/null @@ -1,30 +0,0 @@ -# PyTivo - -Project Homepage: - - -Docker Homepage: - - -PyTivo is both an HMO and GoBack server. Similar to TiVo Desktop pyTivo -loads many standard video compression codecs and outputs mpeg2 video to -the TiVo. However, pyTivo is able to load MANY more file types than TiVo -Desktop. - -## Usage - -Set `pytivo_enabled: true` in your `group_vars/all.yml` file. The PyTivo -web interface can be found at . - -## Specific Configuration - -PyTivo needs to be configured for use. Your ansible-nas media is -available to share via: - -* /movies - Where your movies are stored -* /music - Where your music is stored -* /photos - Where your photos are stored -* /podcasts - Where your podcasts are stored -* /tv - Where your TV episodes are stored - -Configuration help for PyTivo settings can be found at [Configure_pyTivo](https://pytivo.sourceforge.io/wiki/index.php/Configure_pyTivo). diff --git a/roles/radarr/docs/radarr.md b/roles/radarr/docs/radarr.md deleted file mode 100644 index 141bbebbd0..0000000000 --- a/roles/radarr/docs/radarr.md +++ /dev/null @@ -1,22 +0,0 @@ -# Radarr - -Homepage: [radarr](https://radarr.video/) - -**Radarr** is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent. - -## Usage - -Set `radarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Radarr web interface can be found at `http://ansible_nas_host_or_ip:7878` by default - -## Specific Configuration - -**First make sure Radarr has permissions to write and read the `/download`, and `/movies` folders**. Do this by ensuring the `radarr_movies_directory:` and `radarr_download_directory` settings are correct. - -Radarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* - -For Radarr to understand that the `/movies` folder is a folder, you'll need to add a new subfolder into it. -You can also do this by adding a random movie to the folder. Keep in mind to have the internal setting **Create empty movie folders** on **yes** - -Comprehensive setup information can be found on the [Radarr GitHub wiki](https://github.com/Radarr/Radarr/wiki/Setup-Guide) diff --git a/roles/route53_ddns/docs/route53_ddns.md b/roles/route53_ddns/docs/route53_ddns.md deleted file mode 100644 index c0b261d422..0000000000 --- a/roles/route53_ddns/docs/route53_ddns.md +++ /dev/null @@ -1,40 +0,0 @@ -# AWS Route53 Dynamic DNS Updater - -ddns-route53: - -AWS Route53: - -If you want your Ansible-NAS accessible externally then you need a domain name. You will also need to set a wildcard host `A` record to point to your static IP, or enable this container to automatically update AWS Route53 with your dynamic IP address. - -## Usage - -Set `route53_ddns_enabled: true` in your `inventories//nas.yml` file. - -Set required AWS access credentials from the AWS Console. (See below.) - -## Specific Configuration - -Make sure you set your domain (if different than the `ansible-nas` default) and access details within your `inventories//nas.yml` file. - -To set up Route53 to work with the service, please review the [Prerequisites](https://crazymax.dev/ddns-route53/usage/prerequisites/) page. In short, you will need to set up a Route53 [Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html), an [IAM Policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html), and an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) with API credentials. - -### AWS Access Credentials - -| Parameter | Description | Status | -|--------------------|-------------------|-----------| -| route53_key_id | AWS access key ID | mandatory | -| route53_secret_key | AWS secret key | mandatory | - -### Networking - -| Parameter | Description | Status | -|------------------------|--------------------------------|-----------| -| route53_hosted_zone_id | Route53 hosted zone ID | mandatory | -| route53_ttl | Time-to-live for the DNS entry | | -| route53_host | Wildcard domain to update | | - -### Application - -| Parameter | Description | Status | -|------------------|-----------------------------------------------------|-----------| -| route53_schedule | [CRON](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc#hdr-CRON_Expression_Format) schedule for checking and updating DNS entry | | diff --git a/roles/rssbridge/docs/rssbridge.md b/roles/rssbridge/docs/rssbridge.md deleted file mode 100644 index 517e5bef05..0000000000 --- a/roles/rssbridge/docs/rssbridge.md +++ /dev/null @@ -1,13 +0,0 @@ -# RSS-Bridge - -Homepage: - -RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. It can be used on webservers or as a stand-alone application in CLI mode. - -Important: RSS-Bridge is not a feed reader or feed aggregator, but a tool to generate feeds that are consumed by feed readers and feed aggregators. - -## Usage - -Set `rssbridge_enabled: true` in your `inventories//nas.yml` file. - -The RSS-Bridge web interface can be found at . diff --git a/roles/sabnzbd/docs/sabnzbd.md b/roles/sabnzbd/docs/sabnzbd.md deleted file mode 100644 index a4ed13d11f..0000000000 --- a/roles/sabnzbd/docs/sabnzbd.md +++ /dev/null @@ -1,11 +0,0 @@ -# Sabnzbd - -Homepage: - -The time tested Usenet downloader provided with FreeNAS. It just works for those migrating from FreeNAS. - -## Usage - -Set `sabnzbd_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Sabnzbd web interface can be found at . Use this interface to configure the software upon first connection. diff --git a/roles/sickchill/docs/sickchill.md b/roles/sickchill/docs/sickchill.md deleted file mode 100644 index 8fe2b75aec..0000000000 --- a/roles/sickchill/docs/sickchill.md +++ /dev/null @@ -1,12 +0,0 @@ -# Sickchill - -Homepage: [Sickchill](https://sickchill.github.io/) - -SickChill is an automatic Video Library Manager for TV Shows. -It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want. - -## Usage - -Set `sickchill_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The sickchill web interface can be found at `http://ansible_nas_host_or_ip:8081` by default diff --git a/roles/sonarr/docs/sonarr.md b/roles/sonarr/docs/sonarr.md deleted file mode 100644 index f856f75a60..0000000000 --- a/roles/sonarr/docs/sonarr.md +++ /dev/null @@ -1,22 +0,0 @@ -# Sonarr - -Homepage: - -**Sonarr** is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. - -## Usage - -Set `sonarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Sonarr web interface can be found at `http://ansible_nas_host_or_ip:8989` by default - -## Specific Configuration - -**First make sure Sonarr has permissions to write and read the `/download` and `/tv` folders**. Do this by ensuring the `sonarr_movies_directory:` and `sonarr_download_directory` settings are correct. - -Sonarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* - -For Sonarr to understand that the `/tv` folder is a folder, you'll need to add a folder into it. -You can also do this by adding a random series to the folder. Keep in mind to have the setting **Create empty movie folders** on **yes** - -For comprehensive configuration instructions see the [Sonarr GitHub wiki](https://github.com/Sonarr/Sonarr/wiki) diff --git a/roles/speedtest-tracker/docs/speedtest.md b/roles/speedtest-tracker/docs/speedtest.md deleted file mode 100644 index e88eb51f0b..0000000000 --- a/roles/speedtest-tracker/docs/speedtest.md +++ /dev/null @@ -1,15 +0,0 @@ -# Speedtest-Tracker - -Homepage: - -Docker Container: - -Continuously track your internet speed - -## Usage - -Set `speedtest_tracker_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_tracker_available_externally: true` in your `inventories//nas.yml` file. - -The Speedtest-Tracker interface can be found at . diff --git a/roles/stats/docs/stats.md b/roles/stats/docs/stats.md deleted file mode 100644 index 256209597f..0000000000 --- a/roles/stats/docs/stats.md +++ /dev/null @@ -1,13 +0,0 @@ -# Stats - -The stats role uses Prometheus, Grafana, Telegraf and a number of metrics exporters to collect and record lots of metrics about your NAS. - -Telegraf also exposes an InfluxDB endpoint for applications that require it. - -## Usage - -Set `stats_enabled: true` in your `inventories//nas.yml` file. If you want to gather metrics on your internet connection, enable `stats_internet_speed_test_enabled` too. - -If you want to access Grafana externally, set `stats_grafana_available_externally: true` in your `inventories//nas.yml` file. If you want to access Promethehus externally, set `stats_prometheus_available_externally: true` in your `inventories//nas.yml` file. - -The Grafana web interface can be found at , Prometheus can be found at diff --git a/roles/syncthing/docs/syncthing.md b/roles/syncthing/docs/syncthing.md deleted file mode 100644 index 27d0ad9e73..0000000000 --- a/roles/syncthing/docs/syncthing.md +++ /dev/null @@ -1,27 +0,0 @@ -# Syncthing - -Homepage: - -Github: - -Docker: - -Syncthing is a continuous file synchronization program. It synchronizes files -between two or more computers. It strives to fulfill the goals below in summary. -Syncthing should be: - -1. Safe From Data Loss -2. Secure Against Attackers -3. Easy to Use -4. Automatic -5. Universally Available -6. For Individuals -7. For eveything else see the goals document - -## Usage - -Set `syncthing_enabled: true` in your `\inventories\[my inventory]\group_vars\nas.yml` file. - -## Specific Configuration - -Open the web interface at :8384 to configure. diff --git a/roles/tautulli/docs/tautulli.md b/roles/tautulli/docs/tautulli.md deleted file mode 100644 index 3f1ce59f21..0000000000 --- a/roles/tautulli/docs/tautulli.md +++ /dev/null @@ -1,11 +0,0 @@ -# Tautulli - -Homepage: - -Tautulli allows you to monitor your Plex Media Server. - -## Usage - -Set `tautulli_enabled: true` in your `inventories//nas.yml` file. - -The Tautulli web interface can be found at . diff --git a/roles/thelounge/docs/thelounge.md b/roles/thelounge/docs/thelounge.md deleted file mode 100644 index 1b15ea7098..0000000000 --- a/roles/thelounge/docs/thelounge.md +++ /dev/null @@ -1,15 +0,0 @@ -# The Lounge" - -Homepage: - -The Lounge is a self-hosted web IRC client. - -## Usage - -Set `thelounge_enabled: true` in your `inventories//nas.yml` file. - -The Lounge web interface can be found at . - -## Specific Configuration - -The default username and password is `admin`. Change this once you've logged in! diff --git a/roles/tiddlywiki/docs/tiddlywiki.md b/roles/tiddlywiki/docs/tiddlywiki.md deleted file mode 100644 index cb161d5d84..0000000000 --- a/roles/tiddlywiki/docs/tiddlywiki.md +++ /dev/null @@ -1,34 +0,0 @@ -# TiddlyWiki - -Homepage: - -TiddlyWiki is a unique non-linear notebook for capturing, organizing, and sharing complex information. Use it to keep your to-do list, to plan an essay or novel, or to organise your wedding. Record every thought that crosses your brain, or build a flexible and responsive website. Unlike conventional online services, TiddlyWiki lets you choose where to keep your data, guaranteeing that in the decades to come you will still be able to use the notes you take today. - -## Usage - -Set `tiddlywiki_enabled: true` in your `inventories//nas.yml` file. - -If you want to access TiddlyWiki externally, set `tiddlywiki_available_externally: true` in your `inventories//nas.yml` file. - -The TiddlyWiki web interface can be found at . - -## Specific Configuration - -The TiddlyWiki role has several configuration parameters. All parameters are optional. - -### Data and Networking - -| Parameter | Description | -|---------------------------|-------------------------------| -| tiddlywiki_data_directory | Host location to store data | -| tiddlywiki_port | Host port for internal access | -| tiddlywiki_hostname | Subdomain for external access | - -### Server Configuration - -| Parameter | Description | -|------------------------|--------------------------| -| tiddlywiki_username | Basic Auth username | -| tiddlywiki_password | Basic Auth password | -| tiddlywiki_node_memory | NodeJS memory allocation | -| tiddlywiki_debug_level | Service debugging | diff --git a/roles/timemachine/docs/timemachine.md b/roles/timemachine/docs/timemachine.md deleted file mode 100644 index 37c2cbc723..0000000000 --- a/roles/timemachine/docs/timemachine.md +++ /dev/null @@ -1,28 +0,0 @@ -# Time Machine - -Apple docs: - -Docker image: - -Time Machine is an application that allows you to backup files from your Mac. - -Older versions of Time Machine relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. - -## Usage - -Set `timemachine_enabled: true` in your `inventories//nas.yml` file. - -Enabling Time Machine will result in the installation of Avahi on the NAS system (if it is not already installed) and a Time Machine service configuration file for Avahi will be added to the system (at `/etc/avahi/services/timemachine.service`) to allow for Time Machine discovery by Macs on the local network. Avahi runs on the system, rather than in a container, as the same Avahi instance can be used to announce any number of services. - -The Samba server included in the Time Machine docker container logs to `STDOUT` and is compatible with [Docker's built-in logging infrastructure.](https://docs.docker.com/config/containers/logging/) - -## Specific Configuration - -- `timemachine_data_directory`: The absolute path on Ansible NAS where the backup files will be stored -- `timemachine_volume_size_limit`: The maximum amount of space Time Machine can use for the backups in units of MiB. Set it to 0 for no limit. -- `timemachine_share_name`: The name of the share as it will appear in the Time Machine application. Default is 'Data' -- `timemachine_password`: The password used to access the share. Default is 'timemachine' - -## Upgrading from AFP to SMB-based Time Machine - -Older versions of Time Machine included in Ansible-NAS relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS with the AFP-based Time Machine, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. diff --git a/roles/traefik/docs/traefik.md b/roles/traefik/docs/traefik.md deleted file mode 100644 index 8b552f2836..0000000000 --- a/roles/traefik/docs/traefik.md +++ /dev/null @@ -1,20 +0,0 @@ -# Traefik - -Homepage: - -Traefik is a reverse proxy used to provide external access to your Ansible-NAS box. Additionally, Traefik will automatically request and renew SSL certificates for you. - -You can configure which applications are available externally by enabling the `_available_externally` setting -for each application in the Advanced Settings section of your `all.yml`. - -See [External Access](../../getting-started/external-access.md) for more info. - -## Usage - -Set `traefik_enabled: true` in your `inventories//nas.yml` file. - -Traefik's web interface can be found at . - -## Specific Configuration - -You'll need to map port 80 and 443 from your router to your Ansible-NAS box. A quick search should reveal instruction for your model of router. diff --git a/roles/transmission-with-openvpn/docs/transmission.md b/roles/transmission-with-openvpn/docs/transmission.md deleted file mode 100644 index 456e741dfa..0000000000 --- a/roles/transmission-with-openvpn/docs/transmission.md +++ /dev/null @@ -1,25 +0,0 @@ -# Transmission - -Homepage: - -Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects -directly. - -## Usage - -Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. - -Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). - -## Specific Configuration - -If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: - -```yaml -openvpn_username: super_secret_username -openvpn_password: super_secret_password -openvpn_provider: NORDVPN -openvpn_config: uk686.nordvpn.com.udp -``` - -See for supported VPN providers. diff --git a/roles/transmission/docs/transmission.md b/roles/transmission/docs/transmission.md deleted file mode 100644 index 456e741dfa..0000000000 --- a/roles/transmission/docs/transmission.md +++ /dev/null @@ -1,25 +0,0 @@ -# Transmission - -Homepage: - -Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects -directly. - -## Usage - -Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. - -Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). - -## Specific Configuration - -If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: - -```yaml -openvpn_username: super_secret_username -openvpn_password: super_secret_password -openvpn_provider: NORDVPN -openvpn_config: uk686.nordvpn.com.udp -``` - -See for supported VPN providers. diff --git a/roles/ubooquity/docs/ubooquity.md b/roles/ubooquity/docs/ubooquity.md deleted file mode 100644 index 24397c09e2..0000000000 --- a/roles/ubooquity/docs/ubooquity.md +++ /dev/null @@ -1,25 +0,0 @@ -# Ubooquity - -Homepage: - -Documentation: - -Docker Image: - -Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer. - -## Usage - -Set `ubooquity_enabled: true` in your `inventories//nas.yml` file. - -Access the webui at by default. See specific configuration section below for information on setting up external access. - -## Specific Configuration - -Important note: if you want to access Ubooquity externally through Traefik (at ubooquity.yourdomain.tld), you need to go to and set the reverse proxy prefix to blank under "Advanced". Otherwise you will need to append "/ubooquity" to the url in order to access. - -### Admin login - -The admin portal is not exposed through Traefik. You can access the admin portal on port 2203. - -Upon your first run, the address is . You will be able to set the admin password here. diff --git a/roles/utorrent/docs/utorrent.md b/roles/utorrent/docs/utorrent.md deleted file mode 100644 index 18845365a8..0000000000 --- a/roles/utorrent/docs/utorrent.md +++ /dev/null @@ -1,15 +0,0 @@ -# uTorrent - -Homepage: -Docker Container: - -## Usage - -Set `utorrent_enabled: true` in your `inventories//nas.yml` file. - -If you want to access uTorrent externally, don't forget to set `utorrent_available_externally: true` in your `inventories//nas.yml` file. - -The uTorrent web interface can be found at : - -- Username: admin -- Password: *leave blank* diff --git a/roles/virtual_desktop/docs/virtual_desktop.md b/roles/virtual_desktop/docs/virtual_desktop.md deleted file mode 100644 index 0b84170db1..0000000000 --- a/roles/virtual_desktop/docs/virtual_desktop.md +++ /dev/null @@ -1,30 +0,0 @@ -# Virtual Desktop - -It's possible to run a cut down desktop within a Docker container. We use [RattyDAVE's custom Ubuntu Mate image](https://github.com/RattyDAVE/docker-ubuntu-xrdp-mate-custom). - -## Usage - -Set `virtual_desktop_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -By default `ansible_nas_user` will be granted access with a password of `topsecret` with sudo rights. To change or add additional users override `vd_users` in your `nas.yml`: - -```yaml -vd_users: - - username: "{{ ansible_nas_user }}" - password: "topsecret" - sudo: "Y" - - username: "larrylaffer" - password: "kensentme" - sudo: "Y" -``` - -## Mounts - -`samba_shares_root` is mounted to `/samba`. -`docker_home` is mounted to `/docker`. - -## Remote Access - -It's possible to access your virtual desktop through a web browser! Check out [Guacamole](guacamole.md). diff --git a/roles/wallabag/docs/wallabag.md b/roles/wallabag/docs/wallabag.md deleted file mode 100644 index e5ffd3a3f0..0000000000 --- a/roles/wallabag/docs/wallabag.md +++ /dev/null @@ -1,17 +0,0 @@ -# Wallabag - -Homepage: - -wallabag is a self-hostable PHP application allowing you to not miss any content anymore. Click, save and read it when you can. It extracts content so that you can read it when you have time. - -## Usage - -Set `wallabag_enabled: true` in your `inventories//nas.yml` file. - -If you want to access wallabag externally, don't forget to set `wallabag_available_externally: true` in your `inventories//nas.yml` file. - -I recommend using the mobile app, which will sync with this installation so you have access to your saved articles even if you don't have signal or wifi access. - -The default credentials are wallabag:wallabag - -The wallabag web interface can be found at . diff --git a/roles/watchtower/docs/watchtower.md b/roles/watchtower/docs/watchtower.md deleted file mode 100644 index 283bc72ff0..0000000000 --- a/roles/watchtower/docs/watchtower.md +++ /dev/null @@ -1,15 +0,0 @@ -# Watchtower - -Homepage: - -A process for watching your Docker containers and automatically updating and restarting them whenever their base image is refreshed. - -## Usage - -Set `watchtower_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -By default Watchtower is configured to check daily at 5am for updates. - -Various notification options are available, and can be configured by updating `watchtower_command` in your `inventories//nas.yml` file. A few examples are provided. The full set of options can be found at the [Watchtower GitHub project page](https://github.com/v2tec/watchtower). diff --git a/roles/wireshark/docs/wireshark.md b/roles/wireshark/docs/wireshark.md deleted file mode 100644 index 34442ab1f8..0000000000 --- a/roles/wireshark/docs/wireshark.md +++ /dev/null @@ -1,11 +0,0 @@ -# Wireshark - -Homepage: - -Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998. - -## Usage - -Set `wireshark_enabled: true` in your `inventories//nas.yml` file. - -The Wireshark web interface can be found at . diff --git a/roles/woodpecker-ci/docs/woodpecker_ci.md b/roles/woodpecker-ci/docs/woodpecker_ci.md deleted file mode 100644 index 216b4f538a..0000000000 --- a/roles/woodpecker-ci/docs/woodpecker_ci.md +++ /dev/null @@ -1,17 +0,0 @@ -# Woodpecker CI - -Woodpecker is a simple CI engine with great extensibility. - -Check it out at . - -## Usage - -Set `woodpecker_ci_enabled: true` in your `inventories//nas.yml` file. - -Gitea (`gitea_enabled: true`) must be set up and running before attempting to set up Woodpecker CI. - -## Setup Tasks - -An Oauth2 application must be set up in Gitea. Visit for more info, then set `woodpecker_ci_gitea_client` and `woodpecker_ci_gitea_secret` accordingly. - -Set `woodpecker_ci_admin_user` to the same username as your user in Gitea. diff --git a/roles/youtubedlmaterial/docs/youtubedlmaterial.md b/roles/youtubedlmaterial/docs/youtubedlmaterial.md deleted file mode 100644 index cea68c4217..0000000000 --- a/roles/youtubedlmaterial/docs/youtubedlmaterial.md +++ /dev/null @@ -1,17 +0,0 @@ -# YouTubeDL-Material - -Homepage: -Docker Container: - -YoutubeDL-Material is a Material Design frontend for youtube-dl. It's coded using Angular 9 for the frontend, and Node.js on the backend. - -## Usage - -Set `youtubedlmaterial_enabled: true` in your `inventories//nas.yml` file. - -The YouTubeDL-Material web interface can be found at . - -## Specific Configuration - -A YouTube directory will be created in your configured downloads spot. YouTubeDL-Material downloads will be placed there. -You can change the download location via `inventories//nas.yml` file. diff --git a/roles/znc/docs/znc.md b/roles/znc/docs/znc.md deleted file mode 100644 index bbcb5b54b6..0000000000 --- a/roles/znc/docs/znc.md +++ /dev/null @@ -1,11 +0,0 @@ -# Znc - -Homepage: - -ZNC is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC. It supports Transport Layer Security connections and IPv6. - -## Usage - -Set `znc_enabled: true` in your `inventories//nas.yml` file. Edit `znc_*` variables to suit your needs. For more advanced needs, edit the template config file (`templates\znc.conf.j2`) directly. - -Connect to ZNC using IRC at ansible_nas_host_or_ip:6677. From 88b3aa86ca2cfcf7bf9822616c21304c7f3c5346 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:25:52 +0200 Subject: [PATCH 119/286] Duplicate website/docs/applications/news/freshrss.md history in roles/freshrss/docs/ history. --- roles/freshrss/docs/freshrss.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 roles/freshrss/docs/freshrss.md diff --git a/roles/freshrss/docs/freshrss.md b/roles/freshrss/docs/freshrss.md new file mode 100644 index 0000000000..b34b3d08ed --- /dev/null +++ b/roles/freshrss/docs/freshrss.md @@ -0,0 +1,23 @@ +--- +title: "FreshRSS" +--- + +Homepage: + +FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed. + +It is lightweight, easy to work with, powerful, and customizable. + +It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface. + +Thanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc. + +FreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed. + +Finally, it supports extensions for further tuning. + +## Usage + +Set `freshrss_enabled: true` in your `inventories//nas.yml` file. + +The FreshRSS web interface can be found at . From 3b4bc62892320057973cab53f058175a21095a4a Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:30:23 +0200 Subject: [PATCH 120/286] Duplicate website/docs/applications/development-tools/gitea.md history in roles/gitea/docs/ history. --- roles/gitea/docs/gitea.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/gitea/docs/gitea.md diff --git a/roles/gitea/docs/gitea.md b/roles/gitea/docs/gitea.md new file mode 100644 index 0000000000..4624342009 --- /dev/null +++ b/roles/gitea/docs/gitea.md @@ -0,0 +1,13 @@ +--- +title: "Gitea" +--- + +Homepage: + +Gitea is a painless self-hosted Git service. + +## Usage + +Set `gitea_enabled: true` in your `inventories//nas.yml` file. + +The Gitea web interface can be found at . From 0b6af3583ab37ec6f3c27addf8349e187f1d7221 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:33:17 +0200 Subject: [PATCH 121/286] Duplicate website/docs/applications/development-tools/gitlab.md history in roles/gitlab/ history. --- roles/gitlab/gitlab.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/gitlab/gitlab.md diff --git a/roles/gitlab/gitlab.md b/roles/gitlab/gitlab.md new file mode 100644 index 0000000000..f5562d0430 --- /dev/null +++ b/roles/gitlab/gitlab.md @@ -0,0 +1,15 @@ +--- +title: "GitLab" +--- + +Homepage: + +If Gitea isn't powerful enough for you then consider GitLab. It's a much more powerful (and consequently bigger) Git repository solution that includes a suite of code analytics. On the other hand it requires more RAM. + +## Usage + +Set `gitlab_enabled: true` in your `inventories//nas.yml` file. + +To make GitLab available externally via Traefik set `gitlab_available_externally: true` in your `inventories//nas.yml` file. + +The first time you run GitLab you'll be prompted for an account's password. The password is for GitLab's `root` administrator account. From there you can log in to create additional users and further configure the application. From a5399703e9a7a51888cc958d001524df885f3a5a Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:33:49 +0200 Subject: [PATCH 122/286] Duplicate website/docs/applications/monitoring/glances.md history in roles/glances/docs/ history. --- roles/glances/docs/glances.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/glances/docs/glances.md diff --git a/roles/glances/docs/glances.md b/roles/glances/docs/glances.md new file mode 100644 index 0000000000..8963969682 --- /dev/null +++ b/roles/glances/docs/glances.md @@ -0,0 +1,17 @@ +--- +title: "Glances" +--- + +Homepage: + +Glances is a cross-platform system monitoring tool written in Python. + +## Usage + +Set `glances_enabled: true` in your `inventories//nas.yml` file. + +The Glances web interface can be found at . + +## Specific Configuration + +Glances can be integrated with InfluxDB and Grafana. From 9dc1cc0fd3521f2487e6c8e03a7ec938d02e3d1b Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:36:17 +0200 Subject: [PATCH 123/286] Duplicate website/docs/applications/other/gotify.md history in roles/gotify/docs/ history. --- roles/gitlab/{ => docs}/gitlab.md | 0 roles/gotify/docs/gotify.md | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) rename roles/gitlab/{ => docs}/gitlab.md (100%) create mode 100644 roles/gotify/docs/gotify.md diff --git a/roles/gitlab/gitlab.md b/roles/gitlab/docs/gitlab.md similarity index 100% rename from roles/gitlab/gitlab.md rename to roles/gitlab/docs/gitlab.md diff --git a/roles/gotify/docs/gotify.md b/roles/gotify/docs/gotify.md new file mode 100644 index 0000000000..3e2e4267d6 --- /dev/null +++ b/roles/gotify/docs/gotify.md @@ -0,0 +1,18 @@ +--- +title: "Gotify" +--- + +Homepage: + +A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui) + +## Usage + +Set `gotify_enabled: true` in your `inventories//nas.yml` file. + +The Gotify web interface can be found at . + +Android client: [https://play.google.com/store/apps/details?id=com.github.gotify](https://play.google.com/store/apps/details?id=com.github.gotify) +iOS client: n/a +Chrome extension: n/a +Firefox extension: From 06f126e064822e60908ce9f4417326bcd41414bf Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:36:54 +0200 Subject: [PATCH 124/286] Duplicate website/docs/applications/other/guacamole.md history in roles/guacamole/docs/ history. --- roles/guacamole/docs/guacamole.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 roles/guacamole/docs/guacamole.md diff --git a/roles/guacamole/docs/guacamole.md b/roles/guacamole/docs/guacamole.md new file mode 100644 index 0000000000..eb1fa811cb --- /dev/null +++ b/roles/guacamole/docs/guacamole.md @@ -0,0 +1,19 @@ +--- +title: "Guacamole" +--- + +Homepage: + +Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. + +## Usage + +Set `guacamole_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +The default username and password is `guacadmin`. Change it! + +## What to connect to? + +You can run a virtual desktop from your Ansible-NAS box, check out the [Virtual Desktop docs](virtual_desktop.md). From f6144b77a1bb845ec858117eaa137c7c3c1e4b74 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:37:31 +0200 Subject: [PATCH 125/286] Duplicate website/docs/applications/system-tools/healthchecks.io.md history in roles/healthchecks.io/docs/ history. --- roles/healthchecks.io/docs/healthchecks.io.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/healthchecks.io/docs/healthchecks.io.md diff --git a/roles/healthchecks.io/docs/healthchecks.io.md b/roles/healthchecks.io/docs/healthchecks.io.md new file mode 100644 index 0000000000..aadbcf9431 --- /dev/null +++ b/roles/healthchecks.io/docs/healthchecks.io.md @@ -0,0 +1,13 @@ +--- +title: "Healthchecks.io" +--- + +Homepage: + +A simple cronjob that uses `curl` to ping a given endpoint on the `healthchecks.io` servers. You can choose how often it should ping the endpoint, and what happens when it doesn't. Email/Slack/Telegram and many more services can be integrated. + +## Usage + +Create your own project on , and set both the time between pings and the grace time. Set your prefered integration such as email. + +Set `healthchecks_enabled: true` in your `inventories//nas.yml` file, and if your time between pings is different than the default `healthchecks_ping_minutes`, change it. Finally, set your ping url in the `healthchecks_url` variable. From f7e5d511297f3d429f1d98ecb33d84941d985b26 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:37:58 +0200 Subject: [PATCH 126/286] Duplicate website/docs/applications/dashboards/heimdall.md history in roles/heimdall/docs/ history. --- roles/heimdall/docs/heimdall.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/heimdall/docs/heimdall.md diff --git a/roles/heimdall/docs/heimdall.md b/roles/heimdall/docs/heimdall.md new file mode 100644 index 0000000000..7b0b00c307 --- /dev/null +++ b/roles/heimdall/docs/heimdall.md @@ -0,0 +1,17 @@ +--- +title: "Heimdall" +--- + +Homepage: + +Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like + +## Usage + +Set `heimdall_enabled: true` in your `inventories//nas.yml` file. + +The Heimdall web interface can be found at . + +## Specific Configuration + +Heimdall defaults to port 10080 - some browsers block this port. Override `heimdall_port_http` to move it somewhere else. From 8c02e9569277f3335e51ad4b3aee39122e00fef1 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:38:24 +0200 Subject: [PATCH 127/286] Duplicate website/docs/applications/home-automation/homeassistant.md history in roles/homeassistant/docs/ history. --- roles/homeassistant/docs/homeassistant.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/homeassistant/docs/homeassistant.md diff --git a/roles/homeassistant/docs/homeassistant.md b/roles/homeassistant/docs/homeassistant.md new file mode 100644 index 0000000000..ac1bc59b59 --- /dev/null +++ b/roles/homeassistant/docs/homeassistant.md @@ -0,0 +1,15 @@ +--- +title: "Home Assistant" +--- + +Homepage: + +Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. + +## Usage + +Set `homeassistant_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Home Assistant externally, don't forget to set `homeassistant_available_externally: true` in your `inventories//nas.yml` file. + +The Home Assistant web interface can be found at . From 398fc0dc1dd4f7ae3b60250d1bf3b1eadd83ebbe Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:38:49 +0200 Subject: [PATCH 128/286] Duplicate website/docs/applications/home-automation/homebridge.md history in roles/homebridge/docs/ history. --- roles/homebridge/docs/homebridge.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/homebridge/docs/homebridge.md diff --git a/roles/homebridge/docs/homebridge.md b/roles/homebridge/docs/homebridge.md new file mode 100644 index 0000000000..98c80ebcdc --- /dev/null +++ b/roles/homebridge/docs/homebridge.md @@ -0,0 +1,13 @@ +--- +title: "Homebridge" +--- + +Homepage: + +Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices. + +## Usage + +Set `homebridge_enabled: true` in your `inventories//nas.yml` file. + +The Homebridge web interface can be found at . The default username and password is 'admin' - change this after your first login! From 49bf9c308d3fc179b845f08929cd0be3062aa129 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:39:40 +0200 Subject: [PATCH 129/286] Duplicate website/docs/applications/download-tools/jackett.md history in roles/jackett/docs/ history. --- roles/jackett/docs/jackett.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/jackett/docs/jackett.md diff --git a/roles/jackett/docs/jackett.md b/roles/jackett/docs/jackett.md new file mode 100644 index 0000000000..866c1792ee --- /dev/null +++ b/roles/jackett/docs/jackett.md @@ -0,0 +1,13 @@ +--- +title: "Jackett" +--- + +Homepage: + +Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, qBittorrent, Nefarious etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. + +## Usage + +Set `jackett_enabled: true` in your `inventories//nas.yml` file. + +The Jackett web interface can be found at . From 621ab06dcb0fe78b13c5e8e5e1e3679f83efa847 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:40:07 +0200 Subject: [PATCH 130/286] Duplicate website/docs/applications/media-serving/jellyfin.md history in roles/jellyfin/docs/ history. --- roles/jellyfin/docs/jellyfin.md | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 roles/jellyfin/docs/jellyfin.md diff --git a/roles/jellyfin/docs/jellyfin.md b/roles/jellyfin/docs/jellyfin.md new file mode 100644 index 0000000000..939177de2b --- /dev/null +++ b/roles/jellyfin/docs/jellyfin.md @@ -0,0 +1,67 @@ +--- +title: "Jellyfin" +--- + +Homepage: + +Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! + +Note that [Plex](https://www.plex.tv/), also included in Ansible-NAS, has a very +similar functionality. + +## Usage + +Set `jellyfin_enabled: true` in your `inventories//nas.yml` file. There are further +parameters you can edit such as `movies_root`, `tv_root` or `music_root` lower down + +## Specific Configuration + +The jellyfin web interface can be found at port 8896 (http) or 8928 (https, if +configured) of your NAS. + +By default, Ansible-NAS gives jellyfin read/write access to the folders where your +movies, TV shows and music are stored. To change this to read-only, edit the following +lines in `all.yml`: + +```yaml + jellyfin_movies_permissions: "rw" + jellyfin_tv_permissions: "rw" + jellyfin_books_permissions: "rw" + jellyfin_audiobooks_permissions: "rw" + jellyfin_music_permissions: "rw" +``` + +so that they end in `ro` instead of `rw`. Note that jellyfin will not be able to +delete files then, which might be exactly what you want. However, you will not +have the option to store cover art in the related folders. Always leave the +configuration directory read/write + +## Naming movies and TV shows + +jellyfin is very fussy about how movies and TV shows must be named to enable +automatic downloads of cover art and metadata. In short, movie files should +follow how movies are listed in the [IMDb](https://www.imdb.com/), including the +year of publication: + +```raw + movies/Bride of Frankenstein (1935).mp4 +``` + +Note the spaces. You should probably remove colons and other special characters +TV shows require a folder structure with the name of the series - again if +possible with the year of publication - followed by sub-folders for the +individual seasons. For example, the first episode of the first season of +the original "Doctor Who" could be stored as: + +```raw + tv/Doctor Who (1963)/Season 1/Doctor Who - s01e01.mp4 +``` + +The [TVDB](https://www.thetvdb.com/) is one source for the exact names of TV +shows. + +Unfortunately, there are number of special cases, especially related to split +movies and older series. See the [movie +naming](https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming) and [TV +naming](https://github.com/MediaBrowser/Wiki/wiki/TV-naming) guides for further +information. From a7a7f229261b89566c7be2d89cb71d5fadafc1c1 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:40:31 +0200 Subject: [PATCH 131/286] Duplicate website/docs/applications/content-management/joomla.md history in roles/joomla/docs/ history. --- roles/joomla/docs/joomla.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 roles/joomla/docs/joomla.md diff --git a/roles/joomla/docs/joomla.md b/roles/joomla/docs/joomla.md new file mode 100644 index 0000000000..e573f2f397 --- /dev/null +++ b/roles/joomla/docs/joomla.md @@ -0,0 +1,26 @@ +--- +title: "Joomla" +description: "An award-winning content management system" +--- + +Homepage: + +Joomla! is an award-winning content management system (CMS), which enables you to build web sites and powerful online applications. + +## Usage + +Set `joomla_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Joomla externally, set `joomla_available_externally: true` in your `inventories//nas.yml` file. + +The Joomla web interface can be found at . + +## Specific Configuration + +- Set `joomla_database_password` in your `all.yml` before installing Joomla. + +- On first run you'll need to enter database details: + - Host: `mysql` + - Database: `joomla` + - Username: `root` + - Password: whatever you set for `joomla_database_password`. From 5ae9ec397717759868582ae77a1b016a61e5b9bc Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:40:56 +0200 Subject: [PATCH 132/286] Duplicate website/docs/applications/media-serving/komga.md history in roles/komga/docs/ history. --- roles/komga/docs/komga.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/komga/docs/komga.md diff --git a/roles/komga/docs/komga.md b/roles/komga/docs/komga.md new file mode 100644 index 0000000000..82b21acc71 --- /dev/null +++ b/roles/komga/docs/komga.md @@ -0,0 +1,15 @@ +--- +title: "Komga" +--- + +Homepage: + +Docker Image: + +Komga is a media server for your comics, mangas, BDs and magazines. + +## Usage + +Set `komga_enabled: true` in your `inventories//nas.yml` file. + +Access the webui at by default. From 39d5fd87ce284c326ae750a9561a335dd0f61bbb Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:41:21 +0200 Subject: [PATCH 133/286] Duplicate website/docs/applications/system-tools/krusader.md history in roles/krusader/docs/ history. --- roles/krusader/docs/krusader.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/krusader/docs/krusader.md diff --git a/roles/krusader/docs/krusader.md b/roles/krusader/docs/krusader.md new file mode 100644 index 0000000000..4c3e147f76 --- /dev/null +++ b/roles/krusader/docs/krusader.md @@ -0,0 +1,15 @@ +--- +title: "Krusader" +--- + +Homepage: + +Docker Container: [Krusader](https://hub.docker.com/r/djaydev/krusader) + +Krusader provides twin panel file management for your ansible-nas via browser and VNC. + +## Usage + +Set `krusader_enabled: true` in your `inventories//nas.yml` file. + +The Krusader web interface can be found at . From cc922e63d6029c821514f9cf5e61a2ed2eeb12d5 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:41:47 +0200 Subject: [PATCH 134/286] Duplicate website/docs/applications/download-tools/lidarr.md history in roles/lidarr/docs/ history. --- roles/lidarr/docs/lidarr.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 roles/lidarr/docs/lidarr.md diff --git a/roles/lidarr/docs/lidarr.md b/roles/lidarr/docs/lidarr.md new file mode 100644 index 0000000000..32843d4add --- /dev/null +++ b/roles/lidarr/docs/lidarr.md @@ -0,0 +1,11 @@ +--- +title: "Lidarr" +--- + +Homepage: + +Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. + +## Usage + +Set `lidarr_enabled: true` in your `inventories//nas.yml` file. From d5720dfce7f224de6e92f9377a21e0cb0e186246 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:42:13 +0200 Subject: [PATCH 135/286] Duplicate website/docs/applications/other/mealie.md history in roles/mealie/docs/ history. --- roles/mealie/docs/mealie.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/mealie/docs/mealie.md diff --git a/roles/mealie/docs/mealie.md b/roles/mealie/docs/mealie.md new file mode 100644 index 0000000000..b001c10f6c --- /dev/null +++ b/roles/mealie/docs/mealie.md @@ -0,0 +1,13 @@ +--- +title: "Mealie" +--- + +Homepage: + +A self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. + +## Usage + +Set `mealie_enabled: true` in your `inventories//nas.yml` file. + +The Mealie web interface can be found at . From 9c7bebdac2b5bb443930c305b356733a92a8087d Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:42:40 +0200 Subject: [PATCH 136/286] Duplicate website/docs/applications/gaming/minecraft-server.md history in roles/minecraft-server/docs/ history. --- roles/minecraft-server/docs/minecraft-server.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/minecraft-server/docs/minecraft-server.md diff --git a/roles/minecraft-server/docs/minecraft-server.md b/roles/minecraft-server/docs/minecraft-server.md new file mode 100644 index 0000000000..e9e4e4a88c --- /dev/null +++ b/roles/minecraft-server/docs/minecraft-server.md @@ -0,0 +1,15 @@ +--- +title: "Minecraft Server" +--- + +Homepage: + +The server version of the game Minecraft, running in a container. "Prepare for an adventure of limitless possibilities as you build, mine, battle mobs, and explore the ever-changing Minecraft landscape." + +## Usage + +Set `minecraft_server_enabled: true` in your `inventories//nas.yml` file. + +The Ansible NAS host or ip address should then be usable as a server within the Minecraft multiplayer game menu. + +The image `itzg/minecraft-server` has [documentation](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) with further details on how to manage the Minecraft server instance. From ca2310eb6f72e31199dfcf6ec508dc82ada41659 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:43:12 +0200 Subject: [PATCH 137/286] Duplicate website/docs/applications/media-serving/minidlna.md history in roles/minidlna/docs/ history. --- roles/minidlna/docs/minidlna.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/minidlna/docs/minidlna.md diff --git a/roles/minidlna/docs/minidlna.md b/roles/minidlna/docs/minidlna.md new file mode 100644 index 0000000000..f216795b71 --- /dev/null +++ b/roles/minidlna/docs/minidlna.md @@ -0,0 +1,13 @@ +--- +title: "MiniDLNA" +--- + +Homepage: + +MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP clients. The MiniDNLA daemon serves media files (music, pictures, and video) to clients on a network. Example clients include applications such as Totem and Kodi, and devices such as portable media players, Smartphones, Televisions, and gaming systems (such as PS3 and Xbox 360). + +## Usage + +Set `minidlna_enabled: true` in your `inventories//nas.yml` file. + +The very basic MiniDLNA web interface can be found at . From b2c3bdb35d364c9d58d54d26ec5896c7a4685750 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:43:40 +0200 Subject: [PATCH 138/286] Duplicate website/docs/applications/news/miniflux.md history in roles/miniflux/docs/ history. --- roles/miniflux/docs/miniflux.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/miniflux/docs/miniflux.md diff --git a/roles/miniflux/docs/miniflux.md b/roles/miniflux/docs/miniflux.md new file mode 100644 index 0000000000..92890158b9 --- /dev/null +++ b/roles/miniflux/docs/miniflux.md @@ -0,0 +1,15 @@ +# Miniflux + +Homepage: + +Miniflux is a minimalist and opinionated feed reader. + +## Usage + +Set `miniflux_enabled: true` in your `inventories//nas.yml` file. + +The Miniflux web interface can be found at , the default username is `admin` and password `supersecure`. + +## Specific Configuration + +An admin user will be created with the username and password of `miniflux_admin_username` and `miniflux_admin_password` respectively. These can be found in the Miniflux section within `all.yml.dist`. From 831b4a6ffda06cd4d57198408c3694a0ca505288 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:44:06 +0200 Subject: [PATCH 139/286] Duplicate website/docs/applications/home-automation/mosquitto.md history in roles/mosquitto/docs/ history. --- roles/mosquitto/docs/mosquitto.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 roles/mosquitto/docs/mosquitto.md diff --git a/roles/mosquitto/docs/mosquitto.md b/roles/mosquitto/docs/mosquitto.md new file mode 100644 index 0000000000..5fe0c9d6cc --- /dev/null +++ b/roles/mosquitto/docs/mosquitto.md @@ -0,0 +1,11 @@ +--- +title: "Mosquitto" +--- + +Homepage: + +Mosquitto is a lightweight open source MQTT message broker. + +## Usage + +Set `mosquitto_enabled: true` in your `inventories//nas.yml` file. From 0a0a807b46137136d5c02230f75545df031efc61 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:44:30 +0200 Subject: [PATCH 140/286] Duplicate website/docs/applications/download-tools/mylar.md history in roles/mylar/docs/ history. --- roles/mylar/docs/mylar.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/mylar/docs/mylar.md diff --git a/roles/mylar/docs/mylar.md b/roles/mylar/docs/mylar.md new file mode 100644 index 0000000000..819183f1b1 --- /dev/null +++ b/roles/mylar/docs/mylar.md @@ -0,0 +1,17 @@ +--- +title: "Mylar" +--- + +Homepage: + +Docker Container: + +An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents + +## Usage + +Set `mylar_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Mylar externally, don't forget to set `mylar_available_externally: true` in your `inventories//nas.yml` file. + +The Mylar web interface can be found at . From bb51d163ac09f1edb4b8e17bbda2fa1762fe8657 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:45:11 +0200 Subject: [PATCH 141/286] Duplicate website/docs/applications/media-serving/mymediaforalexa.md history in roles/mymediaforalexa/docs/ history. --- roles/mymediaforalexa/docs/mymediaforalexa.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/mymediaforalexa/docs/mymediaforalexa.md diff --git a/roles/mymediaforalexa/docs/mymediaforalexa.md b/roles/mymediaforalexa/docs/mymediaforalexa.md new file mode 100644 index 0000000000..85b42f6dcb --- /dev/null +++ b/roles/mymediaforalexa/docs/mymediaforalexa.md @@ -0,0 +1,13 @@ +--- +title: "My Media for Alexa" +--- + +Homepage: + +My Media lets you stream your music collection to your Amazon Echo or Amazon Dot without having to upload all your music collection to the Cloud. This keeps your music under your control. + +## Usage + +Set `mymediaforalexa_enabled: true` in your `inventories//nas.yml` file. + +The My Media for Alexa web interface can be found at . From 20e3acd2269d4aeb68927d4fd9b27ef9ff3957a0 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:45:36 +0200 Subject: [PATCH 142/286] Duplicate website/docs/applications/home-automation/n8n.md history in roles/n8n/docs/ history. --- roles/n8n/docs/n8n.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 roles/n8n/docs/n8n.md diff --git a/roles/n8n/docs/n8n.md b/roles/n8n/docs/n8n.md new file mode 100644 index 0000000000..c96511632b --- /dev/null +++ b/roles/n8n/docs/n8n.md @@ -0,0 +1,20 @@ +--- +title: "Nodemation (n8n)" +--- + +Homepage: + +Extendable workflow automation tool that enables you to connect anything to everything. More pragrmatically, it helps you interconnect API with each other to build your own information / work flows. + +## Usage + +Set `n8n_enabled: true` in your `inventories//nas.yml` file. + +n8n is secured by default, he user and password can be set with: + +```yaml + n8n_basic_auth_user: "" + n8n_basic_auth_password: "" +``` + +The default for these is "n8n_user" and "n8n_change_me" respectively, it is recommended to change these. From eefa42da0bc8e53c1cfcd2144210a9ed393fc8f7 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:46:02 +0200 Subject: [PATCH 143/286] Duplicate website/docs/applications/media-serving/navidrome.md history in roles/navidrome/docs/ history. --- roles/navidrome/docs/navidrome.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/navidrome/docs/navidrome.md diff --git a/roles/navidrome/docs/navidrome.md b/roles/navidrome/docs/navidrome.md new file mode 100644 index 0000000000..3e5380e228 --- /dev/null +++ b/roles/navidrome/docs/navidrome.md @@ -0,0 +1,13 @@ +--- +title: "Navidrome" +--- + +Homepage: + +Navidrome is an open source web-based music collection server and streamer that is compatible with Subsonic/Airsonic. It gives you freedom to listen to your music collection from any browser or mobile device. It's like your personal Spotify! + +## Usage + +Set `navidrome_enabled: true` in your `inventories//nas.yml` file. + +The Navidrome web interface can be found at . From ec0d2c2361db1b0408a4dcc4cc588cd7fb762c01 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:46:30 +0200 Subject: [PATCH 144/286] Duplicate website/docs/applications/system-tools/netbootxyz.md history in roles/netbootxyz/docs/ history. --- roles/netbootxyz/docs/netbootxyz.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/netbootxyz/docs/netbootxyz.md diff --git a/roles/netbootxyz/docs/netbootxyz.md b/roles/netbootxyz/docs/netbootxyz.md new file mode 100644 index 0000000000..bca2bd5d25 --- /dev/null +++ b/roles/netbootxyz/docs/netbootxyz.md @@ -0,0 +1,17 @@ +--- +title: "netboot.xyz" +--- + +Homepage: + +Docker Container: + +netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool. [iPXE](https://ipxe.org/) is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags. + +You can remote attach the ISO to servers, set it up as a rescue option in Grub, or even set up your home network to boot to it by default so that it's always available. + +## Usage + +Set `netbootxyz_enabled: true` in your `inventories//nas.yml` file. + +The netbooxyz web interface can be found at . From c38c2ff9c735074728b74da7dfe44a8ad9170993 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:47:56 +0200 Subject: [PATCH 145/286] Duplicate website/docs/applications/other/nextcloud.md history in roles/nextcloud/docs/ history. --- roles/nextcloud/docs/nextcloud.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 roles/nextcloud/docs/nextcloud.md diff --git a/roles/nextcloud/docs/nextcloud.md b/roles/nextcloud/docs/nextcloud.md new file mode 100644 index 0000000000..5cc5b062fd --- /dev/null +++ b/roles/nextcloud/docs/nextcloud.md @@ -0,0 +1,27 @@ +--- +title: "Nextcloud" +--- + +Homepage: + +## Usage + +Set `nextcloud_enabled: true` in your `inventories//nas.yml` file. + +Tread carefully. + +External access may require that you manually configure your Fully Qualified Domain Name (FQDN) as a trusted domain within the application. There is an environment variable set up for this in the "nextcloud task" which will most likely make manual configuration unnecessary. If you get the following [screenshot](https://docs.nextcloud.com/server/14/admin_manual/installation/installation_wizard.html#trusted-domains) warning when trying to access nextcloud externally you'll need to manually set it up. + +This can be accomplished in two commands. + +```bash +# On the server where the docker containers are running +$ docker exec -it --user www-data nextcloud /bin/bash +$ php occ config:system:set trusted_domains INDEX_FOR_NEW_ENTRY_SEE_DOCS_LINK_BELOW --value=YOUR_FQDN_HERE --update-only +``` + +The above commands are documented in the administration guide for Nextcloud: + +* [set array values](https://docs.nextcloud.com/server/14/admin_manual/configuration_server/occ_command.html#setting-an-array-configuration-value) + +* [docker container docs, references environment variables](https://github.com/nextcloud/docker) From a4c4221ee6a7941eda97dab5fec338652d51e290 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:48:20 +0200 Subject: [PATCH 146/286] Duplicate website/docs/applications/development-tools/nomad.md history in roles/nomad/docs/ history. --- roles/nomad/docs/nomad.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/nomad/docs/nomad.md diff --git a/roles/nomad/docs/nomad.md b/roles/nomad/docs/nomad.md new file mode 100644 index 0000000000..08389d110a --- /dev/null +++ b/roles/nomad/docs/nomad.md @@ -0,0 +1,13 @@ +--- +title: "Nomad" +--- + +Homepage: + +A simple and flexible scheduler and orchestrator to deploy and manage containers and non-containerised applications across on-prem and clouds at scale. + +## Usage + +Set `nomad_enabled: true` in your `inventories//nas.yml` file. + +Nomad's web interface can be found at From 8dded7a7d0d78dc300895f701f9f1bdbf4b32ba6 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:48:46 +0200 Subject: [PATCH 147/286] Duplicate website/docs/applications/download-tools/nzbget.md history in roles/nzbget/docs/ history. --- roles/nzbget/docs/nzbget.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/nzbget/docs/nzbget.md diff --git a/roles/nzbget/docs/nzbget.md b/roles/nzbget/docs/nzbget.md new file mode 100644 index 0000000000..1e81efb51e --- /dev/null +++ b/roles/nzbget/docs/nzbget.md @@ -0,0 +1,13 @@ +--- +title: "NZBGet" +--- + +Homepage: + +The most efficient Usenet downloader. NZBGet is written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources. + +## Usage + +Set `nzbget_enabled: true` in your `inventories//nas.yml` file. + +The NZBget web interface can be found at , the default username is `nzbget` and password `tegbzn6789`. Change this once you've logged in! From 3e7d879afa9091f6e6a838565ea1dacf9e295376 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:49:11 +0200 Subject: [PATCH 148/286] Duplicate website/docs/applications/other/octoprint.md history in roles/octoprint/docs/ history. --- roles/octoprint/docs/octoprint.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 roles/octoprint/docs/octoprint.md diff --git a/roles/octoprint/docs/octoprint.md b/roles/octoprint/docs/octoprint.md new file mode 100644 index 0000000000..1d5b8c413e --- /dev/null +++ b/roles/octoprint/docs/octoprint.md @@ -0,0 +1,12 @@ +--- +title: "Octoprint" +--- +Homepage: + +Octoprint is a control and monitoring application for your 3D printer. You can start and stop print jobs, view your webcam feed, move the print head and extruder manually and check your gcode files, all from a single web interface. Octoprint doesn't require modifications on the printer firmware, just make sure your NAS is phisically connected to it with a usb cable. + +## Usage + +Connect the printer to your NAS, and take note of where the serial interface is mounted (usually it's automounted in `/dev/ttyUSB0`). Set `octoprint_enabled: true` in your `inventories//nas.yml` file, as well as the `octoprint_printer_mountpoint` variable if your printer doesn't mount to the default location. + +If you want to also have a webcam feed, attach one to your NAS and take note of its mountpoint as well (usually `/dev/video0`). Set `octoprint_enable_webcam: true` and add a `octoprint_webcam_mountpoint` variable if the webcam doesn't mount to the default location. From 218f42f3bcef7dc0dec91d879cc81c51a5f086f1 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:49:35 +0200 Subject: [PATCH 149/286] Duplicate website/docs/applications/download-tools/ombi.md history in roles/ombi/docs/ history. --- roles/ombi/docs/ombi.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 roles/ombi/docs/ombi.md diff --git a/roles/ombi/docs/ombi.md b/roles/ombi/docs/ombi.md new file mode 100644 index 0000000000..c13076c280 --- /dev/null +++ b/roles/ombi/docs/ombi.md @@ -0,0 +1,11 @@ +--- +title: "Ombi" +--- + +Homepage: + +Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users. + +## Usage + +Set `ombi_enabled: true` in your `inventories//nas.yml` file. From 1bbb31f4a2bf787469f18a2f9d3befcbf25ba646 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:50:00 +0200 Subject: [PATCH 150/286] Duplicate website/docs/applications/home-automation/openhab.md history in roles/openhab/docs/ history. --- roles/openhab/docs/openhab.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/openhab/docs/openhab.md diff --git a/roles/openhab/docs/openhab.md b/roles/openhab/docs/openhab.md new file mode 100644 index 0000000000..47a60422ae --- /dev/null +++ b/roles/openhab/docs/openhab.md @@ -0,0 +1,17 @@ +--- +title: "openHAB" +--- + +Homepage: + +OpenHab is a vendor and technology agnostic open source automation software for your home. +It allows you to connect many different IoT-Devices (which in this case means "Intranet of Things") using custom bindings made by the community. + +## Usage + +Set `openhab_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +The openHAB Webinterface is available at port 7777 (HTTP) and 7778 (HTTPS). +Visit the webinterface and follow the setup instructions found in the [openHAB Documentation](https://www.openhab.org/docs/tutorial/1sttimesetup.html) From f2c8bd1fd97c48c84f8aff86bd1355eb76d38921 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:50:27 +0200 Subject: [PATCH 151/286] Duplicate website/docs/applications/dashboards/organizr.md history in roles/organizr/docs/ history. --- roles/organizr/docs/organizr.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/organizr/docs/organizr.md diff --git a/roles/organizr/docs/organizr.md b/roles/organizr/docs/organizr.md new file mode 100644 index 0000000000..3fb1b3cd95 --- /dev/null +++ b/roles/organizr/docs/organizr.md @@ -0,0 +1,17 @@ +--- +title: "Organizr" +--- + +Homepage: + +ORGANIZR aims to be your one stop shop for your Servers Frontend. + +Do you have quite a bit of services running on your computer or server? Do you have a lot of bookmarks or have to memor$ + +TODO: finish this truncated description + +## Usage + +Set `organizr_enabled: true` in your `inventories//nas.yml` file. + +The Organizr web interface can be found at . From 8b51299fc17af227ac920a067af2b690639e5356 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:50:50 +0200 Subject: [PATCH 152/286] Duplicate website/docs/applications/download-tools/overseerr.md history in roles/overseerr/docs/ history. --- roles/overseerr/docs/overseerr.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/overseerr/docs/overseerr.md diff --git a/roles/overseerr/docs/overseerr.md b/roles/overseerr/docs/overseerr.md new file mode 100644 index 0000000000..d754a8291d --- /dev/null +++ b/roles/overseerr/docs/overseerr.md @@ -0,0 +1,15 @@ +--- +title: "Overseerr" +--- + + Homepage: + + Docker Container: + + Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services, such as Sonarr, Radarr, and Plex! + +## Usage + + Using overseerr: Set `overseerr_enabled: true` in your `inventories//nas.yml` file. + + The overseerr web interface can be found at . From ce7711dad602e7b8ecd9b1ec95c97a9743e17c7b Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:51:17 +0200 Subject: [PATCH 153/286] Duplicate website/docs/applications/other/paperless_ng.md history in roles/paperless_ng/docs/ history. --- roles/paperless_ng/docs/paperless_ng.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 roles/paperless_ng/docs/paperless_ng.md diff --git a/roles/paperless_ng/docs/paperless_ng.md b/roles/paperless_ng/docs/paperless_ng.md new file mode 100644 index 0000000000..651a01ad9e --- /dev/null +++ b/roles/paperless_ng/docs/paperless_ng.md @@ -0,0 +1,25 @@ +--- +title: "Paperless-ng" +--- + +Homepage: + +Paperless is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents. + +Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood + +## Usage + +Set `paperless_ng_enabled: true` in your `inventories//nas.yml` file. + +The paperless-ng web interface can be found at . + +### Create the superuser + +To be able to login, you will need a super user. To create it, execute the following command: + +```bash +docker exec -it paperless_ng_uiserver python manage.py createsuperuser +``` + +This will prompt you to set a username, an optional e-mail address and finally a password (at least 8 characters). From 76c4339b32492e84674ffe8ddae2c30047e6d8f9 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:51:43 +0200 Subject: [PATCH 154/286] Duplicate website/docs/applications/other/piwigo.md history in roles/piwigo/docs/ history. --- roles/piwigo/docs/piwigo.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 roles/piwigo/docs/piwigo.md diff --git a/roles/piwigo/docs/piwigo.md b/roles/piwigo/docs/piwigo.md new file mode 100644 index 0000000000..f6760f8df9 --- /dev/null +++ b/roles/piwigo/docs/piwigo.md @@ -0,0 +1,30 @@ +--- +title: "Piwigo" +--- + +Homepage: [Piwigo.org](https://piwigo.org) + +Piwigo is open source photo gallery software for the web. Designed for organisations, teams and individuals. + +## Usage + +Set `piwigo_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Piwigo externally, set `piwigo_available_externally: true` in your `inventories//nas.yml` file. + +The Piwigo web interface can be found at . + +## Specific Configuration + +Optional configurations: + +- Set `piwigo_mysql_user` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". +- Set `piwigo_mysql_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". +- Set `piwigo_mysql_root_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". + +- On first run you'll need to enter database details: + - Host: `db:3306` + - Username: the value of piwigo_mysql_user, defaults to "piwigo" + - Password: the value of piwigo_password, defaults to "piwigo" + - Database Name: `piwigo` + - Database tables prefix: should be prefilled with `piwigo_` From 530e103e63aa35606088f739477920d2185b1bf7 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:52:07 +0200 Subject: [PATCH 155/286] Duplicate website/docs/applications/media-serving/plex.md history in roles/plex/docs/ history. --- roles/plex/docs/plex.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 roles/plex/docs/plex.md diff --git a/roles/plex/docs/plex.md b/roles/plex/docs/plex.md new file mode 100644 index 0000000000..8fb789020f --- /dev/null +++ b/roles/plex/docs/plex.md @@ -0,0 +1,18 @@ +--- +title: "Plex" +--- + +Homepage: + +Plex is a personal media server that also provides access to several external movie, web show, and podcast services. Allows you to stream music too. Apps for many devices, including e.g. chromecast integration. + +## Usage + +Set `plex_enabled: true` in your `inventories//nas.yml` file. + +The Plex web interface can be found at . + +## Specific Configuration + +You'll need to log in with a plex account, (or possibly claim your server). +You'll need to set up your local file store - go to settings > Manage > Libraries, and add your libraries. These are mounted in the root directory by default. From 8c364880d4e998ee36bd130a3e9b3826f4e687e1 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:52:32 +0200 Subject: [PATCH 156/286] Duplicate website/docs/applications/system-tools/portainer.md history in roles/portainer/docs/ history. --- roles/portainer/docs/portainer.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 roles/portainer/docs/portainer.md diff --git a/roles/portainer/docs/portainer.md b/roles/portainer/docs/portainer.md new file mode 100644 index 0000000000..78c727e62f --- /dev/null +++ b/roles/portainer/docs/portainer.md @@ -0,0 +1,11 @@ +--- +title: "Portainer" +--- + +Homepage: + +## Usage + +Set `portainer_enabled: true` in your `inventories//nas.yml` file. + +The Portainer web interface can be found at . From 7b478dcaddb7b064fd91f092c1ba116aa4708866 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:52:59 +0200 Subject: [PATCH 157/286] Duplicate website/docs/applications/download-tools/prowlarr.md history in roles/prowlarr/docs/ history. --- roles/prowlarr/docs/prowlarr.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/prowlarr/docs/prowlarr.md diff --git a/roles/prowlarr/docs/prowlarr.md b/roles/prowlarr/docs/prowlarr.md new file mode 100644 index 0000000000..0c0c0b45c1 --- /dev/null +++ b/roles/prowlarr/docs/prowlarr.md @@ -0,0 +1,17 @@ +--- +title: "Prowlarr" +--- + +Homepages: [prowlarr](https://github.com/Prowlarr/Prowlarr) + +**Prowlarr** is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all). + +## Usage + +Set `prowlarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Prowlarr web interface can be found at `http://ansible_nas_host_or_ip:9696` by default + +## Specific Configuration + +For comprehensive configuration instructions see the [Prowlarr wiki](https://wiki.servarr.com/prowlarr) or [Prowlarr Github page](https://github.com/Prowlarr/Prowlarr) From e53297d72ce496c33b92d7d789a2f0976dc2b619 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:53:23 +0200 Subject: [PATCH 158/286] Duplicate website/docs/applications/download-tools/pyload.md history in roles/pyload/docs/ history. --- roles/pyload/docs/pyload.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 roles/pyload/docs/pyload.md diff --git a/roles/pyload/docs/pyload.md b/roles/pyload/docs/pyload.md new file mode 100644 index 0000000000..7870a26a1e --- /dev/null +++ b/roles/pyload/docs/pyload.md @@ -0,0 +1,18 @@ +--- +title: "pyLoad" +--- + +Homepage: [https://pyload.net/](https://pyload.net/) + +Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web. + +## Usage + +Set `pyload_enabled: true` in your `inventories//nas.yml` file. + +pyLoad's web interface can be found at . + +## Specific Configuration + +Default username is `pyload` and default password is `pyload` +In order to add or remove users, you will need to access the container from an interactive shell (can easily be done from portainer, if installed) and enter pyLoad's home directory `/opt/pyload` and using the command `python pyLoadCore.py -u` and follow the on-screen prompts. More commands to configure and customize pyLoad can be found on it's website. From 57f8175b0d5b279a454a2f73b0185c840f23a66f Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:53:50 +0200 Subject: [PATCH 159/286] Duplicate website/docs/applications/media-serving/pytivo.md history in roles/pytivo/docs/ history. --- roles/pytivo/docs/pytivo.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 roles/pytivo/docs/pytivo.md diff --git a/roles/pytivo/docs/pytivo.md b/roles/pytivo/docs/pytivo.md new file mode 100644 index 0000000000..c3344a23b7 --- /dev/null +++ b/roles/pytivo/docs/pytivo.md @@ -0,0 +1,32 @@ +--- +title: "PyTivo" +--- + +Project Homepage: + + +Docker Homepage: + + +PyTivo is both an HMO and GoBack server. Similar to TiVo Desktop pyTivo +loads many standard video compression codecs and outputs mpeg2 video to +the TiVo. However, pyTivo is able to load MANY more file types than TiVo +Desktop. + +## Usage + +Set `pytivo_enabled: true` in your `group_vars/all.yml` file. The PyTivo +web interface can be found at . + +## Specific Configuration + +PyTivo needs to be configured for use. Your ansible-nas media is +available to share via: + +* /movies - Where your movies are stored +* /music - Where your music is stored +* /photos - Where your photos are stored +* /podcasts - Where your podcasts are stored +* /tv - Where your TV episodes are stored + +Configuration help for PyTivo settings can be found at [Configure_pyTivo](https://pytivo.sourceforge.io/wiki/index.php/Configure_pyTivo). From 5a6f5582636dabd1f54b980f85f9c6b81efeaf9c Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:54:14 +0200 Subject: [PATCH 160/286] Duplicate website/docs/applications/download-tools/radarr.md history in roles/radarr/docs/ history. --- roles/radarr/docs/radarr.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 roles/radarr/docs/radarr.md diff --git a/roles/radarr/docs/radarr.md b/roles/radarr/docs/radarr.md new file mode 100644 index 0000000000..09355c1f76 --- /dev/null +++ b/roles/radarr/docs/radarr.md @@ -0,0 +1,24 @@ +--- +title: "Radarr" +--- + +Homepage: [radarr](https://radarr.video/) + +**Radarr** is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent. + +## Usage + +Set `radarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Radarr web interface can be found at `http://ansible_nas_host_or_ip:7878` by default + +## Specific Configuration + +**First make sure Radarr has permissions to write and read the `/download`, and `/movies` folders**. Do this by ensuring the `radarr_movies_directory:` and `radarr_download_directory` settings are correct. + +Radarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* + +For Radarr to understand that the `/movies` folder is a folder, you'll need to add a new subfolder into it. +You can also do this by adding a random movie to the folder. Keep in mind to have the internal setting **Create empty movie folders** on **yes** + +Comprehensive setup information can be found on the [Radarr GitHub wiki](https://github.com/Radarr/Radarr/wiki/Setup-Guide) From 61d5479d0f047f35625ce9bd62fcab51f3a9d991 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:54:41 +0200 Subject: [PATCH 161/286] Duplicate website/docs/applications/system-tools/route53_ddns.md history in roles/route53_ddns/docs/ history. --- roles/route53_ddns/docs/route53_ddns.md | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 roles/route53_ddns/docs/route53_ddns.md diff --git a/roles/route53_ddns/docs/route53_ddns.md b/roles/route53_ddns/docs/route53_ddns.md new file mode 100644 index 0000000000..4ac4009997 --- /dev/null +++ b/roles/route53_ddns/docs/route53_ddns.md @@ -0,0 +1,42 @@ +--- +title: "AWS Route53 Dynamic DNS Updater" +--- + +ddns-route53: + +AWS Route53: + +If you want your Ansible-NAS accessible externally then you need a domain name. You will also need to set a wildcard host `A` record to point to your static IP, or enable this container to automatically update AWS Route53 with your dynamic IP address. + +## Usage + +Set `route53_ddns_enabled: true` in your `inventories//nas.yml` file. + +Set required AWS access credentials from the AWS Console. (See below.) + +## Specific Configuration + +Make sure you set your domain (if different than the `ansible-nas` default) and access details within your `inventories//nas.yml` file. + +To set up Route53 to work with the service, please review the [Prerequisites](https://crazymax.dev/ddns-route53/usage/prerequisites/) page. In short, you will need to set up a Route53 [Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html), an [IAM Policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html), and an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) with API credentials. + +### AWS Access Credentials + +| Parameter | Description | Status | +|--------------------|-------------------|-----------| +| route53_key_id | AWS access key ID | mandatory | +| route53_secret_key | AWS secret key | mandatory | + +### Networking + +| Parameter | Description | Status | +|------------------------|--------------------------------|-----------| +| route53_hosted_zone_id | Route53 hosted zone ID | mandatory | +| route53_ttl | Time-to-live for the DNS entry | | +| route53_host | Wildcard domain to update | | + +### Application + +| Parameter | Description | Status | +|------------------|-----------------------------------------------------|-----------| +| route53_schedule | [CRON](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc#hdr-CRON_Expression_Format) schedule for checking and updating DNS entry | | From 039df5b991d874b19e3d959d3caa2f98ee877adb Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:55:05 +0200 Subject: [PATCH 162/286] Duplicate website/docs/applications/news/rssbridge.md history in roles/rssbridge/docs/ history. --- roles/rssbridge/docs/rssbridge.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/rssbridge/docs/rssbridge.md diff --git a/roles/rssbridge/docs/rssbridge.md b/roles/rssbridge/docs/rssbridge.md new file mode 100644 index 0000000000..9ea01ba1b9 --- /dev/null +++ b/roles/rssbridge/docs/rssbridge.md @@ -0,0 +1,15 @@ +--- +title: "RSS-Bridge" +--- + +Homepage: + +RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. It can be used on webservers or as a stand-alone application in CLI mode. + +Important: RSS-Bridge is not a feed reader or feed aggregator, but a tool to generate feeds that are consumed by feed readers and feed aggregators. + +## Usage + +Set `rssbridge_enabled: true` in your `inventories//nas.yml` file. + +The RSS-Bridge web interface can be found at . From c2d81b290ff6fc84031a8454f3f55c0ab15d0551 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:55:31 +0200 Subject: [PATCH 163/286] Duplicate website/docs/applications/download-tools/sabnzbd.md history in roles/sabnzbd/docs/ history. --- roles/sabnzbd/docs/sabnzbd.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/sabnzbd/docs/sabnzbd.md diff --git a/roles/sabnzbd/docs/sabnzbd.md b/roles/sabnzbd/docs/sabnzbd.md new file mode 100644 index 0000000000..ddbd27d51b --- /dev/null +++ b/roles/sabnzbd/docs/sabnzbd.md @@ -0,0 +1,13 @@ +--- +title: "Sabnzbd" +--- + +Homepage: + +The time tested Usenet downloader provided with FreeNAS. It just works for those migrating from FreeNAS. + +## Usage + +Set `sabnzbd_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Sabnzbd web interface can be found at . Use this interface to configure the software upon first connection. From 1fd91e97ca0cbd62a01245ba1288890fc372190d Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:56:21 +0200 Subject: [PATCH 164/286] Duplicate website/docs/applications/download-tools/sonarr.md history in roles/sonarr/docs/ history. --- roles/sonarr/docs/sonarr.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 roles/sonarr/docs/sonarr.md diff --git a/roles/sonarr/docs/sonarr.md b/roles/sonarr/docs/sonarr.md new file mode 100644 index 0000000000..0833ecb97e --- /dev/null +++ b/roles/sonarr/docs/sonarr.md @@ -0,0 +1,24 @@ +--- +title: "Sonarr" +--- + +Homepage: + +**Sonarr** is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. + +## Usage + +Set `sonarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The Sonarr web interface can be found at `http://ansible_nas_host_or_ip:8989` by default + +## Specific Configuration + +**First make sure Sonarr has permissions to write and read the `/download` and `/tv` folders**. Do this by ensuring the `sonarr_movies_directory:` and `sonarr_download_directory` settings are correct. + +Sonarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* + +For Sonarr to understand that the `/tv` folder is a folder, you'll need to add a folder into it. +You can also do this by adding a random series to the folder. Keep in mind to have the setting **Create empty movie folders** on **yes** + +For comprehensive configuration instructions see the [Sonarr GitHub wiki](https://github.com/Sonarr/Sonarr/wiki) From a8ddd3f98040487270cb0b99733d136ce3070912 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:56:53 +0200 Subject: [PATCH 165/286] Duplicate website/docs/applications/monitoring/speedtest.md history in roles/speedtest-tracker/docs/ history. --- roles/speedtest-tracker/docs/speedtest.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/speedtest-tracker/docs/speedtest.md diff --git a/roles/speedtest-tracker/docs/speedtest.md b/roles/speedtest-tracker/docs/speedtest.md new file mode 100644 index 0000000000..d9f82ad92c --- /dev/null +++ b/roles/speedtest-tracker/docs/speedtest.md @@ -0,0 +1,17 @@ +--- +title: "Speedtest-Tracker" +--- + +Homepage: + +Docker Container: + +Continuously track your internet speed + +## Usage + +Set `speedtest_tracker_enabled: true` in your `inventories//nas.yml` file. + +If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_tracker_available_externally: true` in your `inventories//nas.yml` file. + +The Speedtest-Tracker interface can be found at . From 009b4d3ded881720c7b5e6bd07cb5ab6fc767276 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:57:29 +0200 Subject: [PATCH 166/286] Duplicate website/docs/applications/monitoring/stats.md history in roles/stats/docs/ history. --- roles/stats/docs/stats.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 roles/stats/docs/stats.md diff --git a/roles/stats/docs/stats.md b/roles/stats/docs/stats.md new file mode 100644 index 0000000000..1a92639aa8 --- /dev/null +++ b/roles/stats/docs/stats.md @@ -0,0 +1,15 @@ +--- +title: "Stats" +--- + +The stats role uses Prometheus, Grafana, Telegraf and a number of metrics exporters to collect and record lots of metrics about your NAS. + +Telegraf also exposes an InfluxDB endpoint for applications that require it. + +## Usage + +Set `stats_enabled: true` in your `inventories//nas.yml` file. If you want to gather metrics on your internet connection, enable `stats_internet_speed_test_enabled` too. + +If you want to access Grafana externally, set `stats_grafana_available_externally: true` in your `inventories//nas.yml` file. If you want to access Promethehus externally, set `stats_prometheus_available_externally: true` in your `inventories//nas.yml` file. + +The Grafana web interface can be found at , Prometheus can be found at From 8a0c0fe764992f054ab990d74b6bcda6c3c7db1c Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:57:55 +0200 Subject: [PATCH 167/286] Duplicate website/docs/applications/system-tools/syncthing.md history in roles/syncthing/docs/ history. --- roles/syncthing/docs/syncthing.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 roles/syncthing/docs/syncthing.md diff --git a/roles/syncthing/docs/syncthing.md b/roles/syncthing/docs/syncthing.md new file mode 100644 index 0000000000..83e882d0db --- /dev/null +++ b/roles/syncthing/docs/syncthing.md @@ -0,0 +1,29 @@ +--- +title: "Syncthing" +--- + +Homepage: + +Github: + +Docker: + +Syncthing is a continuous file synchronization program. It synchronizes files +between two or more computers. It strives to fulfill the goals below in summary. +Syncthing should be: + +1. Safe From Data Loss +2. Secure Against Attackers +3. Easy to Use +4. Automatic +5. Universally Available +6. For Individuals +7. For eveything else see the goals document + +## Usage + +Set `syncthing_enabled: true` in your `\inventories\[my inventory]\group_vars\nas.yml` file. + +## Specific Configuration + +Open the web interface at :8384 to configure. From 78213fa4577c7d921f5be9b4d64981bc23d57b39 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:58:19 +0200 Subject: [PATCH 168/286] Duplicate website/docs/applications/media-serving/tautulli.md history in roles/tautulli/docs/ history. --- roles/tautulli/docs/tautulli.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/tautulli/docs/tautulli.md diff --git a/roles/tautulli/docs/tautulli.md b/roles/tautulli/docs/tautulli.md new file mode 100644 index 0000000000..a987629912 --- /dev/null +++ b/roles/tautulli/docs/tautulli.md @@ -0,0 +1,13 @@ +--- +title: "Tautulli" +--- + +Homepage: + +Tautulli allows you to monitor your Plex Media Server. + +## Usage + +Set `tautulli_enabled: true` in your `inventories//nas.yml` file. + +The Tautulli web interface can be found at . From e247f7c4569618093cfccca95562579e0ba3c9e2 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:58:44 +0200 Subject: [PATCH 169/286] Duplicate website/docs/applications/other/thelounge.md history in roles/thelounge/docs/ history. --- roles/thelounge/docs/thelounge.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/thelounge/docs/thelounge.md diff --git a/roles/thelounge/docs/thelounge.md b/roles/thelounge/docs/thelounge.md new file mode 100644 index 0000000000..6292a700ae --- /dev/null +++ b/roles/thelounge/docs/thelounge.md @@ -0,0 +1,17 @@ +--- +title: "The Lounge" +--- + +Homepage: + +The Lounge is a self-hosted web IRC client. + +## Usage + +Set `thelounge_enabled: true` in your `inventories//nas.yml` file. + +The Lounge web interface can be found at . + +## Specific Configuration + +The default username and password is `admin`. Change this once you've logged in! From 959d1579d0230eae72dd70810e98e7240376f8db Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:59:08 +0200 Subject: [PATCH 170/286] Duplicate website/docs/applications/content-management/tiddlywiki.md history in roles/tiddlywiki/docs/ history. --- roles/tiddlywiki/docs/tiddlywiki.md | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 roles/tiddlywiki/docs/tiddlywiki.md diff --git a/roles/tiddlywiki/docs/tiddlywiki.md b/roles/tiddlywiki/docs/tiddlywiki.md new file mode 100644 index 0000000000..be0344b2e0 --- /dev/null +++ b/roles/tiddlywiki/docs/tiddlywiki.md @@ -0,0 +1,37 @@ +--- +title: "TiddlyWiki" +description: "A notebook for capturing, organizing, and sharing information" +--- + +Homepage: + +TiddlyWiki is a unique non-linear notebook for capturing, organizing, and sharing complex information. Use it to keep your to-do list, to plan an essay or novel, or to organise your wedding. Record every thought that crosses your brain, or build a flexible and responsive website. Unlike conventional online services, TiddlyWiki lets you choose where to keep your data, guaranteeing that in the decades to come you will still be able to use the notes you take today. + +## Usage + +Set `tiddlywiki_enabled: true` in your `inventories//nas.yml` file. + +If you want to access TiddlyWiki externally, set `tiddlywiki_available_externally: true` in your `inventories//nas.yml` file. + +The TiddlyWiki web interface can be found at . + +## Specific Configuration + +The TiddlyWiki role has several configuration parameters. All parameters are optional. + +### Data and Networking + +| Parameter | Description | +|---------------------------|-------------------------------| +| tiddlywiki_data_directory | Host location to store data | +| tiddlywiki_port | Host port for internal access | +| tiddlywiki_hostname | Subdomain for external access | + +### Server Configuration + +| Parameter | Description | +|------------------------|--------------------------| +| tiddlywiki_username | Basic Auth username | +| tiddlywiki_password | Basic Auth password | +| tiddlywiki_node_memory | NodeJS memory allocation | +| tiddlywiki_debug_level | Service debugging | From 22a2499858e818bb9005ee1613f0dfffe531e84d Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 13:59:38 +0200 Subject: [PATCH 171/286] Duplicate website/docs/applications/system-tools/timemachine.md history in roles/timemachine/docs/ history. --- roles/timemachine/docs/timemachine.md | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 roles/timemachine/docs/timemachine.md diff --git a/roles/timemachine/docs/timemachine.md b/roles/timemachine/docs/timemachine.md new file mode 100644 index 0000000000..2589ebe87a --- /dev/null +++ b/roles/timemachine/docs/timemachine.md @@ -0,0 +1,30 @@ +--- +title: "Time Machine" +--- + +Apple docs: + +Docker image: + +Time Machine is an application that allows you to backup files from your Mac. + +Older versions of Time Machine relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. + +## Usage + +Set `timemachine_enabled: true` in your `inventories//nas.yml` file. + +Enabling Time Machine will result in the installation of Avahi on the NAS system (if it is not already installed) and a Time Machine service configuration file for Avahi will be added to the system (at `/etc/avahi/services/timemachine.service`) to allow for Time Machine discovery by Macs on the local network. Avahi runs on the system, rather than in a container, as the same Avahi instance can be used to announce any number of services. + +The Samba server included in the Time Machine docker container logs to `STDOUT` and is compatible with [Docker's built-in logging infrastructure.](https://docs.docker.com/config/containers/logging/) + +## Specific Configuration + +- `timemachine_data_directory`: The absolute path on Ansible NAS where the backup files will be stored +- `timemachine_volume_size_limit`: The maximum amount of space Time Machine can use for the backups in units of MiB. Set it to 0 for no limit. +- `timemachine_share_name`: The name of the share as it will appear in the Time Machine application. Default is 'Data' +- `timemachine_password`: The password used to access the share. Default is 'timemachine' + +## Upgrading from AFP to SMB-based Time Machine + +Older versions of Time Machine included in Ansible-NAS relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS with the AFP-based Time Machine, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. From c67899b599e947de400320caa92b8bad17420839 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:00:12 +0200 Subject: [PATCH 172/286] Duplicate website/docs/applications/other/traefik.md history in roles/traefik/docs/ history. --- roles/traefik/docs/traefik.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 roles/traefik/docs/traefik.md diff --git a/roles/traefik/docs/traefik.md b/roles/traefik/docs/traefik.md new file mode 100644 index 0000000000..439d01aee6 --- /dev/null +++ b/roles/traefik/docs/traefik.md @@ -0,0 +1,22 @@ +--- +title: "Traefik" +--- + +Homepage: + +Traefik is a reverse proxy used to provide external access to your Ansible-NAS box. Additionally, Traefik will automatically request and renew SSL certificates for you. + +You can configure which applications are available externally by enabling the `_available_externally` setting +for each application in the Advanced Settings section of your `all.yml`. + +See [External Access](../../getting-started/external-access.md) for more info. + +## Usage + +Set `traefik_enabled: true` in your `inventories//nas.yml` file. + +Traefik's web interface can be found at . + +## Specific Configuration + +You'll need to map port 80 and 443 from your router to your Ansible-NAS box. A quick search should reveal instruction for your model of router. From ec3e903cbd4b585bfa987882ef393518a500dfc4 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:00:38 +0200 Subject: [PATCH 173/286] Duplicate website/docs/applications/download-tools/transmission.md history in roles/transmission/docs/ history. --- roles/transmission/docs/transmission.md | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 roles/transmission/docs/transmission.md diff --git a/roles/transmission/docs/transmission.md b/roles/transmission/docs/transmission.md new file mode 100644 index 0000000000..e29ce9c403 --- /dev/null +++ b/roles/transmission/docs/transmission.md @@ -0,0 +1,27 @@ +--- +title: "Transmission" +--- + +Homepage: + +Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects +directly. + +## Usage + +Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. + +Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). + +## Specific Configuration + +If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: + +```yaml +openvpn_username: super_secret_username +openvpn_password: super_secret_password +openvpn_provider: NORDVPN +openvpn_config: uk686.nordvpn.com.udp +``` + +See for supported VPN providers. From 2d5b83af443859204ee729ec32701079cb860f12 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:00:59 +0200 Subject: [PATCH 174/286] Duplicate website/docs/applications/download-tools/transmission.md history in roles/transmission-with-openvpn/docs/ history. --- .../docs/transmission.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 roles/transmission-with-openvpn/docs/transmission.md diff --git a/roles/transmission-with-openvpn/docs/transmission.md b/roles/transmission-with-openvpn/docs/transmission.md new file mode 100644 index 0000000000..e29ce9c403 --- /dev/null +++ b/roles/transmission-with-openvpn/docs/transmission.md @@ -0,0 +1,27 @@ +--- +title: "Transmission" +--- + +Homepage: + +Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects +directly. + +## Usage + +Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. + +Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). + +## Specific Configuration + +If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: + +```yaml +openvpn_username: super_secret_username +openvpn_password: super_secret_password +openvpn_provider: NORDVPN +openvpn_config: uk686.nordvpn.com.udp +``` + +See for supported VPN providers. From a0e053b0b2e206130cfc1b32649bb6ffa9bfe7ba Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:01:27 +0200 Subject: [PATCH 175/286] Duplicate website/docs/applications/media-serving/ubooquity.md history in roles/ubooquity/docs/ history. --- roles/ubooquity/docs/ubooquity.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 roles/ubooquity/docs/ubooquity.md diff --git a/roles/ubooquity/docs/ubooquity.md b/roles/ubooquity/docs/ubooquity.md new file mode 100644 index 0000000000..1dea780627 --- /dev/null +++ b/roles/ubooquity/docs/ubooquity.md @@ -0,0 +1,27 @@ +--- +title: "Ubooquity" +--- + +Homepage: + +Documentation: + +Docker Image: + +Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer. + +## Usage + +Set `ubooquity_enabled: true` in your `inventories//nas.yml` file. + +Access the webui at by default. See specific configuration section below for information on setting up external access. + +## Specific Configuration + +Important note: if you want to access Ubooquity externally through Traefik (at ubooquity.yourdomain.tld), you need to go to and set the reverse proxy prefix to blank under "Advanced". Otherwise you will need to append "/ubooquity" to the url in order to access. + +### Admin login + +The admin portal is not exposed through Traefik. You can access the admin portal on port 2203. + +Upon your first run, the address is . You will be able to set the admin password here. From 7cd5c334dee22b5d213ef9f38fa712aab112461f Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:13:32 +0200 Subject: [PATCH 176/286] Duplicate website/docs/applications/download-tools/utorrent.md history in roles/utorrent/docs/ history. --- roles/utorrent/docs/utorrent.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/utorrent/docs/utorrent.md diff --git a/roles/utorrent/docs/utorrent.md b/roles/utorrent/docs/utorrent.md new file mode 100644 index 0000000000..c62bab8c1b --- /dev/null +++ b/roles/utorrent/docs/utorrent.md @@ -0,0 +1,17 @@ +--- +title: "uTorrent" +--- + +Homepage: +Docker Container: + +## Usage + +Set `utorrent_enabled: true` in your `inventories//nas.yml` file. + +If you want to access uTorrent externally, don't forget to set `utorrent_available_externally: true` in your `inventories//nas.yml` file. + +The uTorrent web interface can be found at : + +- Username: admin +- Password: *leave blank* From 1ef3a230d264d1433aead615ec99420501b06c6c Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:13:59 +0200 Subject: [PATCH 177/286] Duplicate website/docs/applications/other/virtual_desktop.md history in roles/virtual_desktop/docs/ history. --- roles/virtual_desktop/docs/virtual_desktop.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 roles/virtual_desktop/docs/virtual_desktop.md diff --git a/roles/virtual_desktop/docs/virtual_desktop.md b/roles/virtual_desktop/docs/virtual_desktop.md new file mode 100644 index 0000000000..4ff7bec824 --- /dev/null +++ b/roles/virtual_desktop/docs/virtual_desktop.md @@ -0,0 +1,32 @@ +--- +title: "Virtual Desktop" +--- + +It's possible to run a cut down desktop within a Docker container. We use [RattyDAVE's custom Ubuntu Mate image](https://github.com/RattyDAVE/docker-ubuntu-xrdp-mate-custom). + +## Usage + +Set `virtual_desktop_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +By default `ansible_nas_user` will be granted access with a password of `topsecret` with sudo rights. To change or add additional users override `vd_users` in your `nas.yml`: + +```yaml +vd_users: + - username: "{{ ansible_nas_user }}" + password: "topsecret" + sudo: "Y" + - username: "larrylaffer" + password: "kensentme" + sudo: "Y" +``` + +## Mounts + +`samba_shares_root` is mounted to `/samba`. +`docker_home` is mounted to `/docker`. + +## Remote Access + +It's possible to access your virtual desktop through a web browser! Check out [Guacamole](guacamole.md). From 725477b576095872d6b60a561df7a9ee60cbb950 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:17:27 +0200 Subject: [PATCH 178/286] Duplicate website/docs/applications/other/wallabag.md history in roles/wallabag/docs/ history. --- roles/wallabag/docs/wallabag.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 roles/wallabag/docs/wallabag.md diff --git a/roles/wallabag/docs/wallabag.md b/roles/wallabag/docs/wallabag.md new file mode 100644 index 0000000000..84bb4b95c0 --- /dev/null +++ b/roles/wallabag/docs/wallabag.md @@ -0,0 +1,19 @@ +--- +title: "Wallabag" +--- + +Homepage: + +wallabag is a self-hostable PHP application allowing you to not miss any content anymore. Click, save and read it when you can. It extracts content so that you can read it when you have time. + +## Usage + +Set `wallabag_enabled: true` in your `inventories//nas.yml` file. + +If you want to access wallabag externally, don't forget to set `wallabag_available_externally: true` in your `inventories//nas.yml` file. + +I recommend using the mobile app, which will sync with this installation so you have access to your saved articles even if you don't have signal or wifi access. + +The default credentials are wallabag:wallabag + +The wallabag web interface can be found at . From dd0cb5941c7b52ba7e3f01786780e0dfeb0b8f64 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:17:52 +0200 Subject: [PATCH 179/286] Duplicate website/docs/applications/system-tools/watchtower.md history in roles/watchtower/docs/ history. --- roles/watchtower/docs/watchtower.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 roles/watchtower/docs/watchtower.md diff --git a/roles/watchtower/docs/watchtower.md b/roles/watchtower/docs/watchtower.md new file mode 100644 index 0000000000..31e1fa2e71 --- /dev/null +++ b/roles/watchtower/docs/watchtower.md @@ -0,0 +1,17 @@ +--- +title: "Watchtower" +--- + +Homepage: + +A process for watching your Docker containers and automatically updating and restarting them whenever their base image is refreshed. + +## Usage + +Set `watchtower_enabled: true` in your `inventories//nas.yml` file. + +## Specific Configuration + +By default Watchtower is configured to check daily at 5am for updates. + +Various notification options are available, and can be configured by updating `watchtower_command` in your `inventories//nas.yml` file. A few examples are provided. The full set of options can be found at the [Watchtower GitHub project page](https://github.com/v2tec/watchtower). From 2662641277c7880d1303f5b2ef5a951c71724c6b Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:18:19 +0200 Subject: [PATCH 180/286] Duplicate website/docs/applications/monitoring/wireshark.md history in roles/wireshark/docs/ history. --- roles/wireshark/docs/wireshark.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 roles/wireshark/docs/wireshark.md diff --git a/roles/wireshark/docs/wireshark.md b/roles/wireshark/docs/wireshark.md new file mode 100644 index 0000000000..689853d76e --- /dev/null +++ b/roles/wireshark/docs/wireshark.md @@ -0,0 +1,13 @@ +--- +title: "Wireshark" +--- + +Homepage: + +Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998. + +## Usage + +Set `wireshark_enabled: true` in your `inventories//nas.yml` file. + +The Wireshark web interface can be found at . From cad799dea014b590b0624661092a64b4ea80d5a6 Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:18:46 +0200 Subject: [PATCH 181/286] Duplicate website/docs/applications/development-tools/woodpecker_ci.md history in roles/woodpecker-ci/docs/ history. --- roles/woodpecker-ci/docs/woodpecker_ci.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 roles/woodpecker-ci/docs/woodpecker_ci.md diff --git a/roles/woodpecker-ci/docs/woodpecker_ci.md b/roles/woodpecker-ci/docs/woodpecker_ci.md new file mode 100644 index 0000000000..50208319b5 --- /dev/null +++ b/roles/woodpecker-ci/docs/woodpecker_ci.md @@ -0,0 +1,19 @@ +--- +title: "Woodpecker CI" +--- + +Woodpecker is a simple CI engine with great extensibility. + +Check it out at . + +## Usage + +Set `woodpecker_ci_enabled: true` in your `inventories//nas.yml` file. + +Gitea (`gitea_enabled: true`) must be set up and running before attempting to set up Woodpecker CI. + +## Setup Tasks + +An Oauth2 application must be set up in Gitea. Visit for more info, then set `woodpecker_ci_gitea_client` and `woodpecker_ci_gitea_secret` accordingly. + +Set `woodpecker_ci_admin_user` to the same username as your user in Gitea. From d039d1e16fd6f724732b9955a375d5ae3642cb2c Mon Sep 17 00:00:00 2001 From: Anarion Dunedain Date: Tue, 28 Mar 2023 14:19:11 +0200 Subject: [PATCH 182/286] Duplicate website/docs/applications/download-tools/youtubedlmaterial.md history in roles/youtubedlmaterial/docs/ history. --- .../docs/youtubedlmaterial.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 roles/youtubedlmaterial/docs/youtubedlmaterial.md diff --git a/roles/youtubedlmaterial/docs/youtubedlmaterial.md b/roles/youtubedlmaterial/docs/youtubedlmaterial.md new file mode 100644 index 0000000000..5065be1ea5 --- /dev/null +++ b/roles/youtubedlmaterial/docs/youtubedlmaterial.md @@ -0,0 +1,19 @@ +--- +title: "YouTubeDL-Material" +--- + +Homepage: +Docker Container: + +YoutubeDL-Material is a Material Design frontend for youtube-dl. It's coded using Angular 9 for the frontend, and Node.js on the backend. + +## Usage + +Set `youtubedlmaterial_enabled: true` in your `inventories//nas.yml` file. + +The YouTubeDL-Material web interface can be found at . + +## Specific Configuration + +A YouTube directory will be created in your configured downloads spot. YouTubeDL-Material downloads will be placed there. +You can change the download location via `inventories//nas.yml` file. From c4ab198ead092dcd7486c39aa373954c639b6a29 Mon Sep 17 00:00:00 2001 From: Anarion Date: Tue, 28 Mar 2023 17:15:40 +0200 Subject: [PATCH 183/286] =?UTF-8?q?=F0=9F=93=9D=20Add=204=20missing=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roles/get_iplayer/docs/get_iplayer.md | 11 +++++++++++ roles/netdata/docs/netdata.md | 11 +++++++++++ roles/sickchill/docs/sickchill.md | 12 ++++++++++++ roles/znc/docs/znc.md | 11 +++++++++++ 4 files changed, 45 insertions(+) create mode 100644 roles/get_iplayer/docs/get_iplayer.md create mode 100644 roles/netdata/docs/netdata.md create mode 100644 roles/sickchill/docs/sickchill.md create mode 100644 roles/znc/docs/znc.md diff --git a/roles/get_iplayer/docs/get_iplayer.md b/roles/get_iplayer/docs/get_iplayer.md new file mode 100644 index 0000000000..48173c248d --- /dev/null +++ b/roles/get_iplayer/docs/get_iplayer.md @@ -0,0 +1,11 @@ +# Get_iPlayer + +Homepage: + +Downloads TV and radio programmes from BBC iPlayer. + +## Usage + +Set `get_iplayer_enabled: true` in your `inventories//nas.yml` file. + +The get_iplayer web interface can be found at . diff --git a/roles/netdata/docs/netdata.md b/roles/netdata/docs/netdata.md new file mode 100644 index 0000000000..e8ef688400 --- /dev/null +++ b/roles/netdata/docs/netdata.md @@ -0,0 +1,11 @@ +# Netdata + +Homepage: + +An extremely comprehensive system monitoring solution. + +## Usage + +Set `netdata_enabled: true` in your `inventories//nas.yml` file. + +Netdata web interface can be found at . diff --git a/roles/sickchill/docs/sickchill.md b/roles/sickchill/docs/sickchill.md new file mode 100644 index 0000000000..8fe2b75aec --- /dev/null +++ b/roles/sickchill/docs/sickchill.md @@ -0,0 +1,12 @@ +# Sickchill + +Homepage: [Sickchill](https://sickchill.github.io/) + +SickChill is an automatic Video Library Manager for TV Shows. +It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want. + +## Usage + +Set `sickchill_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. + +The sickchill web interface can be found at `http://ansible_nas_host_or_ip:8081` by default diff --git a/roles/znc/docs/znc.md b/roles/znc/docs/znc.md new file mode 100644 index 0000000000..bbcb5b54b6 --- /dev/null +++ b/roles/znc/docs/znc.md @@ -0,0 +1,11 @@ +# Znc + +Homepage: + +ZNC is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC. It supports Transport Layer Security connections and IPv6. + +## Usage + +Set `znc_enabled: true` in your `inventories//nas.yml` file. Edit `znc_*` variables to suit your needs. For more advanced needs, edit the template config file (`templates\znc.conf.j2`) directly. + +Connect to ZNC using IRC at ansible_nas_host_or_ip:6677. From 2a1d7fc718e8c1d38eb0858944fd053208b2b4a0 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 2 Apr 2023 23:24:51 +0100 Subject: [PATCH 184/286] Enable scraping of additional hosts from Prometheus --- roles/stats/defaults/main.yml | 4 ++++ roles/stats/tasks/prometheus.yml | 2 +- .../templates/{prometheus.yml => prometheus.yml.j2} | 13 +++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) rename roles/stats/templates/{prometheus.yml => prometheus.yml.j2} (84%) diff --git a/roles/stats/defaults/main.yml b/roles/stats/defaults/main.yml index a0bd81f953..a1d0dde185 100644 --- a/roles/stats/defaults/main.yml +++ b/roles/stats/defaults/main.yml @@ -32,3 +32,7 @@ stats_grafana_memory: 1g stats_prometheus_retention_time: 365d stats_prometheus_retention_size: 30GB stats_collection_interval: 15s + +# uncomment to scrape more hosts +# stats_prometheus_additional_hosts: +# - 192.168.1.1:9100 diff --git a/roles/stats/tasks/prometheus.yml b/roles/stats/tasks/prometheus.yml index f4a8c062e9..fa2779bebb 100644 --- a/roles/stats/tasks/prometheus.yml +++ b/roles/stats/tasks/prometheus.yml @@ -18,7 +18,7 @@ - name: Template Prometheus config template: - src: prometheus.yml + src: prometheus.yml.j2 dest: "{{ stats_prometheus_config_directory }}/prometheus.yml" register: prometheus_config diff --git a/roles/stats/templates/prometheus.yml b/roles/stats/templates/prometheus.yml.j2 similarity index 84% rename from roles/stats/templates/prometheus.yml rename to roles/stats/templates/prometheus.yml.j2 index d16bf8023f..9e7ca1d2f3 100644 --- a/roles/stats/templates/prometheus.yml +++ b/roles/stats/templates/prometheus.yml.j2 @@ -43,3 +43,16 @@ scrape_configs: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ stats_speedtest_exporter_port }}" ] +{% if stats_prometheus_additional_hosts is defined %} + - job_name: "additional_hosts" + static_configs: + - targets: [ +{% for host in stats_prometheus_additional_hosts %} + {{ host }} + {% if not loop.last %} + , + {% endif %} + ] +{% endfor %} +{% endif %} + From 9cd762d5864c7314bac274e9f5b6d0d22d4c14f4 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 2 Apr 2023 23:31:46 +0100 Subject: [PATCH 185/286] Add Prometheus metrics output to Traefik --- roles/traefik/templates/traefik.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/roles/traefik/templates/traefik.toml b/roles/traefik/templates/traefik.toml index 51555ba1d4..c2d4473166 100644 --- a/roles/traefik/templates/traefik.toml +++ b/roles/traefik/templates/traefik.toml @@ -44,3 +44,6 @@ [certificatesResolvers.letsencrypt.acme.dnsChallenge] provider = "{{ traefik_dns_provider }}" + +[metrics] + [metrics.prometheus] From 791ff3e061be98f356eb40f80344744def3378d3 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 9 Apr 2023 21:16:53 +0100 Subject: [PATCH 186/286] Pi4 support tweaks --- nas.yml | 7 +++++++ requirements.yml | 3 +++ 2 files changed, 10 insertions(+) diff --git a/nas.yml b/nas.yml index b71dcd3902..db4d157db0 100644 --- a/nas.yml +++ b/nas.yml @@ -21,10 +21,17 @@ - skip_ansible_lint - role: geerlingguy.docker + when: ansible_architecture == "x86_64" tags: - docker - skip_ansible_lint + - role: geerlingguy.docker_arm + when: ansible_architecture == "aarch64" + tags: + - docker_arm + - skip_ansible_lint + ### ### Ansible-NAS Roles ### diff --git a/requirements.yml b/requirements.yml index d69a68cbb4..db3ff45825 100644 --- a/requirements.yml +++ b/requirements.yml @@ -2,6 +2,9 @@ - name: geerlingguy.docker version: 6.0.0 +- name: geerlingguy.docker_arm + version: 5.0.0 + - name: bertvv.samba version: v2.7.1 From 1c11b89076f724c3ed9cd61751454af0b2efc313 Mon Sep 17 00:00:00 2001 From: Anarion Date: Mon, 10 Apr 2023 10:39:43 +0200 Subject: [PATCH 187/286] =?UTF-8?q?=F0=9F=93=9D=20Remove=20individual=20do?= =?UTF-8?q?cs=20folders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- roles/freshrss/docs/freshrss.md | 23 ------- roles/get_iplayer/docs/get_iplayer.md | 11 --- roles/gitea/docs/gitea.md | 13 ---- roles/gitlab/docs/gitlab.md | 15 ----- roles/glances/docs/glances.md | 17 ----- roles/gotify/docs/gotify.md | 18 ----- roles/guacamole/docs/guacamole.md | 19 ------ roles/healthchecks.io/docs/healthchecks.io.md | 13 ---- roles/heimdall/docs/heimdall.md | 17 ----- roles/homeassistant/docs/homeassistant.md | 15 ----- roles/homebridge/docs/homebridge.md | 13 ---- roles/jackett/docs/jackett.md | 13 ---- roles/jellyfin/docs/jellyfin.md | 67 ------------------- roles/joomla/docs/joomla.md | 26 ------- roles/komga/docs/komga.md | 15 ----- roles/krusader/docs/krusader.md | 15 ----- roles/lidarr/docs/lidarr.md | 11 --- roles/mealie/docs/mealie.md | 13 ---- .../minecraft-server/docs/minecraft-server.md | 15 ----- roles/minidlna/docs/minidlna.md | 13 ---- roles/miniflux/docs/miniflux.md | 15 ----- roles/mosquitto/docs/mosquitto.md | 11 --- roles/mylar/docs/mylar.md | 17 ----- roles/mymediaforalexa/docs/mymediaforalexa.md | 13 ---- roles/n8n/docs/n8n.md | 20 ------ roles/navidrome/docs/navidrome.md | 13 ---- roles/netbootxyz/docs/netbootxyz.md | 17 ----- roles/netdata/docs/netdata.md | 11 --- roles/nextcloud/docs/nextcloud.md | 27 -------- roles/nomad/docs/nomad.md | 13 ---- roles/nzbget/docs/nzbget.md | 13 ---- roles/octoprint/docs/octoprint.md | 12 ---- roles/ombi/docs/ombi.md | 11 --- roles/openhab/docs/openhab.md | 17 ----- roles/organizr/docs/organizr.md | 17 ----- roles/overseerr/docs/overseerr.md | 15 ----- roles/paperless_ng/docs/paperless_ng.md | 25 ------- roles/piwigo/docs/piwigo.md | 30 --------- roles/plex/docs/plex.md | 18 ----- roles/portainer/docs/portainer.md | 11 --- roles/prowlarr/docs/prowlarr.md | 17 ----- roles/pyload/docs/pyload.md | 18 ----- roles/pytivo/docs/pytivo.md | 32 --------- roles/radarr/docs/radarr.md | 24 ------- roles/route53_ddns/docs/route53_ddns.md | 42 ------------ roles/rssbridge/docs/rssbridge.md | 15 ----- roles/sabnzbd/docs/sabnzbd.md | 13 ---- roles/sickchill/docs/sickchill.md | 12 ---- roles/sonarr/docs/sonarr.md | 24 ------- roles/speedtest-tracker/docs/speedtest.md | 17 ----- roles/stats/docs/stats.md | 15 ----- roles/syncthing/docs/syncthing.md | 29 -------- roles/tautulli/docs/tautulli.md | 13 ---- roles/thelounge/docs/thelounge.md | 17 ----- roles/tiddlywiki/docs/tiddlywiki.md | 37 ---------- roles/timemachine/docs/timemachine.md | 30 --------- roles/traefik/docs/traefik.md | 22 ------ .../docs/transmission.md | 27 -------- roles/transmission/docs/transmission.md | 27 -------- roles/ubooquity/docs/ubooquity.md | 27 -------- roles/utorrent/docs/utorrent.md | 17 ----- roles/virtual_desktop/docs/virtual_desktop.md | 32 --------- roles/wallabag/docs/wallabag.md | 19 ------ roles/watchtower/docs/watchtower.md | 17 ----- roles/wireshark/docs/wireshark.md | 13 ---- roles/woodpecker-ci/docs/woodpecker_ci.md | 19 ------ .../docs/youtubedlmaterial.md | 19 ------ roles/znc/docs/znc.md | 11 --- 68 files changed, 1293 deletions(-) delete mode 100644 roles/freshrss/docs/freshrss.md delete mode 100644 roles/get_iplayer/docs/get_iplayer.md delete mode 100644 roles/gitea/docs/gitea.md delete mode 100644 roles/gitlab/docs/gitlab.md delete mode 100644 roles/glances/docs/glances.md delete mode 100644 roles/gotify/docs/gotify.md delete mode 100644 roles/guacamole/docs/guacamole.md delete mode 100644 roles/healthchecks.io/docs/healthchecks.io.md delete mode 100644 roles/heimdall/docs/heimdall.md delete mode 100644 roles/homeassistant/docs/homeassistant.md delete mode 100644 roles/homebridge/docs/homebridge.md delete mode 100644 roles/jackett/docs/jackett.md delete mode 100644 roles/jellyfin/docs/jellyfin.md delete mode 100644 roles/joomla/docs/joomla.md delete mode 100644 roles/komga/docs/komga.md delete mode 100644 roles/krusader/docs/krusader.md delete mode 100644 roles/lidarr/docs/lidarr.md delete mode 100644 roles/mealie/docs/mealie.md delete mode 100644 roles/minecraft-server/docs/minecraft-server.md delete mode 100644 roles/minidlna/docs/minidlna.md delete mode 100644 roles/miniflux/docs/miniflux.md delete mode 100644 roles/mosquitto/docs/mosquitto.md delete mode 100644 roles/mylar/docs/mylar.md delete mode 100644 roles/mymediaforalexa/docs/mymediaforalexa.md delete mode 100644 roles/n8n/docs/n8n.md delete mode 100644 roles/navidrome/docs/navidrome.md delete mode 100644 roles/netbootxyz/docs/netbootxyz.md delete mode 100644 roles/netdata/docs/netdata.md delete mode 100644 roles/nextcloud/docs/nextcloud.md delete mode 100644 roles/nomad/docs/nomad.md delete mode 100644 roles/nzbget/docs/nzbget.md delete mode 100644 roles/octoprint/docs/octoprint.md delete mode 100644 roles/ombi/docs/ombi.md delete mode 100644 roles/openhab/docs/openhab.md delete mode 100644 roles/organizr/docs/organizr.md delete mode 100644 roles/overseerr/docs/overseerr.md delete mode 100644 roles/paperless_ng/docs/paperless_ng.md delete mode 100644 roles/piwigo/docs/piwigo.md delete mode 100644 roles/plex/docs/plex.md delete mode 100644 roles/portainer/docs/portainer.md delete mode 100644 roles/prowlarr/docs/prowlarr.md delete mode 100644 roles/pyload/docs/pyload.md delete mode 100644 roles/pytivo/docs/pytivo.md delete mode 100644 roles/radarr/docs/radarr.md delete mode 100644 roles/route53_ddns/docs/route53_ddns.md delete mode 100644 roles/rssbridge/docs/rssbridge.md delete mode 100644 roles/sabnzbd/docs/sabnzbd.md delete mode 100644 roles/sickchill/docs/sickchill.md delete mode 100644 roles/sonarr/docs/sonarr.md delete mode 100644 roles/speedtest-tracker/docs/speedtest.md delete mode 100644 roles/stats/docs/stats.md delete mode 100644 roles/syncthing/docs/syncthing.md delete mode 100644 roles/tautulli/docs/tautulli.md delete mode 100644 roles/thelounge/docs/thelounge.md delete mode 100644 roles/tiddlywiki/docs/tiddlywiki.md delete mode 100644 roles/timemachine/docs/timemachine.md delete mode 100644 roles/traefik/docs/traefik.md delete mode 100644 roles/transmission-with-openvpn/docs/transmission.md delete mode 100644 roles/transmission/docs/transmission.md delete mode 100644 roles/ubooquity/docs/ubooquity.md delete mode 100644 roles/utorrent/docs/utorrent.md delete mode 100644 roles/virtual_desktop/docs/virtual_desktop.md delete mode 100644 roles/wallabag/docs/wallabag.md delete mode 100644 roles/watchtower/docs/watchtower.md delete mode 100644 roles/wireshark/docs/wireshark.md delete mode 100644 roles/woodpecker-ci/docs/woodpecker_ci.md delete mode 100644 roles/youtubedlmaterial/docs/youtubedlmaterial.md delete mode 100644 roles/znc/docs/znc.md diff --git a/roles/freshrss/docs/freshrss.md b/roles/freshrss/docs/freshrss.md deleted file mode 100644 index b34b3d08ed..0000000000 --- a/roles/freshrss/docs/freshrss.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "FreshRSS" ---- - -Homepage: - -FreshRSS is a self-hosted RSS feed aggregator like Leed or Kriss Feed. - -It is lightweight, easy to work with, powerful, and customizable. - -It is a multi-user application with an anonymous reading mode. It supports custom tags. There is an API for (mobile) clients, and a Command-Line Interface. - -Thanks to the WebSub standard (formerly PubSubHubbub), FreshRSS is able to receive instant push notifications from compatible sources, such as Mastodon, Friendica, WordPress, Blogger, FeedBurner, etc. - -FreshRSS natively supports basic Web scraping, based on XPath, for Web sites not providing any RSS / Atom feed. - -Finally, it supports extensions for further tuning. - -## Usage - -Set `freshrss_enabled: true` in your `inventories//nas.yml` file. - -The FreshRSS web interface can be found at . diff --git a/roles/get_iplayer/docs/get_iplayer.md b/roles/get_iplayer/docs/get_iplayer.md deleted file mode 100644 index 48173c248d..0000000000 --- a/roles/get_iplayer/docs/get_iplayer.md +++ /dev/null @@ -1,11 +0,0 @@ -# Get_iPlayer - -Homepage: - -Downloads TV and radio programmes from BBC iPlayer. - -## Usage - -Set `get_iplayer_enabled: true` in your `inventories//nas.yml` file. - -The get_iplayer web interface can be found at . diff --git a/roles/gitea/docs/gitea.md b/roles/gitea/docs/gitea.md deleted file mode 100644 index 4624342009..0000000000 --- a/roles/gitea/docs/gitea.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Gitea" ---- - -Homepage: - -Gitea is a painless self-hosted Git service. - -## Usage - -Set `gitea_enabled: true` in your `inventories//nas.yml` file. - -The Gitea web interface can be found at . diff --git a/roles/gitlab/docs/gitlab.md b/roles/gitlab/docs/gitlab.md deleted file mode 100644 index f5562d0430..0000000000 --- a/roles/gitlab/docs/gitlab.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "GitLab" ---- - -Homepage: - -If Gitea isn't powerful enough for you then consider GitLab. It's a much more powerful (and consequently bigger) Git repository solution that includes a suite of code analytics. On the other hand it requires more RAM. - -## Usage - -Set `gitlab_enabled: true` in your `inventories//nas.yml` file. - -To make GitLab available externally via Traefik set `gitlab_available_externally: true` in your `inventories//nas.yml` file. - -The first time you run GitLab you'll be prompted for an account's password. The password is for GitLab's `root` administrator account. From there you can log in to create additional users and further configure the application. diff --git a/roles/glances/docs/glances.md b/roles/glances/docs/glances.md deleted file mode 100644 index 8963969682..0000000000 --- a/roles/glances/docs/glances.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Glances" ---- - -Homepage: - -Glances is a cross-platform system monitoring tool written in Python. - -## Usage - -Set `glances_enabled: true` in your `inventories//nas.yml` file. - -The Glances web interface can be found at . - -## Specific Configuration - -Glances can be integrated with InfluxDB and Grafana. diff --git a/roles/gotify/docs/gotify.md b/roles/gotify/docs/gotify.md deleted file mode 100644 index 3e2e4267d6..0000000000 --- a/roles/gotify/docs/gotify.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Gotify" ---- - -Homepage: - -A simple server for sending and receiving messages in real-time per WebSocket. (Includes a sleek web-ui) - -## Usage - -Set `gotify_enabled: true` in your `inventories//nas.yml` file. - -The Gotify web interface can be found at . - -Android client: [https://play.google.com/store/apps/details?id=com.github.gotify](https://play.google.com/store/apps/details?id=com.github.gotify) -iOS client: n/a -Chrome extension: n/a -Firefox extension: diff --git a/roles/guacamole/docs/guacamole.md b/roles/guacamole/docs/guacamole.md deleted file mode 100644 index eb1fa811cb..0000000000 --- a/roles/guacamole/docs/guacamole.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Guacamole" ---- - -Homepage: - -Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH. - -## Usage - -Set `guacamole_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -The default username and password is `guacadmin`. Change it! - -## What to connect to? - -You can run a virtual desktop from your Ansible-NAS box, check out the [Virtual Desktop docs](virtual_desktop.md). diff --git a/roles/healthchecks.io/docs/healthchecks.io.md b/roles/healthchecks.io/docs/healthchecks.io.md deleted file mode 100644 index aadbcf9431..0000000000 --- a/roles/healthchecks.io/docs/healthchecks.io.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Healthchecks.io" ---- - -Homepage: - -A simple cronjob that uses `curl` to ping a given endpoint on the `healthchecks.io` servers. You can choose how often it should ping the endpoint, and what happens when it doesn't. Email/Slack/Telegram and many more services can be integrated. - -## Usage - -Create your own project on , and set both the time between pings and the grace time. Set your prefered integration such as email. - -Set `healthchecks_enabled: true` in your `inventories//nas.yml` file, and if your time between pings is different than the default `healthchecks_ping_minutes`, change it. Finally, set your ping url in the `healthchecks_url` variable. diff --git a/roles/heimdall/docs/heimdall.md b/roles/heimdall/docs/heimdall.md deleted file mode 100644 index 7b0b00c307..0000000000 --- a/roles/heimdall/docs/heimdall.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Heimdall" ---- - -Homepage: - -Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like - -## Usage - -Set `heimdall_enabled: true` in your `inventories//nas.yml` file. - -The Heimdall web interface can be found at . - -## Specific Configuration - -Heimdall defaults to port 10080 - some browsers block this port. Override `heimdall_port_http` to move it somewhere else. diff --git a/roles/homeassistant/docs/homeassistant.md b/roles/homeassistant/docs/homeassistant.md deleted file mode 100644 index ac1bc59b59..0000000000 --- a/roles/homeassistant/docs/homeassistant.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Home Assistant" ---- - -Homepage: - -Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts. - -## Usage - -Set `homeassistant_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Home Assistant externally, don't forget to set `homeassistant_available_externally: true` in your `inventories//nas.yml` file. - -The Home Assistant web interface can be found at . diff --git a/roles/homebridge/docs/homebridge.md b/roles/homebridge/docs/homebridge.md deleted file mode 100644 index 98c80ebcdc..0000000000 --- a/roles/homebridge/docs/homebridge.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Homebridge" ---- - -Homepage: - -Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices. - -## Usage - -Set `homebridge_enabled: true` in your `inventories//nas.yml` file. - -The Homebridge web interface can be found at . The default username and password is 'admin' - change this after your first login! diff --git a/roles/jackett/docs/jackett.md b/roles/jackett/docs/jackett.md deleted file mode 100644 index 866c1792ee..0000000000 --- a/roles/jackett/docs/jackett.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Jackett" ---- - -Homepage: - -Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, qBittorrent, Nefarious etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. - -## Usage - -Set `jackett_enabled: true` in your `inventories//nas.yml` file. - -The Jackett web interface can be found at . diff --git a/roles/jellyfin/docs/jellyfin.md b/roles/jellyfin/docs/jellyfin.md deleted file mode 100644 index 939177de2b..0000000000 --- a/roles/jellyfin/docs/jellyfin.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Jellyfin" ---- - -Homepage: - -Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest! - -Note that [Plex](https://www.plex.tv/), also included in Ansible-NAS, has a very -similar functionality. - -## Usage - -Set `jellyfin_enabled: true` in your `inventories//nas.yml` file. There are further -parameters you can edit such as `movies_root`, `tv_root` or `music_root` lower down - -## Specific Configuration - -The jellyfin web interface can be found at port 8896 (http) or 8928 (https, if -configured) of your NAS. - -By default, Ansible-NAS gives jellyfin read/write access to the folders where your -movies, TV shows and music are stored. To change this to read-only, edit the following -lines in `all.yml`: - -```yaml - jellyfin_movies_permissions: "rw" - jellyfin_tv_permissions: "rw" - jellyfin_books_permissions: "rw" - jellyfin_audiobooks_permissions: "rw" - jellyfin_music_permissions: "rw" -``` - -so that they end in `ro` instead of `rw`. Note that jellyfin will not be able to -delete files then, which might be exactly what you want. However, you will not -have the option to store cover art in the related folders. Always leave the -configuration directory read/write - -## Naming movies and TV shows - -jellyfin is very fussy about how movies and TV shows must be named to enable -automatic downloads of cover art and metadata. In short, movie files should -follow how movies are listed in the [IMDb](https://www.imdb.com/), including the -year of publication: - -```raw - movies/Bride of Frankenstein (1935).mp4 -``` - -Note the spaces. You should probably remove colons and other special characters -TV shows require a folder structure with the name of the series - again if -possible with the year of publication - followed by sub-folders for the -individual seasons. For example, the first episode of the first season of -the original "Doctor Who" could be stored as: - -```raw - tv/Doctor Who (1963)/Season 1/Doctor Who - s01e01.mp4 -``` - -The [TVDB](https://www.thetvdb.com/) is one source for the exact names of TV -shows. - -Unfortunately, there are number of special cases, especially related to split -movies and older series. See the [movie -naming](https://github.com/MediaBrowser/Wiki/wiki/Movie%20naming) and [TV -naming](https://github.com/MediaBrowser/Wiki/wiki/TV-naming) guides for further -information. diff --git a/roles/joomla/docs/joomla.md b/roles/joomla/docs/joomla.md deleted file mode 100644 index e573f2f397..0000000000 --- a/roles/joomla/docs/joomla.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Joomla" -description: "An award-winning content management system" ---- - -Homepage: - -Joomla! is an award-winning content management system (CMS), which enables you to build web sites and powerful online applications. - -## Usage - -Set `joomla_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Joomla externally, set `joomla_available_externally: true` in your `inventories//nas.yml` file. - -The Joomla web interface can be found at . - -## Specific Configuration - -- Set `joomla_database_password` in your `all.yml` before installing Joomla. - -- On first run you'll need to enter database details: - - Host: `mysql` - - Database: `joomla` - - Username: `root` - - Password: whatever you set for `joomla_database_password`. diff --git a/roles/komga/docs/komga.md b/roles/komga/docs/komga.md deleted file mode 100644 index 82b21acc71..0000000000 --- a/roles/komga/docs/komga.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Komga" ---- - -Homepage: - -Docker Image: - -Komga is a media server for your comics, mangas, BDs and magazines. - -## Usage - -Set `komga_enabled: true` in your `inventories//nas.yml` file. - -Access the webui at by default. diff --git a/roles/krusader/docs/krusader.md b/roles/krusader/docs/krusader.md deleted file mode 100644 index 4c3e147f76..0000000000 --- a/roles/krusader/docs/krusader.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Krusader" ---- - -Homepage: - -Docker Container: [Krusader](https://hub.docker.com/r/djaydev/krusader) - -Krusader provides twin panel file management for your ansible-nas via browser and VNC. - -## Usage - -Set `krusader_enabled: true` in your `inventories//nas.yml` file. - -The Krusader web interface can be found at . diff --git a/roles/lidarr/docs/lidarr.md b/roles/lidarr/docs/lidarr.md deleted file mode 100644 index 32843d4add..0000000000 --- a/roles/lidarr/docs/lidarr.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Lidarr" ---- - -Homepage: - -Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. - -## Usage - -Set `lidarr_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/mealie/docs/mealie.md b/roles/mealie/docs/mealie.md deleted file mode 100644 index b001c10f6c..0000000000 --- a/roles/mealie/docs/mealie.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Mealie" ---- - -Homepage: - -A self-hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. - -## Usage - -Set `mealie_enabled: true` in your `inventories//nas.yml` file. - -The Mealie web interface can be found at . diff --git a/roles/minecraft-server/docs/minecraft-server.md b/roles/minecraft-server/docs/minecraft-server.md deleted file mode 100644 index e9e4e4a88c..0000000000 --- a/roles/minecraft-server/docs/minecraft-server.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Minecraft Server" ---- - -Homepage: - -The server version of the game Minecraft, running in a container. "Prepare for an adventure of limitless possibilities as you build, mine, battle mobs, and explore the ever-changing Minecraft landscape." - -## Usage - -Set `minecraft_server_enabled: true` in your `inventories//nas.yml` file. - -The Ansible NAS host or ip address should then be usable as a server within the Minecraft multiplayer game menu. - -The image `itzg/minecraft-server` has [documentation](https://github.com/itzg/docker-minecraft-server/blob/master/README.md) with further details on how to manage the Minecraft server instance. diff --git a/roles/minidlna/docs/minidlna.md b/roles/minidlna/docs/minidlna.md deleted file mode 100644 index f216795b71..0000000000 --- a/roles/minidlna/docs/minidlna.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "MiniDLNA" ---- - -Homepage: - -MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP clients. The MiniDNLA daemon serves media files (music, pictures, and video) to clients on a network. Example clients include applications such as Totem and Kodi, and devices such as portable media players, Smartphones, Televisions, and gaming systems (such as PS3 and Xbox 360). - -## Usage - -Set `minidlna_enabled: true` in your `inventories//nas.yml` file. - -The very basic MiniDLNA web interface can be found at . diff --git a/roles/miniflux/docs/miniflux.md b/roles/miniflux/docs/miniflux.md deleted file mode 100644 index 92890158b9..0000000000 --- a/roles/miniflux/docs/miniflux.md +++ /dev/null @@ -1,15 +0,0 @@ -# Miniflux - -Homepage: - -Miniflux is a minimalist and opinionated feed reader. - -## Usage - -Set `miniflux_enabled: true` in your `inventories//nas.yml` file. - -The Miniflux web interface can be found at , the default username is `admin` and password `supersecure`. - -## Specific Configuration - -An admin user will be created with the username and password of `miniflux_admin_username` and `miniflux_admin_password` respectively. These can be found in the Miniflux section within `all.yml.dist`. diff --git a/roles/mosquitto/docs/mosquitto.md b/roles/mosquitto/docs/mosquitto.md deleted file mode 100644 index 5fe0c9d6cc..0000000000 --- a/roles/mosquitto/docs/mosquitto.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Mosquitto" ---- - -Homepage: - -Mosquitto is a lightweight open source MQTT message broker. - -## Usage - -Set `mosquitto_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/mylar/docs/mylar.md b/roles/mylar/docs/mylar.md deleted file mode 100644 index 819183f1b1..0000000000 --- a/roles/mylar/docs/mylar.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Mylar" ---- - -Homepage: - -Docker Container: - -An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents - -## Usage - -Set `mylar_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Mylar externally, don't forget to set `mylar_available_externally: true` in your `inventories//nas.yml` file. - -The Mylar web interface can be found at . diff --git a/roles/mymediaforalexa/docs/mymediaforalexa.md b/roles/mymediaforalexa/docs/mymediaforalexa.md deleted file mode 100644 index 85b42f6dcb..0000000000 --- a/roles/mymediaforalexa/docs/mymediaforalexa.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "My Media for Alexa" ---- - -Homepage: - -My Media lets you stream your music collection to your Amazon Echo or Amazon Dot without having to upload all your music collection to the Cloud. This keeps your music under your control. - -## Usage - -Set `mymediaforalexa_enabled: true` in your `inventories//nas.yml` file. - -The My Media for Alexa web interface can be found at . diff --git a/roles/n8n/docs/n8n.md b/roles/n8n/docs/n8n.md deleted file mode 100644 index c96511632b..0000000000 --- a/roles/n8n/docs/n8n.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: "Nodemation (n8n)" ---- - -Homepage: - -Extendable workflow automation tool that enables you to connect anything to everything. More pragrmatically, it helps you interconnect API with each other to build your own information / work flows. - -## Usage - -Set `n8n_enabled: true` in your `inventories//nas.yml` file. - -n8n is secured by default, he user and password can be set with: - -```yaml - n8n_basic_auth_user: "" - n8n_basic_auth_password: "" -``` - -The default for these is "n8n_user" and "n8n_change_me" respectively, it is recommended to change these. diff --git a/roles/navidrome/docs/navidrome.md b/roles/navidrome/docs/navidrome.md deleted file mode 100644 index 3e5380e228..0000000000 --- a/roles/navidrome/docs/navidrome.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Navidrome" ---- - -Homepage: - -Navidrome is an open source web-based music collection server and streamer that is compatible with Subsonic/Airsonic. It gives you freedom to listen to your music collection from any browser or mobile device. It's like your personal Spotify! - -## Usage - -Set `navidrome_enabled: true` in your `inventories//nas.yml` file. - -The Navidrome web interface can be found at . diff --git a/roles/netbootxyz/docs/netbootxyz.md b/roles/netbootxyz/docs/netbootxyz.md deleted file mode 100644 index bca2bd5d25..0000000000 --- a/roles/netbootxyz/docs/netbootxyz.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "netboot.xyz" ---- - -Homepage: - -Docker Container: - -netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool. [iPXE](https://ipxe.org/) is used to provide a user friendly menu from within the BIOS that lets you easily choose the operating system you want along with any specific types of versions or bootable flags. - -You can remote attach the ISO to servers, set it up as a rescue option in Grub, or even set up your home network to boot to it by default so that it's always available. - -## Usage - -Set `netbootxyz_enabled: true` in your `inventories//nas.yml` file. - -The netbooxyz web interface can be found at . diff --git a/roles/netdata/docs/netdata.md b/roles/netdata/docs/netdata.md deleted file mode 100644 index e8ef688400..0000000000 --- a/roles/netdata/docs/netdata.md +++ /dev/null @@ -1,11 +0,0 @@ -# Netdata - -Homepage: - -An extremely comprehensive system monitoring solution. - -## Usage - -Set `netdata_enabled: true` in your `inventories//nas.yml` file. - -Netdata web interface can be found at . diff --git a/roles/nextcloud/docs/nextcloud.md b/roles/nextcloud/docs/nextcloud.md deleted file mode 100644 index 5cc5b062fd..0000000000 --- a/roles/nextcloud/docs/nextcloud.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Nextcloud" ---- - -Homepage: - -## Usage - -Set `nextcloud_enabled: true` in your `inventories//nas.yml` file. - -Tread carefully. - -External access may require that you manually configure your Fully Qualified Domain Name (FQDN) as a trusted domain within the application. There is an environment variable set up for this in the "nextcloud task" which will most likely make manual configuration unnecessary. If you get the following [screenshot](https://docs.nextcloud.com/server/14/admin_manual/installation/installation_wizard.html#trusted-domains) warning when trying to access nextcloud externally you'll need to manually set it up. - -This can be accomplished in two commands. - -```bash -# On the server where the docker containers are running -$ docker exec -it --user www-data nextcloud /bin/bash -$ php occ config:system:set trusted_domains INDEX_FOR_NEW_ENTRY_SEE_DOCS_LINK_BELOW --value=YOUR_FQDN_HERE --update-only -``` - -The above commands are documented in the administration guide for Nextcloud: - -* [set array values](https://docs.nextcloud.com/server/14/admin_manual/configuration_server/occ_command.html#setting-an-array-configuration-value) - -* [docker container docs, references environment variables](https://github.com/nextcloud/docker) diff --git a/roles/nomad/docs/nomad.md b/roles/nomad/docs/nomad.md deleted file mode 100644 index 08389d110a..0000000000 --- a/roles/nomad/docs/nomad.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Nomad" ---- - -Homepage: - -A simple and flexible scheduler and orchestrator to deploy and manage containers and non-containerised applications across on-prem and clouds at scale. - -## Usage - -Set `nomad_enabled: true` in your `inventories//nas.yml` file. - -Nomad's web interface can be found at diff --git a/roles/nzbget/docs/nzbget.md b/roles/nzbget/docs/nzbget.md deleted file mode 100644 index 1e81efb51e..0000000000 --- a/roles/nzbget/docs/nzbget.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "NZBGet" ---- - -Homepage: - -The most efficient Usenet downloader. NZBGet is written in C++ and designed with performance in mind to achieve maximum download speed by using very little system resources. - -## Usage - -Set `nzbget_enabled: true` in your `inventories//nas.yml` file. - -The NZBget web interface can be found at , the default username is `nzbget` and password `tegbzn6789`. Change this once you've logged in! diff --git a/roles/octoprint/docs/octoprint.md b/roles/octoprint/docs/octoprint.md deleted file mode 100644 index 1d5b8c413e..0000000000 --- a/roles/octoprint/docs/octoprint.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Octoprint" ---- -Homepage: - -Octoprint is a control and monitoring application for your 3D printer. You can start and stop print jobs, view your webcam feed, move the print head and extruder manually and check your gcode files, all from a single web interface. Octoprint doesn't require modifications on the printer firmware, just make sure your NAS is phisically connected to it with a usb cable. - -## Usage - -Connect the printer to your NAS, and take note of where the serial interface is mounted (usually it's automounted in `/dev/ttyUSB0`). Set `octoprint_enabled: true` in your `inventories//nas.yml` file, as well as the `octoprint_printer_mountpoint` variable if your printer doesn't mount to the default location. - -If you want to also have a webcam feed, attach one to your NAS and take note of its mountpoint as well (usually `/dev/video0`). Set `octoprint_enable_webcam: true` and add a `octoprint_webcam_mountpoint` variable if the webcam doesn't mount to the default location. diff --git a/roles/ombi/docs/ombi.md b/roles/ombi/docs/ombi.md deleted file mode 100644 index c13076c280..0000000000 --- a/roles/ombi/docs/ombi.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Ombi" ---- - -Homepage: - -Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users. - -## Usage - -Set `ombi_enabled: true` in your `inventories//nas.yml` file. diff --git a/roles/openhab/docs/openhab.md b/roles/openhab/docs/openhab.md deleted file mode 100644 index 47a60422ae..0000000000 --- a/roles/openhab/docs/openhab.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "openHAB" ---- - -Homepage: - -OpenHab is a vendor and technology agnostic open source automation software for your home. -It allows you to connect many different IoT-Devices (which in this case means "Intranet of Things") using custom bindings made by the community. - -## Usage - -Set `openhab_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -The openHAB Webinterface is available at port 7777 (HTTP) and 7778 (HTTPS). -Visit the webinterface and follow the setup instructions found in the [openHAB Documentation](https://www.openhab.org/docs/tutorial/1sttimesetup.html) diff --git a/roles/organizr/docs/organizr.md b/roles/organizr/docs/organizr.md deleted file mode 100644 index 3fb1b3cd95..0000000000 --- a/roles/organizr/docs/organizr.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Organizr" ---- - -Homepage: - -ORGANIZR aims to be your one stop shop for your Servers Frontend. - -Do you have quite a bit of services running on your computer or server? Do you have a lot of bookmarks or have to memor$ - -TODO: finish this truncated description - -## Usage - -Set `organizr_enabled: true` in your `inventories//nas.yml` file. - -The Organizr web interface can be found at . diff --git a/roles/overseerr/docs/overseerr.md b/roles/overseerr/docs/overseerr.md deleted file mode 100644 index d754a8291d..0000000000 --- a/roles/overseerr/docs/overseerr.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Overseerr" ---- - - Homepage: - - Docker Container: - - Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services, such as Sonarr, Radarr, and Plex! - -## Usage - - Using overseerr: Set `overseerr_enabled: true` in your `inventories//nas.yml` file. - - The overseerr web interface can be found at . diff --git a/roles/paperless_ng/docs/paperless_ng.md b/roles/paperless_ng/docs/paperless_ng.md deleted file mode 100644 index 651a01ad9e..0000000000 --- a/roles/paperless_ng/docs/paperless_ng.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "Paperless-ng" ---- - -Homepage: - -Paperless is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents. - -Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood - -## Usage - -Set `paperless_ng_enabled: true` in your `inventories//nas.yml` file. - -The paperless-ng web interface can be found at . - -### Create the superuser - -To be able to login, you will need a super user. To create it, execute the following command: - -```bash -docker exec -it paperless_ng_uiserver python manage.py createsuperuser -``` - -This will prompt you to set a username, an optional e-mail address and finally a password (at least 8 characters). diff --git a/roles/piwigo/docs/piwigo.md b/roles/piwigo/docs/piwigo.md deleted file mode 100644 index f6760f8df9..0000000000 --- a/roles/piwigo/docs/piwigo.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Piwigo" ---- - -Homepage: [Piwigo.org](https://piwigo.org) - -Piwigo is open source photo gallery software for the web. Designed for organisations, teams and individuals. - -## Usage - -Set `piwigo_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Piwigo externally, set `piwigo_available_externally: true` in your `inventories//nas.yml` file. - -The Piwigo web interface can be found at . - -## Specific Configuration - -Optional configurations: - -- Set `piwigo_mysql_user` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". -- Set `piwigo_mysql_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". -- Set `piwigo_mysql_root_password` in `inventories//group_vars/nas.yml` before installing Piwigo, this defaults to "piwigo". - -- On first run you'll need to enter database details: - - Host: `db:3306` - - Username: the value of piwigo_mysql_user, defaults to "piwigo" - - Password: the value of piwigo_password, defaults to "piwigo" - - Database Name: `piwigo` - - Database tables prefix: should be prefilled with `piwigo_` diff --git a/roles/plex/docs/plex.md b/roles/plex/docs/plex.md deleted file mode 100644 index 8fb789020f..0000000000 --- a/roles/plex/docs/plex.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Plex" ---- - -Homepage: - -Plex is a personal media server that also provides access to several external movie, web show, and podcast services. Allows you to stream music too. Apps for many devices, including e.g. chromecast integration. - -## Usage - -Set `plex_enabled: true` in your `inventories//nas.yml` file. - -The Plex web interface can be found at . - -## Specific Configuration - -You'll need to log in with a plex account, (or possibly claim your server). -You'll need to set up your local file store - go to settings > Manage > Libraries, and add your libraries. These are mounted in the root directory by default. diff --git a/roles/portainer/docs/portainer.md b/roles/portainer/docs/portainer.md deleted file mode 100644 index 78c727e62f..0000000000 --- a/roles/portainer/docs/portainer.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: "Portainer" ---- - -Homepage: - -## Usage - -Set `portainer_enabled: true` in your `inventories//nas.yml` file. - -The Portainer web interface can be found at . diff --git a/roles/prowlarr/docs/prowlarr.md b/roles/prowlarr/docs/prowlarr.md deleted file mode 100644 index 0c0c0b45c1..0000000000 --- a/roles/prowlarr/docs/prowlarr.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Prowlarr" ---- - -Homepages: [prowlarr](https://github.com/Prowlarr/Prowlarr) - -**Prowlarr** is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all). - -## Usage - -Set `prowlarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Prowlarr web interface can be found at `http://ansible_nas_host_or_ip:9696` by default - -## Specific Configuration - -For comprehensive configuration instructions see the [Prowlarr wiki](https://wiki.servarr.com/prowlarr) or [Prowlarr Github page](https://github.com/Prowlarr/Prowlarr) diff --git a/roles/pyload/docs/pyload.md b/roles/pyload/docs/pyload.md deleted file mode 100644 index 7870a26a1e..0000000000 --- a/roles/pyload/docs/pyload.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "pyLoad" ---- - -Homepage: [https://pyload.net/](https://pyload.net/) - -Free and Open Source download manager written in Python and designed to be extremely lightweight, easily extensible and fully manageable via web. - -## Usage - -Set `pyload_enabled: true` in your `inventories//nas.yml` file. - -pyLoad's web interface can be found at . - -## Specific Configuration - -Default username is `pyload` and default password is `pyload` -In order to add or remove users, you will need to access the container from an interactive shell (can easily be done from portainer, if installed) and enter pyLoad's home directory `/opt/pyload` and using the command `python pyLoadCore.py -u` and follow the on-screen prompts. More commands to configure and customize pyLoad can be found on it's website. diff --git a/roles/pytivo/docs/pytivo.md b/roles/pytivo/docs/pytivo.md deleted file mode 100644 index c3344a23b7..0000000000 --- a/roles/pytivo/docs/pytivo.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "PyTivo" ---- - -Project Homepage: - - -Docker Homepage: - - -PyTivo is both an HMO and GoBack server. Similar to TiVo Desktop pyTivo -loads many standard video compression codecs and outputs mpeg2 video to -the TiVo. However, pyTivo is able to load MANY more file types than TiVo -Desktop. - -## Usage - -Set `pytivo_enabled: true` in your `group_vars/all.yml` file. The PyTivo -web interface can be found at . - -## Specific Configuration - -PyTivo needs to be configured for use. Your ansible-nas media is -available to share via: - -* /movies - Where your movies are stored -* /music - Where your music is stored -* /photos - Where your photos are stored -* /podcasts - Where your podcasts are stored -* /tv - Where your TV episodes are stored - -Configuration help for PyTivo settings can be found at [Configure_pyTivo](https://pytivo.sourceforge.io/wiki/index.php/Configure_pyTivo). diff --git a/roles/radarr/docs/radarr.md b/roles/radarr/docs/radarr.md deleted file mode 100644 index 09355c1f76..0000000000 --- a/roles/radarr/docs/radarr.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Radarr" ---- - -Homepage: [radarr](https://radarr.video/) - -**Radarr** is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent. - -## Usage - -Set `radarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Radarr web interface can be found at `http://ansible_nas_host_or_ip:7878` by default - -## Specific Configuration - -**First make sure Radarr has permissions to write and read the `/download`, and `/movies` folders**. Do this by ensuring the `radarr_movies_directory:` and `radarr_download_directory` settings are correct. - -Radarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* - -For Radarr to understand that the `/movies` folder is a folder, you'll need to add a new subfolder into it. -You can also do this by adding a random movie to the folder. Keep in mind to have the internal setting **Create empty movie folders** on **yes** - -Comprehensive setup information can be found on the [Radarr GitHub wiki](https://github.com/Radarr/Radarr/wiki/Setup-Guide) diff --git a/roles/route53_ddns/docs/route53_ddns.md b/roles/route53_ddns/docs/route53_ddns.md deleted file mode 100644 index 4ac4009997..0000000000 --- a/roles/route53_ddns/docs/route53_ddns.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: "AWS Route53 Dynamic DNS Updater" ---- - -ddns-route53: - -AWS Route53: - -If you want your Ansible-NAS accessible externally then you need a domain name. You will also need to set a wildcard host `A` record to point to your static IP, or enable this container to automatically update AWS Route53 with your dynamic IP address. - -## Usage - -Set `route53_ddns_enabled: true` in your `inventories//nas.yml` file. - -Set required AWS access credentials from the AWS Console. (See below.) - -## Specific Configuration - -Make sure you set your domain (if different than the `ansible-nas` default) and access details within your `inventories//nas.yml` file. - -To set up Route53 to work with the service, please review the [Prerequisites](https://crazymax.dev/ddns-route53/usage/prerequisites/) page. In short, you will need to set up a Route53 [Hosted Zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html), an [IAM Policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html), and an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) with API credentials. - -### AWS Access Credentials - -| Parameter | Description | Status | -|--------------------|-------------------|-----------| -| route53_key_id | AWS access key ID | mandatory | -| route53_secret_key | AWS secret key | mandatory | - -### Networking - -| Parameter | Description | Status | -|------------------------|--------------------------------|-----------| -| route53_hosted_zone_id | Route53 hosted zone ID | mandatory | -| route53_ttl | Time-to-live for the DNS entry | | -| route53_host | Wildcard domain to update | | - -### Application - -| Parameter | Description | Status | -|------------------|-----------------------------------------------------|-----------| -| route53_schedule | [CRON](https://pkg.go.dev/github.com/robfig/cron?utm_source=godoc#hdr-CRON_Expression_Format) schedule for checking and updating DNS entry | | diff --git a/roles/rssbridge/docs/rssbridge.md b/roles/rssbridge/docs/rssbridge.md deleted file mode 100644 index 9ea01ba1b9..0000000000 --- a/roles/rssbridge/docs/rssbridge.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "RSS-Bridge" ---- - -Homepage: - -RSS-Bridge is a PHP project capable of generating RSS and Atom feeds for websites that don't have one. It can be used on webservers or as a stand-alone application in CLI mode. - -Important: RSS-Bridge is not a feed reader or feed aggregator, but a tool to generate feeds that are consumed by feed readers and feed aggregators. - -## Usage - -Set `rssbridge_enabled: true` in your `inventories//nas.yml` file. - -The RSS-Bridge web interface can be found at . diff --git a/roles/sabnzbd/docs/sabnzbd.md b/roles/sabnzbd/docs/sabnzbd.md deleted file mode 100644 index ddbd27d51b..0000000000 --- a/roles/sabnzbd/docs/sabnzbd.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Sabnzbd" ---- - -Homepage: - -The time tested Usenet downloader provided with FreeNAS. It just works for those migrating from FreeNAS. - -## Usage - -Set `sabnzbd_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Sabnzbd web interface can be found at . Use this interface to configure the software upon first connection. diff --git a/roles/sickchill/docs/sickchill.md b/roles/sickchill/docs/sickchill.md deleted file mode 100644 index 8fe2b75aec..0000000000 --- a/roles/sickchill/docs/sickchill.md +++ /dev/null @@ -1,12 +0,0 @@ -# Sickchill - -Homepage: [Sickchill](https://sickchill.github.io/) - -SickChill is an automatic Video Library Manager for TV Shows. -It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want. - -## Usage - -Set `sickchill_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The sickchill web interface can be found at `http://ansible_nas_host_or_ip:8081` by default diff --git a/roles/sonarr/docs/sonarr.md b/roles/sonarr/docs/sonarr.md deleted file mode 100644 index 0833ecb97e..0000000000 --- a/roles/sonarr/docs/sonarr.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Sonarr" ---- - -Homepage: - -**Sonarr** is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. - -## Usage - -Set `sonarr_enabled: true` in your `/inventories/[my inventory]/group_vars/nas.yml` file. - -The Sonarr web interface can be found at `http://ansible_nas_host_or_ip:8989` by default - -## Specific Configuration - -**First make sure Sonarr has permissions to write and read the `/download` and `/tv` folders**. Do this by ensuring the `sonarr_movies_directory:` and `sonarr_download_directory` settings are correct. - -Sonarr will get the file path from the Download client. On default settings with Transmission the path is `/storage/downloads/complete`. You will need to create a path mapping in the **Remote Path Mappings** settings under **Download Client** to point to your internal path that is by default `/downloads`. *If you have difficulties with the path mapping you could also just add a new volume path for the Transmission container and use `/downloads` as the download directory.* - -For Sonarr to understand that the `/tv` folder is a folder, you'll need to add a folder into it. -You can also do this by adding a random series to the folder. Keep in mind to have the setting **Create empty movie folders** on **yes** - -For comprehensive configuration instructions see the [Sonarr GitHub wiki](https://github.com/Sonarr/Sonarr/wiki) diff --git a/roles/speedtest-tracker/docs/speedtest.md b/roles/speedtest-tracker/docs/speedtest.md deleted file mode 100644 index d9f82ad92c..0000000000 --- a/roles/speedtest-tracker/docs/speedtest.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Speedtest-Tracker" ---- - -Homepage: - -Docker Container: - -Continuously track your internet speed - -## Usage - -Set `speedtest_tracker_enabled: true` in your `inventories//nas.yml` file. - -If you want to access Speedtest-Tracker externally, don't forget to set `speedtest_tracker_available_externally: true` in your `inventories//nas.yml` file. - -The Speedtest-Tracker interface can be found at . diff --git a/roles/stats/docs/stats.md b/roles/stats/docs/stats.md deleted file mode 100644 index 1a92639aa8..0000000000 --- a/roles/stats/docs/stats.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Stats" ---- - -The stats role uses Prometheus, Grafana, Telegraf and a number of metrics exporters to collect and record lots of metrics about your NAS. - -Telegraf also exposes an InfluxDB endpoint for applications that require it. - -## Usage - -Set `stats_enabled: true` in your `inventories//nas.yml` file. If you want to gather metrics on your internet connection, enable `stats_internet_speed_test_enabled` too. - -If you want to access Grafana externally, set `stats_grafana_available_externally: true` in your `inventories//nas.yml` file. If you want to access Promethehus externally, set `stats_prometheus_available_externally: true` in your `inventories//nas.yml` file. - -The Grafana web interface can be found at , Prometheus can be found at diff --git a/roles/syncthing/docs/syncthing.md b/roles/syncthing/docs/syncthing.md deleted file mode 100644 index 83e882d0db..0000000000 --- a/roles/syncthing/docs/syncthing.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "Syncthing" ---- - -Homepage: - -Github: - -Docker: - -Syncthing is a continuous file synchronization program. It synchronizes files -between two or more computers. It strives to fulfill the goals below in summary. -Syncthing should be: - -1. Safe From Data Loss -2. Secure Against Attackers -3. Easy to Use -4. Automatic -5. Universally Available -6. For Individuals -7. For eveything else see the goals document - -## Usage - -Set `syncthing_enabled: true` in your `\inventories\[my inventory]\group_vars\nas.yml` file. - -## Specific Configuration - -Open the web interface at :8384 to configure. diff --git a/roles/tautulli/docs/tautulli.md b/roles/tautulli/docs/tautulli.md deleted file mode 100644 index a987629912..0000000000 --- a/roles/tautulli/docs/tautulli.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Tautulli" ---- - -Homepage: - -Tautulli allows you to monitor your Plex Media Server. - -## Usage - -Set `tautulli_enabled: true` in your `inventories//nas.yml` file. - -The Tautulli web interface can be found at . diff --git a/roles/thelounge/docs/thelounge.md b/roles/thelounge/docs/thelounge.md deleted file mode 100644 index 6292a700ae..0000000000 --- a/roles/thelounge/docs/thelounge.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "The Lounge" ---- - -Homepage: - -The Lounge is a self-hosted web IRC client. - -## Usage - -Set `thelounge_enabled: true` in your `inventories//nas.yml` file. - -The Lounge web interface can be found at . - -## Specific Configuration - -The default username and password is `admin`. Change this once you've logged in! diff --git a/roles/tiddlywiki/docs/tiddlywiki.md b/roles/tiddlywiki/docs/tiddlywiki.md deleted file mode 100644 index be0344b2e0..0000000000 --- a/roles/tiddlywiki/docs/tiddlywiki.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "TiddlyWiki" -description: "A notebook for capturing, organizing, and sharing information" ---- - -Homepage: - -TiddlyWiki is a unique non-linear notebook for capturing, organizing, and sharing complex information. Use it to keep your to-do list, to plan an essay or novel, or to organise your wedding. Record every thought that crosses your brain, or build a flexible and responsive website. Unlike conventional online services, TiddlyWiki lets you choose where to keep your data, guaranteeing that in the decades to come you will still be able to use the notes you take today. - -## Usage - -Set `tiddlywiki_enabled: true` in your `inventories//nas.yml` file. - -If you want to access TiddlyWiki externally, set `tiddlywiki_available_externally: true` in your `inventories//nas.yml` file. - -The TiddlyWiki web interface can be found at . - -## Specific Configuration - -The TiddlyWiki role has several configuration parameters. All parameters are optional. - -### Data and Networking - -| Parameter | Description | -|---------------------------|-------------------------------| -| tiddlywiki_data_directory | Host location to store data | -| tiddlywiki_port | Host port for internal access | -| tiddlywiki_hostname | Subdomain for external access | - -### Server Configuration - -| Parameter | Description | -|------------------------|--------------------------| -| tiddlywiki_username | Basic Auth username | -| tiddlywiki_password | Basic Auth password | -| tiddlywiki_node_memory | NodeJS memory allocation | -| tiddlywiki_debug_level | Service debugging | diff --git a/roles/timemachine/docs/timemachine.md b/roles/timemachine/docs/timemachine.md deleted file mode 100644 index 2589ebe87a..0000000000 --- a/roles/timemachine/docs/timemachine.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: "Time Machine" ---- - -Apple docs: - -Docker image: - -Time Machine is an application that allows you to backup files from your Mac. - -Older versions of Time Machine relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. - -## Usage - -Set `timemachine_enabled: true` in your `inventories//nas.yml` file. - -Enabling Time Machine will result in the installation of Avahi on the NAS system (if it is not already installed) and a Time Machine service configuration file for Avahi will be added to the system (at `/etc/avahi/services/timemachine.service`) to allow for Time Machine discovery by Macs on the local network. Avahi runs on the system, rather than in a container, as the same Avahi instance can be used to announce any number of services. - -The Samba server included in the Time Machine docker container logs to `STDOUT` and is compatible with [Docker's built-in logging infrastructure.](https://docs.docker.com/config/containers/logging/) - -## Specific Configuration - -- `timemachine_data_directory`: The absolute path on Ansible NAS where the backup files will be stored -- `timemachine_volume_size_limit`: The maximum amount of space Time Machine can use for the backups in units of MiB. Set it to 0 for no limit. -- `timemachine_share_name`: The name of the share as it will appear in the Time Machine application. Default is 'Data' -- `timemachine_password`: The password used to access the share. Default is 'timemachine' - -## Upgrading from AFP to SMB-based Time Machine - -Older versions of Time Machine included in Ansible-NAS relied on AFP (netatalk) shares. Apple has deprecated Time Machine over AFP in favor of SMB (Samba), and current versions of Ansible-NAS use a Samba-based Time Machine share. If you are upgrading from an older version of Ansible-NAS with the AFP-based Time Machine, you will need to re-select your Time Machine back up disk by opening Time Machine Preferences and Selecting your backup disk via the "Select Disk..." option. Your Mac will find the old backups on the share and use them. diff --git a/roles/traefik/docs/traefik.md b/roles/traefik/docs/traefik.md deleted file mode 100644 index 439d01aee6..0000000000 --- a/roles/traefik/docs/traefik.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Traefik" ---- - -Homepage: - -Traefik is a reverse proxy used to provide external access to your Ansible-NAS box. Additionally, Traefik will automatically request and renew SSL certificates for you. - -You can configure which applications are available externally by enabling the `_available_externally` setting -for each application in the Advanced Settings section of your `all.yml`. - -See [External Access](../../getting-started/external-access.md) for more info. - -## Usage - -Set `traefik_enabled: true` in your `inventories//nas.yml` file. - -Traefik's web interface can be found at . - -## Specific Configuration - -You'll need to map port 80 and 443 from your router to your Ansible-NAS box. A quick search should reveal instruction for your model of router. diff --git a/roles/transmission-with-openvpn/docs/transmission.md b/roles/transmission-with-openvpn/docs/transmission.md deleted file mode 100644 index e29ce9c403..0000000000 --- a/roles/transmission-with-openvpn/docs/transmission.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Transmission" ---- - -Homepage: - -Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects -directly. - -## Usage - -Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. - -Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). - -## Specific Configuration - -If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: - -```yaml -openvpn_username: super_secret_username -openvpn_password: super_secret_password -openvpn_provider: NORDVPN -openvpn_config: uk686.nordvpn.com.udp -``` - -See for supported VPN providers. diff --git a/roles/transmission/docs/transmission.md b/roles/transmission/docs/transmission.md deleted file mode 100644 index e29ce9c403..0000000000 --- a/roles/transmission/docs/transmission.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Transmission" ---- - -Homepage: - -Transmission is a free BitTorrent client. Two versions are provided - one that tunnels through OpenVPN and one that connects -directly. - -## Usage - -Set `transmission_enabled: true`, or `transmission_with_openvpn_enabled: true` in your `inventories//nas.yml` file. - -Transmission's web interface can be found at (with OpenVPN) or (without OpenVPN). - -## Specific Configuration - -If you enable Transmission with OpenVPN, you'll need to add the following to your inventory `all.yml`: - -```yaml -openvpn_username: super_secret_username -openvpn_password: super_secret_password -openvpn_provider: NORDVPN -openvpn_config: uk686.nordvpn.com.udp -``` - -See for supported VPN providers. diff --git a/roles/ubooquity/docs/ubooquity.md b/roles/ubooquity/docs/ubooquity.md deleted file mode 100644 index 1dea780627..0000000000 --- a/roles/ubooquity/docs/ubooquity.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "Ubooquity" ---- - -Homepage: - -Documentation: - -Docker Image: - -Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer. - -## Usage - -Set `ubooquity_enabled: true` in your `inventories//nas.yml` file. - -Access the webui at by default. See specific configuration section below for information on setting up external access. - -## Specific Configuration - -Important note: if you want to access Ubooquity externally through Traefik (at ubooquity.yourdomain.tld), you need to go to and set the reverse proxy prefix to blank under "Advanced". Otherwise you will need to append "/ubooquity" to the url in order to access. - -### Admin login - -The admin portal is not exposed through Traefik. You can access the admin portal on port 2203. - -Upon your first run, the address is . You will be able to set the admin password here. diff --git a/roles/utorrent/docs/utorrent.md b/roles/utorrent/docs/utorrent.md deleted file mode 100644 index c62bab8c1b..0000000000 --- a/roles/utorrent/docs/utorrent.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "uTorrent" ---- - -Homepage: -Docker Container: - -## Usage - -Set `utorrent_enabled: true` in your `inventories//nas.yml` file. - -If you want to access uTorrent externally, don't forget to set `utorrent_available_externally: true` in your `inventories//nas.yml` file. - -The uTorrent web interface can be found at : - -- Username: admin -- Password: *leave blank* diff --git a/roles/virtual_desktop/docs/virtual_desktop.md b/roles/virtual_desktop/docs/virtual_desktop.md deleted file mode 100644 index 4ff7bec824..0000000000 --- a/roles/virtual_desktop/docs/virtual_desktop.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: "Virtual Desktop" ---- - -It's possible to run a cut down desktop within a Docker container. We use [RattyDAVE's custom Ubuntu Mate image](https://github.com/RattyDAVE/docker-ubuntu-xrdp-mate-custom). - -## Usage - -Set `virtual_desktop_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -By default `ansible_nas_user` will be granted access with a password of `topsecret` with sudo rights. To change or add additional users override `vd_users` in your `nas.yml`: - -```yaml -vd_users: - - username: "{{ ansible_nas_user }}" - password: "topsecret" - sudo: "Y" - - username: "larrylaffer" - password: "kensentme" - sudo: "Y" -``` - -## Mounts - -`samba_shares_root` is mounted to `/samba`. -`docker_home` is mounted to `/docker`. - -## Remote Access - -It's possible to access your virtual desktop through a web browser! Check out [Guacamole](guacamole.md). diff --git a/roles/wallabag/docs/wallabag.md b/roles/wallabag/docs/wallabag.md deleted file mode 100644 index 84bb4b95c0..0000000000 --- a/roles/wallabag/docs/wallabag.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Wallabag" ---- - -Homepage: - -wallabag is a self-hostable PHP application allowing you to not miss any content anymore. Click, save and read it when you can. It extracts content so that you can read it when you have time. - -## Usage - -Set `wallabag_enabled: true` in your `inventories//nas.yml` file. - -If you want to access wallabag externally, don't forget to set `wallabag_available_externally: true` in your `inventories//nas.yml` file. - -I recommend using the mobile app, which will sync with this installation so you have access to your saved articles even if you don't have signal or wifi access. - -The default credentials are wallabag:wallabag - -The wallabag web interface can be found at . diff --git a/roles/watchtower/docs/watchtower.md b/roles/watchtower/docs/watchtower.md deleted file mode 100644 index 31e1fa2e71..0000000000 --- a/roles/watchtower/docs/watchtower.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Watchtower" ---- - -Homepage: - -A process for watching your Docker containers and automatically updating and restarting them whenever their base image is refreshed. - -## Usage - -Set `watchtower_enabled: true` in your `inventories//nas.yml` file. - -## Specific Configuration - -By default Watchtower is configured to check daily at 5am for updates. - -Various notification options are available, and can be configured by updating `watchtower_command` in your `inventories//nas.yml` file. A few examples are provided. The full set of options can be found at the [Watchtower GitHub project page](https://github.com/v2tec/watchtower). diff --git a/roles/wireshark/docs/wireshark.md b/roles/wireshark/docs/wireshark.md deleted file mode 100644 index 689853d76e..0000000000 --- a/roles/wireshark/docs/wireshark.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: "Wireshark" ---- - -Homepage: - -Wireshark is the world’s foremost and widely-used network protocol analyzer. It lets you see what’s happening on your network at a microscopic level and is the de facto (and often de jure) standard across many commercial and non-profit enterprises, government agencies, and educational institutions. Wireshark development thrives thanks to the volunteer contributions of networking experts around the globe and is the continuation of a project started by Gerald Combs in 1998. - -## Usage - -Set `wireshark_enabled: true` in your `inventories//nas.yml` file. - -The Wireshark web interface can be found at . diff --git a/roles/woodpecker-ci/docs/woodpecker_ci.md b/roles/woodpecker-ci/docs/woodpecker_ci.md deleted file mode 100644 index 50208319b5..0000000000 --- a/roles/woodpecker-ci/docs/woodpecker_ci.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Woodpecker CI" ---- - -Woodpecker is a simple CI engine with great extensibility. - -Check it out at . - -## Usage - -Set `woodpecker_ci_enabled: true` in your `inventories//nas.yml` file. - -Gitea (`gitea_enabled: true`) must be set up and running before attempting to set up Woodpecker CI. - -## Setup Tasks - -An Oauth2 application must be set up in Gitea. Visit for more info, then set `woodpecker_ci_gitea_client` and `woodpecker_ci_gitea_secret` accordingly. - -Set `woodpecker_ci_admin_user` to the same username as your user in Gitea. diff --git a/roles/youtubedlmaterial/docs/youtubedlmaterial.md b/roles/youtubedlmaterial/docs/youtubedlmaterial.md deleted file mode 100644 index 5065be1ea5..0000000000 --- a/roles/youtubedlmaterial/docs/youtubedlmaterial.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "YouTubeDL-Material" ---- - -Homepage: -Docker Container: - -YoutubeDL-Material is a Material Design frontend for youtube-dl. It's coded using Angular 9 for the frontend, and Node.js on the backend. - -## Usage - -Set `youtubedlmaterial_enabled: true` in your `inventories//nas.yml` file. - -The YouTubeDL-Material web interface can be found at . - -## Specific Configuration - -A YouTube directory will be created in your configured downloads spot. YouTubeDL-Material downloads will be placed there. -You can change the download location via `inventories//nas.yml` file. diff --git a/roles/znc/docs/znc.md b/roles/znc/docs/znc.md deleted file mode 100644 index bbcb5b54b6..0000000000 --- a/roles/znc/docs/znc.md +++ /dev/null @@ -1,11 +0,0 @@ -# Znc - -Homepage: - -ZNC is an IRC network bouncer or BNC. It can detach the client from the actual IRC server, and also from selected channels. Multiple clients from different locations can connect to a single ZNC account simultaneously and therefore appear under the same nickname on IRC. It supports Transport Layer Security connections and IPv6. - -## Usage - -Set `znc_enabled: true` in your `inventories//nas.yml` file. Edit `znc_*` variables to suit your needs. For more advanced needs, edit the template config file (`templates\znc.conf.j2`) directly. - -Connect to ZNC using IRC at ansible_nas_host_or_ip:6677. From 144d5269654934259dc916e822f11b3889167ba4 Mon Sep 17 00:00:00 2001 From: Anarion Date: Mon, 10 Apr 2023 10:48:28 +0200 Subject: [PATCH 188/286] =?UTF-8?q?=F0=9F=93=9D=20Update=20available=20app?= =?UTF-8?q?lications=20badge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 927037e15b..e08b871560 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Ansible NAS +![Available Applications](https://img.shields.io/github/directory-file-count/davestephens/ansible-nas/roles?label=Available%20Applications&style=flat-square) [![CI](https://github.com/davestephens/ansible-nas/workflows/CI/badge.svg)](https://github.com/davestephens/ansible-nas/actions?query=workflow%3ACI) [![Integration](https://github.com/davestephens/ansible-nas/workflows/Integration/badge.svg)](https://github.com/davestephens/ansible-nas/actions?query=workflow%3AIntegration) [![Gitter chat](https://img.shields.io/gitter/room/ansible-nas/chat.svg?logo=gitter&style=flat-square)](https://gitter.im/Ansible-NAS/Chat) @@ -14,7 +15,7 @@ You can configure Ansible-NAS to set up any (or all!) of the applications listed If you have a spare domain name you can configure applications to be accessible externally to your home LAN too; they'll be configured with a sensible hostname and DNS gets updated accordingly if your home IP address changes. -## Available Applications ![Roles](https://img.shields.io/github/directory-file-count/davestephens/ansible-nas/roles?label=Roles) +## Available Applications * [Airsonic](https://airsonic.github.io/) - catalog and stream music * [Bazarr](https://github.com/morpheus65535/bazarr) - companion to Radarr and Sonarr for downloading subtitles From 9d42bf518f3345dc5f4894bdedad963ac79bcd56 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 11 Apr 2023 23:28:40 +0100 Subject: [PATCH 189/286] Remove broken tests, move docs back to website directory --- roles/mumble/defaults/{main.yaml => main.yml} | 0 roles/mumble/molecule/default/molecule.yml | 6 ------ roles/mumble/molecule/default/side_effect.yml | 10 ---------- roles/mumble/molecule/default/verify.yml | 19 ------------------- .../molecule/default/verify_stopped.yml | 19 ------------------- roles/mumble/tasks/{main.yaml => main.yml} | 1 - .../docs/applications/other}/mumble.md | 0 7 files changed, 55 deletions(-) rename roles/mumble/defaults/{main.yaml => main.yml} (100%) delete mode 100644 roles/mumble/molecule/default/molecule.yml delete mode 100644 roles/mumble/molecule/default/side_effect.yml delete mode 100644 roles/mumble/molecule/default/verify.yml delete mode 100644 roles/mumble/molecule/default/verify_stopped.yml rename roles/mumble/tasks/{main.yaml => main.yml} (92%) rename {roles/mumble/docs => website/docs/applications/other}/mumble.md (100%) diff --git a/roles/mumble/defaults/main.yaml b/roles/mumble/defaults/main.yml similarity index 100% rename from roles/mumble/defaults/main.yaml rename to roles/mumble/defaults/main.yml diff --git a/roles/mumble/molecule/default/molecule.yml b/roles/mumble/molecule/default/molecule.yml deleted file mode 100644 index d6f75a6b79..0000000000 --- a/roles/mumble/molecule/default/molecule.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -provisioner: - inventory: - group_vars: - all: - mumble_enabled: true diff --git a/roles/mumble/molecule/default/side_effect.yml b/roles/mumble/molecule/default/side_effect.yml deleted file mode 100644 index 397569d226..0000000000 --- a/roles/mumble/molecule/default/side_effect.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -- name: Stop - hosts: all - become: true - tasks: - - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: - name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" - vars: - mumble_enabled: false diff --git a/roles/mumble/molecule/default/verify.yml b/roles/mumble/molecule/default/verify.yml deleted file mode 100644 index ec53d8de6f..0000000000 --- a/roles/mumble/molecule/default/verify.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Verify - hosts: all - gather_facts: false - tasks: - - name: Include vars - include_vars: - file: ../../defaults/main.yml - - - name: Get container state - docker_container_info: - name: "{{ mumble_container_name }}" - register: result - - - name: Check Mumble is running - assert: - that: - - result.container['State']['Status'] == "running" - - result.container['State']['Restarting'] == false diff --git a/roles/mumble/molecule/default/verify_stopped.yml b/roles/mumble/molecule/default/verify_stopped.yml deleted file mode 100644 index da429ba804..0000000000 --- a/roles/mumble/molecule/default/verify_stopped.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Verify - hosts: all - gather_facts: false - tasks: - - name: Include vars - include_vars: - file: ../../defaults/main.yml - - - name: Try and stop and remove Mumble - docker_container: - name: "{{ mumble_container_name }}" - state: absent - register: result - - - name: Check Mumble is stopped - assert: - that: - - not result.changed diff --git a/roles/mumble/tasks/main.yaml b/roles/mumble/tasks/main.yml similarity index 92% rename from roles/mumble/tasks/main.yaml rename to roles/mumble/tasks/main.yml index b841ffc246..1b9b197f06 100644 --- a/roles/mumble/tasks/main.yaml +++ b/roles/mumble/tasks/main.yml @@ -23,7 +23,6 @@ - "{{ mumble_tcp_port }}:64738/tcp" - "{{ mumble_udp_port }}:64738/udp" env: - # Setting the password prevents unwanted users from connecting to the instance, especially if publicly available. MUMBLE_CONFIG_SERVER_PASSWORD: "{{ mumble_server_password }}" restart_policy: unless-stopped labels: diff --git a/roles/mumble/docs/mumble.md b/website/docs/applications/other/mumble.md similarity index 100% rename from roles/mumble/docs/mumble.md rename to website/docs/applications/other/mumble.md From 2fedf1b43b9e3a3684021d4db94b9a6a744303b2 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 11 Apr 2023 23:30:30 +0100 Subject: [PATCH 190/286] Move molecule test directories to /tmp --- tests/molecule/base.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/molecule/base.yml b/tests/molecule/base.yml index 575034f17d..71064d1549 100644 --- a/tests/molecule/base.yml +++ b/tests/molecule/base.yml @@ -16,22 +16,22 @@ provisioner: inventory: group_vars: all: - samba_shares_root: /shares + samba_shares_root: /tmp/ansible-nas/shares ansible_nas_domain: ansible-nas.io ansible_nas_timezone: Europe/London - audiobooks_root: /audiobooks - books_root: /books - code_root: /code - comics_root: /comics - docker_home: /ansible-nas - documents_root: /documents - downloads_root: /downloads - movies_root: /movies - music_root: /music - photos_root: /photos - podcasts_root: /podcasts - torrents_root: /torrents - tv_root: /tv + audiobooks_root: /tmp/ansible-nas/shares/audiobooks + books_root: /tmp/ansible-nas/shares/books + code_root: /tmp/ansible-nas/shares/code + comics_root: /tmp/ansible-nas/shares/comics + docker_home: /tmp/ansible-nas/docker + documents_root: /tmp/ansible-nas/shares/documents + downloads_root: /tmp/ansible-nas/shares/downloads + movies_root: /tmp/ansible-nas/shares/movies + music_root: /tmp/ansible-nas/shares/music + photos_root: /tmp/ansible-nas/shares/photos + podcasts_root: /tmp/ansible-nas/shares/podcasts + torrents_root: /tmp/ansible-nas/shares/torrents + tv_root: /tmp/ansible-nas/shares/tv playbooks: prepare: ../../../../tests/molecule/resources/playbooks/prepare.yml converge: ../../../../tests/molecule/resources/playbooks/converge.yml From 2a8d86e0627c656c2ba8926fc2b998b13dc11213 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 12 Apr 2023 22:57:56 +0100 Subject: [PATCH 191/286] Fix portainer port --- roles/portainer/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/portainer/tasks/main.yml b/roles/portainer/tasks/main.yml index d49f1e7896..5c343029c0 100644 --- a/roles/portainer/tasks/main.yml +++ b/roles/portainer/tasks/main.yml @@ -16,7 +16,7 @@ - "/var/run/docker.sock:/var/run/docker.sock:ro" - "/etc/timezone:/etc/timezone:ro" ports: - - "{{ portainer_port }}:9000" + - "{{ portainer_port }}:9443" restart_policy: unless-stopped memory: "{{ portainer_memory }}" labels: @@ -25,4 +25,4 @@ traefik.http.routers.portainer.tls.certresolver: "letsencrypt" traefik.http.routers.portainer.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.portainer.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.portainer.loadbalancer.server.port: "9000" + traefik.http.services.portainer.loadbalancer.server.port: "9443" From 7d3e6825d08f84cc7fcb60d8d5e4c888f06e7959 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 12 Apr 2023 23:03:20 +0100 Subject: [PATCH 192/286] Add ability to scrape additional hosts with Prometheus, and scrape from HomeAssistant --- roles/stats/defaults/main.yml | 3 +++ roles/stats/templates/prometheus.yml.j2 | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/roles/stats/defaults/main.yml b/roles/stats/defaults/main.yml index a1d0dde185..5b370dc5a7 100644 --- a/roles/stats/defaults/main.yml +++ b/roles/stats/defaults/main.yml @@ -36,3 +36,6 @@ stats_collection_interval: 15s # uncomment to scrape more hosts # stats_prometheus_additional_hosts: # - 192.168.1.1:9100 + +# uncomment to scrape metrics from HomeAssistant. You'll need to create a long lived access token. +# stats_hass_long_lived_access_token: addfasdfasdf diff --git a/roles/stats/templates/prometheus.yml.j2 b/roles/stats/templates/prometheus.yml.j2 index 9e7ca1d2f3..34e5a0b4ba 100644 --- a/roles/stats/templates/prometheus.yml.j2 +++ b/roles/stats/templates/prometheus.yml.j2 @@ -56,3 +56,12 @@ scrape_configs: {% endfor %} {% endif %} + + - job_name: "homeassistant" + metrics_path: /api/prometheus + authorization: + credentials: "{{ stats_hass_long_lived_access_token | default("abcd") }}" + static_configs: + - targets: [ + "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:8123" + ] From 91bf5a26b03e62645ce90f539b36a5156f066fb1 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 12 Apr 2023 23:22:52 +0100 Subject: [PATCH 193/286] Revert naming of include_vars --- roles/airsonic/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/bazarr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/bitwarden/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/booksonic/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/calibre/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/cloudcmd/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/code-server/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/couchpotato/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/dashy/molecule/default/verify.yml | 3 +- .../dashy/molecule/default/verify_stopped.yml | 3 +- roles/deluge/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/dokuwiki/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/drone-ci/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/duplicacy/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/emby/molecule/default/verify.yml | 3 +- roles/esphome/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/firefly/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/freshrss/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/get_iplayer/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/gitea/molecule/default/verify.yml | 3 +- .../gitea/molecule/default/verify_stopped.yml | 3 +- roles/gitlab/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/glances/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/gotify/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/guacamole/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/heimdall/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/hello_world/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../homeassistant/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/homebridge/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/jackett/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/jellyfin/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/joomla/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/komga/molecule/default/verify.yml | 3 +- .../komga/molecule/default/verify_stopped.yml | 3 +- roles/krusader/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/lidarr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/mealie/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../defaults/main.yml | 17 +++++++++ roles/minecraft-bedrock-server/tasks/main.yml | 35 +++++++++++++++++++ .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/minidlna/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/miniflux/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/mosquitto/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/mylar/molecule/default/verify.yml | 3 +- .../mylar/molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/n8n/molecule/default/verify.yml | 3 +- roles/n8n/molecule/default/verify_stopped.yml | 3 +- roles/navidrome/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/netbootxyz/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/netdata/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/nextcloud/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/nomad/molecule/default/verify.yml | 3 +- .../nomad/molecule/default/verify_stopped.yml | 3 +- roles/nzbget/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/octoprint/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/ombi/molecule/default/verify.yml | 3 +- .../ombi/molecule/default/verify_stopped.yml | 3 +- roles/openhab/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/organizr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/overseerr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../paperless_ng/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/piwigo/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/plex/molecule/default/verify.yml | 3 +- .../plex/molecule/default/verify_stopped.yml | 3 +- roles/portainer/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/prowlarr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/pyload/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/pytivo/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/radarr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../route53_ddns/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/rssbridge/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/sabnzbd/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/sickchill/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/sonarr/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/stats/molecule/default/verify.yml | 3 +- .../stats/molecule/default/verify_stopped.yml | 3 +- roles/syncthing/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/tautulli/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/thelounge/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/tiddlywiki/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/timemachine/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/traefik/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../transmission/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/ubooquity/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/utorrent/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/wallabag/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/watchtower/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/wireshark/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../woodpecker-ci/molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- .../molecule/default/verify.yml | 3 +- .../molecule/default/verify_stopped.yml | 3 +- roles/znc/molecule/default/verify.yml | 3 +- roles/znc/molecule/default/verify_stopped.yml | 3 +- 173 files changed, 223 insertions(+), 342 deletions(-) create mode 100644 roles/minecraft-bedrock-server/defaults/main.yml create mode 100644 roles/minecraft-bedrock-server/tasks/main.yml diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index 4b3472e787..5dc0a7c49e 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index 2a42b6dd94..a642055718 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Airsonic diff --git a/roles/bazarr/molecule/default/verify.yml b/roles/bazarr/molecule/default/verify.yml index 65df9389fb..b29244084d 100644 --- a/roles/bazarr/molecule/default/verify.yml +++ b/roles/bazarr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/bazarr/molecule/default/verify_stopped.yml b/roles/bazarr/molecule/default/verify_stopped.yml index a82a3746d1..7b316fdbb3 100644 --- a/roles/bazarr/molecule/default/verify_stopped.yml +++ b/roles/bazarr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bazarr diff --git a/roles/bitwarden/molecule/default/verify.yml b/roles/bitwarden/molecule/default/verify.yml index 797499d0a1..c62702be65 100644 --- a/roles/bitwarden/molecule/default/verify.yml +++ b/roles/bitwarden/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/bitwarden/molecule/default/verify_stopped.yml b/roles/bitwarden/molecule/default/verify_stopped.yml index ca08d06444..debe83588a 100644 --- a/roles/bitwarden/molecule/default/verify_stopped.yml +++ b/roles/bitwarden/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bitwarden diff --git a/roles/booksonic/molecule/default/verify.yml b/roles/booksonic/molecule/default/verify.yml index 145ab469bf..98400317b7 100644 --- a/roles/booksonic/molecule/default/verify.yml +++ b/roles/booksonic/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/booksonic/molecule/default/verify_stopped.yml b/roles/booksonic/molecule/default/verify_stopped.yml index aa5ad01896..7b68fe984a 100644 --- a/roles/booksonic/molecule/default/verify_stopped.yml +++ b/roles/booksonic/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Booksonic diff --git a/roles/calibre/molecule/default/verify.yml b/roles/calibre/molecule/default/verify.yml index b911fb6686..77267b9d52 100644 --- a/roles/calibre/molecule/default/verify.yml +++ b/roles/calibre/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/calibre/molecule/default/verify_stopped.yml b/roles/calibre/molecule/default/verify_stopped.yml index 3ee9c51f27..bd3ccf6e30 100644 --- a/roles/calibre/molecule/default/verify_stopped.yml +++ b/roles/calibre/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Calibre diff --git a/roles/cloudcmd/molecule/default/verify.yml b/roles/cloudcmd/molecule/default/verify.yml index 14dd662ae4..abef5b4ac7 100644 --- a/roles/cloudcmd/molecule/default/verify.yml +++ b/roles/cloudcmd/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/cloudcmd/molecule/default/verify_stopped.yml b/roles/cloudcmd/molecule/default/verify_stopped.yml index b5beda3821..68ad0d3b93 100644 --- a/roles/cloudcmd/molecule/default/verify_stopped.yml +++ b/roles/cloudcmd/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudcmd diff --git a/roles/cloudflare_ddns/molecule/default/verify.yml b/roles/cloudflare_ddns/molecule/default/verify.yml index bbcff3a651..0e92e82ee9 100644 --- a/roles/cloudflare_ddns/molecule/default/verify.yml +++ b/roles/cloudflare_ddns/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml index ea05fd7552..e2273930e4 100644 --- a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml +++ b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudflare DDNS diff --git a/roles/code-server/molecule/default/verify.yml b/roles/code-server/molecule/default/verify.yml index 0abf9488c6..970070c650 100644 --- a/roles/code-server/molecule/default/verify.yml +++ b/roles/code-server/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/code-server/molecule/default/verify_stopped.yml b/roles/code-server/molecule/default/verify_stopped.yml index 87973991d7..5cba43ccf5 100644 --- a/roles/code-server/molecule/default/verify_stopped.yml +++ b/roles/code-server/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Code Server diff --git a/roles/couchpotato/molecule/default/verify.yml b/roles/couchpotato/molecule/default/verify.yml index c4acee8c49..3031e9025e 100644 --- a/roles/couchpotato/molecule/default/verify.yml +++ b/roles/couchpotato/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/couchpotato/molecule/default/verify_stopped.yml b/roles/couchpotato/molecule/default/verify_stopped.yml index f9546dfe54..213afef491 100644 --- a/roles/couchpotato/molecule/default/verify_stopped.yml +++ b/roles/couchpotato/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Couchpotato diff --git a/roles/dashy/molecule/default/verify.yml b/roles/dashy/molecule/default/verify.yml index dd68450bfa..6c1bc594eb 100644 --- a/roles/dashy/molecule/default/verify.yml +++ b/roles/dashy/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/dashy/molecule/default/verify_stopped.yml b/roles/dashy/molecule/default/verify_stopped.yml index 872ba4f4e6..1748897f7c 100644 --- a/roles/dashy/molecule/default/verify_stopped.yml +++ b/roles/dashy/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dashy diff --git a/roles/deluge/molecule/default/verify.yml b/roles/deluge/molecule/default/verify.yml index 021229fa8e..6d815a897f 100644 --- a/roles/deluge/molecule/default/verify.yml +++ b/roles/deluge/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/deluge/molecule/default/verify_stopped.yml b/roles/deluge/molecule/default/verify_stopped.yml index daa3bbe7b5..9d4abcbe0a 100644 --- a/roles/deluge/molecule/default/verify_stopped.yml +++ b/roles/deluge/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Deluge diff --git a/roles/dokuwiki/molecule/default/verify.yml b/roles/dokuwiki/molecule/default/verify.yml index d5e4fd9a9c..676a5e79c2 100644 --- a/roles/dokuwiki/molecule/default/verify.yml +++ b/roles/dokuwiki/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/dokuwiki/molecule/default/verify_stopped.yml b/roles/dokuwiki/molecule/default/verify_stopped.yml index e8101a35c9..60151b02c4 100644 --- a/roles/dokuwiki/molecule/default/verify_stopped.yml +++ b/roles/dokuwiki/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dokuwiki diff --git a/roles/drone-ci/molecule/default/verify.yml b/roles/drone-ci/molecule/default/verify.yml index f48abc5395..c993caf942 100644 --- a/roles/drone-ci/molecule/default/verify.yml +++ b/roles/drone-ci/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/drone-ci/molecule/default/verify_stopped.yml b/roles/drone-ci/molecule/default/verify_stopped.yml index 3f50b5da4d..3f8ce56f01 100644 --- a/roles/drone-ci/molecule/default/verify_stopped.yml +++ b/roles/drone-ci/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Drone CI diff --git a/roles/duplicacy/molecule/default/verify.yml b/roles/duplicacy/molecule/default/verify.yml index e1421406dc..7eaee192b0 100644 --- a/roles/duplicacy/molecule/default/verify.yml +++ b/roles/duplicacy/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/duplicacy/molecule/default/verify_stopped.yml b/roles/duplicacy/molecule/default/verify_stopped.yml index bf7c63aa7b..487edf7010 100644 --- a/roles/duplicacy/molecule/default/verify_stopped.yml +++ b/roles/duplicacy/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Duplicacy diff --git a/roles/emby/molecule/default/verify.yml b/roles/emby/molecule/default/verify.yml index 49fb383632..ce3037bff7 100644 --- a/roles/emby/molecule/default/verify.yml +++ b/roles/emby/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/esphome/molecule/default/verify.yml b/roles/esphome/molecule/default/verify.yml index 12154f92fd..a80b586783 100644 --- a/roles/esphome/molecule/default/verify.yml +++ b/roles/esphome/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/esphome/molecule/default/verify_stopped.yml b/roles/esphome/molecule/default/verify_stopped.yml index b92cbdd094..dad14d096a 100644 --- a/roles/esphome/molecule/default/verify_stopped.yml +++ b/roles/esphome/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove EspHome diff --git a/roles/firefly/molecule/default/verify.yml b/roles/firefly/molecule/default/verify.yml index aa3877057d..7da64ee713 100644 --- a/roles/firefly/molecule/default/verify.yml +++ b/roles/firefly/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/firefly/molecule/default/verify_stopped.yml b/roles/firefly/molecule/default/verify_stopped.yml index 831693bff7..eecb620322 100644 --- a/roles/firefly/molecule/default/verify_stopped.yml +++ b/roles/firefly/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Firefly diff --git a/roles/freshrss/molecule/default/verify.yml b/roles/freshrss/molecule/default/verify.yml index 08aa5ccab1..8cc69ce503 100644 --- a/roles/freshrss/molecule/default/verify.yml +++ b/roles/freshrss/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get freshrss container state diff --git a/roles/freshrss/molecule/default/verify_stopped.yml b/roles/freshrss/molecule/default/verify_stopped.yml index f25fad5b5c..7f5d333f3b 100644 --- a/roles/freshrss/molecule/default/verify_stopped.yml +++ b/roles/freshrss/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove freshrss diff --git a/roles/get_iplayer/molecule/default/verify.yml b/roles/get_iplayer/molecule/default/verify.yml index e702ec7b8c..500671fe02 100644 --- a/roles/get_iplayer/molecule/default/verify.yml +++ b/roles/get_iplayer/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get get_iplayer container state diff --git a/roles/get_iplayer/molecule/default/verify_stopped.yml b/roles/get_iplayer/molecule/default/verify_stopped.yml index dfe2162114..f116836827 100644 --- a/roles/get_iplayer/molecule/default/verify_stopped.yml +++ b/roles/get_iplayer/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove get_iplayer diff --git a/roles/gitea/molecule/default/verify.yml b/roles/gitea/molecule/default/verify.yml index d8924eb23e..3560ab00a7 100644 --- a/roles/gitea/molecule/default/verify.yml +++ b/roles/gitea/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get gitea container state diff --git a/roles/gitea/molecule/default/verify_stopped.yml b/roles/gitea/molecule/default/verify_stopped.yml index 0c3182e888..0f0078221e 100644 --- a/roles/gitea/molecule/default/verify_stopped.yml +++ b/roles/gitea/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove gitea diff --git a/roles/gitlab/molecule/default/verify.yml b/roles/gitlab/molecule/default/verify.yml index 318e6b65fd..b0099085f2 100644 --- a/roles/gitlab/molecule/default/verify.yml +++ b/roles/gitlab/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get gitlab container state diff --git a/roles/gitlab/molecule/default/verify_stopped.yml b/roles/gitlab/molecule/default/verify_stopped.yml index 46bcc078d3..8822cfd85d 100644 --- a/roles/gitlab/molecule/default/verify_stopped.yml +++ b/roles/gitlab/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove gitlab diff --git a/roles/glances/molecule/default/verify.yml b/roles/glances/molecule/default/verify.yml index 2a9e2cc217..22b40c80d8 100644 --- a/roles/glances/molecule/default/verify.yml +++ b/roles/glances/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get glances container state diff --git a/roles/glances/molecule/default/verify_stopped.yml b/roles/glances/molecule/default/verify_stopped.yml index 5fcee40999..daa317aacb 100644 --- a/roles/glances/molecule/default/verify_stopped.yml +++ b/roles/glances/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove glances diff --git a/roles/gotify/molecule/default/verify.yml b/roles/gotify/molecule/default/verify.yml index 62059cb760..5afdae4fe8 100644 --- a/roles/gotify/molecule/default/verify.yml +++ b/roles/gotify/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get gotify container state diff --git a/roles/gotify/molecule/default/verify_stopped.yml b/roles/gotify/molecule/default/verify_stopped.yml index 541bbe3de2..db6f4ea9a9 100644 --- a/roles/gotify/molecule/default/verify_stopped.yml +++ b/roles/gotify/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove gotify diff --git a/roles/guacamole/molecule/default/verify.yml b/roles/guacamole/molecule/default/verify.yml index dc90031f1f..d0aeb19636 100644 --- a/roles/guacamole/molecule/default/verify.yml +++ b/roles/guacamole/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get guacamole container state diff --git a/roles/guacamole/molecule/default/verify_stopped.yml b/roles/guacamole/molecule/default/verify_stopped.yml index f3b6955b3a..e2a0677658 100644 --- a/roles/guacamole/molecule/default/verify_stopped.yml +++ b/roles/guacamole/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove guacamole diff --git a/roles/healthchecks.io/molecule/default/verify.yml b/roles/healthchecks.io/molecule/default/verify.yml index 69fff456dd..5cf452b4d9 100644 --- a/roles/healthchecks.io/molecule/default/verify.yml +++ b/roles/healthchecks.io/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Check cron job file diff --git a/roles/healthchecks.io/molecule/default/verify_stopped.yml b/roles/healthchecks.io/molecule/default/verify_stopped.yml index b0fa202467..9457a1d1c7 100644 --- a/roles/healthchecks.io/molecule/default/verify_stopped.yml +++ b/roles/healthchecks.io/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Check cron job file diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml index e812328e51..fbeb602193 100644 --- a/roles/heimdall/molecule/default/verify.yml +++ b/roles/heimdall/molecule/default/verify.yml @@ -5,8 +5,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml index 1181dd362d..2be7a52dce 100644 --- a/roles/heimdall/molecule/default/verify_stopped.yml +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -5,8 +5,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Heimdall diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml index d0345f309c..1cf221a3a3 100644 --- a/roles/hello_world/molecule/default/verify.yml +++ b/roles/hello_world/molecule/default/verify.yml @@ -5,8 +5,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get container state diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml index 1360f1a481..4f4cc4dd44 100644 --- a/roles/hello_world/molecule/default/verify_stopped.yml +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -5,8 +5,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Hello World diff --git a/roles/homeassistant/molecule/default/verify.yml b/roles/homeassistant/molecule/default/verify.yml index e21658927f..d2e857f41c 100644 --- a/roles/homeassistant/molecule/default/verify.yml +++ b/roles/homeassistant/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get homeassistant container state diff --git a/roles/homeassistant/molecule/default/verify_stopped.yml b/roles/homeassistant/molecule/default/verify_stopped.yml index e4d2ab86f6..bb7440b1af 100644 --- a/roles/homeassistant/molecule/default/verify_stopped.yml +++ b/roles/homeassistant/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove homeassistant diff --git a/roles/homebridge/molecule/default/verify.yml b/roles/homebridge/molecule/default/verify.yml index 0fa3521cee..1e8b8dd833 100644 --- a/roles/homebridge/molecule/default/verify.yml +++ b/roles/homebridge/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get homebridge container state diff --git a/roles/homebridge/molecule/default/verify_stopped.yml b/roles/homebridge/molecule/default/verify_stopped.yml index f5539057ea..aa0376d161 100644 --- a/roles/homebridge/molecule/default/verify_stopped.yml +++ b/roles/homebridge/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove homebridge diff --git a/roles/jackett/molecule/default/verify.yml b/roles/jackett/molecule/default/verify.yml index 387a850e9a..f27e3fd863 100644 --- a/roles/jackett/molecule/default/verify.yml +++ b/roles/jackett/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get jackett container state diff --git a/roles/jackett/molecule/default/verify_stopped.yml b/roles/jackett/molecule/default/verify_stopped.yml index f57260526b..2b2c2fdc5e 100644 --- a/roles/jackett/molecule/default/verify_stopped.yml +++ b/roles/jackett/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove jackett diff --git a/roles/jellyfin/molecule/default/verify.yml b/roles/jellyfin/molecule/default/verify.yml index fa07a167c7..4cc38b902b 100644 --- a/roles/jellyfin/molecule/default/verify.yml +++ b/roles/jellyfin/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get jellyfin container state diff --git a/roles/jellyfin/molecule/default/verify_stopped.yml b/roles/jellyfin/molecule/default/verify_stopped.yml index 18552ea830..b43be1d21a 100644 --- a/roles/jellyfin/molecule/default/verify_stopped.yml +++ b/roles/jellyfin/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove jellyfin diff --git a/roles/joomla/molecule/default/verify.yml b/roles/joomla/molecule/default/verify.yml index 728ea20cae..dcc9115b84 100644 --- a/roles/joomla/molecule/default/verify.yml +++ b/roles/joomla/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get joomla container state diff --git a/roles/joomla/molecule/default/verify_stopped.yml b/roles/joomla/molecule/default/verify_stopped.yml index 601be52130..67094074aa 100644 --- a/roles/joomla/molecule/default/verify_stopped.yml +++ b/roles/joomla/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove joomla diff --git a/roles/komga/molecule/default/verify.yml b/roles/komga/molecule/default/verify.yml index aad4abe828..a52b5648db 100644 --- a/roles/komga/molecule/default/verify.yml +++ b/roles/komga/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get komga container state diff --git a/roles/komga/molecule/default/verify_stopped.yml b/roles/komga/molecule/default/verify_stopped.yml index a601c7960e..f1c8476df8 100644 --- a/roles/komga/molecule/default/verify_stopped.yml +++ b/roles/komga/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove komga diff --git a/roles/krusader/molecule/default/verify.yml b/roles/krusader/molecule/default/verify.yml index 24b6cfb2e1..339f18a464 100644 --- a/roles/krusader/molecule/default/verify.yml +++ b/roles/krusader/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get krusader container state diff --git a/roles/krusader/molecule/default/verify_stopped.yml b/roles/krusader/molecule/default/verify_stopped.yml index 081b85ad7e..e4961db8ec 100644 --- a/roles/krusader/molecule/default/verify_stopped.yml +++ b/roles/krusader/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove krusader diff --git a/roles/lidarr/molecule/default/verify.yml b/roles/lidarr/molecule/default/verify.yml index 02df67184b..b4baf74a9d 100644 --- a/roles/lidarr/molecule/default/verify.yml +++ b/roles/lidarr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get lidarr container state diff --git a/roles/lidarr/molecule/default/verify_stopped.yml b/roles/lidarr/molecule/default/verify_stopped.yml index 4fb7012702..fd27ea603f 100644 --- a/roles/lidarr/molecule/default/verify_stopped.yml +++ b/roles/lidarr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove lidarr diff --git a/roles/mealie/molecule/default/verify.yml b/roles/mealie/molecule/default/verify.yml index ae2c360328..e167f36308 100644 --- a/roles/mealie/molecule/default/verify.yml +++ b/roles/mealie/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get mealie container state diff --git a/roles/mealie/molecule/default/verify_stopped.yml b/roles/mealie/molecule/default/verify_stopped.yml index 1d1abad091..cd8d744081 100644 --- a/roles/mealie/molecule/default/verify_stopped.yml +++ b/roles/mealie/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove mealie diff --git a/roles/minecraft-bedrock-server/defaults/main.yml b/roles/minecraft-bedrock-server/defaults/main.yml new file mode 100644 index 0000000000..437178ef5a --- /dev/null +++ b/roles/minecraft-bedrock-server/defaults/main.yml @@ -0,0 +1,17 @@ +--- +minecraft_bedrock_server_enabled: false + +# directories +minecraft_bedrock_server_data_directory: "{{ docker_home }}/minecraft_bedrock_server" + +# network +minecraft_bedrock_server_port: "19132" + +# docker +minecraft_bedrock_server_container_name: minecraft-bedrock-server + +# minecraft settings +minecraft_bedrock_server_name: "Ansible-NAS Minecraft Server" +minecraft_bedrock_server_game_mode: "creative" +minecraft_bedrock_server_difficulty: "normal" +minecraft_bedrock_server_online_mode: "false" \ No newline at end of file diff --git a/roles/minecraft-bedrock-server/tasks/main.yml b/roles/minecraft-bedrock-server/tasks/main.yml new file mode 100644 index 0000000000..6603483157 --- /dev/null +++ b/roles/minecraft-bedrock-server/tasks/main.yml @@ -0,0 +1,35 @@ +--- +- name: Create Minecraft Bedrock Server Directories + file: + path: "{{ item }}" + state: directory + with_items: + - "{{ minecraft_bedrock_server_data_directory }}" + +- name: Start Minecraft Bedrock Server + block: + - name: Minecraft Bedrock Server Docker Container + docker_container: + name: "{{ minecraft_bedrock_server_container_name }}" + image: itzg/minecraft-bedrock-server + pull: true + volumes: + - "{{ minecraft_bedrock_server_data_directory }}:/data:rw" + ports: + - "{{ minecraft_bedrock_server_port }}:19132/udp" + env: + EULA: "TRUE" + SERVER_NAME: "{{ minecraft_bedrock_server_name }}" + GAMEMODE: "{{ minecraft_bedrock_server_game_mode }}" + DIFFICULTY: "{{ minecraft_bedrock_server_difficulty }}" + ONLINE_MODE: "{{ minecraft_bedrock_server_online_mode }}" + restart_policy: unless-stopped + when: minecraft_bedrock_server_enabled is true + +- name: Stop Minecraft Bedrock Server + block: + - name: Stop Minecraft Bedrock Server + docker_container: + name: "{{ minecraft_bedrock_server_container_name }}" + state: absent + when: minecraft_bedrock_server_enabled is false \ No newline at end of file diff --git a/roles/minecraft-server/molecule/default/verify.yml b/roles/minecraft-server/molecule/default/verify.yml index 5a145c44a6..e4059e2504 100644 --- a/roles/minecraft-server/molecule/default/verify.yml +++ b/roles/minecraft-server/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get minecraft_server container state diff --git a/roles/minecraft-server/molecule/default/verify_stopped.yml b/roles/minecraft-server/molecule/default/verify_stopped.yml index f89567277b..285dc38142 100644 --- a/roles/minecraft-server/molecule/default/verify_stopped.yml +++ b/roles/minecraft-server/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove minecraft_server diff --git a/roles/minidlna/molecule/default/verify.yml b/roles/minidlna/molecule/default/verify.yml index 7cad6a8c20..358c301a73 100644 --- a/roles/minidlna/molecule/default/verify.yml +++ b/roles/minidlna/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get minidlna container state diff --git a/roles/minidlna/molecule/default/verify_stopped.yml b/roles/minidlna/molecule/default/verify_stopped.yml index cb144af74b..5c7c20e6c6 100644 --- a/roles/minidlna/molecule/default/verify_stopped.yml +++ b/roles/minidlna/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove minidlna diff --git a/roles/miniflux/molecule/default/verify.yml b/roles/miniflux/molecule/default/verify.yml index 89bb48fd7f..54514bebb6 100644 --- a/roles/miniflux/molecule/default/verify.yml +++ b/roles/miniflux/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get miniflux container state diff --git a/roles/miniflux/molecule/default/verify_stopped.yml b/roles/miniflux/molecule/default/verify_stopped.yml index 05382c5dd2..d070a29708 100644 --- a/roles/miniflux/molecule/default/verify_stopped.yml +++ b/roles/miniflux/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove miniflux diff --git a/roles/mosquitto/molecule/default/verify.yml b/roles/mosquitto/molecule/default/verify.yml index 0656648d9f..4cf3bfcda9 100644 --- a/roles/mosquitto/molecule/default/verify.yml +++ b/roles/mosquitto/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get mosquitto container state diff --git a/roles/mosquitto/molecule/default/verify_stopped.yml b/roles/mosquitto/molecule/default/verify_stopped.yml index f7e040ccdf..56358827ad 100644 --- a/roles/mosquitto/molecule/default/verify_stopped.yml +++ b/roles/mosquitto/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove mosquitto diff --git a/roles/mylar/molecule/default/verify.yml b/roles/mylar/molecule/default/verify.yml index fb17cd4115..7ec901d4d2 100644 --- a/roles/mylar/molecule/default/verify.yml +++ b/roles/mylar/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get mylar container state diff --git a/roles/mylar/molecule/default/verify_stopped.yml b/roles/mylar/molecule/default/verify_stopped.yml index 8d3cf8a731..8109d7e5f9 100644 --- a/roles/mylar/molecule/default/verify_stopped.yml +++ b/roles/mylar/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove mylar diff --git a/roles/mymediaforalexa/molecule/default/verify.yml b/roles/mymediaforalexa/molecule/default/verify.yml index c9a5e4bdf8..7cec76a47d 100644 --- a/roles/mymediaforalexa/molecule/default/verify.yml +++ b/roles/mymediaforalexa/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get mymediaforalexa container state diff --git a/roles/mymediaforalexa/molecule/default/verify_stopped.yml b/roles/mymediaforalexa/molecule/default/verify_stopped.yml index 6d26c297a3..70945ef404 100644 --- a/roles/mymediaforalexa/molecule/default/verify_stopped.yml +++ b/roles/mymediaforalexa/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove mymediaforalexa diff --git a/roles/n8n/molecule/default/verify.yml b/roles/n8n/molecule/default/verify.yml index 3ea8d266c3..3e2b196a32 100644 --- a/roles/n8n/molecule/default/verify.yml +++ b/roles/n8n/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get n8n container state diff --git a/roles/n8n/molecule/default/verify_stopped.yml b/roles/n8n/molecule/default/verify_stopped.yml index e6081311d9..46681ad3ee 100644 --- a/roles/n8n/molecule/default/verify_stopped.yml +++ b/roles/n8n/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove n8n diff --git a/roles/navidrome/molecule/default/verify.yml b/roles/navidrome/molecule/default/verify.yml index e791e779f1..d584c4580f 100644 --- a/roles/navidrome/molecule/default/verify.yml +++ b/roles/navidrome/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get navidrome container state diff --git a/roles/navidrome/molecule/default/verify_stopped.yml b/roles/navidrome/molecule/default/verify_stopped.yml index b26f69ba34..0e4c1ed983 100644 --- a/roles/navidrome/molecule/default/verify_stopped.yml +++ b/roles/navidrome/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove navidrome diff --git a/roles/netbootxyz/molecule/default/verify.yml b/roles/netbootxyz/molecule/default/verify.yml index 2f2efee870..3d4f93a0e5 100644 --- a/roles/netbootxyz/molecule/default/verify.yml +++ b/roles/netbootxyz/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get netbootxyz container state diff --git a/roles/netbootxyz/molecule/default/verify_stopped.yml b/roles/netbootxyz/molecule/default/verify_stopped.yml index 86e1213397..59f5f29bd2 100644 --- a/roles/netbootxyz/molecule/default/verify_stopped.yml +++ b/roles/netbootxyz/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove netbootxyz diff --git a/roles/netdata/molecule/default/verify.yml b/roles/netdata/molecule/default/verify.yml index 6094369d84..d1e73c7751 100644 --- a/roles/netdata/molecule/default/verify.yml +++ b/roles/netdata/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get netdata container state diff --git a/roles/netdata/molecule/default/verify_stopped.yml b/roles/netdata/molecule/default/verify_stopped.yml index 7fe1d29246..57d35803c5 100644 --- a/roles/netdata/molecule/default/verify_stopped.yml +++ b/roles/netdata/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove netdata diff --git a/roles/nextcloud/molecule/default/verify.yml b/roles/nextcloud/molecule/default/verify.yml index d42137260b..b09438c3ed 100644 --- a/roles/nextcloud/molecule/default/verify.yml +++ b/roles/nextcloud/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get nextcloud db container state diff --git a/roles/nextcloud/molecule/default/verify_stopped.yml b/roles/nextcloud/molecule/default/verify_stopped.yml index 26edbcab2b..230e8b55e8 100644 --- a/roles/nextcloud/molecule/default/verify_stopped.yml +++ b/roles/nextcloud/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove nextcloud diff --git a/roles/nomad/molecule/default/verify.yml b/roles/nomad/molecule/default/verify.yml index 2efc7cd6e6..61aefb6236 100644 --- a/roles/nomad/molecule/default/verify.yml +++ b/roles/nomad/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get Nomad service state diff --git a/roles/nomad/molecule/default/verify_stopped.yml b/roles/nomad/molecule/default/verify_stopped.yml index e51d9c9fa3..fe0b9b6ba5 100644 --- a/roles/nomad/molecule/default/verify_stopped.yml +++ b/roles/nomad/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Nomad - retrieve information diff --git a/roles/nzbget/molecule/default/verify.yml b/roles/nzbget/molecule/default/verify.yml index b9d7422e39..f83b6a94cb 100644 --- a/roles/nzbget/molecule/default/verify.yml +++ b/roles/nzbget/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get nzbget container state diff --git a/roles/nzbget/molecule/default/verify_stopped.yml b/roles/nzbget/molecule/default/verify_stopped.yml index 1c228aec60..815ba5f763 100644 --- a/roles/nzbget/molecule/default/verify_stopped.yml +++ b/roles/nzbget/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove nzbget diff --git a/roles/octoprint/molecule/default/verify.yml b/roles/octoprint/molecule/default/verify.yml index e7b628f8be..fab275e914 100644 --- a/roles/octoprint/molecule/default/verify.yml +++ b/roles/octoprint/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get octoprint container state diff --git a/roles/octoprint/molecule/default/verify_stopped.yml b/roles/octoprint/molecule/default/verify_stopped.yml index 23dca6fc92..2da1d96245 100644 --- a/roles/octoprint/molecule/default/verify_stopped.yml +++ b/roles/octoprint/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove octoprint diff --git a/roles/ombi/molecule/default/verify.yml b/roles/ombi/molecule/default/verify.yml index 91f442a830..60c9a900c9 100644 --- a/roles/ombi/molecule/default/verify.yml +++ b/roles/ombi/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get ombi container state diff --git a/roles/ombi/molecule/default/verify_stopped.yml b/roles/ombi/molecule/default/verify_stopped.yml index 2ee8ef5355..d15746c6ba 100644 --- a/roles/ombi/molecule/default/verify_stopped.yml +++ b/roles/ombi/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove ombi diff --git a/roles/openhab/molecule/default/verify.yml b/roles/openhab/molecule/default/verify.yml index 78a330015b..a7f727559a 100644 --- a/roles/openhab/molecule/default/verify.yml +++ b/roles/openhab/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get openhab container state diff --git a/roles/openhab/molecule/default/verify_stopped.yml b/roles/openhab/molecule/default/verify_stopped.yml index d7aeec1000..578ac2a1dc 100644 --- a/roles/openhab/molecule/default/verify_stopped.yml +++ b/roles/openhab/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove openhab diff --git a/roles/organizr/molecule/default/verify.yml b/roles/organizr/molecule/default/verify.yml index 7777f61418..abeb046193 100644 --- a/roles/organizr/molecule/default/verify.yml +++ b/roles/organizr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get organizr container state diff --git a/roles/organizr/molecule/default/verify_stopped.yml b/roles/organizr/molecule/default/verify_stopped.yml index 3001c7c51e..c3cdf466d3 100644 --- a/roles/organizr/molecule/default/verify_stopped.yml +++ b/roles/organizr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove organizr diff --git a/roles/overseerr/molecule/default/verify.yml b/roles/overseerr/molecule/default/verify.yml index 26215c95cb..2b18139101 100644 --- a/roles/overseerr/molecule/default/verify.yml +++ b/roles/overseerr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get overseerr container state diff --git a/roles/overseerr/molecule/default/verify_stopped.yml b/roles/overseerr/molecule/default/verify_stopped.yml index 63b0dabc6f..b98b606432 100644 --- a/roles/overseerr/molecule/default/verify_stopped.yml +++ b/roles/overseerr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove overseerr diff --git a/roles/paperless_ng/molecule/default/verify.yml b/roles/paperless_ng/molecule/default/verify.yml index 500fae123b..ef82b1e4f3 100644 --- a/roles/paperless_ng/molecule/default/verify.yml +++ b/roles/paperless_ng/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get paperless_ng redis container state diff --git a/roles/paperless_ng/molecule/default/verify_stopped.yml b/roles/paperless_ng/molecule/default/verify_stopped.yml index 24f8793259..af6907877b 100644 --- a/roles/paperless_ng/molecule/default/verify_stopped.yml +++ b/roles/paperless_ng/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove paperless_ng diff --git a/roles/piwigo/molecule/default/verify.yml b/roles/piwigo/molecule/default/verify.yml index 323430699b..769b190054 100644 --- a/roles/piwigo/molecule/default/verify.yml +++ b/roles/piwigo/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get piwigo db container state diff --git a/roles/piwigo/molecule/default/verify_stopped.yml b/roles/piwigo/molecule/default/verify_stopped.yml index 750ae3d49f..da970edea3 100644 --- a/roles/piwigo/molecule/default/verify_stopped.yml +++ b/roles/piwigo/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove piwigo diff --git a/roles/plex/molecule/default/verify.yml b/roles/plex/molecule/default/verify.yml index d971c288c6..3a19919e40 100644 --- a/roles/plex/molecule/default/verify.yml +++ b/roles/plex/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get plex container state diff --git a/roles/plex/molecule/default/verify_stopped.yml b/roles/plex/molecule/default/verify_stopped.yml index 37859b3c64..435d7c861b 100644 --- a/roles/plex/molecule/default/verify_stopped.yml +++ b/roles/plex/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove plex diff --git a/roles/portainer/molecule/default/verify.yml b/roles/portainer/molecule/default/verify.yml index a53be8a4d3..aa514cb584 100644 --- a/roles/portainer/molecule/default/verify.yml +++ b/roles/portainer/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get portainer container state diff --git a/roles/portainer/molecule/default/verify_stopped.yml b/roles/portainer/molecule/default/verify_stopped.yml index 5add0bf72e..09d75c8add 100644 --- a/roles/portainer/molecule/default/verify_stopped.yml +++ b/roles/portainer/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove portainer diff --git a/roles/prowlarr/molecule/default/verify.yml b/roles/prowlarr/molecule/default/verify.yml index 30a19ec67a..86fd32010e 100644 --- a/roles/prowlarr/molecule/default/verify.yml +++ b/roles/prowlarr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get prowlarr container state diff --git a/roles/prowlarr/molecule/default/verify_stopped.yml b/roles/prowlarr/molecule/default/verify_stopped.yml index 67d63e38f1..2a93e24921 100644 --- a/roles/prowlarr/molecule/default/verify_stopped.yml +++ b/roles/prowlarr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove prowlarr diff --git a/roles/pyload/molecule/default/verify.yml b/roles/pyload/molecule/default/verify.yml index f6183b3c78..0b787fd82e 100644 --- a/roles/pyload/molecule/default/verify.yml +++ b/roles/pyload/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get pyload container state diff --git a/roles/pyload/molecule/default/verify_stopped.yml b/roles/pyload/molecule/default/verify_stopped.yml index d340dfb46b..a9fcb8fba0 100644 --- a/roles/pyload/molecule/default/verify_stopped.yml +++ b/roles/pyload/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove pyload diff --git a/roles/pytivo/molecule/default/verify.yml b/roles/pytivo/molecule/default/verify.yml index b185c87277..612ceafd6e 100644 --- a/roles/pytivo/molecule/default/verify.yml +++ b/roles/pytivo/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get pytivo container state diff --git a/roles/pytivo/molecule/default/verify_stopped.yml b/roles/pytivo/molecule/default/verify_stopped.yml index 591d38672b..d2a53f091b 100644 --- a/roles/pytivo/molecule/default/verify_stopped.yml +++ b/roles/pytivo/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove pytivo diff --git a/roles/radarr/molecule/default/verify.yml b/roles/radarr/molecule/default/verify.yml index 5083dada46..dc44b41559 100644 --- a/roles/radarr/molecule/default/verify.yml +++ b/roles/radarr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get radarr container state diff --git a/roles/radarr/molecule/default/verify_stopped.yml b/roles/radarr/molecule/default/verify_stopped.yml index fd1f933e9a..e0f1fed8ca 100644 --- a/roles/radarr/molecule/default/verify_stopped.yml +++ b/roles/radarr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove radarr diff --git a/roles/route53_ddns/molecule/default/verify.yml b/roles/route53_ddns/molecule/default/verify.yml index f64de7d790..406f138ee3 100644 --- a/roles/route53_ddns/molecule/default/verify.yml +++ b/roles/route53_ddns/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get route53 container state diff --git a/roles/route53_ddns/molecule/default/verify_stopped.yml b/roles/route53_ddns/molecule/default/verify_stopped.yml index 114d565728..f14a9bbb3a 100644 --- a/roles/route53_ddns/molecule/default/verify_stopped.yml +++ b/roles/route53_ddns/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove route53 diff --git a/roles/rssbridge/molecule/default/verify.yml b/roles/rssbridge/molecule/default/verify.yml index 20bee845bf..049a800a6b 100644 --- a/roles/rssbridge/molecule/default/verify.yml +++ b/roles/rssbridge/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get rssbridge container state diff --git a/roles/rssbridge/molecule/default/verify_stopped.yml b/roles/rssbridge/molecule/default/verify_stopped.yml index 2c260381a7..033a5809e0 100644 --- a/roles/rssbridge/molecule/default/verify_stopped.yml +++ b/roles/rssbridge/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove rssbridge diff --git a/roles/sabnzbd/molecule/default/verify.yml b/roles/sabnzbd/molecule/default/verify.yml index c8f767eb89..fd3e58cfbd 100644 --- a/roles/sabnzbd/molecule/default/verify.yml +++ b/roles/sabnzbd/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get sabnzbd container state diff --git a/roles/sabnzbd/molecule/default/verify_stopped.yml b/roles/sabnzbd/molecule/default/verify_stopped.yml index d83fa89d43..dea2b6715d 100644 --- a/roles/sabnzbd/molecule/default/verify_stopped.yml +++ b/roles/sabnzbd/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove sabnzbd diff --git a/roles/sickchill/molecule/default/verify.yml b/roles/sickchill/molecule/default/verify.yml index 4a9bc9d170..4fd0e1a2a9 100644 --- a/roles/sickchill/molecule/default/verify.yml +++ b/roles/sickchill/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get sickchill container state diff --git a/roles/sickchill/molecule/default/verify_stopped.yml b/roles/sickchill/molecule/default/verify_stopped.yml index 6da330633a..f15aa772c5 100644 --- a/roles/sickchill/molecule/default/verify_stopped.yml +++ b/roles/sickchill/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove sickchill diff --git a/roles/sonarr/molecule/default/verify.yml b/roles/sonarr/molecule/default/verify.yml index 15cbf349f7..062cb38a8f 100644 --- a/roles/sonarr/molecule/default/verify.yml +++ b/roles/sonarr/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get sonarr container state diff --git a/roles/sonarr/molecule/default/verify_stopped.yml b/roles/sonarr/molecule/default/verify_stopped.yml index 76a78fcccb..a445fefa55 100644 --- a/roles/sonarr/molecule/default/verify_stopped.yml +++ b/roles/sonarr/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove sonarr diff --git a/roles/speedtest-tracker/molecule/default/verify.yml b/roles/speedtest-tracker/molecule/default/verify.yml index a8faf3ecd5..2d145990dc 100644 --- a/roles/speedtest-tracker/molecule/default/verify.yml +++ b/roles/speedtest-tracker/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get speedtest container state diff --git a/roles/speedtest-tracker/molecule/default/verify_stopped.yml b/roles/speedtest-tracker/molecule/default/verify_stopped.yml index 8118ee41a9..5c609048c4 100644 --- a/roles/speedtest-tracker/molecule/default/verify_stopped.yml +++ b/roles/speedtest-tracker/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove speedtest diff --git a/roles/stats/molecule/default/verify.yml b/roles/stats/molecule/default/verify.yml index 4b08158d05..a8873d4f3b 100644 --- a/roles/stats/molecule/default/verify.yml +++ b/roles/stats/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Get Grafana container state diff --git a/roles/stats/molecule/default/verify_stopped.yml b/roles/stats/molecule/default/verify_stopped.yml index 7e04cfdb10..9f0f0c84af 100644 --- a/roles/stats/molecule/default/verify_stopped.yml +++ b/roles/stats/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - include_vars: + - include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Grafana diff --git a/roles/syncthing/molecule/default/verify.yml b/roles/syncthing/molecule/default/verify.yml index 09439f5dcb..6ad2fd9e52 100644 --- a/roles/syncthing/molecule/default/verify.yml +++ b/roles/syncthing/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get syncthing container state diff --git a/roles/syncthing/molecule/default/verify_stopped.yml b/roles/syncthing/molecule/default/verify_stopped.yml index e751187399..3671847745 100644 --- a/roles/syncthing/molecule/default/verify_stopped.yml +++ b/roles/syncthing/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove syncthing diff --git a/roles/tautulli/molecule/default/verify.yml b/roles/tautulli/molecule/default/verify.yml index 7fe57d0556..eb94b6143f 100644 --- a/roles/tautulli/molecule/default/verify.yml +++ b/roles/tautulli/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get tautulli container state diff --git a/roles/tautulli/molecule/default/verify_stopped.yml b/roles/tautulli/molecule/default/verify_stopped.yml index c47aaab911..c93908c4af 100644 --- a/roles/tautulli/molecule/default/verify_stopped.yml +++ b/roles/tautulli/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove tautulli diff --git a/roles/thelounge/molecule/default/verify.yml b/roles/thelounge/molecule/default/verify.yml index ad0b83cc5a..d202987806 100644 --- a/roles/thelounge/molecule/default/verify.yml +++ b/roles/thelounge/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get thelounge container state diff --git a/roles/thelounge/molecule/default/verify_stopped.yml b/roles/thelounge/molecule/default/verify_stopped.yml index 8dbdaa1d49..d356320ffa 100644 --- a/roles/thelounge/molecule/default/verify_stopped.yml +++ b/roles/thelounge/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove thelounge diff --git a/roles/tiddlywiki/molecule/default/verify.yml b/roles/tiddlywiki/molecule/default/verify.yml index cefc8177e6..5f0a53c167 100644 --- a/roles/tiddlywiki/molecule/default/verify.yml +++ b/roles/tiddlywiki/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get tiddlywiki container state diff --git a/roles/tiddlywiki/molecule/default/verify_stopped.yml b/roles/tiddlywiki/molecule/default/verify_stopped.yml index debf551c44..933341fba2 100644 --- a/roles/tiddlywiki/molecule/default/verify_stopped.yml +++ b/roles/tiddlywiki/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove tiddlywiki diff --git a/roles/timemachine/molecule/default/verify.yml b/roles/timemachine/molecule/default/verify.yml index ff6c026502..eea11ff82e 100644 --- a/roles/timemachine/molecule/default/verify.yml +++ b/roles/timemachine/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get timemachine container state diff --git a/roles/timemachine/molecule/default/verify_stopped.yml b/roles/timemachine/molecule/default/verify_stopped.yml index e916db5fe7..c3a2c8f27b 100644 --- a/roles/timemachine/molecule/default/verify_stopped.yml +++ b/roles/timemachine/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove timemachine diff --git a/roles/traefik/molecule/default/verify.yml b/roles/traefik/molecule/default/verify.yml index 94510931c4..f0eb443362 100644 --- a/roles/traefik/molecule/default/verify.yml +++ b/roles/traefik/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get traefik container state diff --git a/roles/traefik/molecule/default/verify_stopped.yml b/roles/traefik/molecule/default/verify_stopped.yml index ab92055078..ab4cee802d 100644 --- a/roles/traefik/molecule/default/verify_stopped.yml +++ b/roles/traefik/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove traefik diff --git a/roles/transmission-with-openvpn/molecule/default/verify.yml b/roles/transmission-with-openvpn/molecule/default/verify.yml index 748aef0778..285e02bb4f 100644 --- a/roles/transmission-with-openvpn/molecule/default/verify.yml +++ b/roles/transmission-with-openvpn/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get transmission container state diff --git a/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml b/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml index fa5d60dc48..144a74d251 100644 --- a/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml +++ b/roles/transmission-with-openvpn/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove transmission diff --git a/roles/transmission/molecule/default/verify.yml b/roles/transmission/molecule/default/verify.yml index 101dceb538..63afee933d 100644 --- a/roles/transmission/molecule/default/verify.yml +++ b/roles/transmission/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get transmission container state diff --git a/roles/transmission/molecule/default/verify_stopped.yml b/roles/transmission/molecule/default/verify_stopped.yml index bea8a2edb8..f02f68eb8e 100644 --- a/roles/transmission/molecule/default/verify_stopped.yml +++ b/roles/transmission/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove transmission diff --git a/roles/ubooquity/molecule/default/verify.yml b/roles/ubooquity/molecule/default/verify.yml index 4471805a1c..db55665a57 100644 --- a/roles/ubooquity/molecule/default/verify.yml +++ b/roles/ubooquity/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get ubooquity container state diff --git a/roles/ubooquity/molecule/default/verify_stopped.yml b/roles/ubooquity/molecule/default/verify_stopped.yml index ecdd6f81a9..c82c49569a 100644 --- a/roles/ubooquity/molecule/default/verify_stopped.yml +++ b/roles/ubooquity/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove ubooquity diff --git a/roles/utorrent/molecule/default/verify.yml b/roles/utorrent/molecule/default/verify.yml index b2f6d3ec43..72a2141111 100644 --- a/roles/utorrent/molecule/default/verify.yml +++ b/roles/utorrent/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get utorrent container state diff --git a/roles/utorrent/molecule/default/verify_stopped.yml b/roles/utorrent/molecule/default/verify_stopped.yml index 76d5347dbd..ba10e3e489 100644 --- a/roles/utorrent/molecule/default/verify_stopped.yml +++ b/roles/utorrent/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove utorrent diff --git a/roles/virtual_desktop/molecule/default/verify.yml b/roles/virtual_desktop/molecule/default/verify.yml index 0058aa983b..8a9a8f11a2 100644 --- a/roles/virtual_desktop/molecule/default/verify.yml +++ b/roles/virtual_desktop/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get virtual_desktop container state diff --git a/roles/virtual_desktop/molecule/default/verify_stopped.yml b/roles/virtual_desktop/molecule/default/verify_stopped.yml index 0d8468587f..19464acef4 100644 --- a/roles/virtual_desktop/molecule/default/verify_stopped.yml +++ b/roles/virtual_desktop/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove virtual_desktop diff --git a/roles/wallabag/molecule/default/verify.yml b/roles/wallabag/molecule/default/verify.yml index b710d9f531..7c757d9af6 100644 --- a/roles/wallabag/molecule/default/verify.yml +++ b/roles/wallabag/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get wallabag container state diff --git a/roles/wallabag/molecule/default/verify_stopped.yml b/roles/wallabag/molecule/default/verify_stopped.yml index 2fdd59b86c..32e8f70657 100644 --- a/roles/wallabag/molecule/default/verify_stopped.yml +++ b/roles/wallabag/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove wallabag diff --git a/roles/watchtower/molecule/default/verify.yml b/roles/watchtower/molecule/default/verify.yml index 11e56dd085..411025b782 100644 --- a/roles/watchtower/molecule/default/verify.yml +++ b/roles/watchtower/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get watchtower container state diff --git a/roles/watchtower/molecule/default/verify_stopped.yml b/roles/watchtower/molecule/default/verify_stopped.yml index d935558031..c29667d940 100644 --- a/roles/watchtower/molecule/default/verify_stopped.yml +++ b/roles/watchtower/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove watchtower diff --git a/roles/wireshark/molecule/default/verify.yml b/roles/wireshark/molecule/default/verify.yml index 5595dbd452..ee02896899 100644 --- a/roles/wireshark/molecule/default/verify.yml +++ b/roles/wireshark/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get wireshark container state diff --git a/roles/wireshark/molecule/default/verify_stopped.yml b/roles/wireshark/molecule/default/verify_stopped.yml index 572d11d108..5034e4832e 100644 --- a/roles/wireshark/molecule/default/verify_stopped.yml +++ b/roles/wireshark/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove wireshark diff --git a/roles/woodpecker-ci/molecule/default/verify.yml b/roles/woodpecker-ci/molecule/default/verify.yml index 7d01d15c66..97894af492 100644 --- a/roles/woodpecker-ci/molecule/default/verify.yml +++ b/roles/woodpecker-ci/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get woodpecker_ci container state diff --git a/roles/woodpecker-ci/molecule/default/verify_stopped.yml b/roles/woodpecker-ci/molecule/default/verify_stopped.yml index 887373bd2c..fec426b396 100644 --- a/roles/woodpecker-ci/molecule/default/verify_stopped.yml +++ b/roles/woodpecker-ci/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove woodpecker_ci diff --git a/roles/youtubedlmaterial/molecule/default/verify.yml b/roles/youtubedlmaterial/molecule/default/verify.yml index 274e3501d8..6d5b0a30c9 100644 --- a/roles/youtubedlmaterial/molecule/default/verify.yml +++ b/roles/youtubedlmaterial/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get youtubedlmaterial container state diff --git a/roles/youtubedlmaterial/molecule/default/verify_stopped.yml b/roles/youtubedlmaterial/molecule/default/verify_stopped.yml index c033588db7..1477964030 100644 --- a/roles/youtubedlmaterial/molecule/default/verify_stopped.yml +++ b/roles/youtubedlmaterial/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove youtubedlmaterial diff --git a/roles/znc/molecule/default/verify.yml b/roles/znc/molecule/default/verify.yml index 8756c9540c..d83a3f0751 100644 --- a/roles/znc/molecule/default/verify.yml +++ b/roles/znc/molecule/default/verify.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get znc container state diff --git a/roles/znc/molecule/default/verify_stopped.yml b/roles/znc/molecule/default/verify_stopped.yml index 8a5d3ef9c9..ef703b57cc 100644 --- a/roles/znc/molecule/default/verify_stopped.yml +++ b/roles/znc/molecule/default/verify_stopped.yml @@ -3,8 +3,7 @@ hosts: all gather_facts: false tasks: - - name: Include vars - ansible.builtin.include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove znc From 14b386ed144bb1a2c8da097308c2000777002939 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 12 Apr 2023 23:29:29 +0100 Subject: [PATCH 194/286] Use FQCNs --- roles/airsonic/molecule/default/verify.yml | 4 ++-- roles/airsonic/molecule/default/verify_stopped.yml | 4 ++-- roles/bazarr/molecule/default/verify.yml | 4 ++-- roles/bazarr/molecule/default/verify_stopped.yml | 4 ++-- roles/bitwarden/molecule/default/verify.yml | 4 ++-- roles/bitwarden/molecule/default/verify_stopped.yml | 4 ++-- roles/booksonic/molecule/default/verify.yml | 4 ++-- roles/booksonic/molecule/default/verify_stopped.yml | 4 ++-- roles/calibre/molecule/default/verify.yml | 4 ++-- roles/calibre/molecule/default/verify_stopped.yml | 4 ++-- roles/cloudcmd/molecule/default/verify.yml | 4 ++-- roles/cloudcmd/molecule/default/verify_stopped.yml | 4 ++-- roles/cloudflare_ddns/molecule/default/verify.yml | 4 ++-- roles/cloudflare_ddns/molecule/default/verify_stopped.yml | 4 ++-- roles/code-server/molecule/default/verify.yml | 4 ++-- roles/code-server/molecule/default/verify_stopped.yml | 4 ++-- roles/couchpotato/molecule/default/verify.yml | 4 ++-- roles/couchpotato/molecule/default/verify_stopped.yml | 4 ++-- roles/dashy/molecule/default/verify.yml | 4 ++-- roles/dashy/molecule/default/verify_stopped.yml | 4 ++-- roles/deluge/molecule/default/verify.yml | 4 ++-- roles/deluge/molecule/default/verify_stopped.yml | 4 ++-- roles/dokuwiki/molecule/default/verify.yml | 4 ++-- roles/dokuwiki/molecule/default/verify_stopped.yml | 4 ++-- roles/drone-ci/molecule/default/verify.yml | 4 ++-- roles/drone-ci/molecule/default/verify_stopped.yml | 4 ++-- roles/duplicacy/molecule/default/verify.yml | 4 ++-- roles/duplicacy/molecule/default/verify_stopped.yml | 4 ++-- roles/emby/molecule/default/verify.yml | 4 ++-- roles/emby/molecule/default/verify_stopped.yml | 4 ++-- roles/esphome/molecule/default/verify.yml | 4 ++-- roles/esphome/molecule/default/verify_stopped.yml | 4 ++-- roles/firefly/molecule/default/verify.yml | 4 ++-- roles/firefly/molecule/default/verify_stopped.yml | 4 ++-- roles/heimdall/molecule/default/verify.yml | 4 ++-- roles/heimdall/molecule/default/verify_stopped.yml | 4 ++-- roles/hello_world/molecule/default/verify.yml | 4 ++-- roles/hello_world/molecule/default/verify_stopped.yml | 4 ++-- roles/komga/molecule/default/verify.yml | 4 ++-- roles/komga/molecule/default/verify_stopped.yml | 4 ++-- roles/krusader/molecule/default/verify.yml | 4 ++-- roles/krusader/molecule/default/verify_stopped.yml | 4 ++-- roles/stats/molecule/default/verify.yml | 4 ++-- roles/stats/molecule/default/verify_stopped.yml | 4 ++-- 44 files changed, 88 insertions(+), 88 deletions(-) diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index 5dc0a7c49e..3e3a90227f 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Airsonic is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index a642055718..cb7a2285c7 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Airsonic @@ -13,6 +13,6 @@ register: result - name: Check Airsonic is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/bazarr/molecule/default/verify.yml b/roles/bazarr/molecule/default/verify.yml index b29244084d..dd9c38f667 100644 --- a/roles/bazarr/molecule/default/verify.yml +++ b/roles/bazarr/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Bazarr is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/bazarr/molecule/default/verify_stopped.yml b/roles/bazarr/molecule/default/verify_stopped.yml index 7b316fdbb3..cbba12938e 100644 --- a/roles/bazarr/molecule/default/verify_stopped.yml +++ b/roles/bazarr/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bazarr @@ -13,6 +13,6 @@ register: result - name: Check Bazarr is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/bitwarden/molecule/default/verify.yml b/roles/bitwarden/molecule/default/verify.yml index c62702be65..8fd851865b 100644 --- a/roles/bitwarden/molecule/default/verify.yml +++ b/roles/bitwarden/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -17,7 +17,7 @@ register: result_backup - name: Check Bitwarden is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/bitwarden/molecule/default/verify_stopped.yml b/roles/bitwarden/molecule/default/verify_stopped.yml index debe83588a..5a0ebd112b 100644 --- a/roles/bitwarden/molecule/default/verify_stopped.yml +++ b/roles/bitwarden/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Bitwarden @@ -19,7 +19,7 @@ register: result_backup - name: Check Bitwarden is stopped - assert: + ansible.builtin.assert: that: - not result.changed - not result_backup.changed diff --git a/roles/booksonic/molecule/default/verify.yml b/roles/booksonic/molecule/default/verify.yml index 98400317b7..6fd1b5c9cc 100644 --- a/roles/booksonic/molecule/default/verify.yml +++ b/roles/booksonic/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Booksonic is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/booksonic/molecule/default/verify_stopped.yml b/roles/booksonic/molecule/default/verify_stopped.yml index 7b68fe984a..dc36dbaa3a 100644 --- a/roles/booksonic/molecule/default/verify_stopped.yml +++ b/roles/booksonic/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Booksonic @@ -13,6 +13,6 @@ register: result - name: Check Booksonic is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/calibre/molecule/default/verify.yml b/roles/calibre/molecule/default/verify.yml index 77267b9d52..654b5ead76 100644 --- a/roles/calibre/molecule/default/verify.yml +++ b/roles/calibre/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Calibre is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/calibre/molecule/default/verify_stopped.yml b/roles/calibre/molecule/default/verify_stopped.yml index bd3ccf6e30..3471141e5d 100644 --- a/roles/calibre/molecule/default/verify_stopped.yml +++ b/roles/calibre/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Calibre @@ -13,6 +13,6 @@ register: result - name: Check Calibre is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/cloudcmd/molecule/default/verify.yml b/roles/cloudcmd/molecule/default/verify.yml index abef5b4ac7..45127370b5 100644 --- a/roles/cloudcmd/molecule/default/verify.yml +++ b/roles/cloudcmd/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Cloudcmd is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/cloudcmd/molecule/default/verify_stopped.yml b/roles/cloudcmd/molecule/default/verify_stopped.yml index 68ad0d3b93..f3a9be3478 100644 --- a/roles/cloudcmd/molecule/default/verify_stopped.yml +++ b/roles/cloudcmd/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudcmd @@ -13,6 +13,6 @@ register: result - name: Check Cloudcmd is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/cloudflare_ddns/molecule/default/verify.yml b/roles/cloudflare_ddns/molecule/default/verify.yml index 0e92e82ee9..0a6cc0ce6a 100644 --- a/roles/cloudflare_ddns/molecule/default/verify.yml +++ b/roles/cloudflare_ddns/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Cloudflare DDNS is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml index e2273930e4..acc32a5f73 100644 --- a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml +++ b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Cloudflare DDNS @@ -13,6 +13,6 @@ register: result - name: Check Cloudflare DDNS is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/code-server/molecule/default/verify.yml b/roles/code-server/molecule/default/verify.yml index 970070c650..91338114eb 100644 --- a/roles/code-server/molecule/default/verify.yml +++ b/roles/code-server/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Code Server is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/code-server/molecule/default/verify_stopped.yml b/roles/code-server/molecule/default/verify_stopped.yml index 5cba43ccf5..78f6f5d151 100644 --- a/roles/code-server/molecule/default/verify_stopped.yml +++ b/roles/code-server/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Code Server @@ -13,6 +13,6 @@ register: result - name: Check Code Server is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/couchpotato/molecule/default/verify.yml b/roles/couchpotato/molecule/default/verify.yml index 3031e9025e..5594ee210c 100644 --- a/roles/couchpotato/molecule/default/verify.yml +++ b/roles/couchpotato/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Couchpotato is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/couchpotato/molecule/default/verify_stopped.yml b/roles/couchpotato/molecule/default/verify_stopped.yml index 213afef491..75a59a4851 100644 --- a/roles/couchpotato/molecule/default/verify_stopped.yml +++ b/roles/couchpotato/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Couchpotato @@ -13,6 +13,6 @@ register: result - name: Check Couchpotato is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/dashy/molecule/default/verify.yml b/roles/dashy/molecule/default/verify.yml index 6c1bc594eb..3201bc9256 100644 --- a/roles/dashy/molecule/default/verify.yml +++ b/roles/dashy/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Dashy is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/dashy/molecule/default/verify_stopped.yml b/roles/dashy/molecule/default/verify_stopped.yml index 1748897f7c..bfbc698aa9 100644 --- a/roles/dashy/molecule/default/verify_stopped.yml +++ b/roles/dashy/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dashy @@ -13,6 +13,6 @@ register: result - name: Check Dashy is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/deluge/molecule/default/verify.yml b/roles/deluge/molecule/default/verify.yml index 6d815a897f..9044347b54 100644 --- a/roles/deluge/molecule/default/verify.yml +++ b/roles/deluge/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Deluge is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/deluge/molecule/default/verify_stopped.yml b/roles/deluge/molecule/default/verify_stopped.yml index 9d4abcbe0a..c08fb34415 100644 --- a/roles/deluge/molecule/default/verify_stopped.yml +++ b/roles/deluge/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Deluge @@ -13,6 +13,6 @@ register: result - name: Check Deluge is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/dokuwiki/molecule/default/verify.yml b/roles/dokuwiki/molecule/default/verify.yml index 676a5e79c2..95a0e87e5b 100644 --- a/roles/dokuwiki/molecule/default/verify.yml +++ b/roles/dokuwiki/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Dokuwiki is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/dokuwiki/molecule/default/verify_stopped.yml b/roles/dokuwiki/molecule/default/verify_stopped.yml index 60151b02c4..028bf4cc96 100644 --- a/roles/dokuwiki/molecule/default/verify_stopped.yml +++ b/roles/dokuwiki/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Dokuwiki @@ -13,6 +13,6 @@ register: result - name: Check Dokuwiki is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/drone-ci/molecule/default/verify.yml b/roles/drone-ci/molecule/default/verify.yml index c993caf942..0ec1dc522b 100644 --- a/roles/drone-ci/molecule/default/verify.yml +++ b/roles/drone-ci/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -18,7 +18,7 @@ - name: Check Drone CI is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/drone-ci/molecule/default/verify_stopped.yml b/roles/drone-ci/molecule/default/verify_stopped.yml index 3f8ce56f01..01b669e0ac 100644 --- a/roles/drone-ci/molecule/default/verify_stopped.yml +++ b/roles/drone-ci/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Drone CI @@ -19,7 +19,7 @@ register: result_runner - name: Check Drone CI is stopped - assert: + ansible.builtin.assert: that: - not result.changed - not result_runner.changed diff --git a/roles/duplicacy/molecule/default/verify.yml b/roles/duplicacy/molecule/default/verify.yml index 7eaee192b0..8f56bc27b8 100644 --- a/roles/duplicacy/molecule/default/verify.yml +++ b/roles/duplicacy/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Duplicacy is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/duplicacy/molecule/default/verify_stopped.yml b/roles/duplicacy/molecule/default/verify_stopped.yml index 487edf7010..c538145519 100644 --- a/roles/duplicacy/molecule/default/verify_stopped.yml +++ b/roles/duplicacy/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Duplicacy @@ -13,6 +13,6 @@ register: result - name: Check Duplicacy is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/emby/molecule/default/verify.yml b/roles/emby/molecule/default/verify.yml index ce3037bff7..fff17b8ffc 100644 --- a/roles/emby/molecule/default/verify.yml +++ b/roles/emby/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check Emby is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/emby/molecule/default/verify_stopped.yml b/roles/emby/molecule/default/verify_stopped.yml index ab61e9bcbc..9c8d319ce6 100644 --- a/roles/emby/molecule/default/verify_stopped.yml +++ b/roles/emby/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Emby @@ -13,6 +13,6 @@ register: result - name: Check Emby is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/esphome/molecule/default/verify.yml b/roles/esphome/molecule/default/verify.yml index a80b586783..5927d95abe 100644 --- a/roles/esphome/molecule/default/verify.yml +++ b/roles/esphome/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -12,7 +12,7 @@ register: result - name: Check EspHome is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/esphome/molecule/default/verify_stopped.yml b/roles/esphome/molecule/default/verify_stopped.yml index dad14d096a..ba25030e55 100644 --- a/roles/esphome/molecule/default/verify_stopped.yml +++ b/roles/esphome/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove EspHome @@ -13,6 +13,6 @@ register: result - name: Check EspHome is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/firefly/molecule/default/verify.yml b/roles/firefly/molecule/default/verify.yml index 7da64ee713..0cbb1d1497 100644 --- a/roles/firefly/molecule/default/verify.yml +++ b/roles/firefly/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -17,7 +17,7 @@ register: result_mysql - name: Check Firefly is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/firefly/molecule/default/verify_stopped.yml b/roles/firefly/molecule/default/verify_stopped.yml index eecb620322..89eb2e2ab0 100644 --- a/roles/firefly/molecule/default/verify_stopped.yml +++ b/roles/firefly/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Firefly @@ -19,7 +19,7 @@ register: result_mysql - name: Check Firefly is stopped - assert: + ansible.builtin.assert: that: - not result.changed - not result_mysql.changed diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml index fbeb602193..2aac9e046f 100644 --- a/roles/heimdall/molecule/default/verify.yml +++ b/roles/heimdall/molecule/default/verify.yml @@ -5,7 +5,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -14,7 +14,7 @@ register: result - name: Check Heimdall is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml index 2be7a52dce..824d44e6c8 100644 --- a/roles/heimdall/molecule/default/verify_stopped.yml +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -5,7 +5,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Heimdall @@ -15,6 +15,6 @@ register: result - name: Check Heimdall is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml index 1cf221a3a3..25ac64dbd8 100644 --- a/roles/hello_world/molecule/default/verify.yml +++ b/roles/hello_world/molecule/default/verify.yml @@ -5,7 +5,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get container state @@ -14,7 +14,7 @@ register: result - name: Check Hello World is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml index 4f4cc4dd44..1c93808142 100644 --- a/roles/hello_world/molecule/default/verify_stopped.yml +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -5,7 +5,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Hello World @@ -15,6 +15,6 @@ register: result - name: Check Hello World is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/komga/molecule/default/verify.yml b/roles/komga/molecule/default/verify.yml index a52b5648db..9d6b75adb0 100644 --- a/roles/komga/molecule/default/verify.yml +++ b/roles/komga/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get komga container state @@ -12,7 +12,7 @@ register: result - name: Check if komga docker container is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/komga/molecule/default/verify_stopped.yml b/roles/komga/molecule/default/verify_stopped.yml index f1c8476df8..8ba8afcb2a 100644 --- a/roles/komga/molecule/default/verify_stopped.yml +++ b/roles/komga/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove komga @@ -13,6 +13,6 @@ register: result - name: Check if komga container is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/krusader/molecule/default/verify.yml b/roles/krusader/molecule/default/verify.yml index 339f18a464..f84754224c 100644 --- a/roles/krusader/molecule/default/verify.yml +++ b/roles/krusader/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get krusader container state @@ -12,7 +12,7 @@ register: result - name: Check if krusader docker container is running - assert: + ansible.builtin.assert: that: - result.container['State']['Status'] == "running" - result.container['State']['Restarting'] == false diff --git a/roles/krusader/molecule/default/verify_stopped.yml b/roles/krusader/molecule/default/verify_stopped.yml index e4961db8ec..4530db47cd 100644 --- a/roles/krusader/molecule/default/verify_stopped.yml +++ b/roles/krusader/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove krusader @@ -13,6 +13,6 @@ register: result - name: Check if krusader container is stopped - assert: + ansible.builtin.assert: that: - not result.changed diff --git a/roles/stats/molecule/default/verify.yml b/roles/stats/molecule/default/verify.yml index a8873d4f3b..bf70bf479e 100644 --- a/roles/stats/molecule/default/verify.yml +++ b/roles/stats/molecule/default/verify.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Get Grafana container state @@ -32,7 +32,7 @@ register: result_speedtest - name: Check if stats docker containers are running - assert: + ansible.builtin.assert: that: - result_grafana.container['State']['Status'] == "running" - result_grafana.container['State']['Restarting'] == false diff --git a/roles/stats/molecule/default/verify_stopped.yml b/roles/stats/molecule/default/verify_stopped.yml index 9f0f0c84af..d15e2867c1 100644 --- a/roles/stats/molecule/default/verify_stopped.yml +++ b/roles/stats/molecule/default/verify_stopped.yml @@ -3,7 +3,7 @@ hosts: all gather_facts: false tasks: - - include_vars: + - ansible.builtin.include_vars: file: ../../defaults/main.yml - name: Try and stop and remove Grafana @@ -37,7 +37,7 @@ register: result_speedtest - name: Check if stats containers are stopped - assert: + ansible.builtin.assert: that: - not result_grafana.changed - not result_prometheus.changed From fd4f56f933b39f9828d90533a5294659a756665d Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Apr 2023 13:56:06 +0100 Subject: [PATCH 195/286] Update ansible-lint --- .github/workflows/ci.yml | 2 +- .pre-commit-config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 191cacf3e8..7e819a7388 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: python-version: "3.x" - name: Install test dependencies - run: pip3 install ansible yamllint==1.27.1 ansible-lint==6.5 + run: pip3 install ansible yamllint==1.27.1 ansible-lint==6.14.6 - name: Ansible-lint run: ansible-lint nas.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 9509d9ef65..d366947326 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ --- repos: - repo: https://github.com/ansible-community/ansible-lint.git - rev: v6.5.0 + rev: v6.14.6 hooks: - id: ansible-lint - repo: https://github.com/adrienverge/yamllint.git From 7d3cf84538b57148a13d3cbf6ae6bba509f9f2da Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Apr 2023 13:56:23 +0100 Subject: [PATCH 196/286] Add collections to requirements.yml --- requirements.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/requirements.yml b/requirements.yml index db3ff45825..a0a3fc1a30 100644 --- a/requirements.yml +++ b/requirements.yml @@ -1,12 +1,17 @@ --- -- name: geerlingguy.docker - version: 6.0.0 +roles: + - name: geerlingguy.docker + version: 6.0.0 -- name: geerlingguy.docker_arm - version: 5.0.0 + - name: geerlingguy.docker_arm + version: 5.0.0 -- name: bertvv.samba - version: v2.7.1 + - name: bertvv.samba + version: v2.7.1 -- name: geerlingguy.nfs - version: 2.0.0 + - name: geerlingguy.nfs + version: 2.0.0 + +collections: + - name: community.docker + - name: community.general From 0caf47d315ce67a53809d1927ccc498b2d21a728 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Apr 2023 14:03:10 +0100 Subject: [PATCH 197/286] Update comments on ansible-nas-docker role defaults --- roles/ansible-nas-docker/defaults/main.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/roles/ansible-nas-docker/defaults/main.yml b/roles/ansible-nas-docker/defaults/main.yml index 81971e46de..1293d9c1da 100644 --- a/roles/ansible-nas-docker/defaults/main.yml +++ b/roles/ansible-nas-docker/defaults/main.yml @@ -1,11 +1,12 @@ --- ansible_nas_user: david -# Where you want Docker to store its container data. +# Where you want to store application data - you'll likely want this backed up or on a ZFS zpool. docker_home: /mnt/Volume2/docker # Where you want Docker to store images -docker_image_directory: "{{ docker_home }}/data" +# Keep this on a fast disk, ideally an SSD. It doesn't need to be backed up. +docker_image_directory: "/var/lib/docker" # Docker storage driver, see https://docs.docker.com/storage/storagedriver/select-storage-driver/#supported-backing-filesystems # You might want to change this to ZFS, depending on your underlying filesystem. From 6db66f2bc1dcfc543855f2e5dc8412bb58e6b41a Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Apr 2023 14:11:49 +0100 Subject: [PATCH 198/286] Finish switch to FQCNs --- roles/airsonic/molecule/default/verify.yml | 2 +- roles/airsonic/molecule/default/verify_stopped.yml | 2 +- roles/airsonic/tasks/main.yml | 6 +++--- roles/ansible-nas-docker/tasks/main.yml | 14 +++++++------- roles/ansible-nas-general/tasks/main.yml | 14 +++++++------- roles/ansible-nas-users/tasks/main.yml | 4 ++-- roles/bazarr/molecule/default/verify.yml | 2 +- roles/bazarr/molecule/default/verify_stopped.yml | 2 +- roles/bazarr/tasks/main.yml | 6 +++--- roles/bitwarden/molecule/default/verify.yml | 4 ++-- .../bitwarden/molecule/default/verify_stopped.yml | 4 ++-- roles/bitwarden/tasks/main.yml | 10 +++++----- roles/booksonic/molecule/default/verify.yml | 2 +- .../booksonic/molecule/default/verify_stopped.yml | 2 +- roles/booksonic/tasks/main.yml | 6 +++--- roles/calibre/molecule/default/verify.yml | 2 +- roles/calibre/molecule/default/verify_stopped.yml | 2 +- roles/calibre/tasks/main.yml | 6 +++--- roles/cloudcmd/molecule/default/verify.yml | 2 +- roles/cloudcmd/molecule/default/verify_stopped.yml | 2 +- roles/cloudcmd/tasks/main.yml | 6 +++--- roles/cloudflare_ddns/molecule/default/verify.yml | 2 +- .../molecule/default/verify_stopped.yml | 2 +- roles/cloudflare_ddns/tasks/main.yml | 10 +++++----- roles/code-server/molecule/default/verify.yml | 2 +- .../molecule/default/verify_stopped.yml | 2 +- roles/code-server/tasks/main.yml | 4 ++-- roles/couchpotato/molecule/default/verify.yml | 2 +- .../molecule/default/verify_stopped.yml | 2 +- roles/couchpotato/tasks/main.yml | 6 +++--- roles/dashy/molecule/default/verify.yml | 2 +- roles/dashy/molecule/default/verify_stopped.yml | 2 +- roles/dashy/tasks/main.yml | 4 ++-- roles/deluge/molecule/default/verify.yml | 2 +- roles/deluge/molecule/default/verify_stopped.yml | 2 +- roles/deluge/tasks/main.yml | 6 +++--- roles/dokuwiki/molecule/default/verify.yml | 2 +- roles/dokuwiki/molecule/default/verify_stopped.yml | 2 +- roles/dokuwiki/tasks/main.yml | 6 +++--- roles/drone-ci/molecule/default/prepare.yml | 6 +++--- roles/drone-ci/molecule/default/verify.yml | 4 ++-- roles/drone-ci/molecule/default/verify_stopped.yml | 4 ++-- roles/drone-ci/tasks/main.yml | 14 +++++++------- roles/duplicacy/molecule/default/verify.yml | 2 +- .../duplicacy/molecule/default/verify_stopped.yml | 2 +- roles/duplicacy/tasks/main.yml | 6 +++--- roles/duplicati/tasks/main.yml | 6 +++--- roles/emby/molecule/default/verify.yml | 2 +- roles/emby/molecule/default/verify_stopped.yml | 2 +- roles/emby/tasks/main.yml | 6 +++--- roles/esphome/molecule/default/verify.yml | 2 +- roles/esphome/molecule/default/verify_stopped.yml | 2 +- roles/esphome/tasks/main.yml | 6 +++--- roles/firefly/molecule/default/verify.yml | 4 ++-- roles/firefly/molecule/default/verify_stopped.yml | 4 ++-- roles/firefly/tasks/main.yml | 10 +++++----- roles/freshrss/tasks/main.yml | 2 -- roles/get_iplayer/tasks/main.yml | 1 - roles/gitea/handlers/main.yml | 2 +- roles/gitea/tasks/main.yml | 8 +++----- roles/gitlab/tasks/main.yml | 7 +++---- roles/glances/tasks/main.yml | 1 - roles/gotify/tasks/main.yml | 1 - roles/guacamole/tasks/main.yml | 7 +++---- roles/heimdall/molecule/default/verify.yml | 2 +- roles/heimdall/molecule/default/verify_stopped.yml | 2 +- roles/heimdall/tasks/main.yml | 10 +++++----- roles/hello_world/molecule/default/verify.yml | 2 +- .../molecule/default/verify_stopped.yml | 2 +- roles/hello_world/tasks/main.yml | 6 +++--- roles/homeassistant/tasks/main.yml | 1 - roles/homebridge/tasks/main.yml | 1 - roles/jackett/tasks/main.yml | 1 - roles/jellyfin/tasks/main.yml | 1 - roles/joomla/tasks/main.yml | 2 -- roles/komga/molecule/default/verify.yml | 2 +- roles/komga/molecule/default/verify_stopped.yml | 2 +- roles/komga/tasks/main.yml | 1 - roles/krusader/molecule/default/verify.yml | 2 +- roles/krusader/molecule/default/verify_stopped.yml | 2 +- roles/krusader/tasks/main.yml | 1 - roles/lidarr/tasks/main.yml | 1 - roles/mealie/tasks/main.yml | 1 - roles/minecraft-server/tasks/main.yml | 1 - roles/minidlna/tasks/main.yml | 1 - roles/miniflux/tasks/main.yml | 2 -- roles/mosquitto/tasks/main.yml | 1 - roles/mumble/tasks/main.yml | 6 +++--- roles/mylar/tasks/main.yml | 1 - roles/mymediaforalexa/tasks/main.yml | 1 - roles/n8n/tasks/main.yml | 1 - roles/navidrome/tasks/main.yml | 1 - roles/netbootxyz/tasks/main.yml | 1 - roles/netdata/tasks/main.yml | 1 - roles/nextcloud/tasks/main.yml | 2 -- roles/nzbget/tasks/main.yml | 1 - roles/octoprint/tasks/main.yml | 1 - roles/ombi/tasks/main.yml | 1 - roles/openhab/tasks/main.yml | 1 - roles/organizr/tasks/main.yml | 1 - roles/overseerr/tasks/main.yml | 1 - roles/paperless_ng/tasks/main.yml | 1 - roles/piwigo/tasks/main.yml | 2 -- roles/plex/tasks/main.yml | 1 - roles/prowlarr/tasks/main.yml | 1 - roles/pyload/tasks/main.yml | 1 - roles/pytivo/tasks/main.yml | 1 - roles/radarr/tasks/main.yml | 1 - roles/route53_ddns/tasks/main.yml | 3 +-- roles/rssbridge/tasks/main.yml | 1 - roles/sabnzbd/tasks/main.yml | 1 - roles/sickchill/tasks/main.yml | 1 - roles/sonarr/tasks/main.yml | 1 - roles/speedtest-tracker/tasks/main.yml | 2 -- roles/stats/molecule/default/verify.yml | 10 +++++----- roles/stats/molecule/default/verify_stopped.yml | 10 +++++----- roles/stats/tasks/exporters.yml | 10 ++++------ roles/stats/tasks/grafana.yml | 1 - roles/stats/tasks/prometheus.yml | 1 - roles/stats/tasks/telegraf.yml | 1 - roles/syncthing/tasks/main.yml | 1 - roles/tautulli/tasks/main.yml | 1 - roles/thelounge/tasks/main.yml | 1 - roles/tiddlywiki/tasks/main.yml | 1 - roles/timemachine/tasks/main.yml | 1 - roles/traefik/tasks/main.yml | 1 - roles/transmission-with-openvpn/tasks/main.yml | 1 - roles/transmission/tasks/main.yml | 1 - roles/ubooquity/tasks/main.yml | 1 - roles/utorrent/tasks/main.yml | 1 - roles/virtual_desktop/tasks/main.yml | 1 - roles/wallabag/tasks/main.yml | 1 - roles/watchtower/tasks/main.yml | 1 - roles/wireshark/tasks/main.yml | 1 - roles/woodpecker-ci/tasks/main.yml | 2 -- roles/youtubedlmaterial/tasks/main.yml | 1 - roles/znc/tasks/main.yml | 1 - tests/molecule/resources/playbooks/prepare.yml | 2 +- 138 files changed, 166 insertions(+), 242 deletions(-) diff --git a/roles/airsonic/molecule/default/verify.yml b/roles/airsonic/molecule/default/verify.yml index 3e3a90227f..6cdcbbaa45 100644 --- a/roles/airsonic/molecule/default/verify.yml +++ b/roles/airsonic/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ airsonic_container_name }}" register: result diff --git a/roles/airsonic/molecule/default/verify_stopped.yml b/roles/airsonic/molecule/default/verify_stopped.yml index cb7a2285c7..5cdeaa20d3 100644 --- a/roles/airsonic/molecule/default/verify_stopped.yml +++ b/roles/airsonic/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Airsonic - docker_container: + community.docker.docker_container: name: "{{ airsonic_container_name }}" state: absent register: result diff --git a/roles/airsonic/tasks/main.yml b/roles/airsonic/tasks/main.yml index cb89902633..6d937b83c5 100644 --- a/roles/airsonic/tasks/main.yml +++ b/roles/airsonic/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Airsonic block: - name: Create Airsonic Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: @@ -10,7 +10,7 @@ - "{{ airsonic_data_directory }}/playlists" - name: Airsonic Docker Container - docker_container: + community.docker.docker_container: name: "{{ airsonic_container_name }}" image: airsonic/airsonic:latest pull: true @@ -35,7 +35,7 @@ - name: Stop Airsonic block: - name: Stop Airsonic - docker_container: + community.docker.docker_container: name: "{{ airsonic_container_name }}" state: absent when: airsonic_enabled is false diff --git a/roles/ansible-nas-docker/tasks/main.yml b/roles/ansible-nas-docker/tasks/main.yml index 5e64678ace..595a42666b 100644 --- a/roles/ansible-nas-docker/tasks/main.yml +++ b/roles/ansible-nas-docker/tasks/main.yml @@ -1,45 +1,45 @@ --- - name: Install python3-pip - apt: + ansible.builtin.apt: name: python3-pip state: present register: result until: result is succeeded - name: Remove docker-py python module - pip: + ansible.builtin.pip: name: docker-py state: absent register: result until: result is succeeded - name: Install docker python module - pip: + ansible.builtin.pip: name: docker state: present register: result until: result is succeeded - name: Create Docker home directory - file: + ansible.builtin.file: path: "{{ docker_home }}" mode: 0755 state: directory - name: Add user account to Docker group - user: + ansible.builtin.user: name: "{{ ansible_nas_user }}" groups: docker append: yes - name: Generate Docker daemon.json - copy: + ansible.builtin.copy: dest: /etc/docker/daemon.json content: "{{ docker_daemon_json | to_nice_json }}" register: docker_config - name: Restart Docker # noqa no-handler - service: + ansible.builtin.service: name: docker state: restarted when: docker_config.changed diff --git a/roles/ansible-nas-general/tasks/main.yml b/roles/ansible-nas-general/tasks/main.yml index e32d515d44..fa0e126e79 100644 --- a/roles/ansible-nas-general/tasks/main.yml +++ b/roles/ansible-nas-general/tasks/main.yml @@ -1,18 +1,18 @@ --- - name: Set login banner - copy: + ansible.builtin.copy: src: motd.txt dest: /etc/motd - name: Update apt-cache - apt: + ansible.builtin.apt: update_cache: yes cache_valid_time: 3600 register: result until: result is succeeded - name: Upgrade all packages # noqa package-latest - apt: + ansible.builtin.apt: upgrade: yes state: latest when: keep_packages_updated @@ -20,7 +20,7 @@ - skip_ansible_lint - name: Install some packages - apt: + ansible.builtin.apt: name: "{{ ansible_nas_extra_packages }}" state: present register: result @@ -29,15 +29,15 @@ # - name: Configure smartmontools - name: "Set hostname to {{ ansible_nas_hostname }}" - hostname: + ansible.builtin.hostname: name: "{{ ansible_nas_hostname }}" - name: "Set timezone to {{ ansible_nas_timezone }}" - timezone: + community.general.timezone: name: "{{ ansible_nas_timezone }}" - name: "Permission share directories" - file: + ansible.builtin.file: path: "{{ item.path }}" state: directory owner: ansible-nas diff --git a/roles/ansible-nas-users/tasks/main.yml b/roles/ansible-nas-users/tasks/main.yml index 0b06eba91d..b6037dd1f3 100644 --- a/roles/ansible-nas-users/tasks/main.yml +++ b/roles/ansible-nas-users/tasks/main.yml @@ -1,11 +1,11 @@ --- - name: Create ansible-nas group - group: + ansible.builtin.group: name: ansible-nas state: present - name: Create ansible-nas user - user: + ansible.builtin.user: name: ansible-nas state: present system: yes diff --git a/roles/bazarr/molecule/default/verify.yml b/roles/bazarr/molecule/default/verify.yml index dd9c38f667..b9aca222b5 100644 --- a/roles/bazarr/molecule/default/verify.yml +++ b/roles/bazarr/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ bazarr_container_name }}" register: result diff --git a/roles/bazarr/molecule/default/verify_stopped.yml b/roles/bazarr/molecule/default/verify_stopped.yml index cbba12938e..c20b735818 100644 --- a/roles/bazarr/molecule/default/verify_stopped.yml +++ b/roles/bazarr/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Bazarr - docker_container: + community.docker.docker_container: name: "{{ bazarr_container_name }}" state: absent register: result diff --git a/roles/bazarr/tasks/main.yml b/roles/bazarr/tasks/main.yml index 71d838c1e5..323eca3862 100644 --- a/roles/bazarr/tasks/main.yml +++ b/roles/bazarr/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Bazarr block: - name: Create Bazarr Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ bazarr_data_directory }}" - name: Bazarr - docker_container: + community.docker.docker_container: name: "{{ bazarr_container_name }}" image: linuxserver/bazarr pull: true @@ -37,7 +37,7 @@ - name: Stop Bazarr block: - name: Stop Bazarr - docker_container: + community.docker.docker_container: name: "{{ bazarr_container_name }}" state: absent when: bazarr_enabled is false diff --git a/roles/bitwarden/molecule/default/verify.yml b/roles/bitwarden/molecule/default/verify.yml index 8fd851865b..f1feae3872 100644 --- a/roles/bitwarden/molecule/default/verify.yml +++ b/roles/bitwarden/molecule/default/verify.yml @@ -7,12 +7,12 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ bitwarden_container_name }}" register: result - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ bitwarden_backup_container_name }}" register: result_backup diff --git a/roles/bitwarden/molecule/default/verify_stopped.yml b/roles/bitwarden/molecule/default/verify_stopped.yml index 5a0ebd112b..9a0cb7e9c9 100644 --- a/roles/bitwarden/molecule/default/verify_stopped.yml +++ b/roles/bitwarden/molecule/default/verify_stopped.yml @@ -7,13 +7,13 @@ file: ../../defaults/main.yml - name: Try and stop and remove Bitwarden - docker_container: + community.docker.docker_container: name: "{{ bitwarden_container_name }}" state: absent register: result - name: Try and stop and remove Bitwarden Backup - docker_container: + community.docker.docker_container: name: "{{ bitwarden_backup_container_name }}" state: absent register: result_backup diff --git a/roles/bitwarden/tasks/main.yml b/roles/bitwarden/tasks/main.yml index 3ad680bd09..ae2203d2be 100644 --- a/roles/bitwarden/tasks/main.yml +++ b/roles/bitwarden/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Bitwarden block: - name: Create Bitwarden Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory mode: "0755" @@ -10,7 +10,7 @@ - "{{ bitwarden_data_directory }}" - name: Bitwarden Docker Container - docker_container: + community.docker.docker_container: name: "{{ bitwarden_container_name }}" image: vaultwarden/server:latest pull: true @@ -45,7 +45,7 @@ restart_policy: unless-stopped - name: Bitwarden Backup Container - docker_container: + community.docker.docker_container: name: "{{ bitwarden_backup_container_name }}" image: bruceforce/bw_backup:latest pull: true @@ -57,12 +57,12 @@ - name: Stop Bitwarden block: - name: Stop Bitwarden - docker_container: + community.docker.docker_container: name: "{{ bitwarden_container_name }}" state: absent - name: Stop Bitwarden Backup - docker_container: + community.docker.docker_container: name: "{{ bitwarden_backup_container_name }}" state: absent when: bitwarden_enabled is false diff --git a/roles/booksonic/molecule/default/verify.yml b/roles/booksonic/molecule/default/verify.yml index 6fd1b5c9cc..e568748920 100644 --- a/roles/booksonic/molecule/default/verify.yml +++ b/roles/booksonic/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ booksonic_container_name }}" register: result diff --git a/roles/booksonic/molecule/default/verify_stopped.yml b/roles/booksonic/molecule/default/verify_stopped.yml index dc36dbaa3a..456e267196 100644 --- a/roles/booksonic/molecule/default/verify_stopped.yml +++ b/roles/booksonic/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Booksonic - docker_container: + community.docker.docker_container: name: "{{ booksonic_container_name }}" state: absent register: result diff --git a/roles/booksonic/tasks/main.yml b/roles/booksonic/tasks/main.yml index 34bf2b4dcf..a530678643 100644 --- a/roles/booksonic/tasks/main.yml +++ b/roles/booksonic/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Booksonic block: - name: Create Booksonic Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory mode: 0755 @@ -11,7 +11,7 @@ - "{{ booksonic_data_directory }}/playlists" - name: Booksonic Docker Container - docker_container: + community.docker.docker_container: name: "{{ booksonic_container_name }}" image: linuxserver/booksonic-air:latest pull: true @@ -40,7 +40,7 @@ - name: Stop Booksonic block: - name: Stop Booksonic - docker_container: + community.docker.docker_container: name: "{{ booksonic_container_name }}" state: absent when: booksonic_enabled is false diff --git a/roles/calibre/molecule/default/verify.yml b/roles/calibre/molecule/default/verify.yml index 654b5ead76..09b2dc5a41 100644 --- a/roles/calibre/molecule/default/verify.yml +++ b/roles/calibre/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ calibre_container_name }}" register: result diff --git a/roles/calibre/molecule/default/verify_stopped.yml b/roles/calibre/molecule/default/verify_stopped.yml index 3471141e5d..2aaedf44f8 100644 --- a/roles/calibre/molecule/default/verify_stopped.yml +++ b/roles/calibre/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Calibre - docker_container: + community.docker.docker_container: name: "{{ calibre_container_name }}" state: absent register: result diff --git a/roles/calibre/tasks/main.yml b/roles/calibre/tasks/main.yml index 0a98a5c4d0..24e2499d22 100644 --- a/roles/calibre/tasks/main.yml +++ b/roles/calibre/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Calibre block: - name: Create Calibre-web Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ calibre_data_directory }}/config" - name: Calibre-web Docker Container - docker_container: + community.docker.docker_container: name: "{{ calibre_container_name }}" image: linuxserver/calibre-web:latest pull: true @@ -37,7 +37,7 @@ - name: Stop Calibre block: - name: Stop Calibre - docker_container: + community.docker.docker_container: name: "{{ calibre_container_name }}" state: absent when: calibre_enabled is false diff --git a/roles/cloudcmd/molecule/default/verify.yml b/roles/cloudcmd/molecule/default/verify.yml index 45127370b5..10328844d8 100644 --- a/roles/cloudcmd/molecule/default/verify.yml +++ b/roles/cloudcmd/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ cloudcmd_container_name }}" register: result diff --git a/roles/cloudcmd/molecule/default/verify_stopped.yml b/roles/cloudcmd/molecule/default/verify_stopped.yml index f3a9be3478..0e1d6fc50b 100644 --- a/roles/cloudcmd/molecule/default/verify_stopped.yml +++ b/roles/cloudcmd/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Cloudcmd - docker_container: + community.docker.docker_container: name: "{{ cloudcmd_container_name }}" state: absent register: result diff --git a/roles/cloudcmd/tasks/main.yml b/roles/cloudcmd/tasks/main.yml index f2bbc9f7fa..2e61d45698 100644 --- a/roles/cloudcmd/tasks/main.yml +++ b/roles/cloudcmd/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Cloudcmd block: - name: Create Cloudcmd Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ cloudcmd_data_directory }}" - name: Create Cloudcmd Docker Container - docker_container: + community.docker.docker_container: name: "{{ cloudcmd_container_name }}" image: coderaiser/cloudcmd pull: true @@ -36,7 +36,7 @@ - name: Stop Cloudcmd block: - name: Stop Cloudcmd - docker_container: + community.docker.docker_container: name: "{{ cloudcmd_container_name }}" state: absent when: cloudcmd_enabled is false diff --git a/roles/cloudflare_ddns/molecule/default/verify.yml b/roles/cloudflare_ddns/molecule/default/verify.yml index 0a6cc0ce6a..68c4bf4e4a 100644 --- a/roles/cloudflare_ddns/molecule/default/verify.yml +++ b/roles/cloudflare_ddns/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ cloudflare_container_name }}" register: result diff --git a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml index acc32a5f73..2ee8430bec 100644 --- a/roles/cloudflare_ddns/molecule/default/verify_stopped.yml +++ b/roles/cloudflare_ddns/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Cloudflare DDNS - docker_container: + community.docker.docker_container: name: "{{ cloudflare_container_name }}" state: absent register: result diff --git a/roles/cloudflare_ddns/tasks/main.yml b/roles/cloudflare_ddns/tasks/main.yml index d400bb94a2..ad8a18a7e9 100644 --- a/roles/cloudflare_ddns/tasks/main.yml +++ b/roles/cloudflare_ddns/tasks/main.yml @@ -2,23 +2,23 @@ - name: Start Cloudflare DDNS block: - name: Check for deprecated API key - fail: + ansible.builtin.fail: msg: "Using a Cloudflare global API key is no longer supported. Please unset cloudflare_api_key and set cloudflare_token" when: cloudflare_api_key is defined - name: Create cloudflare Dynamic DNS Directories - file: + ansible.builtin.file: path: "{{ cloudflare_data_directory }}" state: directory - name: Template Cloudflare Dynamic DNS config.yml with scoped token - template: + ansible.builtin.template: src: config.yml dest: "{{ cloudflare_data_directory }}/config.yml" register: template_files_result - name: Cloudflare Dynamic DNS Container - docker_container: + community.docker.docker_container: name: "{{ cloudflare_container_name }}" image: joshava/cloudflare-ddns:latest pull: true @@ -32,7 +32,7 @@ - name: Stop Cloudflare DDNS block: - name: Stop Cloudflare DDNS - docker_container: + community.docker.docker_container: name: "{{ cloudflare_container_name }}" state: absent when: cloudflare_ddns_enabled is false diff --git a/roles/code-server/molecule/default/verify.yml b/roles/code-server/molecule/default/verify.yml index 91338114eb..c12f5b32a5 100644 --- a/roles/code-server/molecule/default/verify.yml +++ b/roles/code-server/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ code_server_container_name }}" register: result diff --git a/roles/code-server/molecule/default/verify_stopped.yml b/roles/code-server/molecule/default/verify_stopped.yml index 78f6f5d151..6565ad60a8 100644 --- a/roles/code-server/molecule/default/verify_stopped.yml +++ b/roles/code-server/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Code Server - docker_container: + community.docker.docker_container: name: "{{ code_server_container_name }}" state: absent register: result diff --git a/roles/code-server/tasks/main.yml b/roles/code-server/tasks/main.yml index f2cfbf4c7c..6db89f7948 100644 --- a/roles/code-server/tasks/main.yml +++ b/roles/code-server/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Code Server block: - name: Code Server Docker Container - docker_container: + community.docker.docker_container: name: "{{ code_server_container_name }}" image: linuxserver/code-server pull: true @@ -30,7 +30,7 @@ - name: Stop Code Server block: - name: Stop Code Server - docker_container: + community.docker.docker_container: name: "{{ code_server_container_name }}" state: absent when: code_server_enabled is false diff --git a/roles/couchpotato/molecule/default/verify.yml b/roles/couchpotato/molecule/default/verify.yml index 5594ee210c..da1d698cbb 100644 --- a/roles/couchpotato/molecule/default/verify.yml +++ b/roles/couchpotato/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ couchpotato_container_name }}" register: result diff --git a/roles/couchpotato/molecule/default/verify_stopped.yml b/roles/couchpotato/molecule/default/verify_stopped.yml index 75a59a4851..7d219707a7 100644 --- a/roles/couchpotato/molecule/default/verify_stopped.yml +++ b/roles/couchpotato/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Couchpotato - docker_container: + community.docker.docker_container: name: "{{ couchpotato_container_name }}" state: absent register: result diff --git a/roles/couchpotato/tasks/main.yml b/roles/couchpotato/tasks/main.yml index 11366552b9..07d30c9e67 100644 --- a/roles/couchpotato/tasks/main.yml +++ b/roles/couchpotato/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Couchpotato block: - name: Create Couchpotato Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory # mode: 0755 @@ -10,7 +10,7 @@ - "{{ docker_home }}/couchpotato/config" - name: Couchpotato Docker Container - docker_container: + community.docker.docker_container: name: "{{ couchpotato_container_name }}" image: linuxserver/couchpotato pull: true @@ -39,7 +39,7 @@ - name: Stop Couchpotato block: - name: Stop Couchpotato - docker_container: + community.docker.docker_container: name: "{{ couchpotato_container_name }}" state: absent when: couchpotato_enabled is false diff --git a/roles/dashy/molecule/default/verify.yml b/roles/dashy/molecule/default/verify.yml index 3201bc9256..0b251cc279 100644 --- a/roles/dashy/molecule/default/verify.yml +++ b/roles/dashy/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ dashy_container_name }}" register: result diff --git a/roles/dashy/molecule/default/verify_stopped.yml b/roles/dashy/molecule/default/verify_stopped.yml index bfbc698aa9..5ad6990397 100644 --- a/roles/dashy/molecule/default/verify_stopped.yml +++ b/roles/dashy/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Dashy - docker_container: + community.docker.docker_container: name: "{{ dashy_container_name }}" state: absent register: result diff --git a/roles/dashy/tasks/main.yml b/roles/dashy/tasks/main.yml index 2e6605ceb1..92ebe9ff01 100644 --- a/roles/dashy/tasks/main.yml +++ b/roles/dashy/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Dashy block: - name: Dashy Docker Container - docker_container: + community.docker.docker_container: name: "{{ dashy_container_name }}" image: lissy93/dashy:latest pull: true @@ -22,7 +22,7 @@ - name: Stop Dashy block: - name: Stop Dashy - docker_container: + community.docker.docker_container: name: "{{ dashy_container_name }}" state: absent when: dashy_enabled is false diff --git a/roles/deluge/molecule/default/verify.yml b/roles/deluge/molecule/default/verify.yml index 9044347b54..e97299ad5a 100644 --- a/roles/deluge/molecule/default/verify.yml +++ b/roles/deluge/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ deluge_container_name }}" register: result diff --git a/roles/deluge/molecule/default/verify_stopped.yml b/roles/deluge/molecule/default/verify_stopped.yml index c08fb34415..49132b931a 100644 --- a/roles/deluge/molecule/default/verify_stopped.yml +++ b/roles/deluge/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Deluge - docker_container: + community.docker.docker_container: name: "{{ deluge_container_name }}" state: absent register: result diff --git a/roles/deluge/tasks/main.yml b/roles/deluge/tasks/main.yml index 9c475d75a0..16cd3fa966 100644 --- a/roles/deluge/tasks/main.yml +++ b/roles/deluge/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Deluge block: - name: Create Deluge Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: @@ -10,7 +10,7 @@ - "{{ deluge_download_directory }}" - name: Deluge Docker Container - docker_container: + community.docker.docker_container: name: deluge image: linuxserver/deluge pull: true @@ -37,7 +37,7 @@ - name: Stop Deluge block: - name: Stop Deluge - docker_container: + community.docker.docker_container: name: "{{ deluge_container_name }}" state: absent when: deluge_enabled is false diff --git a/roles/dokuwiki/molecule/default/verify.yml b/roles/dokuwiki/molecule/default/verify.yml index 95a0e87e5b..aee6b5c0cf 100644 --- a/roles/dokuwiki/molecule/default/verify.yml +++ b/roles/dokuwiki/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ dokuwiki_container_name }}" register: result diff --git a/roles/dokuwiki/molecule/default/verify_stopped.yml b/roles/dokuwiki/molecule/default/verify_stopped.yml index 028bf4cc96..8892b1cd0e 100644 --- a/roles/dokuwiki/molecule/default/verify_stopped.yml +++ b/roles/dokuwiki/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Dokuwiki - docker_container: + community.docker.docker_container: name: "{{ dokuwiki_container_name }}" state: absent register: result diff --git a/roles/dokuwiki/tasks/main.yml b/roles/dokuwiki/tasks/main.yml index b0ba0546ef..c0a2c4a1bc 100644 --- a/roles/dokuwiki/tasks/main.yml +++ b/roles/dokuwiki/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Dokuwiki block: - name: Create DokuWiki Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ dokuwiki_data_directory }}/data" - name: DokuWiki Docker Container - docker_container: + community.docker.docker_container: name: "{{ dokuwiki_container_name }}" image: linuxserver/dokuwiki:latest pull: true @@ -35,7 +35,7 @@ - name: Stop Dokuwiki block: - name: Stop Dokuwiki - docker_container: + community.docker.docker_container: name: "{{ dokuwiki_container_name }}" state: absent when: dokuwiki_enabled is false diff --git a/roles/drone-ci/molecule/default/prepare.yml b/roles/drone-ci/molecule/default/prepare.yml index 343f1e6fb5..2ada4b0692 100644 --- a/roles/drone-ci/molecule/default/prepare.yml +++ b/roles/drone-ci/molecule/default/prepare.yml @@ -3,11 +3,11 @@ hosts: all tasks: - name: Install docker python module - pip: + ansible.builtin.pip: name: docker - name: Create a dummy gitea config directory - file: + ansible.builtin.file: path: "{{ item }}" state: directory recurse: yes @@ -15,6 +15,6 @@ - "{{ gitea_data_directory }}/gitea/gitea/conf" - name: Create a dummy gitea config file - file: + ansible.builtin.file: path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" state: touch diff --git a/roles/drone-ci/molecule/default/verify.yml b/roles/drone-ci/molecule/default/verify.yml index 0ec1dc522b..0c13fc172c 100644 --- a/roles/drone-ci/molecule/default/verify.yml +++ b/roles/drone-ci/molecule/default/verify.yml @@ -7,12 +7,12 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ drone_ci_container_name }}" register: result - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ drone_ci_runner_container_name }}" register: result_runner diff --git a/roles/drone-ci/molecule/default/verify_stopped.yml b/roles/drone-ci/molecule/default/verify_stopped.yml index 01b669e0ac..aa2ced5ee3 100644 --- a/roles/drone-ci/molecule/default/verify_stopped.yml +++ b/roles/drone-ci/molecule/default/verify_stopped.yml @@ -7,13 +7,13 @@ file: ../../defaults/main.yml - name: Try and stop and remove Drone CI - docker_container: + community.docker.docker_container: name: "{{ drone_ci_container_name }}" state: absent register: result - name: Try and stop and remove Drone CI runner - docker_container: + community.docker.docker_container: name: "{{ drone_ci_runner_container_name }}" state: absent register: result_runner diff --git a/roles/drone-ci/tasks/main.yml b/roles/drone-ci/tasks/main.yml index db36a55b68..f82c22080a 100644 --- a/roles/drone-ci/tasks/main.yml +++ b/roles/drone-ci/tasks/main.yml @@ -2,24 +2,24 @@ - name: Start Drone-CI block: - name: Check for Gitea installation - fail: + ansible.builtin.fail: msg: "Drone-CI requires Gitea enabled and running for authentication, please set that up first." when: gitea_enabled is false - name: Check for Gitea config - fail: + ansible.builtin.fail: msg: "Missing Gitea Oauth2 config! Read https://docs.drone.io/server/provider/gitea/ and set drone_ci_gitea_client_id and drone_ci_gitea_client_secret." when: drone_ci_gitea_client_id == "notset" - name: Create Drone-CI Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ drone_ci_data_directory }}" - name: Create Drone-CI container - docker_container: + community.docker.docker_container: name: "{{ drone_ci_container_name }}" image: drone/drone:2 pull: true @@ -47,7 +47,7 @@ traefik.http.services.drone_ci.loadbalancer.server.port: "80" - name: Create Drone-CI Runner container - docker_container: + community.docker.docker_container: name: "{{ drone_ci_runner_container_name }}" image: drone/drone-runner-docker:1 pull: true @@ -77,12 +77,12 @@ - name: Stop Drone-CI block: - name: Stop Drone-CI - docker_container: + community.docker.docker_container: name: "{{ drone_ci_container_name }}" state: absent - name: Stop Drone-CI Runner - docker_container: + community.docker.docker_container: name: "{{ drone_ci_runner_container_name }}" state: absent when: drone_ci_enabled is false diff --git a/roles/duplicacy/molecule/default/verify.yml b/roles/duplicacy/molecule/default/verify.yml index 8f56bc27b8..148cfc9f1d 100644 --- a/roles/duplicacy/molecule/default/verify.yml +++ b/roles/duplicacy/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ duplicacy_container_name }}" register: result diff --git a/roles/duplicacy/molecule/default/verify_stopped.yml b/roles/duplicacy/molecule/default/verify_stopped.yml index c538145519..f11c20d56c 100644 --- a/roles/duplicacy/molecule/default/verify_stopped.yml +++ b/roles/duplicacy/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Duplicacy - docker_container: + community.docker.docker_container: name: "{{ duplicacy_container_name }}" state: absent register: result diff --git a/roles/duplicacy/tasks/main.yml b/roles/duplicacy/tasks/main.yml index 832b2315d9..ec219f65ea 100644 --- a/roles/duplicacy/tasks/main.yml +++ b/roles/duplicacy/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Duplicacy block: - name: Create Duplicacy Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: @@ -11,7 +11,7 @@ - "{{ duplicacy_cache_directory }}" - name: Duplicacy Docker Container - docker_container: + community.docker.docker_container: name: "{{ duplicacy_container_name }}" image: saspus/duplicacy-web:mini hostname: "{{ duplicacy_hostname }}" @@ -42,7 +42,7 @@ - name: Stop Duplicacy block: - name: Stop Duplicacy - docker_container: + community.docker.docker_container: name: "{{ duplicacy_container_name }}" state: absent when: duplicacy_enabled is false diff --git a/roles/duplicati/tasks/main.yml b/roles/duplicati/tasks/main.yml index 4794f2e56b..4f61d74fe9 100644 --- a/roles/duplicati/tasks/main.yml +++ b/roles/duplicati/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Duplicati block: - name: Create Duplicati Directory - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ duplicati_data_directory }}" - name: Dupicati Docker Container - docker_container: + community.docker.docker_container: name: "{{ duplicati_container_name }}" image: linuxserver/duplicati pull: true @@ -38,7 +38,7 @@ - name: Stop Duplicati block: - name: Stop Duplicati - docker_container: + community.docker.docker_container: name: "{{ duplicati_container_name }}" state: absent when: duplicati_enabled is false diff --git a/roles/emby/molecule/default/verify.yml b/roles/emby/molecule/default/verify.yml index fff17b8ffc..8dc222fb8d 100644 --- a/roles/emby/molecule/default/verify.yml +++ b/roles/emby/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ emby_container_name }}" register: result diff --git a/roles/emby/molecule/default/verify_stopped.yml b/roles/emby/molecule/default/verify_stopped.yml index 9c8d319ce6..517d871746 100644 --- a/roles/emby/molecule/default/verify_stopped.yml +++ b/roles/emby/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Emby - docker_container: + community.docker.docker_container: name: "{{ emby_container_name }}" state: absent register: result diff --git a/roles/emby/tasks/main.yml b/roles/emby/tasks/main.yml index f7afc68163..117600c4fb 100644 --- a/roles/emby/tasks/main.yml +++ b/roles/emby/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Emby block: - name: Create Emby Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ emby_config_directory }}" - name: Emby Docker Container - docker_container: + community.docker.docker_container: name: "{{ emby_container_name }}" image: emby/embyserver pull: true @@ -38,7 +38,7 @@ - name: Stop Emby block: - name: Stop Emby - docker_container: + community.docker.docker_container: name: "{{ emby_container_name }}" state: absent when: emby_enabled is false diff --git a/roles/esphome/molecule/default/verify.yml b/roles/esphome/molecule/default/verify.yml index 5927d95abe..d1325baddd 100644 --- a/roles/esphome/molecule/default/verify.yml +++ b/roles/esphome/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ esphome_container_name }}" register: result diff --git a/roles/esphome/molecule/default/verify_stopped.yml b/roles/esphome/molecule/default/verify_stopped.yml index ba25030e55..2ca76b6d2f 100644 --- a/roles/esphome/molecule/default/verify_stopped.yml +++ b/roles/esphome/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove EspHome - docker_container: + community.docker.docker_container: name: "{{ esphome_container_name }}" state: absent register: result diff --git a/roles/esphome/tasks/main.yml b/roles/esphome/tasks/main.yml index 37c8871eb2..0efc17dbb2 100644 --- a/roles/esphome/tasks/main.yml +++ b/roles/esphome/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start EspHome block: - name: Create EspHome Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ esphome_data_directory }}/data" - name: EspHome Docker Container - docker_container: + community.docker.docker_container: name: "{{ esphome_container_name }}" image: esphome/esphome:latest pull: true @@ -36,7 +36,7 @@ - name: Stop EspHome block: - name: Stop EspHome - docker_container: + community.docker.docker_container: name: "{{ esphome_container_name }}" state: absent when: esphome_enabled is false diff --git a/roles/firefly/molecule/default/verify.yml b/roles/firefly/molecule/default/verify.yml index 0cbb1d1497..84660965cd 100644 --- a/roles/firefly/molecule/default/verify.yml +++ b/roles/firefly/molecule/default/verify.yml @@ -7,12 +7,12 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ firefly_container_name }}" register: result - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ firefly_mysql_container_name }}" register: result_mysql diff --git a/roles/firefly/molecule/default/verify_stopped.yml b/roles/firefly/molecule/default/verify_stopped.yml index 89eb2e2ab0..fbb2b83b9e 100644 --- a/roles/firefly/molecule/default/verify_stopped.yml +++ b/roles/firefly/molecule/default/verify_stopped.yml @@ -7,13 +7,13 @@ file: ../../defaults/main.yml - name: Try and stop and remove Firefly - docker_container: + community.docker.docker_container: name: "{{ firefly_container_name }}" state: absent register: result - name: Try and stop and remove Firefly MySql - docker_container: + community.docker.docker_container: name: "{{ firefly_mysql_container_name }}" state: absent register: result_mysql diff --git a/roles/firefly/tasks/main.yml b/roles/firefly/tasks/main.yml index 3384eb17f7..d3c5760399 100644 --- a/roles/firefly/tasks/main.yml +++ b/roles/firefly/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Firefly block: - name: Create Firefly III Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: @@ -11,7 +11,7 @@ - "{{ firefly_data_directory }}/export" - name: Create MySQL container for Firefly - docker_container: + community.docker.docker_container: name: "{{ firefly_mysql_container_name }}" image: mariadb:10.9 pull: true @@ -30,7 +30,7 @@ seconds: 30 - name: Create Firefly III container - docker_container: + community.docker.docker_container: name: "{{ firefly_container_name }}" image: fireflyiii/core:latest pull: true @@ -66,12 +66,12 @@ - name: Stop Firefly block: - name: Stop Firefly - docker_container: + community.docker.docker_container: name: "{{ firefly_container_name }}" state: absent - name: Stop Firefly MySQL - docker_container: + community.docker.docker_container: name: "{{ firefly_mysql_container_name }}" state: absent when: firefly_enabled is false diff --git a/roles/freshrss/tasks/main.yml b/roles/freshrss/tasks/main.yml index 74494d2cf6..07fcd873d9 100644 --- a/roles/freshrss/tasks/main.yml +++ b/roles/freshrss/tasks/main.yml @@ -11,7 +11,6 @@ - name: FreshRSS Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ freshrss_container_name }}" image: "{{ freshrss_image_name }}:{{ freshrss_image_version }}" pull: true @@ -34,7 +33,6 @@ traefik.http.services.freshrss.loadbalancer.server.port: "80" when: freshrss_enabled is true - - name: Stop FreshRSS block: - name: Stop FreshRSS diff --git a/roles/get_iplayer/tasks/main.yml b/roles/get_iplayer/tasks/main.yml index 4db0cb8f4d..96129aa96a 100644 --- a/roles/get_iplayer/tasks/main.yml +++ b/roles/get_iplayer/tasks/main.yml @@ -11,7 +11,6 @@ - name: Create get_iplayer Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ get_iplayer_container_name }}" image: "{{ get_iplayer_image_name }}:{{ get_iplayer_image_version }}" pull: true diff --git a/roles/gitea/handlers/main.yml b/roles/gitea/handlers/main.yml index 9901f9847f..c887893f6f 100644 --- a/roles/gitea/handlers/main.yml +++ b/roles/gitea/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Restart Gitea - docker_container: + community.docker.docker_container: name: "{{ gitea_container_name }}" restart: true listen: "restart gitea" diff --git a/roles/gitea/tasks/main.yml b/roles/gitea/tasks/main.yml index b7b554bd36..d04ce39edf 100644 --- a/roles/gitea/tasks/main.yml +++ b/roles/gitea/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Gitea block: - name: Create Gitea Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory recurse: yes @@ -16,7 +16,6 @@ - name: Create MySQL container for Gitea community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ gitea_mysql_container_name }}" image: "{{ gitea_mysql_image_name }}:{{ gitea_mysql_image_version }}" pull: true @@ -35,7 +34,6 @@ - name: Create Gitea container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ gitea_container_name }}" image: "{{ gitea_image_name }}:{{ gitea_image_version }}" pull: true @@ -73,12 +71,12 @@ - name: Stop Gitea block: - name: Stop Gitea - docker_container: + community.docker.docker_container: name: "{{ gitea_container_name }}" state: absent - name: Stop Gitea Mysql - docker_container: + community.docker.docker_container: name: "{{ gitea_mysql_container_name }}" state: absent when: gitea_enabled is false diff --git a/roles/gitlab/tasks/main.yml b/roles/gitlab/tasks/main.yml index 549da0b29a..7e3d5601e8 100644 --- a/roles/gitlab/tasks/main.yml +++ b/roles/gitlab/tasks/main.yml @@ -3,13 +3,13 @@ block: # The gitlab uid/gid matches 'git:git' in the Gitlab Docker image. - name: Create Gitlab group account - group: + ansible.builtin.group: name: gitlab gid: 998 state: present - name: Create Gitlab user account - user: + ansible.builtin.user: name: gitlab uid: 998 state: present @@ -19,7 +19,7 @@ group: gitlab - name: Create Gitlab Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory owner: gitlab @@ -31,7 +31,6 @@ - name: Create Gitlab Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ gitlab_container_name }}" image: "{{ gitlab_image_name }}:{{ gitlab_image_version }}" pull: true diff --git a/roles/glances/tasks/main.yml b/roles/glances/tasks/main.yml index a89a7f2431..de071743ab 100644 --- a/roles/glances/tasks/main.yml +++ b/roles/glances/tasks/main.yml @@ -3,7 +3,6 @@ block: - name: Create Glances Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ glances_container_name }}" image: "{{ glances_image_name }}:{{ glances_image_version }}" pull: true diff --git a/roles/gotify/tasks/main.yml b/roles/gotify/tasks/main.yml index ef6f33f890..b23c41a146 100644 --- a/roles/gotify/tasks/main.yml +++ b/roles/gotify/tasks/main.yml @@ -10,7 +10,6 @@ - name: Gotify Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ gotify_container_name }}" image: "{{ gotify_image_name }}:{{ gotify_image_version }}" pull: true diff --git a/roles/guacamole/tasks/main.yml b/roles/guacamole/tasks/main.yml index 5a3be0040b..efecea9520 100644 --- a/roles/guacamole/tasks/main.yml +++ b/roles/guacamole/tasks/main.yml @@ -9,19 +9,19 @@ - "{{ guacamole_data_directory }}/config" - name: Remove Old Guacamole Mysql Docker Container - docker_container: + community.docker.docker_container: name: guacamole-mysql state: absent keep_volumes: true - name: Remove Old Guacamole guacd Docker Container - docker_container: + community.docker.docker_container: name: guacamole-guacd state: absent keep_volumes: true - name: Remove old Guacamole directories - file: + ansible.builtin.file: path: "{{ item }}" state: absent with_items: @@ -29,7 +29,6 @@ - name: Guacamole Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ guacamole_container_name }}" image: "{{ guacamole_image_name }}:{{ guacamole_image_version }}" pull: true diff --git a/roles/heimdall/molecule/default/verify.yml b/roles/heimdall/molecule/default/verify.yml index 2aac9e046f..0d314f5783 100644 --- a/roles/heimdall/molecule/default/verify.yml +++ b/roles/heimdall/molecule/default/verify.yml @@ -9,7 +9,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ heimdall_container_name }}" register: result diff --git a/roles/heimdall/molecule/default/verify_stopped.yml b/roles/heimdall/molecule/default/verify_stopped.yml index 824d44e6c8..0891912a69 100644 --- a/roles/heimdall/molecule/default/verify_stopped.yml +++ b/roles/heimdall/molecule/default/verify_stopped.yml @@ -9,7 +9,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Heimdall - docker_container: + community.docker.docker_container: name: "{{ heimdall_container_name }}" state: absent register: result diff --git a/roles/heimdall/tasks/main.yml b/roles/heimdall/tasks/main.yml index 31d133910c..2cb56fcf95 100644 --- a/roles/heimdall/tasks/main.yml +++ b/roles/heimdall/tasks/main.yml @@ -2,13 +2,13 @@ - name: Start Heimdall block: - name: Create Heimdall group - group: + ansible.builtin.group: name: heimdall gid: "{{ heimdall_group_id }}" state: present - name: Create Heimdall user - user: + ansible.builtin.user: name: heimdall uid: "{{ heimdall_user_id }}" state: present @@ -18,7 +18,7 @@ group: heimdall - name: Create Heimdall Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory owner: heimdall @@ -27,7 +27,7 @@ - "{{ heimdall_data_directory }}" - name: Create Heimdall container - docker_container: + community.docker.docker_container: name: "{{ heimdall_container_name }}" image: "{{ heimdall_docker_image }}" pull: true @@ -54,7 +54,7 @@ - name: Stop Heimdall block: - name: Stop Heimdall - docker_container: + community.docker.docker_container: name: "{{ heimdall_container_name }}" state: absent when: heimdall_enabled is false diff --git a/roles/hello_world/molecule/default/verify.yml b/roles/hello_world/molecule/default/verify.yml index 25ac64dbd8..d04bdfec64 100644 --- a/roles/hello_world/molecule/default/verify.yml +++ b/roles/hello_world/molecule/default/verify.yml @@ -9,7 +9,7 @@ file: ../../defaults/main.yml - name: Get container state - docker_container_info: + community.docker.docker_container_info: name: "{{ hello_world_container_name }}" register: result diff --git a/roles/hello_world/molecule/default/verify_stopped.yml b/roles/hello_world/molecule/default/verify_stopped.yml index 1c93808142..8cec154d8f 100644 --- a/roles/hello_world/molecule/default/verify_stopped.yml +++ b/roles/hello_world/molecule/default/verify_stopped.yml @@ -9,7 +9,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove Hello World - docker_container: + community.docker.docker_container: name: "{{ hello_world_container_name }}" state: absent register: result diff --git a/roles/hello_world/tasks/main.yml b/roles/hello_world/tasks/main.yml index 7fbec768b7..7b1d8e3b1d 100644 --- a/roles/hello_world/tasks/main.yml +++ b/roles/hello_world/tasks/main.yml @@ -2,14 +2,14 @@ - name: Start Hello World block: - name: Create Hello World Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: - "{{ hello_world_data_directory }}" - name: Hello World Docker Container - docker_container: + community.docker.docker_container: name: "{{ hello_world_container_name }}" image: crccheck/hello-world pull: true @@ -31,7 +31,7 @@ - name: Stop Hello World block: - name: Stop Hello World - docker_container: + community.docker.docker_container: name: "{{ hello_world_container_name }}" state: absent when: hello_world_enabled is false diff --git a/roles/homeassistant/tasks/main.yml b/roles/homeassistant/tasks/main.yml index 0c1ee6039f..3ecccd87ed 100644 --- a/roles/homeassistant/tasks/main.yml +++ b/roles/homeassistant/tasks/main.yml @@ -10,7 +10,6 @@ - name: Home Assistant Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ homeassistant_container_name }}" image: "{{ homeassistant_image_name }}:{{ homeassistant_image_version }}" pull: true diff --git a/roles/homebridge/tasks/main.yml b/roles/homebridge/tasks/main.yml index 2ac79111e2..c5a4310418 100644 --- a/roles/homebridge/tasks/main.yml +++ b/roles/homebridge/tasks/main.yml @@ -11,7 +11,6 @@ - name: Create Homebridge Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ homebridge_container_name }}" image: "{{ homebridge_image_name }}:{{ homebridge_image_version }}" pull: true diff --git a/roles/jackett/tasks/main.yml b/roles/jackett/tasks/main.yml index bffc6121c7..6de20cfcda 100644 --- a/roles/jackett/tasks/main.yml +++ b/roles/jackett/tasks/main.yml @@ -10,7 +10,6 @@ - name: Jackett Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ jackett_container_name }}" image: "{{ jackett_image_name }}:{{ jackett_image_version }}" volumes: diff --git a/roles/jellyfin/tasks/main.yml b/roles/jellyfin/tasks/main.yml index 434b624b7d..a963026769 100644 --- a/roles/jellyfin/tasks/main.yml +++ b/roles/jellyfin/tasks/main.yml @@ -10,7 +10,6 @@ - name: Jellyfin Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ jellyfin_container_name }}" image: "{{ jellyfin_image_name }}:{{ jellyfin_image_version }}" pull: true diff --git a/roles/joomla/tasks/main.yml b/roles/joomla/tasks/main.yml index 2dbcfe8705..a1cd075178 100644 --- a/roles/joomla/tasks/main.yml +++ b/roles/joomla/tasks/main.yml @@ -15,7 +15,6 @@ - name: MySQL Docker Container for Joomla community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ joomla_db_container_name }}" image: "{{ joomla_db_image_name }}:{{ joomla_db_image_version }}" pull: true @@ -33,7 +32,6 @@ - name: Joomla Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ joomla_container_name }}" image: "{{ joomla_image_name }}:{{ joomla_image_version }}" pull: true diff --git a/roles/komga/molecule/default/verify.yml b/roles/komga/molecule/default/verify.yml index 9d6b75adb0..3c9dbab8ba 100644 --- a/roles/komga/molecule/default/verify.yml +++ b/roles/komga/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get komga container state - docker_container_info: + community.docker.docker_container_info: name: "{{ komga_container_name }}" register: result diff --git a/roles/komga/molecule/default/verify_stopped.yml b/roles/komga/molecule/default/verify_stopped.yml index 8ba8afcb2a..cd438afa29 100644 --- a/roles/komga/molecule/default/verify_stopped.yml +++ b/roles/komga/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove komga - docker_container: + community.docker.docker_container: name: "{{ komga_container_name }}" state: absent register: result diff --git a/roles/komga/tasks/main.yml b/roles/komga/tasks/main.yml index f5daa3b3d8..1c1ae34f2f 100644 --- a/roles/komga/tasks/main.yml +++ b/roles/komga/tasks/main.yml @@ -12,7 +12,6 @@ - name: Komga Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ komga_container_name }}" image: "{{ komga_image_name }}:{{ komga_image_version }}" pull: true diff --git a/roles/krusader/molecule/default/verify.yml b/roles/krusader/molecule/default/verify.yml index f84754224c..be88e72911 100644 --- a/roles/krusader/molecule/default/verify.yml +++ b/roles/krusader/molecule/default/verify.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Get krusader container state - docker_container_info: + community.docker.docker_container_info: name: "{{ krusader_container_name }}" register: result diff --git a/roles/krusader/molecule/default/verify_stopped.yml b/roles/krusader/molecule/default/verify_stopped.yml index 4530db47cd..8191c1a6ed 100644 --- a/roles/krusader/molecule/default/verify_stopped.yml +++ b/roles/krusader/molecule/default/verify_stopped.yml @@ -7,7 +7,7 @@ file: ../../defaults/main.yml - name: Try and stop and remove krusader - docker_container: + community.docker.docker_container: name: "{{ krusader_container_name }}" state: absent register: result diff --git a/roles/krusader/tasks/main.yml b/roles/krusader/tasks/main.yml index 36b1c5bd52..c9905959d3 100644 --- a/roles/krusader/tasks/main.yml +++ b/roles/krusader/tasks/main.yml @@ -10,7 +10,6 @@ - name: Krusader Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ krusader_container_name }}" image: "{{ krusader_image_name }}:{{ krusader_image_version }}" pull: true diff --git a/roles/lidarr/tasks/main.yml b/roles/lidarr/tasks/main.yml index abfdccb29f..c35517daf3 100644 --- a/roles/lidarr/tasks/main.yml +++ b/roles/lidarr/tasks/main.yml @@ -8,7 +8,6 @@ - name: Lidarr Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ lidarr_container_name }}" image: "{{ lidarr_image_name }}:{{ lidarr_image_version }}" pull: true diff --git a/roles/mealie/tasks/main.yml b/roles/mealie/tasks/main.yml index 7683d4f708..9e76e59ce3 100644 --- a/roles/mealie/tasks/main.yml +++ b/roles/mealie/tasks/main.yml @@ -10,7 +10,6 @@ - name: Mealie Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ mealie_container_name }}" image: "{{ mealie_image_name }}:{{ mealie_image_version }}" pull: true diff --git a/roles/minecraft-server/tasks/main.yml b/roles/minecraft-server/tasks/main.yml index a7be622801..bbee2f75ae 100644 --- a/roles/minecraft-server/tasks/main.yml +++ b/roles/minecraft-server/tasks/main.yml @@ -10,7 +10,6 @@ - name: Minecraft Server Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ minecraft_server_container_name }}" image: "{{ minecraft_server_image_name }}:{{ minecraft_server_image_version }}" pull: true diff --git a/roles/minidlna/tasks/main.yml b/roles/minidlna/tasks/main.yml index 513c9696ad..fd6f4cea94 100644 --- a/roles/minidlna/tasks/main.yml +++ b/roles/minidlna/tasks/main.yml @@ -3,7 +3,6 @@ block: - name: MiniDLNA Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ minidlna_container_name }}" image: "{{ minidlna_image_name }}:{{ minidlna_image_version }}" pull: true diff --git a/roles/miniflux/tasks/main.yml b/roles/miniflux/tasks/main.yml index f70b1c91b3..b97d467260 100644 --- a/roles/miniflux/tasks/main.yml +++ b/roles/miniflux/tasks/main.yml @@ -14,7 +14,6 @@ - name: Create Postgres for Miniflux community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ miniflux_db_container_name }}" image: "{{ miniflux_db_image_name }}:{{ miniflux_db_image_version }}" pull: true @@ -31,7 +30,6 @@ - name: Create Miniflux Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ miniflux_container_name }}" image: "{{ miniflux_image_name }}:{{ miniflux_image_version }}" pull: true diff --git a/roles/mosquitto/tasks/main.yml b/roles/mosquitto/tasks/main.yml index 9442184537..5411dc56e9 100644 --- a/roles/mosquitto/tasks/main.yml +++ b/roles/mosquitto/tasks/main.yml @@ -18,7 +18,6 @@ - name: Create Mosquitto container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ mosquitto_container_name }}" image: "{{ mosquitto_image_name }}:{{ mosquitto_image_version }}" pull: true diff --git a/roles/mumble/tasks/main.yml b/roles/mumble/tasks/main.yml index 1b9b197f06..ca203ec536 100644 --- a/roles/mumble/tasks/main.yml +++ b/roles/mumble/tasks/main.yml @@ -2,7 +2,7 @@ - name: Start Mumble block: - name: Create Mumble Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory # The mumble image gets uid/gid at build time, and uses 1000 for both, by default. @@ -13,7 +13,7 @@ - "{{ mumble_data_directory }}" - name: Create Mumble Docker Container - docker_container: + community.docker.docker_container: name: "{{ mumble_container_name }}" image: mumblevoip/mumble-server:latest pull: true @@ -37,7 +37,7 @@ - name: Stop Mumble block: - name: Stop Mumble - docker_container: + community.docker.docker_container: name: "{{ mumble_container_name }}" state: absent when: mumble_enabled is false diff --git a/roles/mylar/tasks/main.yml b/roles/mylar/tasks/main.yml index 16d4f97d52..41695a9acb 100644 --- a/roles/mylar/tasks/main.yml +++ b/roles/mylar/tasks/main.yml @@ -11,7 +11,6 @@ - name: Mylar Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ mylar_container_name }}" image: "{{ mylar_image_name }}:{{ mylar_image_version }}" pull: true diff --git a/roles/mymediaforalexa/tasks/main.yml b/roles/mymediaforalexa/tasks/main.yml index 540e6abaf0..6fb481de11 100644 --- a/roles/mymediaforalexa/tasks/main.yml +++ b/roles/mymediaforalexa/tasks/main.yml @@ -11,7 +11,6 @@ - name: Mymediaforalexa Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ mymediaforalexa_container_name }}" image: "{{ mymediaforalexa_image_name }}:{{ mymediaforalexa_image_version }}" pull: true diff --git a/roles/n8n/tasks/main.yml b/roles/n8n/tasks/main.yml index f2b59ca016..25060aaa26 100644 --- a/roles/n8n/tasks/main.yml +++ b/roles/n8n/tasks/main.yml @@ -10,7 +10,6 @@ - name: Create n8n Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ n8n_container_name }}" image: "{{ n8n_image_name }}:{{ n8n_image_version }}" pull: true diff --git a/roles/navidrome/tasks/main.yml b/roles/navidrome/tasks/main.yml index c4a8e92efb..c58cc4a586 100644 --- a/roles/navidrome/tasks/main.yml +++ b/roles/navidrome/tasks/main.yml @@ -12,7 +12,6 @@ - name: Navidrome Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ navidrome_container_name }}" image: "{{ navidrome_image_name }}:{{ navidrome_image_version }}" pull: true diff --git a/roles/netbootxyz/tasks/main.yml b/roles/netbootxyz/tasks/main.yml index e135ddb340..63b6af6585 100644 --- a/roles/netbootxyz/tasks/main.yml +++ b/roles/netbootxyz/tasks/main.yml @@ -11,7 +11,6 @@ - name: Netbootxyz Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ netbootxyz_container_name }}" image: "{{ netbootxyz_image_name }}:{{ netbootxyz_image_version }}" pull: true diff --git a/roles/netdata/tasks/main.yml b/roles/netdata/tasks/main.yml index d1e2063f95..f2cbbc353a 100644 --- a/roles/netdata/tasks/main.yml +++ b/roles/netdata/tasks/main.yml @@ -8,7 +8,6 @@ - name: Netdata Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ netdata_container_name }}" image: "{{ netdata_image_name }}:{{ netdata_image_version }}" hostname: "{{ ansible_nas_hostname }}.{{ ansible_nas_domain }}" diff --git a/roles/nextcloud/tasks/main.yml b/roles/nextcloud/tasks/main.yml index 5841354bd3..e96831a6ff 100644 --- a/roles/nextcloud/tasks/main.yml +++ b/roles/nextcloud/tasks/main.yml @@ -15,7 +15,6 @@ - name: Nextcloud Mysql Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ nextcloud_db_container_name }}" image: "{{ nextcloud_db_image_name }}:{{ nextcloud_db_image_version }}" networks: @@ -34,7 +33,6 @@ - name: Nextcloud Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ nextcloud_container_name }}" image: "{{ nextcloud_image_name }}:{{ nextcloud_image_version }}" networks: diff --git a/roles/nzbget/tasks/main.yml b/roles/nzbget/tasks/main.yml index 767ea62522..da95bba9a1 100644 --- a/roles/nzbget/tasks/main.yml +++ b/roles/nzbget/tasks/main.yml @@ -10,7 +10,6 @@ - name: NZBGet community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ nzbget_container_name }}" image: "{{ nzbget_image_name }}:{{ nzbget_image_version }}" pull: true diff --git a/roles/octoprint/tasks/main.yml b/roles/octoprint/tasks/main.yml index 77cf2b1630..5cc4b4e1b7 100644 --- a/roles/octoprint/tasks/main.yml +++ b/roles/octoprint/tasks/main.yml @@ -10,7 +10,6 @@ - name: Octoprint Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ octoprint_container_name }}" image: "{{ octoprint_image_name }}:{{ octoprint_image_version }}" pull: true diff --git a/roles/ombi/tasks/main.yml b/roles/ombi/tasks/main.yml index 140d2e42ab..95a330f753 100644 --- a/roles/ombi/tasks/main.yml +++ b/roles/ombi/tasks/main.yml @@ -8,7 +8,6 @@ - name: Ombi Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ ombi_container_name }}" image: "{{ ombi_image_name }}:{{ ombi_image_version }}" pull: true diff --git a/roles/openhab/tasks/main.yml b/roles/openhab/tasks/main.yml index ecfe75e40e..0887dbcf55 100644 --- a/roles/openhab/tasks/main.yml +++ b/roles/openhab/tasks/main.yml @@ -31,7 +31,6 @@ - name: Create openHAB container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ openhab_container_name }}" image: "{{ openhab_image_name }}:{{ openhab_image_version }}" pull: true diff --git a/roles/organizr/tasks/main.yml b/roles/organizr/tasks/main.yml index 9c1d97c564..f49ff1e896 100644 --- a/roles/organizr/tasks/main.yml +++ b/roles/organizr/tasks/main.yml @@ -10,7 +10,6 @@ - name: Create Organizr container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ organizr_container_name }}" image: "{{ organizr_image_name }}:{{ organizr_image_version }}" pull: true diff --git a/roles/overseerr/tasks/main.yml b/roles/overseerr/tasks/main.yml index 9af6f9424c..19722dcd35 100644 --- a/roles/overseerr/tasks/main.yml +++ b/roles/overseerr/tasks/main.yml @@ -11,7 +11,6 @@ - name: Overseerr community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ overseerr_container_name }}" image: "{{ overseerr_image_name }}:{{ overseerr_image_version }}" pull: true diff --git a/roles/paperless_ng/tasks/main.yml b/roles/paperless_ng/tasks/main.yml index bca48846a7..e48fd53675 100644 --- a/roles/paperless_ng/tasks/main.yml +++ b/roles/paperless_ng/tasks/main.yml @@ -20,7 +20,6 @@ - name: Create paperless_ng redis broker community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ paperless_ng_redis_container_name }}" image: "{{ paperless_ng_redis_image_name }}:{{ paperless_ng_redis_image_version }}" pull: true diff --git a/roles/piwigo/tasks/main.yml b/roles/piwigo/tasks/main.yml index 9c5dd0de63..8abdc3c9ec 100644 --- a/roles/piwigo/tasks/main.yml +++ b/roles/piwigo/tasks/main.yml @@ -16,7 +16,6 @@ - name: Create MySQL container for Piwigo community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ piwigo_db_container_name }}" image: "{{ piwigo_db_image_name }}:{{ piwigo_db_image_version }}" pull: true @@ -35,7 +34,6 @@ - name: Piwigo Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ piwigo_container_name }}" image: "{{ piwigo_image_name }}:{{ piwigo_image_version }}" pull: true diff --git a/roles/plex/tasks/main.yml b/roles/plex/tasks/main.yml index 7597d22ce6..515c880901 100644 --- a/roles/plex/tasks/main.yml +++ b/roles/plex/tasks/main.yml @@ -12,7 +12,6 @@ - name: Create Plex Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ plex_container_name }}" image: "{{ plex_image_name }}:{{ plex_image_version }}" pull: true diff --git a/roles/prowlarr/tasks/main.yml b/roles/prowlarr/tasks/main.yml index 7bc8726ebd..ae15b3725a 100644 --- a/roles/prowlarr/tasks/main.yml +++ b/roles/prowlarr/tasks/main.yml @@ -10,7 +10,6 @@ - name: Create Prowlarr Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ prowlarr_container_name }}" image: "{{ prowlarr_image_name }}:{{ prowlarr_image_version }}" pull: true diff --git a/roles/pyload/tasks/main.yml b/roles/pyload/tasks/main.yml index 79ea4e6c78..ac79df537a 100644 --- a/roles/pyload/tasks/main.yml +++ b/roles/pyload/tasks/main.yml @@ -12,7 +12,6 @@ - name: Create pyLoad Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ pyload_container_name }}" image: "{{ pyload_image_name }}:{{ pyload_image_version }}" pull: true diff --git a/roles/pytivo/tasks/main.yml b/roles/pytivo/tasks/main.yml index 2e74270ccf..a5edfbf84a 100644 --- a/roles/pytivo/tasks/main.yml +++ b/roles/pytivo/tasks/main.yml @@ -11,7 +11,6 @@ - name: Pytivo community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ pytivo_container_name }}" image: "{{ pytivo_image_name }}:{{ pytivo_image_version }}" pull: true diff --git a/roles/radarr/tasks/main.yml b/roles/radarr/tasks/main.yml index c13cdeaa44..ca4bc57952 100644 --- a/roles/radarr/tasks/main.yml +++ b/roles/radarr/tasks/main.yml @@ -10,7 +10,6 @@ - name: Radarr community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ radarr_container_name }}" image: "{{ radarr_image_name }}:{{ radarr_image_version }}" pull: true diff --git a/roles/route53_ddns/tasks/main.yml b/roles/route53_ddns/tasks/main.yml index df25e460fd..198420e8da 100644 --- a/roles/route53_ddns/tasks/main.yml +++ b/roles/route53_ddns/tasks/main.yml @@ -7,14 +7,13 @@ state: directory - name: Generate AWS Route53 Dynamic DNS config file - template: + ansible.builtin.template: src: config.yml dest: "{{ route53_data_directory }}/ddns-route53.yml" register: template_config - name: AWS Route53 Dynamic DNS Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ route53_container_name }}" image: "{{ route53_image_name }}:{{ route53_image_version }}" pull: true diff --git a/roles/rssbridge/tasks/main.yml b/roles/rssbridge/tasks/main.yml index 73b7e090cb..54e3b911de 100644 --- a/roles/rssbridge/tasks/main.yml +++ b/roles/rssbridge/tasks/main.yml @@ -11,7 +11,6 @@ - name: RSSBridge Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ rssbridge_container_name }}" image: "{{ rssbridge_image_name }}:{{ rssbridge_image_version }}" pull: true diff --git a/roles/sabnzbd/tasks/main.yml b/roles/sabnzbd/tasks/main.yml index 7e5241cd95..d2640007c6 100644 --- a/roles/sabnzbd/tasks/main.yml +++ b/roles/sabnzbd/tasks/main.yml @@ -10,7 +10,6 @@ - name: Sabnzbd community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ sabnzbd_container_name }}" image: "{{ sabnzbd_image_name }}:{{ sabnzbd_image_version }}" pull: true diff --git a/roles/sickchill/tasks/main.yml b/roles/sickchill/tasks/main.yml index f84dad76df..513e054276 100644 --- a/roles/sickchill/tasks/main.yml +++ b/roles/sickchill/tasks/main.yml @@ -11,7 +11,6 @@ - name: Sickchill Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ sickchill_container_name }}" image: "{{ sickchill_image_name }}:{{ sickchill_image_version }}" pull: true diff --git a/roles/sonarr/tasks/main.yml b/roles/sonarr/tasks/main.yml index 3e429e8b9a..92930ce762 100644 --- a/roles/sonarr/tasks/main.yml +++ b/roles/sonarr/tasks/main.yml @@ -10,7 +10,6 @@ - name: Sonarr community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ sonarr_container_name }}" image: "{{ sonarr_image_name }}:{{ sonarr_image_version }}" pull: true diff --git a/roles/speedtest-tracker/tasks/main.yml b/roles/speedtest-tracker/tasks/main.yml index bd1096a861..ddf453f472 100644 --- a/roles/speedtest-tracker/tasks/main.yml +++ b/roles/speedtest-tracker/tasks/main.yml @@ -10,14 +10,12 @@ - name: Remove old Speedtest-Tracker Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ speedtest_container_name }}" state: absent tags: molecule-idempotence-notest - name: Speedtest-Tracker Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ speedtest_container_name }}" image: "{{ speedtest_image_name }}:{{ speedtest_image_version }}" pull: true diff --git a/roles/stats/molecule/default/verify.yml b/roles/stats/molecule/default/verify.yml index bf70bf479e..bcb58984aa 100644 --- a/roles/stats/molecule/default/verify.yml +++ b/roles/stats/molecule/default/verify.yml @@ -7,27 +7,27 @@ file: ../../defaults/main.yml - name: Get Grafana container state - docker_container_info: + community.docker.docker_container_info: name: "{{ stats_grafana_container_name }}" register: result_grafana - name: Get Prometheus container state - docker_container_info: + community.docker.docker_container_info: name: "{{ stats_prometheus_container_name }}" register: result_prometheus - name: Get Telegraf container state - docker_container_info: + community.docker.docker_container_info: name: "{{ stats_telegraf_container_name }}" register: result_telegraf - name: Get Smartctl container state - docker_container_info: + community.docker.docker_container_info: name: "{{ stats_smartctl_container_name }}" register: result_smartctl - name: Get Speedtest container state - docker_container_info: + community.docker.docker_container_info: name: "{{ stats_speedtest_container_name }}" register: result_speedtest diff --git a/roles/stats/molecule/default/verify_stopped.yml b/roles/stats/molecule/default/verify_stopped.yml index d15e2867c1..3beaaab8a3 100644 --- a/roles/stats/molecule/default/verify_stopped.yml +++ b/roles/stats/molecule/default/verify_stopped.yml @@ -7,31 +7,31 @@ file: ../../defaults/main.yml - name: Try and stop and remove Grafana - docker_container: + community.docker.docker_container: name: "{{ stats_grafana_container_name }}" state: absent register: result_grafana - name: Try and stop and remove Prometheus - docker_container: + community.docker.docker_container: name: "{{ stats_prometheus_container_name }}" state: absent register: result_prometheus - name: Try and stop and remove Telegraf - docker_container: + community.docker.docker_container: name: "{{ stats_telegraf_container_name }}" state: absent register: result_telegraf - name: Try and stop and remove Smartctl - docker_container: + community.docker.docker_container: name: "{{ stats_smartctl_container_name }}" state: absent register: result_smartctl - name: Try and stop and remove Speedtest - docker_container: + community.docker.docker_container: name: "{{ stats_speedtest_container_name }}" state: absent register: result_speedtest diff --git a/roles/stats/tasks/exporters.yml b/roles/stats/tasks/exporters.yml index 9e3a3313ef..aa86760c01 100644 --- a/roles/stats/tasks/exporters.yml +++ b/roles/stats/tasks/exporters.yml @@ -2,10 +2,9 @@ - name: Start Exporters block: - name: Smartctl Exporter Docker Container - docker_container: + community.docker.docker_container: name: "{{ stats_smartctl_container_name }}" image: "{{ stats_smartctl_docker_image_name }}:{{ stats_smartctl_docker_image_version }}" - container_default_behavior: no_defaults pull: true privileged: true ports: @@ -14,10 +13,9 @@ memory: "{{ stats_prometheus_smartctl_memory }}" - name: Speedtest Exporter Docker Container - docker_container: + community.docker.docker_container: name: "{{ stats_speedtest_container_name }}" image: "{{ stats_speedtest_docker_image_name }}:{{ stats_speedtest_docker_image_version }}" - container_default_behavior: no_defaults pull: true ports: "{{ stats_speedtest_exporter_port }}:9798" @@ -29,11 +27,11 @@ - name: Stop Exporters block: - name: Stop Smartctl Exporter - docker_container: + community.docker.docker_container: name: "{{ stats_smartctl_container_name }}" state: absent - name: Stop Speedtest Exporter - docker_container: + community.docker.docker_container: name: "{{ stats_speedtest_container_name }}" state: absent when: stats_enabled is false diff --git a/roles/stats/tasks/grafana.yml b/roles/stats/tasks/grafana.yml index cb0a5492a6..f8fcbe1c0a 100644 --- a/roles/stats/tasks/grafana.yml +++ b/roles/stats/tasks/grafana.yml @@ -32,7 +32,6 @@ - name: Grafana Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ stats_grafana_container_name }}" image: "{{ stats_grafana_image_name }}:{{ stats_grafana_image_version }}" pull: true diff --git a/roles/stats/tasks/prometheus.yml b/roles/stats/tasks/prometheus.yml index daf69078ac..f3174751e2 100644 --- a/roles/stats/tasks/prometheus.yml +++ b/roles/stats/tasks/prometheus.yml @@ -26,7 +26,6 @@ - name: Prometheus Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ stats_prometheus_container_name }}" image: "{{ stats_prometheus_image_name }}:{{ stats_prometheus_image_version }}" pull: true diff --git a/roles/stats/tasks/telegraf.yml b/roles/stats/tasks/telegraf.yml index 7d0bc71610..c5aad76b04 100644 --- a/roles/stats/tasks/telegraf.yml +++ b/roles/stats/tasks/telegraf.yml @@ -21,7 +21,6 @@ - name: Telegraf Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ stats_telegraf_container_name }}" image: "{{ stats_telegraf_image_name }}:{{ stats_telegraf_image_version }}" pull: true diff --git a/roles/syncthing/tasks/main.yml b/roles/syncthing/tasks/main.yml index b3ce9c6c85..a9fc6f2bf1 100644 --- a/roles/syncthing/tasks/main.yml +++ b/roles/syncthing/tasks/main.yml @@ -10,7 +10,6 @@ - name: Syncthing Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ syncthing_container_name }}" image: "{{ syncthing_image_name }}:{{ syncthing_image_version }}" pull: true diff --git a/roles/tautulli/tasks/main.yml b/roles/tautulli/tasks/main.yml index 66e293f0f1..c24e4a62af 100644 --- a/roles/tautulli/tasks/main.yml +++ b/roles/tautulli/tasks/main.yml @@ -12,7 +12,6 @@ - name: Tautulli Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ tautulli_container_name }}" image: "{{ tautulli_image_name }}:{{ tautulli_image_version }}" pull: true diff --git a/roles/thelounge/tasks/main.yml b/roles/thelounge/tasks/main.yml index 3f32a4b9ad..fc51186af4 100644 --- a/roles/thelounge/tasks/main.yml +++ b/roles/thelounge/tasks/main.yml @@ -17,7 +17,6 @@ - name: The Lounge Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ thelounge_container_name }}" image: "{{ thelounge_image_name }}:{{ thelounge_image_version }}" pull: true diff --git a/roles/tiddlywiki/tasks/main.yml b/roles/tiddlywiki/tasks/main.yml index 4be056a57f..3bb40540f1 100644 --- a/roles/tiddlywiki/tasks/main.yml +++ b/roles/tiddlywiki/tasks/main.yml @@ -8,7 +8,6 @@ - name: Create Tiddlywiki Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ tiddlywiki_container_name }}" image: "{{ tiddlywiki_image_name }}:{{ tiddlywiki_image_version }}" ports: diff --git a/roles/timemachine/tasks/main.yml b/roles/timemachine/tasks/main.yml index a05bd01f2a..4ca6f0a8c0 100644 --- a/roles/timemachine/tasks/main.yml +++ b/roles/timemachine/tasks/main.yml @@ -8,7 +8,6 @@ - name: Time Machine Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ timemachine_container_name }}" image: "{{ timemachine_image_name }}:{{ timemachine_image_version }}" pull: true diff --git a/roles/traefik/tasks/main.yml b/roles/traefik/tasks/main.yml index bc06b97a33..91e170aae9 100644 --- a/roles/traefik/tasks/main.yml +++ b/roles/traefik/tasks/main.yml @@ -17,7 +17,6 @@ - name: Traefik Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ traefik_container_name }}" image: "{{ traefik_image_name }}:{{ traefik_image_version }}" pull: true diff --git a/roles/transmission-with-openvpn/tasks/main.yml b/roles/transmission-with-openvpn/tasks/main.yml index 6b9cd705a5..bf6fa2c096 100644 --- a/roles/transmission-with-openvpn/tasks/main.yml +++ b/roles/transmission-with-openvpn/tasks/main.yml @@ -13,7 +13,6 @@ - name: Transmission with VPN community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ transmission_openvpn_container_name }}" image: "{{ transmission_openvpn_image_name }}:{{ transmission_openvpn_image_version }}" pull: true diff --git a/roles/transmission/tasks/main.yml b/roles/transmission/tasks/main.yml index d85184216f..38992d5a16 100644 --- a/roles/transmission/tasks/main.yml +++ b/roles/transmission/tasks/main.yml @@ -13,7 +13,6 @@ - name: Transmission Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ transmission_container_name }}" image: "{{ transmission_image_name }}:{{ transmission_image_version }}" pull: true diff --git a/roles/ubooquity/tasks/main.yml b/roles/ubooquity/tasks/main.yml index 82309851bc..013be9edd5 100644 --- a/roles/ubooquity/tasks/main.yml +++ b/roles/ubooquity/tasks/main.yml @@ -10,7 +10,6 @@ - name: Ubooquity Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ ubooquity_container_name }}" image: "{{ ubooquity_image_name }}:{{ ubooquity_image_version }}" pull: true diff --git a/roles/utorrent/tasks/main.yml b/roles/utorrent/tasks/main.yml index 1a7c99e005..6da921c4dc 100644 --- a/roles/utorrent/tasks/main.yml +++ b/roles/utorrent/tasks/main.yml @@ -12,7 +12,6 @@ - name: Create uTorrent Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ utorrent_container_name }}" image: "{{ utorrent_image_name }}:{{ utorrent_image_version }}" pull: true diff --git a/roles/virtual_desktop/tasks/main.yml b/roles/virtual_desktop/tasks/main.yml index 90ccb1c251..21fcce21d6 100644 --- a/roles/virtual_desktop/tasks/main.yml +++ b/roles/virtual_desktop/tasks/main.yml @@ -16,7 +16,6 @@ - name: Virtual Desktop Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ virtual_desktop_container_name }}" image: "{{ virtual_desktop_image_name }}:{{ virtual_desktop_image_version }}" pull: true diff --git a/roles/wallabag/tasks/main.yml b/roles/wallabag/tasks/main.yml index a296c2c342..83070a47dd 100644 --- a/roles/wallabag/tasks/main.yml +++ b/roles/wallabag/tasks/main.yml @@ -14,7 +14,6 @@ - name: Wallabag Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ wallabag_container_name }}" image: "{{ wallabag_image_name }}:{{ wallabag_image_version }}" pull: true diff --git a/roles/watchtower/tasks/main.yml b/roles/watchtower/tasks/main.yml index 0e0212b15a..d80552be6a 100644 --- a/roles/watchtower/tasks/main.yml +++ b/roles/watchtower/tasks/main.yml @@ -3,7 +3,6 @@ block: - name: Watchtower Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ watchtower_container_name }}" image: "{{ watchtower_image_name }}:{{ watchtower_image_version }}" pull: true diff --git a/roles/wireshark/tasks/main.yml b/roles/wireshark/tasks/main.yml index e094a8e1da..ea151854f1 100644 --- a/roles/wireshark/tasks/main.yml +++ b/roles/wireshark/tasks/main.yml @@ -11,7 +11,6 @@ - name: Create Wireshark Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ wireshark_container_name }}" image: "{{ wireshark_image_name }}:{{ wireshark_image_version }}" pull: true diff --git a/roles/woodpecker-ci/tasks/main.yml b/roles/woodpecker-ci/tasks/main.yml index 9b0dbb86a1..89b6fd1dc2 100644 --- a/roles/woodpecker-ci/tasks/main.yml +++ b/roles/woodpecker-ci/tasks/main.yml @@ -20,7 +20,6 @@ - name: Create Woodpecker-CI container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ woodpecker_ci_container_name }}" image: "{{ woodpecker_ci_image_name }}:{{ woodpecker_ci_image_version }}" pull: true @@ -51,7 +50,6 @@ - name: Create Woodpecker-CI agent container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ woodpecker_ci_agent_container_name }}" image: "{{ woodpecker_ci_agent_image_name }}:{{ woodpecker_ci_agent_image_version }}" pull: true diff --git a/roles/youtubedlmaterial/tasks/main.yml b/roles/youtubedlmaterial/tasks/main.yml index 941838a0d7..e98a40c943 100644 --- a/roles/youtubedlmaterial/tasks/main.yml +++ b/roles/youtubedlmaterial/tasks/main.yml @@ -17,7 +17,6 @@ - name: Create Youtubedlmaterial Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ youtubedlmaterial_container_name }}" image: "{{ youtubedlmaterial_image_name }}:{{ youtubedlmaterial_image_version }}" pull: true diff --git a/roles/znc/tasks/main.yml b/roles/znc/tasks/main.yml index 08ccec03dd..10eef7e84d 100644 --- a/roles/znc/tasks/main.yml +++ b/roles/znc/tasks/main.yml @@ -18,7 +18,6 @@ - name: Create ZNC Docker Container community.docker.docker_container: - container_default_behavior: no_defaults name: "{{ znc_container_name }}" image: "{{ znc_image_name }}:{{ znc_image_version }}" pull: true diff --git a/tests/molecule/resources/playbooks/prepare.yml b/tests/molecule/resources/playbooks/prepare.yml index ba2469e445..a2613c4ed2 100644 --- a/tests/molecule/resources/playbooks/prepare.yml +++ b/tests/molecule/resources/playbooks/prepare.yml @@ -3,5 +3,5 @@ hosts: all tasks: - name: Install docker python module - pip: + ansible.builtin.pip: name: docker From a24c6a307f6c52e95416ca62f361c7783ddc9510 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Apr 2023 18:35:32 +0100 Subject: [PATCH 199/286] Add ansible.posix to requirements --- requirements.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.yml b/requirements.yml index a0a3fc1a30..094d3dd4d7 100644 --- a/requirements.yml +++ b/requirements.yml @@ -13,5 +13,6 @@ roles: version: 2.0.0 collections: + - name: ansible.posix - name: community.docker - name: community.general From 588576f4ddb36c95f9e634b5cb552da6cee85f6e Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 17 Apr 2023 22:59:32 +0100 Subject: [PATCH 200/286] Updates to ansible-lint config --- .ansible-lint | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.ansible-lint b/.ansible-lint index f20ec6c000..51961cb6d2 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -2,13 +2,11 @@ skip_list: - risky-file-permissions - role-name - - fqcn-builtins + - name[missing] exclude_paths: - roles/bertvv.samba - roles/geerlingguy.docker + - roles/geerlingguy.docker_arm - roles/geerlingguy.nfs -mock_modules: - - docker_container - - docker_container_info From a015186b6516ef9f6b0990e9609be340965e3c97 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 18 Apr 2023 21:58:54 +0100 Subject: [PATCH 201/286] More FQCNs and linting --- .ansible-lint | 3 +- nas.yml | 3 +- permission_data.yml | 31 ++++++++++--------- .../airsonic/molecule/default/side_effect.yml | 2 +- roles/bazarr/molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- .../calibre/molecule/default/side_effect.yml | 2 +- .../cloudcmd/molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- roles/dashy/molecule/default/side_effect.yml | 2 +- roles/deluge/molecule/default/side_effect.yml | 2 +- .../dokuwiki/molecule/default/side_effect.yml | 2 +- .../drone-ci/molecule/default/side_effect.yml | 2 +- roles/drone-ci/tasks/main.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- roles/emby/molecule/default/side_effect.yml | 2 +- .../esphome/molecule/default/side_effect.yml | 2 +- .../firefly/molecule/default/side_effect.yml | 2 +- roles/firefly/tasks/main.yml | 2 +- .../heimdall/molecule/default/side_effect.yml | 2 +- .../molecule/default/side_effect.yml | 2 +- roles/komga/molecule/default/side_effect.yml | 2 +- .../krusader/molecule/default/side_effect.yml | 2 +- .../defaults/main.yml | 2 +- roles/minecraft-bedrock-server/tasks/main.yml | 8 ++--- roles/nomad/handlers/main.yml | 2 +- roles/nomad/tasks/main.yml | 2 +- roles/stats/tasks/main.yml | 8 ++--- .../molecule/resources/playbooks/converge.yml | 2 +- 32 files changed, 55 insertions(+), 52 deletions(-) diff --git a/.ansible-lint b/.ansible-lint index 51961cb6d2..941f599fbc 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -3,10 +3,11 @@ skip_list: - risky-file-permissions - role-name - name[missing] + - key-order[task] + - name[template] exclude_paths: - roles/bertvv.samba - roles/geerlingguy.docker - roles/geerlingguy.docker_arm - roles/geerlingguy.nfs - diff --git a/nas.yml b/nas.yml index 4d30a93f98..781cf2a6ae 100644 --- a/nas.yml +++ b/nas.yml @@ -1,5 +1,6 @@ --- -- hosts: all +- name: Ansible-NAS + hosts: all roles: ### diff --git a/permission_data.yml b/permission_data.yml index 4f682b5939..d9019a0695 100644 --- a/permission_data.yml +++ b/permission_data.yml @@ -1,19 +1,20 @@ --- -- hosts: all +- name: Permission Data + hosts: all tasks: - - name: Warning! - debug: - msg: "This playbook will repermission ALL existing data in the shares defined in group_vars/all.yml to be owned by the ansible-nas user and group. If this is not what you want, exit now." + - name: Warning! + ansible.builtin.debug: + msg: "This playbook will repermission ALL existing data in the shares defined in group_vars/all.yml to be owned by the ansible-nas user and group. If this is not what you want, exit now." - - name: 20s to change your mind... - pause: - seconds: 20 + - name: 20s to change your mind... + ansible.builtin.pause: + seconds: 20 - - name: "Permission share data" - file: - path: "{{ item.path }}" - owner: ansible-nas - group: ansible-nas - mode: "u=rwX,g=rwX,o=rX" - recurse: true - loop: "{{ samba_shares }}" + - name: "Permission share data" + ansible.builtin.file: + path: "{{ item.path }}" + owner: ansible-nas + group: ansible-nas + mode: "u=rwX,g=rwX,o=rX" + recurse: true + loop: "{{ samba_shares }}" diff --git a/roles/airsonic/molecule/default/side_effect.yml b/roles/airsonic/molecule/default/side_effect.yml index 5f7e409e40..9621db2f15 100644 --- a/roles/airsonic/molecule/default/side_effect.yml +++ b/roles/airsonic/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: airsonic_enabled: false diff --git a/roles/bazarr/molecule/default/side_effect.yml b/roles/bazarr/molecule/default/side_effect.yml index de729e02cb..90808bc786 100644 --- a/roles/bazarr/molecule/default/side_effect.yml +++ b/roles/bazarr/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: bazarr_enabled: false diff --git a/roles/bitwarden/molecule/default/side_effect.yml b/roles/bitwarden/molecule/default/side_effect.yml index 9d5716db66..fb857c4cc4 100644 --- a/roles/bitwarden/molecule/default/side_effect.yml +++ b/roles/bitwarden/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: bitwarden_enabled: false diff --git a/roles/booksonic/molecule/default/side_effect.yml b/roles/booksonic/molecule/default/side_effect.yml index d5621f450b..6bd7170d78 100644 --- a/roles/booksonic/molecule/default/side_effect.yml +++ b/roles/booksonic/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: booksonic_enabled: false diff --git a/roles/calibre/molecule/default/side_effect.yml b/roles/calibre/molecule/default/side_effect.yml index 3c802a9d02..b1d9533ca1 100644 --- a/roles/calibre/molecule/default/side_effect.yml +++ b/roles/calibre/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: calibre_enabled: false diff --git a/roles/cloudcmd/molecule/default/side_effect.yml b/roles/cloudcmd/molecule/default/side_effect.yml index a8be3526e6..b31227b121 100644 --- a/roles/cloudcmd/molecule/default/side_effect.yml +++ b/roles/cloudcmd/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: cloudcmd_enabled: false diff --git a/roles/cloudflare_ddns/molecule/default/side_effect.yml b/roles/cloudflare_ddns/molecule/default/side_effect.yml index a43eaa62c7..97dca8f109 100644 --- a/roles/cloudflare_ddns/molecule/default/side_effect.yml +++ b/roles/cloudflare_ddns/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: cloudflare_ddns_enabled: false diff --git a/roles/code-server/molecule/default/side_effect.yml b/roles/code-server/molecule/default/side_effect.yml index 788fea61bf..b36cc8e60a 100644 --- a/roles/code-server/molecule/default/side_effect.yml +++ b/roles/code-server/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: code_server_enabled: false diff --git a/roles/couchpotato/molecule/default/side_effect.yml b/roles/couchpotato/molecule/default/side_effect.yml index 462d24100d..71b06eb853 100644 --- a/roles/couchpotato/molecule/default/side_effect.yml +++ b/roles/couchpotato/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: couchpotato_enabled: false diff --git a/roles/dashy/molecule/default/side_effect.yml b/roles/dashy/molecule/default/side_effect.yml index de8025c38c..e093850662 100644 --- a/roles/dashy/molecule/default/side_effect.yml +++ b/roles/dashy/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: dashy_enabled: false diff --git a/roles/deluge/molecule/default/side_effect.yml b/roles/deluge/molecule/default/side_effect.yml index 7a856d78b3..55d7c1f1cd 100644 --- a/roles/deluge/molecule/default/side_effect.yml +++ b/roles/deluge/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: deluge_enabled: false diff --git a/roles/dokuwiki/molecule/default/side_effect.yml b/roles/dokuwiki/molecule/default/side_effect.yml index d161636ca3..4754feb0ab 100644 --- a/roles/dokuwiki/molecule/default/side_effect.yml +++ b/roles/dokuwiki/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: dokuwiki_enabled: false diff --git a/roles/drone-ci/molecule/default/side_effect.yml b/roles/drone-ci/molecule/default/side_effect.yml index 1adfbc19f8..baa4393973 100644 --- a/roles/drone-ci/molecule/default/side_effect.yml +++ b/roles/drone-ci/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: drone_ci_enabled: false diff --git a/roles/drone-ci/tasks/main.yml b/roles/drone-ci/tasks/main.yml index f82c22080a..f80bcf62b2 100644 --- a/roles/drone-ci/tasks/main.yml +++ b/roles/drone-ci/tasks/main.yml @@ -65,7 +65,7 @@ memory: "{{ drone_ci_agent_memory }}" - name: Add webhook allowed hosts to Gitea - blockinfile: + ansible.builtin.blockinfile: path: "{{ gitea_data_directory }}/gitea/gitea/conf/app.ini" block: | [webhook] diff --git a/roles/duplicacy/molecule/default/side_effect.yml b/roles/duplicacy/molecule/default/side_effect.yml index c29bfa3632..b4665174d9 100644 --- a/roles/duplicacy/molecule/default/side_effect.yml +++ b/roles/duplicacy/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: duplicacy_enabled: false diff --git a/roles/emby/molecule/default/side_effect.yml b/roles/emby/molecule/default/side_effect.yml index a45266bda6..070460a1ae 100644 --- a/roles/emby/molecule/default/side_effect.yml +++ b/roles/emby/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: emby_enabled: false diff --git a/roles/esphome/molecule/default/side_effect.yml b/roles/esphome/molecule/default/side_effect.yml index 4dd8c64a35..84811ddc64 100644 --- a/roles/esphome/molecule/default/side_effect.yml +++ b/roles/esphome/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: esphome_enabled: false diff --git a/roles/firefly/molecule/default/side_effect.yml b/roles/firefly/molecule/default/side_effect.yml index 4071c141ec..363450f71a 100644 --- a/roles/firefly/molecule/default/side_effect.yml +++ b/roles/firefly/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: firefly_enabled: false diff --git a/roles/firefly/tasks/main.yml b/roles/firefly/tasks/main.yml index d3c5760399..6fae384fc7 100644 --- a/roles/firefly/tasks/main.yml +++ b/roles/firefly/tasks/main.yml @@ -26,7 +26,7 @@ memory: "{{ firefly_mysql_memory }}" - name: Wait for MySQL to init - pause: + ansible.builtin.pause: seconds: 30 - name: Create Firefly III container diff --git a/roles/heimdall/molecule/default/side_effect.yml b/roles/heimdall/molecule/default/side_effect.yml index 3677a4db24..110d0f214e 100644 --- a/roles/heimdall/molecule/default/side_effect.yml +++ b/roles/heimdall/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: heimdall_enabled: false diff --git a/roles/hello_world/molecule/default/side_effect.yml b/roles/hello_world/molecule/default/side_effect.yml index 1809f50827..18367f7c9f 100644 --- a/roles/hello_world/molecule/default/side_effect.yml +++ b/roles/hello_world/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: hello_world_enabled: false diff --git a/roles/komga/molecule/default/side_effect.yml b/roles/komga/molecule/default/side_effect.yml index f923232d2c..76987bf4f5 100644 --- a/roles/komga/molecule/default/side_effect.yml +++ b/roles/komga/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: komga_enabled: false diff --git a/roles/krusader/molecule/default/side_effect.yml b/roles/krusader/molecule/default/side_effect.yml index 5f5a9c030d..14de15af98 100644 --- a/roles/krusader/molecule/default/side_effect.yml +++ b/roles/krusader/molecule/default/side_effect.yml @@ -4,7 +4,7 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" vars: krusader_enabled: false diff --git a/roles/minecraft-bedrock-server/defaults/main.yml b/roles/minecraft-bedrock-server/defaults/main.yml index 437178ef5a..e1ebbe9b54 100644 --- a/roles/minecraft-bedrock-server/defaults/main.yml +++ b/roles/minecraft-bedrock-server/defaults/main.yml @@ -14,4 +14,4 @@ minecraft_bedrock_server_container_name: minecraft-bedrock-server minecraft_bedrock_server_name: "Ansible-NAS Minecraft Server" minecraft_bedrock_server_game_mode: "creative" minecraft_bedrock_server_difficulty: "normal" -minecraft_bedrock_server_online_mode: "false" \ No newline at end of file +minecraft_bedrock_server_online_mode: "false" diff --git a/roles/minecraft-bedrock-server/tasks/main.yml b/roles/minecraft-bedrock-server/tasks/main.yml index 6603483157..779311cd4c 100644 --- a/roles/minecraft-bedrock-server/tasks/main.yml +++ b/roles/minecraft-bedrock-server/tasks/main.yml @@ -1,6 +1,6 @@ --- - name: Create Minecraft Bedrock Server Directories - file: + ansible.builtin.file: path: "{{ item }}" state: directory with_items: @@ -9,7 +9,7 @@ - name: Start Minecraft Bedrock Server block: - name: Minecraft Bedrock Server Docker Container - docker_container: + community.docker.docker_container: name: "{{ minecraft_bedrock_server_container_name }}" image: itzg/minecraft-bedrock-server pull: true @@ -29,7 +29,7 @@ - name: Stop Minecraft Bedrock Server block: - name: Stop Minecraft Bedrock Server - docker_container: + community.docker.docker_container: name: "{{ minecraft_bedrock_server_container_name }}" state: absent - when: minecraft_bedrock_server_enabled is false \ No newline at end of file + when: minecraft_bedrock_server_enabled is false diff --git a/roles/nomad/handlers/main.yml b/roles/nomad/handlers/main.yml index 88b8c54960..15c21979ad 100644 --- a/roles/nomad/handlers/main.yml +++ b/roles/nomad/handlers/main.yml @@ -1,6 +1,6 @@ --- - name: Restart Nomad - systemd: + ansible.builtin.systemd: state: restarted name: "{{ nomad_service_name }}" listen: "restart nomad" diff --git a/roles/nomad/tasks/main.yml b/roles/nomad/tasks/main.yml index 2b19bf722f..91426c610e 100644 --- a/roles/nomad/tasks/main.yml +++ b/roles/nomad/tasks/main.yml @@ -35,7 +35,7 @@ - name: Stop Nomad block: - name: Check if Nomad is installed - stat: + ansible.builtin.stat: path: /usr/bin/nomad register: nomad_install diff --git a/roles/stats/tasks/main.yml b/roles/stats/tasks/main.yml index 91e535dec9..1de477f0bf 100644 --- a/roles/stats/tasks/main.yml +++ b/roles/stats/tasks/main.yml @@ -1,5 +1,5 @@ --- -- import_tasks: prometheus.yml -- import_tasks: telegraf.yml -- import_tasks: exporters.yml -- import_tasks: grafana.yml +- ansible.builtin.import_tasks: prometheus.yml +- ansible.builtin.import_tasks: telegraf.yml +- ansible.builtin.import_tasks: exporters.yml +- ansible.builtin.import_tasks: grafana.yml diff --git a/tests/molecule/resources/playbooks/converge.yml b/tests/molecule/resources/playbooks/converge.yml index 0f30720677..10d888f068 100644 --- a/tests/molecule/resources/playbooks/converge.yml +++ b/tests/molecule/resources/playbooks/converge.yml @@ -4,5 +4,5 @@ become: true tasks: - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" - include_role: + ansible.builtin.include_role: name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" From f6b76424f16ac568745eba9a6e10b92741245178 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Tue, 18 Apr 2023 23:04:49 +0100 Subject: [PATCH 202/286] Updating linting versions --- .github/workflows/ci.yml | 2 +- .pre-commit-config.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7e819a7388..7d0f7e8404 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: python-version: "3.x" - name: Install test dependencies - run: pip3 install ansible yamllint==1.27.1 ansible-lint==6.14.6 + run: pip3 install ansible yamllint==1.30.0 ansible-lint==6.14.6 - name: Ansible-lint run: ansible-lint nas.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d366947326..a4a640a8ed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ repos: hooks: - id: ansible-lint - repo: https://github.com/adrienverge/yamllint.git - rev: v1.27.1 + rev: v1.30.0 hooks: - id: yamllint - repo: https://github.com/igorshubovych/markdownlint-cli From eae3cf55f4afe3e10369c98ab0b0dd493194a702 Mon Sep 17 00:00:00 2001 From: Tim Simpson Date: Sun, 9 Jul 2023 15:10:58 -0500 Subject: [PATCH 203/286] changes the port used inside gitea container to 22 This updates the gitea container so it uses port 22 for SSH instead of `{{ gitea_port_ssh }}`. This seems to be correct as this port is forwarded using `"{{ gitea_port_ssh }}:22"`, so it follows `SSH_PORT` should be hard-set to 22 as well. --- roles/gitea/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/gitea/tasks/main.yml b/roles/gitea/tasks/main.yml index d04ce39edf..9dead7e2bc 100644 --- a/roles/gitea/tasks/main.yml +++ b/roles/gitea/tasks/main.yml @@ -53,7 +53,7 @@ DB_PASSWD: "gitea" RUN_MODE: "prod" SSH_DOMAIN: "{{ ansible_nas_hostname }}" - SSH_PORT: "{{ gitea_port_ssh }}" + SSH_PORT: "22" ROOT_URL: "http://{{ gitea_hostname }}:{{ gitea_port_http }}/" USER_UID: "1000" USER_GID: "1000" From c4dccb47f09ed8003a9ca83bebbb706462c818c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jul 2023 07:56:16 +0000 Subject: [PATCH 204/286] Bump semver from 5.7.1 to 5.7.2 in /website Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2) --- updated-dependencies: - dependency-name: semver dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/package-lock.json | 144 +++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index 4c1bab13fe..18860b827f 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -230,9 +230,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -304,9 +304,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -363,9 +363,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1616,9 +1616,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1828,9 +1828,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2707,9 +2707,9 @@ } }, "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -3878,9 +3878,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -7566,9 +7566,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -8193,9 +8193,9 @@ } }, "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -9768,9 +9768,9 @@ } }, "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -10205,9 +10205,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10230,9 +10230,9 @@ } }, "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -12548,9 +12548,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -12605,9 +12605,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -12648,9 +12648,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -13461,9 +13461,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -13618,9 +13618,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -14284,9 +14284,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -15189,9 +15189,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -17833,9 +17833,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -18267,9 +18267,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -19374,9 +19374,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "source-map": { "version": "0.5.7", @@ -19689,9 +19689,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } @@ -19705,9 +19705,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, From bf4d7f9cb48b25544df2922e7794097668839e8c Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Jul 2023 19:05:37 +0100 Subject: [PATCH 205/286] Add Minio --- README.md | 1 + nas.yml | 4 ++ roles/minio/defaults/main.yml | 25 +++++++++++ roles/minio/molecule/default/molecule.yml | 6 +++ roles/minio/molecule/default/side_effect.yml | 10 +++++ roles/minio/molecule/default/verify.yml | 18 ++++++++ .../minio/molecule/default/verify_stopped.yml | 18 ++++++++ roles/minio/tasks/main.yml | 42 +++++++++++++++++++ .../docs/applications/system-tools/minio.md | 15 +++++++ 9 files changed, 139 insertions(+) create mode 100644 roles/minio/defaults/main.yml create mode 100644 roles/minio/molecule/default/molecule.yml create mode 100644 roles/minio/molecule/default/side_effect.yml create mode 100644 roles/minio/molecule/default/verify.yml create mode 100644 roles/minio/molecule/default/verify_stopped.yml create mode 100644 roles/minio/tasks/main.yml create mode 100644 website/docs/applications/system-tools/minio.md diff --git a/README.md b/README.md index 0475e8374f..2f20f4f3cc 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ If you have a spare domain name you can configure applications to be accessible * [Minecraft Server](https://www.minecraft.net/) - Server edition of the popular building and exploring game * [MiniDLNA](https://sourceforge.net/projects/minidlna/) - simple media server which is fully compliant with DLNA/UPnP-AV clients * [Miniflux](https://miniflux.app/) - An RSS news reader +* [Minio](https://min.io/) - MinIO is a high-performance, S3 compatible object store * [Mosquitto](https://mosquitto.org) - An open source MQTT broker * [Mumble](https://www.mumble.info) - Open source, low latency, high quality voice chat * [Mylar](https://github.com/evilhero/mylar) - An automated Comic Book downloader (cbr/cbz) for use with SABnzbd, NZBGet and torrents diff --git a/nas.yml b/nas.yml index 781cf2a6ae..2871de2552 100644 --- a/nas.yml +++ b/nas.yml @@ -209,6 +209,10 @@ tags: - miniflux + - role: minio + tags: + - minio + - role: mosquitto tags: - mosquitto diff --git a/roles/minio/defaults/main.yml b/roles/minio/defaults/main.yml new file mode 100644 index 0000000000..7b6b431c88 --- /dev/null +++ b/roles/minio/defaults/main.yml @@ -0,0 +1,25 @@ +--- +# enable or disable the application +minio_enabled: false +minio_available_externally: false + +# directories +minio_data_directory: "{{ docker_home }}/minio" + +# env +minio_admin_username: admin +minio_admin_password: supersecure + +# network +minio_hostname: "minio" +minio_network_name: "minio" +minio_api_port: "9000" +minio_console_port: "9009" + +# docker +minio_container_name: "minio" +minio_image_name: "minio/minio" +minio_image_version: "latest" + +# specs +minio_memory: "1g" diff --git a/roles/minio/molecule/default/molecule.yml b/roles/minio/molecule/default/molecule.yml new file mode 100644 index 0000000000..f5f9948b35 --- /dev/null +++ b/roles/minio/molecule/default/molecule.yml @@ -0,0 +1,6 @@ +--- +provisioner: + inventory: + group_vars: + all: + minio_enabled: true diff --git a/roles/minio/molecule/default/side_effect.yml b/roles/minio/molecule/default/side_effect.yml new file mode 100644 index 0000000000..ff139034bc --- /dev/null +++ b/roles/minio/molecule/default/side_effect.yml @@ -0,0 +1,10 @@ +--- +- name: Stop + hosts: all + become: true + tasks: + - name: "Include {{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }} role" + ansible.builtin.include_role: + name: "{{ lookup('env', 'MOLECULE_PROJECT_DIRECTORY') | basename }}" + vars: + minio_enabled: false diff --git a/roles/minio/molecule/default/verify.yml b/roles/minio/molecule/default/verify.yml new file mode 100644 index 0000000000..a36b8ce8bc --- /dev/null +++ b/roles/minio/molecule/default/verify.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Get minio container state + community.docker.docker_container: + name: "{{ minio_container_name }}" + register: result + + - name: Check if minio containers are running + ansible.builtin.assert: + that: + - result.container['State']['Status'] == "running" + - result.container['State']['Restarting'] == false diff --git a/roles/minio/molecule/default/verify_stopped.yml b/roles/minio/molecule/default/verify_stopped.yml new file mode 100644 index 0000000000..5f108779ec --- /dev/null +++ b/roles/minio/molecule/default/verify_stopped.yml @@ -0,0 +1,18 @@ +--- +- name: Verify + hosts: all + gather_facts: false + tasks: + - ansible.builtin.include_vars: + file: ../../defaults/main.yml + + - name: Try and stop and remove minio + community.docker.docker_container: + name: "{{ minio_container_name }}" + state: absent + register: result + + - name: Check if minio is stopped + ansible.builtin.assert: + that: + - not result.changed diff --git a/roles/minio/tasks/main.yml b/roles/minio/tasks/main.yml new file mode 100644 index 0000000000..c06a2d7f43 --- /dev/null +++ b/roles/minio/tasks/main.yml @@ -0,0 +1,42 @@ +--- +- name: Start Minio + block: + - name: Create Minio Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ minio_data_directory }}/data" + + + - name: Create minio Docker Container + community.docker.docker_container: + name: "{{ minio_container_name }}" + image: "{{ minio_image_name }}:{{ minio_image_version }}" + pull: true + ports: + - "{{ minio_api_port }}:9000" + - "{{ minio_console_port }}:{{ minio_console_port }}" + command: 'server /data --console-address ":{{ minio_console_port }}"' + env: + MINIO_ROOT_USER: "{{ minio_admin_username }}" + MINIO_ROOT_PASSWORD: "{{ minio_admin_password }}" + MINIO_PROMETHEUS_AUTH_TYPE: public + restart_policy: unless-stopped + memory: "{{ minio_memory }}" + labels: + traefik.enable: "{{ minio_available_externally | string }}" + traefik.http.routers.minio.rule: "Host(`{{ minio_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.minio.tls.certresolver: "letsencrypt" + traefik.http.routers.minio.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.minio.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.minio.loadbalancer.server.port: "9000" + when: minio_enabled is true + +- name: Stop minio + block: + - name: Stop minio + community.docker.docker_container: + name: "{{ minio_container_name }}" + state: absent + when: minio_enabled is false diff --git a/website/docs/applications/system-tools/minio.md b/website/docs/applications/system-tools/minio.md new file mode 100644 index 0000000000..942ae28fca --- /dev/null +++ b/website/docs/applications/system-tools/minio.md @@ -0,0 +1,15 @@ +--- +title: "Minioo" +--- + +Homepage: + +Docker Container: [Minio](https://hub.docker.com/r/minio/minio) + +MinIO is a High Performance Object Storage released under GNU Affero General Public License v3.0. It is API compatible with Amazon S3 cloud storage service. Use MinIO to build high performance infrastructure for machine learning, analytics and application data workloads. + +## Usage + +Set `minio_enabled: true` in your `inventories//nas.yml` file. + +The Minio web interface can be found at . From b1128a1c81fed55ba4b1f0d885a24eb09da940c4 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sat, 15 Jul 2023 19:23:18 +0100 Subject: [PATCH 206/286] Add minio data volume --- roles/minio/tasks/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/roles/minio/tasks/main.yml b/roles/minio/tasks/main.yml index c06a2d7f43..11a55e7b63 100644 --- a/roles/minio/tasks/main.yml +++ b/roles/minio/tasks/main.yml @@ -18,6 +18,8 @@ - "{{ minio_api_port }}:9000" - "{{ minio_console_port }}:{{ minio_console_port }}" command: 'server /data --console-address ":{{ minio_console_port }}"' + volumes: + - "{{ minio_data_directory }}/data:/data" env: MINIO_ROOT_USER: "{{ minio_admin_username }}" MINIO_ROOT_PASSWORD: "{{ minio_admin_password }}" From 21579cc01a3f7aa79c446bf0910067e091c16cbb Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 19 Jul 2023 23:44:20 +0100 Subject: [PATCH 207/286] Add Loki logging stack --- README.md | 12 ++- nas.yml | 17 ++++ roles/logging/defaults/main.yml | 2 + roles/logging/tasks/main.yml | 29 +++++++ roles/loki/defaults/main.yml | 24 ++++++ roles/loki/handlers/main.yml | 8 ++ roles/loki/tasks/main.yml | 78 +++++++++++++++++++ roles/loki/templates/config.yml | 43 ++++++++++ roles/loki/templates/grafana-datasource.yml | 12 +++ roles/promtail/defaults/main.yml | 23 ++++++ roles/promtail/tasks/main.yml | 54 +++++++++++++ roles/promtail/templates/config.yml | 22 ++++++ .../observability/_category_.json | 7 ++ .../applications/observability/grafana.md | 17 ++++ .../docs/applications/stacks/_category_.json | 7 ++ website/docs/applications/stacks/logging.md | 29 +++++++ .../docs/applications/system-tools/loki.md | 19 +++++ .../docs/applications/system-tools/minio.md | 2 +- .../applications/system-tools/promtail.md | 21 +++++ 19 files changed, 423 insertions(+), 3 deletions(-) create mode 100644 roles/logging/defaults/main.yml create mode 100644 roles/logging/tasks/main.yml create mode 100644 roles/loki/defaults/main.yml create mode 100644 roles/loki/handlers/main.yml create mode 100644 roles/loki/tasks/main.yml create mode 100644 roles/loki/templates/config.yml create mode 100644 roles/loki/templates/grafana-datasource.yml create mode 100644 roles/promtail/defaults/main.yml create mode 100644 roles/promtail/tasks/main.yml create mode 100644 roles/promtail/templates/config.yml create mode 100644 website/docs/applications/observability/_category_.json create mode 100644 website/docs/applications/observability/grafana.md create mode 100644 website/docs/applications/stacks/_category_.json create mode 100644 website/docs/applications/stacks/logging.md create mode 100644 website/docs/applications/system-tools/loki.md create mode 100644 website/docs/applications/system-tools/promtail.md diff --git a/README.md b/README.md index 2f20f4f3cc..621915ae2e 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ If you have a spare domain name you can configure applications to be accessible * [Komga](https://komga.org/) - a media server for your comics, mangas, BDs and magazines * [Krusader](https://krusader.org/) - Twin panel file management for your desktop * [Lidarr](https://github.com/lidarr/Lidarr) - Music collection manager for Usenet and BitTorrent users +* [Loki](https://grafana.com/oss/loki/) - Loki is a horizontally scalable, highly available, multi-tenant log aggregation system inspired by Prometheus. * [Mealie](https://hay-kot.github.io/mealie/) - A self-hosted recipe manager and meal planner * [Minecraft Server](https://www.minecraft.net/) - Server edition of the popular building and exploring game * [MiniDLNA](https://sourceforge.net/projects/minidlna/) - simple media server which is fully compliant with DLNA/UPnP-AV clients @@ -79,6 +80,7 @@ If you have a spare domain name you can configure applications to be accessible * [Plex](https://www.plex.tv/) - Plex Media Server * [Portainer](https://portainer.io/) - for managing Docker and running custom images * [Prometheus](https://prometheus.io/) - Time series database and monitoring system (via stats role). +* [Promtail](https://grafana.com/docs/loki/latest/clients/promtail/) - Promtail is an agent which ships the contents of local logs to a private Grafana Loki instance * [Prowlarr](https://github.com/Prowlarr/Prowlarr) - Indexer aggregator for Sonarr, Radarr, Lidarr, etc. * [pyLoad](https://pyload.net/) - A download manager with a friendly web-interface * [PyTivo](http://pytivo.org) - An HMO and GoBack server for TiVos. @@ -107,6 +109,12 @@ If you have a spare domain name you can configure applications to be accessible * [YouTubeDL-Material](https://github.com/Tzahi12345/YoutubeDL-Material) - Self-hosted YouTube downloader built on Material Design * [ZNC](https://wiki.znc.in/ZNC) - IRC bouncer to stay connected to favourite IRC networks and channels +## Preconfigured Application Stacks + +Ansible-NAS application [stacks](https://ansible-nas.io/docs/category/stacks/) are a number of applications deployed together and preconfigured to perform a common goal. + +* [Logging](https://ansible-nas.io/docs/applications/stacks/logging/) - application logging capture and search service based on Grafana Loki. + ## What This Could Do Ansible-NAS can run anything that's in a Docker image, which is why Portainer is included. A NAS configuration is a pretty personal thing based on what you download, what media you view, how many photos you take...so it's difficult to please everyone. @@ -115,7 +123,7 @@ That said, if specific functionality you want isn't included and you think other ## What This Doesn't Do -Ansible NAS doesn't set up your disk partitions, primarily because getting it wrong can be incredibly destructive. That aside, configuring partitions is usually a one-time (or very infrequent) event, so there's not much to be gained by automating it. Check out the [docs](https://davestephens.github.io/ansible-nas) for recommended setups. +Ansible NAS doesn't set up your disk partitions, primarily because getting it wrong can be incredibly destructive. That aside, configuring partitions is usually a one-time (or very infrequent) event, so there's not much to be gained by automating it. Check out the [docs](https://ansible-nas.io/docs/) for recommended setups. ## Installation @@ -138,7 +146,7 @@ Read the [migrating from FreeNAS](https://ansible-nas.io/docs/further-configurat Getting help is easy! You can: -* Read the [docs](https://davestephens.github.io/ansible-nas) +* Read the [docs](https://ansible-nas.io/docs/) * Start a [discussion](https://github.com/davestephens/ansible-nas/discussions) * Raise an [issue](https://github.com/davestephens/ansible-nas/issues) if you think you've found a bug * Chat on [Gitter](https://gitter.im/Ansible-NAS/Chat) diff --git a/nas.yml b/nas.yml index 2871de2552..742a9bf479 100644 --- a/nas.yml +++ b/nas.yml @@ -46,6 +46,15 @@ - ansible-nas-docker - ansible-nas + ### + ### Stacks + ### + + - role: logging + tags: + - logging + + ### ### Applications ### @@ -193,6 +202,10 @@ tags: - lidarr + - role: loki + tags: + - loki + - role: mealie tags: - mealie @@ -297,6 +310,10 @@ tags: - prowlarr + - role: promtail + tags: + - promtail + - role: pyload tags: - pyload diff --git a/roles/logging/defaults/main.yml b/roles/logging/defaults/main.yml new file mode 100644 index 0000000000..8dfb995585 --- /dev/null +++ b/roles/logging/defaults/main.yml @@ -0,0 +1,2 @@ +--- +logging_stack_enabled: false diff --git a/roles/logging/tasks/main.yml b/roles/logging/tasks/main.yml new file mode 100644 index 0000000000..c6b96ab71d --- /dev/null +++ b/roles/logging/tasks/main.yml @@ -0,0 +1,29 @@ +--- +- name: Start logging stack + block: + - name: Enable logging roles + ansible.builtin.set_fact: + grafana_enabled: true + minio_enabled: true + loki_enabled: true + promtail_enabled: true + when: logging_stack_enabled is true + # vars: + # minio_enabled: true + # loki_enabled: true + # promtail_enabled: true + + +- name: Stop logging stack + block: + - name: Disable logging roles + ansible.builtin.set_fact: + grafana_enabled: false + minio_enabled: false + loki_enabled: false + promtail_enabled: false + when: logging_stack_enabled is false + # vars: + # minio_enabled: false + # loki_enabled: false + # promtail_enabled: false diff --git a/roles/loki/defaults/main.yml b/roles/loki/defaults/main.yml new file mode 100644 index 0000000000..7342af5f6f --- /dev/null +++ b/roles/loki/defaults/main.yml @@ -0,0 +1,24 @@ +--- +# enable or disable the application +loki_enabled: false +loki_available_externally: false + +# directories +loki_data_directory: "{{ docker_home }}/loki" + +# network +loki_hostname: "loki" +loki_network_name: "loki" +loki_http_port: "3100" + +# docker +loki_container_name: "loki" +loki_image_name: "grafana/loki" +loki_image_version: "latest" + +# specs +loki_memory: "1g" + +# config +loki_log_retention: 672h +loki_log_level: warn diff --git a/roles/loki/handlers/main.yml b/roles/loki/handlers/main.yml new file mode 100644 index 0000000000..8463e9fe09 --- /dev/null +++ b/roles/loki/handlers/main.yml @@ -0,0 +1,8 @@ +--- +- name: Restart Grafana + community.docker.docker_container: + name: grafana + image: grafana/grafana:latest + state: started + restart: true + listen: "restart grafana" diff --git a/roles/loki/tasks/main.yml b/roles/loki/tasks/main.yml new file mode 100644 index 0000000000..8e565cf65d --- /dev/null +++ b/roles/loki/tasks/main.yml @@ -0,0 +1,78 @@ +--- +- name: Start Loki + block: + - name: Check for Minio installation + ansible.builtin.fail: + msg: "Loki requires Minio enabled and running for storage, please set that up first." + when: minio_enabled is false + + - name: Check for Grafana installation + ansible.builtin.fail: + msg: "Loki requires Grafana enabled and running for visualisation, please set that up first." + when: grafana_enabled is false + + - name: Include Stats variables + ansible.builtin.include_vars: ../../stats/defaults/main.yml + + - name: Create Loki Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ loki_data_directory }}" + + - name: Create Minio buckets for Loki + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ minio_data_directory }}/data/loki-data" + - "{{ minio_data_directory }}/data/loki-ruler" + + - name: Template Loki config + ansible.builtin.template: + src: config.yml + dest: "{{ loki_data_directory }}/config.yml" + register: loki_config + + - name: Create loki Docker Container + community.docker.docker_container: + name: "{{ loki_container_name }}" + image: "{{ loki_image_name }}:{{ loki_image_version }}" + pull: true + command: "-config.file=/etc/loki/config.yml" + ports: + - "{{ loki_http_port }}:3100" + - 7946 + - 9095 + volumes: + - "{{ loki_data_directory }}/config.yml:/etc/loki/config.yml" + restart_policy: unless-stopped + memory: "{{ loki_memory }}" + restart: "{{ loki_config is changed }}" + labels: + traefik.enable: "{{ loki_available_externally | string }}" + traefik.http.routers.loki.rule: "Host(`{{ loki_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.loki.tls.certresolver: "letsencrypt" + traefik.http.routers.loki.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.loki.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.loki.loadbalancer.server.port: "3100" + prometheus.io/scrape: "true" + prometheus.io/port: "3100" + prometheus.io/path: "/metrics" + + - name: Template Grafana Loki data source + ansible.builtin.template: + src: grafana-datasource.yml + dest: "{{ stats_grafana_config_directory }}/provisioning/datasources/loki.yml" + owner: "472" + notify: restart grafana + when: loki_enabled is true + +- name: Stop loki + block: + - name: Stop loki + community.docker.docker_container: + name: "{{ loki_container_name }}" + state: absent + when: loki_enabled is false diff --git a/roles/loki/templates/config.yml b/roles/loki/templates/config.yml new file mode 100644 index 0000000000..9a99ff3831 --- /dev/null +++ b/roles/loki/templates/config.yml @@ -0,0 +1,43 @@ +--- +server: + http_listen_port: {{ loki_http_port }} + log_level: {{ loki_log_level }} + +memberlist: + +schema_config: + configs: + - from: 2021-08-01 + store: boltdb-shipper + object_store: s3 + schema: v11 + index: + prefix: index_ + period: 24h + +common: + path_prefix: /loki + replication_factor: 1 + storage: + s3: + endpoint: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ minio_api_port }}" + insecure: true + bucketnames: loki-data + access_key_id: "{{ minio_admin_username }}" + secret_access_key: "{{ minio_admin_password }}" + s3forcepathstyle: true + ring: + kvstore: + store: memberlist + +ruler: + storage: + s3: + bucketnames: loki-ruler + +chunk_store_config: + max_look_back_period: {{ loki_log_retention }} + +table_manager: + retention_deletes_enabled: true + retention_period: {{ loki_log_retention }} \ No newline at end of file diff --git a/roles/loki/templates/grafana-datasource.yml b/roles/loki/templates/grafana-datasource.yml new file mode 100644 index 0000000000..05916906e6 --- /dev/null +++ b/roles/loki/templates/grafana-datasource.yml @@ -0,0 +1,12 @@ +--- +apiVersion: 1 + +datasources: + - name: Loki + type: loki + access: proxy + url: http://{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ loki_http_port }} + jsonData: + httpHeaderName1: "X-Scope-OrgID" + secureJsonData: + httpHeaderValue1: "1" diff --git a/roles/promtail/defaults/main.yml b/roles/promtail/defaults/main.yml new file mode 100644 index 0000000000..bdcb4799bf --- /dev/null +++ b/roles/promtail/defaults/main.yml @@ -0,0 +1,23 @@ +--- +# enable or disable the application +promtail_enabled: false +promtail_available_externally: false + +# directories +promtail_data_directory: "{{ docker_home }}/promtail" + +# network +promtail_hostname: "promtail" +promtail_network_name: "promtail" +promtail_port: "9080" + +# docker +promtail_container_name: "promtail" +promtail_image_name: "grafana/promtail" +promtail_image_version: "latest" + +# specs +promtail_memory: "1g" + +# config +promtail_loki_url: http://{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ loki_http_port }}/loki/api/v1/push diff --git a/roles/promtail/tasks/main.yml b/roles/promtail/tasks/main.yml new file mode 100644 index 0000000000..0b4dc22816 --- /dev/null +++ b/roles/promtail/tasks/main.yml @@ -0,0 +1,54 @@ +--- +- name: Start Promtail + block: + - name: Check for Loki installation + ansible.builtin.fail: + msg: "Promtail requires Loki enabled and running as a write target, please set that up first." + when: loki_enabled is false + + - name: Include Loki variables + ansible.builtin.include_vars: ../../loki/defaults/main.yml + + - name: Create Promtail Directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - "{{ promtail_data_directory }}/config" + - "{{ promtail_data_directory }}/data" + + - name: Template Promtail config + ansible.builtin.template: + src: config.yml + dest: "{{ promtail_data_directory }}/config/config.yml" + + - name: Create Promtail Docker Container + community.docker.docker_container: + name: "{{ promtail_container_name }}" + image: "{{ promtail_image_name }}:{{ promtail_image_version }}" + pull: true + command: "-config.file=/etc/promtail/config.yml" + ports: + - "{{ promtail_port }}:9080" + volumes: + - "{{ promtail_data_directory }}/config/config.yml:/etc/promtail/config.yml" + - "{{ promtail_data_directory }}/data/:/data" + - "/var/run/docker.sock:/var/run/docker.sock" + restart_policy: unless-stopped + memory: "{{ promtail_memory }}" + labels: + traefik.enable: "{{ promtail_available_externally | string }}" + traefik.http.routers.promtail.rule: "Host(`{{ promtail_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.promtail.tls.certresolver: "letsencrypt" + traefik.http.routers.promtail.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.promtail.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.promtail.loadbalancer.server.port: "9080" + when: promtail_enabled is true + +- name: Stop promtail + block: + - name: Stop promtail + community.docker.docker_container: + name: "{{ promtail_container_name }}" + state: absent + when: promtail_enabled is false diff --git a/roles/promtail/templates/config.yml b/roles/promtail/templates/config.yml new file mode 100644 index 0000000000..77cf9283f0 --- /dev/null +++ b/roles/promtail/templates/config.yml @@ -0,0 +1,22 @@ +--- +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /data/positions.yml + +clients: + - url: {{ promtail_loki_url }} + tenant_id: 1 + +scrape_configs: + - job_name: docker_scrape + docker_sd_configs: + - host: unix:///var/run/docker.sock + refresh_interval: 5s + relabel_configs: + - source_labels: ['__meta_docker_container_name'] + regex: '/(.*)' + target_label: 'container' + diff --git a/website/docs/applications/observability/_category_.json b/website/docs/applications/observability/_category_.json new file mode 100644 index 0000000000..3a878ef67f --- /dev/null +++ b/website/docs/applications/observability/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Observability", + "link": { + "type": "generated-index", + "description": "All of the observability tooling available for installation with Ansible-NAS." + } +} diff --git a/website/docs/applications/observability/grafana.md b/website/docs/applications/observability/grafana.md new file mode 100644 index 0000000000..1d7a73045c --- /dev/null +++ b/website/docs/applications/observability/grafana.md @@ -0,0 +1,17 @@ +--- +title: "Grafana" +--- + +Homepage: + +Docker image: [Grafana](https://hub.docker.com/r/grafana/grafana) + +Query, visualize, alert on, and understand your data no matter where it’s stored. With Grafana you can create, explore, and share all of your data through beautiful, flexible dashboards. + +## Usage + +Set `stats_enabled: true` in your `inventories//group_vars/nas.yml` file. + +Grafana's web interface can be found at . + + diff --git a/website/docs/applications/stacks/_category_.json b/website/docs/applications/stacks/_category_.json new file mode 100644 index 0000000000..6acc3d3432 --- /dev/null +++ b/website/docs/applications/stacks/_category_.json @@ -0,0 +1,7 @@ +{ + "label": "Stacks", + "link": { + "type": "generated-index", + "description": "Application stacks install a number of different apps together to perform a common goal. There are all of the application stacks available for installation with Ansible-NAS." + } +} diff --git a/website/docs/applications/stacks/logging.md b/website/docs/applications/stacks/logging.md new file mode 100644 index 0000000000..3eee7a76d6 --- /dev/null +++ b/website/docs/applications/stacks/logging.md @@ -0,0 +1,29 @@ +--- +title: "Logging" +--- + +The logging stack sets up a fully functional application logging capture and search service based on [Loki](https://grafana.com/oss/loki/), viewable via Grafana. + +To enable it, add the following to your `inventories//group_vars/nas.yml`: + +``` +logging_stack_enabled: true +``` + +Which is equivalent to: + +``` +minio_enabled: true +loki_enabled: true +promtail_enabled: true +grafana_enabled: true +``` + +Once set up, all container stdout logs will be captured and stored. You'll find the Loki data source available in Grafana. + +Read more: + + - [Grafana](../observability/grafana.md) + - [Loki](../system-tools/loki.md) + - [Minio](../system-tools/minio.md) + - [Promtail](../system-tools/promtail.md) diff --git a/website/docs/applications/system-tools/loki.md b/website/docs/applications/system-tools/loki.md new file mode 100644 index 0000000000..4a2061a7eb --- /dev/null +++ b/website/docs/applications/system-tools/loki.md @@ -0,0 +1,19 @@ +--- +title: "Loki" +--- + +Homepage: + +Docker Container: [Loki](https://hub.docker.com/r/grafana/loki) + +Loki is a log aggregation system designed to store and query logs from all your applications and infrastructure. + +## Usage + +Set `loki_enabled: true` in your `inventories//nas.yml` file. + +Loki doesn't have a web interface. To see what it's doing look at the container logs from your Ansible-NAS shell: + +``` +docker logs loki -f +``` diff --git a/website/docs/applications/system-tools/minio.md b/website/docs/applications/system-tools/minio.md index 942ae28fca..a45cab1289 100644 --- a/website/docs/applications/system-tools/minio.md +++ b/website/docs/applications/system-tools/minio.md @@ -1,5 +1,5 @@ --- -title: "Minioo" +title: "Minio" --- Homepage: diff --git a/website/docs/applications/system-tools/promtail.md b/website/docs/applications/system-tools/promtail.md new file mode 100644 index 0000000000..c6682531bd --- /dev/null +++ b/website/docs/applications/system-tools/promtail.md @@ -0,0 +1,21 @@ +--- +title: "Promtail" +--- + +Homepage: + +Docker image: [Promtail](https://hub.docker.com/r/grafana/promtail) + +Promtail is an agent which ships the contents of local logs to a private Grafana Loki instance or Grafana Cloud. It is usually deployed to every machine that has applications needed to be monitored. + +It primarily: + + - Discovers targets + - Attaches labels to log streams + - Pushes them to the Loki instance. + +## Usage + +Set `promtail_enabled: true` in your `inventories//nas.yml` file. + +To see what Promtail is doing (and what containers it has discovered for tailing), visit the web interface at at . From 6c24a67d504a92962050f12ee11a6496079c9b25 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 19 Jul 2023 23:46:05 +0100 Subject: [PATCH 208/286] Configurable internet speed test interval --- roles/stats/defaults/main.yml | 1 + roles/stats/templates/prometheus.yml.j2 | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/roles/stats/defaults/main.yml b/roles/stats/defaults/main.yml index 3dc240df49..48ad89baeb 100644 --- a/roles/stats/defaults/main.yml +++ b/roles/stats/defaults/main.yml @@ -49,6 +49,7 @@ stats_grafana_memory: 1g stats_prometheus_retention_time: 365d stats_prometheus_retention_size: 30GB stats_collection_interval: 15s +stats_speedtest_collection_interval: 1h # uncomment to scrape more hosts # stats_prometheus_additional_hosts: diff --git a/roles/stats/templates/prometheus.yml.j2 b/roles/stats/templates/prometheus.yml.j2 index 34e5a0b4ba..5f7e46ad7b 100644 --- a/roles/stats/templates/prometheus.yml.j2 +++ b/roles/stats/templates/prometheus.yml.j2 @@ -35,13 +35,15 @@ scrape_configs: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:8083" ] +{% if stats_internet_speed_test_enabled %} - job_name: "speedtest" - scrape_interval: 1h + scrape_interval: {{ stats_speedtest_collection_interval }} scrape_timeout: 5m static_configs: - targets: [ "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}:{{ stats_speedtest_exporter_port }}" ] +{% endif %} {% if stats_prometheus_additional_hosts is defined %} - job_name: "additional_hosts" From ba96fff04cf20c4d124a82d109906fe11c580ba2 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 19 Jul 2023 23:46:57 +0100 Subject: [PATCH 209/286] Docusaurus update to 2.4.1 --- website/package-lock.json | 2400 +++++++++++++++++++------------------ website/package.json | 6 +- 2 files changed, 1226 insertions(+), 1180 deletions(-) diff --git a/website/package-lock.json b/website/package-lock.json index 18860b827f..4ed2138009 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -8,8 +8,8 @@ "name": "ansible-nas", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/preset-classic": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", @@ -18,106 +18,122 @@ "yarn": "^1.22.19" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.1.0" + "@docusaurus/module-type-aliases": "2.4.1" }, "engines": { "node": ">=16.14" } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", - "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.1" + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", - "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "dependencies": { - "@algolia/autocomplete-shared": "1.7.1" + "@algolia/autocomplete-shared": "1.9.3" }, "peerDependencies": { - "@algolia/client-search": "^4.9.1", - "algoliasearch": "^4.9.1" + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", - "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.19.0.tgz", + "integrity": "sha512-G2NxUr3+gFMFwrEsjy7DwZJYXIxBQC5DeRZVKVEpTxW8AkBI2Y7MF+VUs4C8qqE3lHuioym4rvDipzH1xk3DKw==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.19.0" } }, "node_modules/@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.19.0.tgz", + "integrity": "sha512-4zFZCC0vYTvfoFSyAXEXDtQFamMibtMPjARirfvRlfgK+5YXW9qJIV+V7O/4qb1mH6RjngvHOo3GDE1xDoIzKA==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.19.0.tgz", + "integrity": "sha512-Q6z2p4MaiWs4PXB4NQ5l/ZE1j54mF1xlnqOLw0TKKXBhlNM5pOl5XKSvr/t/KHfrkO1/ua/f/YW71iA/lPGn+A==", "dependencies": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.19.0" } }, "node_modules/@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.19.0.tgz", + "integrity": "sha512-/0ZASb3ErYjM9GJijaF6JDDhDiyGYwp2FQ2QInUzH0mq/+a5s1PMI3r/8NV1DmlX+p93d2QplnLpjgNTn4eafw==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.19.0.tgz", + "integrity": "sha512-tB9L0YJ86a1e/ibNdnbFw+yOKooQlmh95Ld6Qyj4GQ1vFmzBpd4x4ilhyFFXbOjsvNGgALu8+44gp5h2ynxrwg==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.19.0.tgz", + "integrity": "sha512-tiEyCKkkG5Ig04ATYlt1v41UJb/lS4RmJVXEAsaTkoyB5iUCOChE5WEVPPuJbO/5tSTCbIF4P+g5BjQDb7aGBA==", "dependencies": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.19.0.tgz", + "integrity": "sha512-nG56w0dphlStCOgB80q0ug0SHYM+tQosL4Qprc+cy8ckFhTgC3hRtyRYHYGPk9txow5pPKDtyb5rnr3oviKP1Q==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.19.0.tgz", + "integrity": "sha512-kkqvljLIBYFv+GMefIq0wv2cRP30NG5/INyL1OKr8Qk4Nk0FciFF3wdxIgv6fm156x1q4V0fLw5zwMMWMPOsLQ==", "dependencies": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/@algolia/events": { @@ -126,47 +142,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.19.0.tgz", + "integrity": "sha512-2YdIHiQwlUCdhFFK1rE53VCEc8scTUcQLWJgpzi1amvP/ffUog4h5VXdGhyhHzYeAexMsaELX2/sEJa4lgOzng==" }, "node_modules/@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.19.0.tgz", + "integrity": "sha512-JjbFPW35gm1RswkB3sgIAS/TjXoqG3FR8Gvsg8lPIB2oh8mcpybyJOUcq56sAfbIQ6n0aFuG4lgqES5TqlWzXw==", "dependencies": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.19.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.19.0.tgz", + "integrity": "sha512-5c3FlK7ZJ6oiLuZHe0iSpPzWlHCzeunQS7nlBsB4sEecVcvRJfXOklLh2vZfouQdaT14gXJ+Hwb2SuyRQLU6Ug==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.19.0" } }, "node_modules/@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.19.0.tgz", + "integrity": "sha512-oBsoYDNx09L163N9aQM/FrGfLoU/sLvvzcHw1fdJg5eysTAXCvdMNXk29ocy0rhq2deQ8ccdU/Z9Qu0RfLGUmA==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.19.0.tgz", + "integrity": "sha512-UkTZEg5q9VTqfa8cPJbeDpu0Ff50aPx2MxGoYP2v25NFFcTlYRufiPBtux0ZKSyXTaoNPm/OBldWlDi9bTx1jA==", "dependencies": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.19.0" } }, "node_modules/@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.19.0.tgz", + "integrity": "sha512-xgpU6eTzHJ8rqEvhVW9DdyIC+rsRYovIGpCz8k9JjwpLHNltu8wTQik0hasb1z16mFaIQDzgJTxo/C4ciMMr6w==", "dependencies": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.19.0", + "@algolia/logger-common": "4.19.0", + "@algolia/requester-common": "4.19.0" } }, "node_modules/@ampproject/remapping": { @@ -1886,11 +1902,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" @@ -1964,18 +1980,18 @@ } }, "node_modules/@docsearch/css": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", - "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==" }, "node_modules/@docsearch/react": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", - "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "dependencies": { - "@algolia/autocomplete-core": "1.7.1", - "@algolia/autocomplete-preset-algolia": "1.7.1", - "@docsearch/css": "3.2.1", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -1996,9 +2012,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", "dependencies": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -2010,13 +2026,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -2037,7 +2053,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -2084,9 +2100,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", "dependencies": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -2098,9 +2114,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.4.0" @@ -2110,14 +2126,14 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -2141,12 +2157,12 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2160,17 +2176,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -2190,17 +2206,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -2220,15 +2236,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" @@ -2242,13 +2258,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" @@ -2262,13 +2278,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" }, "engines": { @@ -2280,13 +2296,31 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" }, "engines": { @@ -2298,16 +2332,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" @@ -2321,22 +2355,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" }, "engines": { "node": ">=16.14" @@ -2359,26 +2394,26 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", - "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "dependencies": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -2398,16 +2433,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", - "dependencies": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "dependencies": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2415,6 +2451,7 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" }, "engines": { @@ -2426,22 +2463,22 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", "dependencies": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -2456,9 +2493,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", "dependencies": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" @@ -2468,9 +2505,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -2487,12 +2524,13 @@ } }, "node_modules/@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", "dependencies": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.1", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -2520,9 +2558,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", "dependencies": { "tslib": "^2.4.0" }, @@ -2539,12 +2577,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", "dependencies": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -2595,18 +2633,18 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2622,12 +2660,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { @@ -2806,9 +2844,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "node_modules/@sideway/pinpoint": { "version": "2.0.0", @@ -3149,9 +3187,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/express": { "version": "4.17.14", @@ -3175,11 +3213,11 @@ } }, "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/history": { @@ -3206,11 +3244,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mime": { @@ -3331,9 +3369,9 @@ } }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, "node_modules/@types/ws": { "version": "8.5.3", @@ -3344,133 +3382,133 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -3516,9 +3554,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -3527,9 +3565,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { "acorn": "^8" } @@ -3622,30 +3660,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.19.0.tgz", + "integrity": "sha512-UIzLHOkprUFzwFxqgw+TOhEG2usLv8q9l4V/Ul82IgNNO+g5RjENd5Sl/J6BU4BlRdMLy/OvPfbSc7Y1dOdwgA==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.19.0", + "@algolia/cache-common": "4.19.0", + "@algolia/cache-in-memory": "4.19.0", + "@algolia/client-account": "4.19.0", + "@algolia/client-analytics": "4.19.0", + "@algolia/client-common": "4.19.0", + "@algolia/client-personalization": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/logger-common": "4.19.0", + "@algolia/logger-console": "4.19.0", + "@algolia/requester-browser-xhr": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/requester-node-http": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "node_modules/algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.4.tgz", + "integrity": "sha512-2Vqu3ngJKe9w1cNLUNJML5TT/l+etnACASVgJ+HWiKhH6TrIYI2FFVcBi0lMTsdSpqTnv736ub7BYqUTavk0mA==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -3761,9 +3799,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.11", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", - "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "funding": [ { "type": "opencollective", @@ -3775,8 +3813,8 @@ } ], "dependencies": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001399", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4050,9 +4088,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -4061,13 +4099,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -4196,9 +4238,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001402", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", - "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "funding": [ { "type": "opencollective", @@ -4207,6 +4249,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -4616,9 +4662,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", "engines": { "node": ">=12" }, @@ -4791,11 +4837,11 @@ } }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -5014,12 +5060,12 @@ } }, "node_modules/cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "dependencies": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -5033,24 +5079,24 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "dependencies": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -5058,11 +5104,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -5370,13 +5416,13 @@ } }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -5431,9 +5477,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -5474,9 +5520,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5505,9 +5551,9 @@ } }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "node_modules/escalade": { "version": "3.1.1", @@ -5601,9 +5647,9 @@ } }, "node_modules/eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", "engines": { "node": ">=6.0.0" }, @@ -5856,9 +5902,9 @@ } }, "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "dependencies": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -5866,7 +5912,7 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "ua-parser-js": "^1.0.35" } }, "node_modules/fbjs-css-vars": { @@ -5999,9 +6045,9 @@ } }, "node_modules/flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "dependencies": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -6172,19 +6218,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6228,9 +6261,9 @@ } }, "node_modules/github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "node_modules/glob": { "version": "7.2.3", @@ -6724,9 +6757,9 @@ } }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -6736,15 +6769,15 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-deceiver": { "version": "1.2.7", @@ -6919,9 +6952,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==", + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", "engines": { "node": ">=12" } @@ -7366,9 +7399,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -7460,9 +7493,9 @@ } }, "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7915,9 +7948,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -7942,9 +7975,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -8260,9 +8293,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -8465,11 +8498,11 @@ } }, "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" @@ -8482,11 +8515,11 @@ } }, "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dependencies": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -8591,12 +8624,12 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" @@ -8606,11 +8639,11 @@ } }, "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -8653,11 +8686,11 @@ } }, "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, @@ -8819,11 +8852,11 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -8892,11 +8925,11 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { @@ -8933,9 +8966,9 @@ } }, "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "dependencies": { "sort-css-media-queries": "2.1.0" }, @@ -9303,9 +9336,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "engines": { "node": ">= 12.13.0" } @@ -9494,11 +9527,11 @@ } }, "node_modules/react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", "dependencies": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, @@ -9550,25 +9583,14 @@ } }, "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dependencies": { - "minimatch": "3.0.4" + "minimatch": "^3.0.5" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "node": ">=6.0.0" } }, "node_modules/regenerate": { @@ -9588,9 +9610,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -10176,6 +10198,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "peer": true, + "engines": { + "node": ">=8.16.0" + } + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -10287,39 +10318,28 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" } }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/serve-handler/node_modules/path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -10783,11 +10803,11 @@ } }, "node_modules/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dependencies": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { @@ -10924,12 +10944,12 @@ } }, "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -10941,15 +10961,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -11066,7 +11086,8 @@ "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==" + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead" }, "node_modules/trim-trailing-lines": { "version": "1.1.4", @@ -11155,9 +11176,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "funding": [ { "type": "opencollective", @@ -11365,9 +11386,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -11376,6 +11397,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -11383,7 +11408,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -11630,6 +11655,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11767,21 +11800,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -11790,9 +11823,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -12103,9 +12136,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -12363,95 +12396,105 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.1.tgz", - "integrity": "sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "requires": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", "requires": { - "@algolia/autocomplete-shared": "1.7.1" + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.1.tgz", - "integrity": "sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", "requires": { - "@algolia/autocomplete-shared": "1.7.1" + "@algolia/autocomplete-shared": "1.9.3" } }, "@algolia/autocomplete-shared": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.1.tgz", - "integrity": "sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "requires": {} }, "@algolia/cache-browser-local-storage": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz", - "integrity": "sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.19.0.tgz", + "integrity": "sha512-G2NxUr3+gFMFwrEsjy7DwZJYXIxBQC5DeRZVKVEpTxW8AkBI2Y7MF+VUs4C8qqE3lHuioym4rvDipzH1xk3DKw==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.19.0" } }, "@algolia/cache-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.2.tgz", - "integrity": "sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.19.0.tgz", + "integrity": "sha512-4zFZCC0vYTvfoFSyAXEXDtQFamMibtMPjARirfvRlfgK+5YXW9qJIV+V7O/4qb1mH6RjngvHOo3GDE1xDoIzKA==" }, "@algolia/cache-in-memory": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz", - "integrity": "sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.19.0.tgz", + "integrity": "sha512-Q6z2p4MaiWs4PXB4NQ5l/ZE1j54mF1xlnqOLw0TKKXBhlNM5pOl5XKSvr/t/KHfrkO1/ua/f/YW71iA/lPGn+A==", "requires": { - "@algolia/cache-common": "4.14.2" + "@algolia/cache-common": "4.19.0" } }, "@algolia/client-account": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.2.tgz", - "integrity": "sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.19.0.tgz", + "integrity": "sha512-/0ZASb3ErYjM9GJijaF6JDDhDiyGYwp2FQ2QInUzH0mq/+a5s1PMI3r/8NV1DmlX+p93d2QplnLpjgNTn4eafw==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "@algolia/client-analytics": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.2.tgz", - "integrity": "sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.19.0.tgz", + "integrity": "sha512-tB9L0YJ86a1e/ibNdnbFw+yOKooQlmh95Ld6Qyj4GQ1vFmzBpd4x4ilhyFFXbOjsvNGgALu8+44gp5h2ynxrwg==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "@algolia/client-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.2.tgz", - "integrity": "sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.19.0.tgz", + "integrity": "sha512-tiEyCKkkG5Ig04ATYlt1v41UJb/lS4RmJVXEAsaTkoyB5iUCOChE5WEVPPuJbO/5tSTCbIF4P+g5BjQDb7aGBA==", "requires": { - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "@algolia/client-personalization": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.2.tgz", - "integrity": "sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.19.0.tgz", + "integrity": "sha512-nG56w0dphlStCOgB80q0ug0SHYM+tQosL4Qprc+cy8ckFhTgC3hRtyRYHYGPk9txow5pPKDtyb5rnr3oviKP1Q==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "@algolia/client-search": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.2.tgz", - "integrity": "sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.19.0.tgz", + "integrity": "sha512-kkqvljLIBYFv+GMefIq0wv2cRP30NG5/INyL1OKr8Qk4Nk0FciFF3wdxIgv6fm156x1q4V0fLw5zwMMWMPOsLQ==", "requires": { - "@algolia/client-common": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/transporter": "4.14.2" + "@algolia/client-common": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "@algolia/events": { @@ -12460,47 +12503,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "@algolia/logger-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.2.tgz", - "integrity": "sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.19.0.tgz", + "integrity": "sha512-2YdIHiQwlUCdhFFK1rE53VCEc8scTUcQLWJgpzi1amvP/ffUog4h5VXdGhyhHzYeAexMsaELX2/sEJa4lgOzng==" }, "@algolia/logger-console": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.2.tgz", - "integrity": "sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.19.0.tgz", + "integrity": "sha512-JjbFPW35gm1RswkB3sgIAS/TjXoqG3FR8Gvsg8lPIB2oh8mcpybyJOUcq56sAfbIQ6n0aFuG4lgqES5TqlWzXw==", "requires": { - "@algolia/logger-common": "4.14.2" + "@algolia/logger-common": "4.19.0" } }, "@algolia/requester-browser-xhr": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz", - "integrity": "sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.19.0.tgz", + "integrity": "sha512-5c3FlK7ZJ6oiLuZHe0iSpPzWlHCzeunQS7nlBsB4sEecVcvRJfXOklLh2vZfouQdaT14gXJ+Hwb2SuyRQLU6Ug==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.19.0" } }, "@algolia/requester-common": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.2.tgz", - "integrity": "sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg==" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.19.0.tgz", + "integrity": "sha512-oBsoYDNx09L163N9aQM/FrGfLoU/sLvvzcHw1fdJg5eysTAXCvdMNXk29ocy0rhq2deQ8ccdU/Z9Qu0RfLGUmA==" }, "@algolia/requester-node-http": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz", - "integrity": "sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.19.0.tgz", + "integrity": "sha512-UkTZEg5q9VTqfa8cPJbeDpu0Ff50aPx2MxGoYP2v25NFFcTlYRufiPBtux0ZKSyXTaoNPm/OBldWlDi9bTx1jA==", "requires": { - "@algolia/requester-common": "4.14.2" + "@algolia/requester-common": "4.19.0" } }, "@algolia/transporter": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.2.tgz", - "integrity": "sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.19.0.tgz", + "integrity": "sha512-xgpU6eTzHJ8rqEvhVW9DdyIC+rsRYovIGpCz8k9JjwpLHNltu8wTQik0hasb1z16mFaIQDzgJTxo/C4ciMMr6w==", "requires": { - "@algolia/cache-common": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/requester-common": "4.14.2" + "@algolia/cache-common": "4.19.0", + "@algolia/logger-common": "4.19.0", + "@algolia/requester-common": "4.19.0" } }, "@ampproject/remapping": { @@ -13660,11 +13703,11 @@ } }, "@babel/runtime": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", - "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/runtime-corejs3": { @@ -13720,25 +13763,25 @@ "optional": true }, "@docsearch/css": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.2.1.tgz", - "integrity": "sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==" }, "@docsearch/react": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.2.1.tgz", - "integrity": "sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", "requires": { - "@algolia/autocomplete-core": "1.7.1", - "@algolia/autocomplete-preset-algolia": "1.7.1", - "@docsearch/css": "3.2.1", + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", "algoliasearch": "^4.0.0" } }, "@docusaurus/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.1.0.tgz", - "integrity": "sha512-/ZJ6xmm+VB9Izbn0/s6h6289cbPy2k4iYFwWDhjiLsVqwa/Y0YBBcXvStfaHccudUC3OfP+26hMk7UCjc50J6Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz", + "integrity": "sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g==", "requires": { "@babel/core": "^7.18.6", "@babel/generator": "^7.18.7", @@ -13750,13 +13793,13 @@ "@babel/runtime": "^7.18.6", "@babel/runtime-corejs3": "^7.18.6", "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", + "@docusaurus/cssnano-preset": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.2.1", "autoprefixer": "^10.4.7", @@ -13777,7 +13820,7 @@ "del": "^6.1.1", "detect-port": "^1.3.0", "escape-html": "^1.0.3", - "eta": "^1.12.3", + "eta": "^2.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "html-minifier-terser": "^6.1.0", @@ -13814,9 +13857,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.1.0.tgz", - "integrity": "sha512-pRLewcgGhOies6pzsUROfmPStDRdFw+FgV5sMtLr5+4Luv2rty5+b/eSIMMetqUsmg3A9r9bcxHk9bKAKvx3zQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz", + "integrity": "sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ==", "requires": { "cssnano-preset-advanced": "^5.3.8", "postcss": "^8.4.14", @@ -13825,23 +13868,23 @@ } }, "@docusaurus/logger": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.1.0.tgz", - "integrity": "sha512-uuJx2T6hDBg82joFeyobywPjSOIfeq05GfyKGHThVoXuXsu1KAzMDYcjoDxarb9CoHCI/Dor8R2MoL6zII8x1Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz", + "integrity": "sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg==", "requires": { "chalk": "^4.1.2", "tslib": "^2.4.0" } }, "@docusaurus/mdx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.1.0.tgz", - "integrity": "sha512-i97hi7hbQjsD3/8OSFhLy7dbKGH8ryjEzOfyhQIn2CFBYOY3ko0vMVEf3IY9nD3Ld7amYzsZ8153RPkcnXA+Lg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz", + "integrity": "sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ==", "requires": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -13858,12 +13901,12 @@ } }, "@docusaurus/module-type-aliases": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.1.0.tgz", - "integrity": "sha512-Z8WZaK5cis3xEtyfOT817u9xgGUauT0PuuVo85ysnFRX8n7qLN1lTPCkC+aCmFm/UcV8h/W5T4NtIsst94UntQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz", + "integrity": "sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A==", "requires": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.1.0", + "@docusaurus/types": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -13873,17 +13916,17 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.1.0.tgz", - "integrity": "sha512-xEp6jlu92HMNUmyRBEeJ4mCW1s77aAEQO4Keez94cUY/Ap7G/r0Awa6xSLff7HL0Fjg8KK1bEbDy7q9voIavdg==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz", + "integrity": "sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -13896,17 +13939,17 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.1.0.tgz", - "integrity": "sha512-Rup5pqXrXlKGIC4VgwvioIhGWF7E/NNSlxv+JAxRYpik8VKlWsk9ysrdHIlpX+KJUCO9irnY21kQh2814mlp/Q==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz", + "integrity": "sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -13919,88 +13962,100 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.1.0.tgz", - "integrity": "sha512-SwZdDZRlObHNKXTnFo7W2aF6U5ZqNVI55Nw2GCBryL7oKQSLeI0lsrMlMXdzn+fS7OuBTd3MJBO1T4Zpz0i/+g==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz", + "integrity": "sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" } }, "@docusaurus/plugin-debug": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.1.0.tgz", - "integrity": "sha512-8wsDq3OIfiy6440KLlp/qT5uk+WRHQXIXklNHEeZcar+Of0TZxCNe2FBpv+bzb/0qcdP45ia5i5WmR5OjN6DPw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz", + "integrity": "sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.1.0.tgz", - "integrity": "sha512-4cgeqIly/wcFVbbWP03y1QJJBgH8W+Bv6AVbWnsXNOZa1yB3AO6hf3ZdeQH9x20v9T2pREogVgAH0rSoVnNsgg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz", + "integrity": "sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.1.0.tgz", - "integrity": "sha512-/3aDlv2dMoCeiX2e+DTGvvrdTA+v3cKQV3DbmfsF4ENhvc5nKV23nth04Z3Vq0Ci1ui6Sn80TkhGk/tiCMW2AA==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz", + "integrity": "sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", + "tslib": "^2.4.0" + } + }, + "@docusaurus/plugin-google-tag-manager": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz", + "integrity": "sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g==", "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "tslib": "^2.4.0" } }, "@docusaurus/plugin-sitemap": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.1.0.tgz", - "integrity": "sha512-2Y6Br8drlrZ/jN9MwMBl0aoi9GAjpfyfMBYpaQZXimbK+e9VjYnujXlvQ4SxtM60ASDgtHIAzfVFBkSR/MwRUw==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz", + "integrity": "sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" } }, "@docusaurus/preset-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.1.0.tgz", - "integrity": "sha512-NQMnaq974K4BcSMXFSJBQ5itniw6RSyW+VT+6i90kGZzTwiuKZmsp0r9lC6BYAvvVMQUNJQwrETmlu7y2XKW7w==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/plugin-debug": "2.1.0", - "@docusaurus/plugin-google-analytics": "2.1.0", - "@docusaurus/plugin-google-gtag": "2.1.0", - "@docusaurus/plugin-sitemap": "2.1.0", - "@docusaurus/theme-classic": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-search-algolia": "2.1.0", - "@docusaurus/types": "2.1.0" + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz", + "integrity": "sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/plugin-debug": "2.4.1", + "@docusaurus/plugin-google-analytics": "2.4.1", + "@docusaurus/plugin-google-gtag": "2.4.1", + "@docusaurus/plugin-google-tag-manager": "2.4.1", + "@docusaurus/plugin-sitemap": "2.4.1", + "@docusaurus/theme-classic": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-search-algolia": "2.4.1", + "@docusaurus/types": "2.4.1" } }, "@docusaurus/react-loadable": { @@ -14013,26 +14068,26 @@ } }, "@docusaurus/theme-classic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.1.0.tgz", - "integrity": "sha512-xn8ZfNMsf7gaSy9+ClFnUu71o7oKgMo5noYSS1hy3svNifRTkrBp6+MReLDsmIaj3mLf2e7+JCBYKBFbaGzQng==", - "requires": { - "@docusaurus/core": "2.1.0", - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/types": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-common": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz", + "integrity": "sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg==", + "requires": { + "@docusaurus/core": "2.4.1", + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/types": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.42", + "infima": "0.2.0-alpha.43", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.14", @@ -14045,16 +14100,17 @@ } }, "@docusaurus/theme-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.1.0.tgz", - "integrity": "sha512-vT1otpVPbKux90YpZUnvknsn5zvpLf+AW1W0EDcpE9up4cDrPqfsh0QoxGHFJnobE2/qftsBFC19BneN4BH8Ag==", - "requires": { - "@docusaurus/mdx-loader": "2.1.0", - "@docusaurus/module-type-aliases": "2.1.0", - "@docusaurus/plugin-content-blog": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/plugin-content-pages": "2.1.0", - "@docusaurus/utils": "2.1.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz", + "integrity": "sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA==", + "requires": { + "@docusaurus/mdx-loader": "2.4.1", + "@docusaurus/module-type-aliases": "2.4.1", + "@docusaurus/plugin-content-blog": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/plugin-content-pages": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-common": "2.4.1", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -14062,26 +14118,27 @@ "parse-numeric-range": "^1.3.0", "prism-react-renderer": "^1.3.5", "tslib": "^2.4.0", + "use-sync-external-store": "^1.2.0", "utility-types": "^3.10.0" } }, "@docusaurus/theme-search-algolia": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.1.0.tgz", - "integrity": "sha512-rNBvi35VvENhucslEeVPOtbAzBdZY/9j55gdsweGV5bYoAXy4mHB6zTGjealcB4pJ6lJY4a5g75fXXMOlUqPfg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz", + "integrity": "sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ==", "requires": { "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.1.0", - "@docusaurus/logger": "2.1.0", - "@docusaurus/plugin-content-docs": "2.1.0", - "@docusaurus/theme-common": "2.1.0", - "@docusaurus/theme-translations": "2.1.0", - "@docusaurus/utils": "2.1.0", - "@docusaurus/utils-validation": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/logger": "2.4.1", + "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/theme-common": "2.4.1", + "@docusaurus/theme-translations": "2.4.1", + "@docusaurus/utils": "2.4.1", + "@docusaurus/utils-validation": "2.4.1", "algoliasearch": "^4.13.1", "algoliasearch-helper": "^3.10.0", "clsx": "^1.2.1", - "eta": "^1.12.3", + "eta": "^2.0.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0", @@ -14089,18 +14146,18 @@ } }, "@docusaurus/theme-translations": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.1.0.tgz", - "integrity": "sha512-07n2akf2nqWvtJeMy3A+7oSGMuu5F673AovXVwY0aGAux1afzGCiqIFlYW3EP0CujvDJAEFSQi/Tetfh+95JNg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz", + "integrity": "sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA==", "requires": { "fs-extra": "^10.1.0", "tslib": "^2.4.0" } }, "@docusaurus/types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.1.0.tgz", - "integrity": "sha512-BS1ebpJZnGG6esKqsjtEC9U9qSaPylPwlO7cQ1GaIE7J/kMZI3FITnNn0otXXu7c7ZTqhb6+8dOrG6fZn6fqzQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz", + "integrity": "sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ==", "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -14113,12 +14170,13 @@ } }, "@docusaurus/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-fPvrfmAuC54n8MjZuG4IysaMdmvN5A/qr7iFLbSGSyDrsbP4fnui6KdZZIa/YOLIPLec8vjZ8RIITJqF18mx4A==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA==", "requires": { - "@docusaurus/logger": "2.1.0", + "@docusaurus/logger": "2.4.1", "@svgr/webpack": "^6.2.1", + "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", "fs-extra": "^10.1.0", "github-slugger": "^1.4.0", @@ -14135,20 +14193,20 @@ } }, "@docusaurus/utils-common": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.1.0.tgz", - "integrity": "sha512-F2vgmt4yRFgRQR2vyEFGTWeyAdmgKbtmu3sjHObF0tjjx/pN0Iw/c6eCopaH34E6tc9nO0nvp01pwW+/86d1fg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz", + "integrity": "sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ==", "requires": { "tslib": "^2.4.0" } }, "@docusaurus/utils-validation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.1.0.tgz", - "integrity": "sha512-AMJzWYKL3b7FLltKtDXNLO9Y649V2BXvrnRdnW2AA+PpBnYV78zKLSCz135cuWwRj1ajNtP4onbXdlnyvCijGQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz", + "integrity": "sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA==", "requires": { - "@docusaurus/logger": "2.1.0", - "@docusaurus/utils": "2.1.0", + "@docusaurus/logger": "2.4.1", + "@docusaurus/utils": "2.4.1", "joi": "^17.6.0", "js-yaml": "^4.1.0", "tslib": "^2.4.0" @@ -14187,18 +14245,18 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -14213,12 +14271,12 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@leichtgewicht/ip-codec": { @@ -14356,9 +14414,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" }, "@sideway/pinpoint": { "version": "2.0.0", @@ -14564,9 +14622,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "@types/express": { "version": "4.17.14", @@ -14590,11 +14648,11 @@ } }, "@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", + "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/history": { @@ -14621,11 +14679,11 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz", + "integrity": "sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==", "requires": { - "@types/unist": "*" + "@types/unist": "^2" } }, "@types/mime": { @@ -14746,9 +14804,9 @@ } }, "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz", + "integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==" }, "@types/ws": { "version": "8.5.3", @@ -14759,133 +14817,133 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, @@ -14924,14 +14982,14 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "requires": {} }, "acorn-walk": { @@ -14997,30 +15055,30 @@ "requires": {} }, "algoliasearch": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.2.tgz", - "integrity": "sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg==", - "requires": { - "@algolia/cache-browser-local-storage": "4.14.2", - "@algolia/cache-common": "4.14.2", - "@algolia/cache-in-memory": "4.14.2", - "@algolia/client-account": "4.14.2", - "@algolia/client-analytics": "4.14.2", - "@algolia/client-common": "4.14.2", - "@algolia/client-personalization": "4.14.2", - "@algolia/client-search": "4.14.2", - "@algolia/logger-common": "4.14.2", - "@algolia/logger-console": "4.14.2", - "@algolia/requester-browser-xhr": "4.14.2", - "@algolia/requester-common": "4.14.2", - "@algolia/requester-node-http": "4.14.2", - "@algolia/transporter": "4.14.2" + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.19.0.tgz", + "integrity": "sha512-UIzLHOkprUFzwFxqgw+TOhEG2usLv8q9l4V/Ul82IgNNO+g5RjENd5Sl/J6BU4BlRdMLy/OvPfbSc7Y1dOdwgA==", + "requires": { + "@algolia/cache-browser-local-storage": "4.19.0", + "@algolia/cache-common": "4.19.0", + "@algolia/cache-in-memory": "4.19.0", + "@algolia/client-account": "4.19.0", + "@algolia/client-analytics": "4.19.0", + "@algolia/client-common": "4.19.0", + "@algolia/client-personalization": "4.19.0", + "@algolia/client-search": "4.19.0", + "@algolia/logger-common": "4.19.0", + "@algolia/logger-console": "4.19.0", + "@algolia/requester-browser-xhr": "4.19.0", + "@algolia/requester-common": "4.19.0", + "@algolia/requester-node-http": "4.19.0", + "@algolia/transporter": "4.19.0" } }, "algoliasearch-helper": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz", - "integrity": "sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw==", + "version": "3.13.4", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.4.tgz", + "integrity": "sha512-2Vqu3ngJKe9w1cNLUNJML5TT/l+etnACASVgJ+HWiKhH6TrIYI2FFVcBi0lMTsdSpqTnv736ub7BYqUTavk0mA==", "requires": { "@algolia/events": "^4.0.1" } @@ -15108,12 +15166,12 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "autoprefixer": { - "version": "10.4.11", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.11.tgz", - "integrity": "sha512-5lHp6DgRodxlBLSkzHOTcufWFflH1ewfy2hvFQyjrblBFlP/0Yh4O/Wrg4ow8WRlN3AAUFFLAQwX8hTptzqVHg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "requires": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001399", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -15330,14 +15388,14 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" } }, "buffer-from": { @@ -15429,9 +15487,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001402", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001402.tgz", - "integrity": "sha512-Mx4MlhXO5NwuvXGgVb+hg65HZ+bhUYsz8QtDGDo2QmaJS2GBX47Xfi2koL86lc8K+l+htXeTEB/Aeqvezoo6Ew==" + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==" }, "ccount": { "version": "1.1.0", @@ -15730,9 +15788,9 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-text-to-clipboard": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", - "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==" }, "copy-webpack-plugin": { "version": "11.0.0", @@ -15845,11 +15903,11 @@ } }, "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "requires": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.12" } }, "cross-spawn": { @@ -15980,12 +16038,12 @@ } }, "cssnano-preset-advanced": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.8.tgz", - "integrity": "sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", "requires": { - "autoprefixer": "^10.3.7", - "cssnano-preset-default": "^5.2.12", + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", "postcss-discard-unused": "^5.1.0", "postcss-merge-idents": "^5.1.1", "postcss-reduce-idents": "^5.2.0", @@ -15993,24 +16051,24 @@ } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -16018,11 +16076,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -16239,13 +16297,13 @@ } }, "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "requires": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" } }, "dot-case": { @@ -16293,9 +16351,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.254", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz", - "integrity": "sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q==" + "version": "1.4.463", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz", + "integrity": "sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw==" }, "emoji-regex": { "version": "9.2.2", @@ -16326,9 +16384,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -16348,9 +16406,9 @@ } }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" }, "escalade": { "version": "3.1.1", @@ -16412,9 +16470,9 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eta": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", - "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==" }, "etag": { "version": "1.8.1", @@ -16612,9 +16670,9 @@ } }, "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", "requires": { "cross-fetch": "^3.1.5", "fbjs-css-vars": "^1.0.0", @@ -16622,7 +16680,7 @@ "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "ua-parser-js": "^1.0.35" } }, "fbjs-css-vars": { @@ -16721,9 +16779,9 @@ } }, "flux": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.3.tgz", - "integrity": "sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", + "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", "requires": { "fbemitter": "^3.0.0", "fbjs": "^3.0.1" @@ -16829,12 +16887,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -16869,9 +16921,9 @@ } }, "github-slugger": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", - "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" }, "glob": { "version": "7.2.3", @@ -17252,20 +17304,20 @@ } }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http-deceiver": { "version": "1.2.7", @@ -17380,9 +17432,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.42", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.42.tgz", - "integrity": "sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==" + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==" }, "inflight": { "version": "1.0.6", @@ -17683,9 +17735,9 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "6.1.0", @@ -17748,9 +17800,9 @@ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18084,9 +18136,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "requires": { "whatwg-url": "^5.0.0" } @@ -18097,9 +18149,9 @@ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" }, "normalize-path": { "version": "3.0.0", @@ -18320,9 +18372,9 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "requires": { "entities": "^4.4.0" } @@ -18466,22 +18518,22 @@ } }, "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -18537,20 +18589,20 @@ } }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -18575,11 +18627,11 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -18671,11 +18723,11 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -18714,11 +18766,11 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -18740,9 +18792,9 @@ } }, "postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", "requires": { "sort-css-media-queries": "2.1.0" } @@ -19019,9 +19071,9 @@ } }, "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" }, "locate-path": { "version": "6.0.0", @@ -19159,11 +19211,11 @@ } }, "react-textarea-autosize": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", - "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", "requires": { - "@babel/runtime": "^7.10.2", + "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" } @@ -19200,21 +19252,11 @@ } }, "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { - "minimatch": "3.0.4" - }, - "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - } + "minimatch": "^3.0.5" } }, "regenerate": { @@ -19231,9 +19273,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "regenerator-transform": { "version": "0.15.0", @@ -19666,6 +19708,12 @@ "ajv-keywords": "^3.5.2" } }, + "search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "peer": true + }, "section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -19759,36 +19807,28 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { "randombytes": "^2.1.0" } }, "serve-handler": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", - "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", "fast-url-parser": "1.1.3", "mime-types": "2.1.18", - "minimatch": "3.0.4", + "minimatch": "3.1.2", "path-is-inside": "1.0.2", "path-to-regexp": "2.2.1", "range-parser": "1.2.0" }, "dependencies": { - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "path-to-regexp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", @@ -20142,11 +20182,11 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -20240,12 +20280,12 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.1.tgz", + "integrity": "sha512-27hxBUVdV6GoNg1pKQ7Z5cbR6V9txPVyBA+FQw3BaZ1Wuzvztce5p156DaP0NVZNrMZZ+6iG9Syf7WgMNKDg2Q==", "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -20258,15 +20298,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "dependencies": { "schema-utils": { @@ -20398,9 +20438,9 @@ "peer": true }, "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==" }, "unherit": { "version": "1.1.3", @@ -20530,9 +20570,9 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -20697,6 +20737,12 @@ "use-isomorphic-layout-effect": "^1.1.1" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -20797,21 +20843,21 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -20820,9 +20866,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -20841,9 +20887,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", diff --git a/website/package.json b/website/package.json index c730d1fb7c..a3c7c8a12e 100644 --- a/website/package.json +++ b/website/package.json @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "2.1.0", - "@docusaurus/preset-classic": "2.1.0", + "@docusaurus/core": "2.4.1", + "@docusaurus/preset-classic": "2.4.1", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", @@ -24,7 +24,7 @@ "yarn": "^1.22.19" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.1.0" + "@docusaurus/module-type-aliases": "2.4.1" }, "browserslist": { "production": [ From f8344219b9ba5981d7cc5cb4fdff3ee97db8adda Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 19 Jul 2023 23:58:08 +0100 Subject: [PATCH 210/286] Config file linting --- roles/loki/templates/config.yml | 2 +- roles/promtail/templates/config.yml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/roles/loki/templates/config.yml b/roles/loki/templates/config.yml index 9a99ff3831..30f64ead7f 100644 --- a/roles/loki/templates/config.yml +++ b/roles/loki/templates/config.yml @@ -40,4 +40,4 @@ chunk_store_config: table_manager: retention_deletes_enabled: true - retention_period: {{ loki_log_retention }} \ No newline at end of file + retention_period: {{ loki_log_retention }} diff --git a/roles/promtail/templates/config.yml b/roles/promtail/templates/config.yml index 77cf9283f0..3ad16f2733 100644 --- a/roles/promtail/templates/config.yml +++ b/roles/promtail/templates/config.yml @@ -19,4 +19,3 @@ scrape_configs: - source_labels: ['__meta_docker_container_name'] regex: '/(.*)' target_label: 'container' - From 8b4755c78f328933daeaacbf325eb2ce4cbcae09 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Thu, 20 Jul 2023 00:03:28 +0100 Subject: [PATCH 211/286] Docs linting --- website/docs/applications/observability/grafana.md | 2 -- website/docs/applications/stacks/logging.md | 12 ++++++------ website/docs/applications/system-tools/loki.md | 2 +- website/docs/applications/system-tools/promtail.md | 6 +++--- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/website/docs/applications/observability/grafana.md b/website/docs/applications/observability/grafana.md index 1d7a73045c..5c8137df45 100644 --- a/website/docs/applications/observability/grafana.md +++ b/website/docs/applications/observability/grafana.md @@ -13,5 +13,3 @@ Query, visualize, alert on, and understand your data no matter where it’s stor Set `stats_enabled: true` in your `inventories//group_vars/nas.yml` file. Grafana's web interface can be found at . - - diff --git a/website/docs/applications/stacks/logging.md b/website/docs/applications/stacks/logging.md index 3eee7a76d6..d5e18293b2 100644 --- a/website/docs/applications/stacks/logging.md +++ b/website/docs/applications/stacks/logging.md @@ -6,13 +6,13 @@ The logging stack sets up a fully functional application logging capture and sea To enable it, add the following to your `inventories//group_vars/nas.yml`: -``` +```yaml logging_stack_enabled: true ``` Which is equivalent to: -``` +```yaml minio_enabled: true loki_enabled: true promtail_enabled: true @@ -23,7 +23,7 @@ Once set up, all container stdout logs will be captured and stored. You'll find Read more: - - [Grafana](../observability/grafana.md) - - [Loki](../system-tools/loki.md) - - [Minio](../system-tools/minio.md) - - [Promtail](../system-tools/promtail.md) +- [Grafana](../observability/grafana.md) +- [Loki](../system-tools/loki.md) +- [Minio](../system-tools/minio.md) +- [Promtail](../system-tools/promtail.md) diff --git a/website/docs/applications/system-tools/loki.md b/website/docs/applications/system-tools/loki.md index 4a2061a7eb..25c9ff569b 100644 --- a/website/docs/applications/system-tools/loki.md +++ b/website/docs/applications/system-tools/loki.md @@ -14,6 +14,6 @@ Set `loki_enabled: true` in your `inventories//nas.yml` file. Loki doesn't have a web interface. To see what it's doing look at the container logs from your Ansible-NAS shell: -``` +```bash docker logs loki -f ``` diff --git a/website/docs/applications/system-tools/promtail.md b/website/docs/applications/system-tools/promtail.md index c6682531bd..5140426355 100644 --- a/website/docs/applications/system-tools/promtail.md +++ b/website/docs/applications/system-tools/promtail.md @@ -10,9 +10,9 @@ Promtail is an agent which ships the contents of local logs to a private Grafana It primarily: - - Discovers targets - - Attaches labels to log streams - - Pushes them to the Loki instance. +- Discovers targets +- Attaches labels to log streams +- Pushes them to the Loki instance. ## Usage From f0965e630f6293c5a6e2ae835049151399cd0d67 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Thu, 20 Jul 2023 23:47:33 +0100 Subject: [PATCH 212/286] Add DDNS Updater --- README.md | 1 + nas.yml | 4 ++ roles/ddns_updater/defaults/main.yml | 40 ++++++++++++++ roles/ddns_updater/tasks/main.yml | 54 +++++++++++++++++++ .../applications/system-tools/ddns_updater.md | 44 +++++++++++++++ 5 files changed, 143 insertions(+) create mode 100644 roles/ddns_updater/defaults/main.yml create mode 100644 roles/ddns_updater/tasks/main.yml create mode 100644 website/docs/applications/system-tools/ddns_updater.md diff --git a/README.md b/README.md index 621915ae2e..c2ac174cf9 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ If you have a spare domain name you can configure applications to be accessible * [Cloudflare DDNS](https://hub.docker.com/r/joshuaavalon/cloudflare-ddns/) - automatically update Cloudflare with your IP address * [CouchPotato](https://couchpota.to/) - for downloading and managing movies * [Dashy](https://dashy.to/) - A self-hosted startpage for your server. Easy to use visual editor, status checking, widgets, themes and tons more! +* [DDNS Updater](https://github.com/qdm12/ddns-updater) - dynamic dns updater for serveral providers * [Deluge](https://dev.deluge-torrent.org/) - A lightweight, Free Software, cross-platform BitTorrent client. * [DokuWiki](https://www.dokuwiki.org/) - A simple to use and highly versatile Open Source wiki software that doesn't require a database. * [Drone CI](https://drone.io) - A self-service Continuous Integration platform for busy development teams. diff --git a/nas.yml b/nas.yml index 742a9bf479..d5680f2a05 100644 --- a/nas.yml +++ b/nas.yml @@ -98,6 +98,10 @@ tags: - dashy + - role: ddns_updater + tags: + - ddns_updater + - role: deluge tags: - deluge diff --git a/roles/ddns_updater/defaults/main.yml b/roles/ddns_updater/defaults/main.yml new file mode 100644 index 0000000000..07dc26fe5e --- /dev/null +++ b/roles/ddns_updater/defaults/main.yml @@ -0,0 +1,40 @@ +--- +ddns_updater_enabled: false +ddns_updater_available_externally: "false" + +# directories +ddns_updater_data_directory: "{{ docker_home }}/ddns_updater" + +# network +ddns_updater_port: 8202 +ddns_updater_hostname: "ddns-updater" + +# docker +ddns_updater_container_name: ddns_updater + +# specs +ddns_updater_memory: 1g + +# gotify +# ddns_updater_gotify_token: "token" +# gotify_url: "https://gotify.{{ ansible_nas_domain }}" + +# DDNS Updater Config +# Period of IP address check +ddns_updater_period: 5m + +# Duration to cooldown between updates for each record. This is useful to avoid being rate limited or banned. +ddns_updater_cooldown_period: 5m + +# Timeout for all HTTP requests +ddns_updater_http_timeout: 10s + +# ddns_updater_config describes the content of the config.json used to configure the updater. +# see https://github.com/qdm12/ddns-updater#configuration for more info +# +# ddns_updater_config: +# settings: +# - provider: namecheap +# domain: example.com +# host: "@" +# password: e5322165c1d74692bfa6d807100c0310 diff --git a/roles/ddns_updater/tasks/main.yml b/roles/ddns_updater/tasks/main.yml new file mode 100644 index 0000000000..e00dbba710 --- /dev/null +++ b/roles/ddns_updater/tasks/main.yml @@ -0,0 +1,54 @@ +--- +- name: Start DDNS Updater + block: + - name: Create DDNS Updater Directories + ansible.builtin.file: + path: "{{ ddns_updater_data_directory }}" + state: directory + + - name: Check config is defined + ansible.builtin.fail: + msg: "Please configure DDNS Updater by setting ddns_updater_config in your inventory nas.yml." + when: ddns_updater_config is not defined + + - name: Generate config.json + ansible.builtin.copy: + content: "{{ ddns_updater_config | to_nice_json }}" + dest: "{{ ddns_updater_data_directory }}/config.json" + register: ddns_updater_config + + - name: DDNS Updater Container + community.docker.docker_container: + name: "{{ ddns_updater_container_name }}" + image: qmcgaw/ddns-updater:latest + pull: true + ports: + - "{{ ddns_updater_port }}:8000" + volumes: + - "{{ ddns_updater_data_directory }}:/updater/data:rw" + env: + TZ: "{{ ansible_nas_timezone }}" + GOTIFY_TOKEN: "{{ ddns_updater_gotify_token | default('') }}" + GOTIFY_URL: "{{ gotify_url | default('') }}" + PERIOD: "{{ ddns_updater_period }}" + UPDATE_COOLDOWN_PERIOD: "{{ ddns_updater_cooldown_period }}" + HTTP_TIMEOUT: "{{ ddns_updater_http_timeout }}" + restart_policy: unless-stopped + restart: "{{ ddns_updater_config is changed }}" + memory: "{{ ddns_updater_memory }}" + labels: + traefik.enable: "{{ ddns_updater_available_externally }}" + traefik.http.routers.airsonic.rule: "Host(`{{ ddns_updater_hostname }}.{{ ansible_nas_domain }}`)" + traefik.http.routers.airsonic.tls.certresolver: "letsencrypt" + traefik.http.routers.airsonic.tls.domains[0].main: "{{ ansible_nas_domain }}" + traefik.http.routers.airsonic.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" + traefik.http.services.airsonic.loadbalancer.server.port: "8000" + when: ddns_updater_enabled is true + +- name: Stop DDNS Updater + block: + - name: Stop DDNS Updater + community.docker.docker_container: + name: "{{ ddns_updater_container_name }}" + state: absent + when: ddns_updater_enabled is false diff --git a/website/docs/applications/system-tools/ddns_updater.md b/website/docs/applications/system-tools/ddns_updater.md new file mode 100644 index 0000000000..19b7d35f04 --- /dev/null +++ b/website/docs/applications/system-tools/ddns_updater.md @@ -0,0 +1,44 @@ +--- +title: "DDNS Updater" +--- + +Lightweight universal DDNS Updater with a web UI. + +Homepage: [https://github.com/qdm12/ddns-updater](https://github.com/qdm12/ddns-updater) + +Light container updating DNS A and/or AAAA records periodically for multiple DNS providers. + +## Usage + +Set `ddns_updater_enabled: true` in your `inventories//group_vars/nas.yml` file. + +## Specific Configuration + +Ensure that the `ddns_updater_config` variable is set with your DDNS Updater configuration. The configuration is converted from YAML into JSON, required by the DDNS Updater application. Use [json2yaml](https://www.json2yaml.com/) to check your configuration format. + + +The following configuration: + +```yaml +ddns_updater_config: + settings: + - provider: namecheap + domain: example.com + host: "@" + password: e5322165c1d74692bfa6d807100c0310 +``` + +...will be serialised to: + +```json +{ + "settings": [ + { + "provider": "namecheap", + "domain": "example.com", + "host": "@", + "password": "e5322165c1d74692bfa6d807100c0310" + } + ] +} +``` From a3d6781bfc63e6336f26d248c0d9d7423c648dd6 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Wed, 26 Jul 2023 22:24:21 +0100 Subject: [PATCH 213/286] Flip gitea back to links so it's on the main docker network --- roles/gitea/tasks/main.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/roles/gitea/tasks/main.yml b/roles/gitea/tasks/main.yml index 9dead7e2bc..3801c8bbf6 100644 --- a/roles/gitea/tasks/main.yml +++ b/roles/gitea/tasks/main.yml @@ -10,18 +10,11 @@ - "{{ gitea_data_directory }}/gitea" - "{{ gitea_data_directory }}/mysql" - - name: Create gitea network - community.docker.docker_network: - name: "{{ gitea_network_name }}" - - name: Create MySQL container for Gitea community.docker.docker_container: name: "{{ gitea_mysql_container_name }}" image: "{{ gitea_mysql_image_name }}:{{ gitea_mysql_image_version }}" pull: true - networks: - - name: "{{ gitea_network_name }}" - network_mode: "{{ gitea_network_name }}" volumes: - "{{ gitea_data_directory }}/mysql:/var/lib/mysql:rw" env: @@ -37,17 +30,16 @@ name: "{{ gitea_container_name }}" image: "{{ gitea_image_name }}:{{ gitea_image_version }}" pull: true - networks: - - name: "{{ gitea_network_name }}" - network_mode: "{{ gitea_network_name }}" volumes: - "{{ gitea_data_directory }}/gitea:/data:rw" ports: - "{{ gitea_port_http }}:3000" - "{{ gitea_port_ssh }}:22" + links: + - gitea-mysql:db env: DB_TYPE: "mysql" - DB_HOST: "{{ gitea_mysql_container_name }}:3306" + DB_HOST: "db:3306" DB_NAME: "gitea" DB_USER: "gitea" DB_PASSWD: "gitea" From 26508c3c7b03004208af9948726c01d731c974dd Mon Sep 17 00:00:00 2001 From: Alex Mills <96640492+AlexMills0@users.noreply.github.com> Date: Thu, 17 Aug 2023 20:11:03 +1000 Subject: [PATCH 214/286] Replace deprecated extension There was a warning appearing in VSCode regarding a deprecated extension. I have resolved the issue by replacing the deprecated extension with the alternative suggested by VSCode. --- .vscode/extensions.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 4586e1a484..993d74a7e0 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,7 +2,7 @@ "recommendations": [ "redhat.ansible", "redhat.vscode-yaml", - "ybaumes.highlight-trailing-white-spaces", - "bungcip.better-toml" + "tamasfe.even-better-toml", + "ybaumes.highlight-trailing-white-spaces" ] } From 4eb1105b476ffde0118730df1e8d2f0d391eb35d Mon Sep 17 00:00:00 2001 From: David Stephens Date: Mon, 28 Aug 2023 22:40:47 +0100 Subject: [PATCH 215/286] Fixes Wrong loadbalancer port in `hello_world` example? #671 --- roles/hello_world/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/hello_world/tasks/main.yml b/roles/hello_world/tasks/main.yml index 7b1d8e3b1d..3d5cb8e399 100644 --- a/roles/hello_world/tasks/main.yml +++ b/roles/hello_world/tasks/main.yml @@ -25,7 +25,7 @@ traefik.http.routers.hello_world.tls.certresolver: "letsencrypt" traefik.http.routers.hello_world.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.hello_world.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.hello_world.loadbalancer.server.port: "4040" + traefik.http.services.hello_world.loadbalancer.server.port: "8000" when: hello_world_enabled is true - name: Stop Hello World From ec015454aabaa7592523df53c2ea8603eb634a8f Mon Sep 17 00:00:00 2001 From: Yevhen D Date: Thu, 31 Aug 2023 16:55:46 +0200 Subject: [PATCH 216/286] Update LICENSE year to 2023 Updated the license year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index d9a3133e5e..0a7478725c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017-2022 David Stephens +Copyright (c) 2017-2023 David Stephens Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From b27e41e156c8fd9ffdf88ab2b90157a2dc55af4b Mon Sep 17 00:00:00 2001 From: Jaimes Booth Date: Wed, 20 Sep 2023 21:17:39 +1200 Subject: [PATCH 217/286] Update Komga port 25600 Change Komga port to match Komga's new default of 25600: https://komga.org/docs/installation/docker --- roles/komga/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/roles/komga/tasks/main.yml b/roles/komga/tasks/main.yml index 1c1ae34f2f..82f87616be 100644 --- a/roles/komga/tasks/main.yml +++ b/roles/komga/tasks/main.yml @@ -22,7 +22,7 @@ - "{{ komga_data_directory }}/config:/config:rw" network_mode: "bridge" ports: - - "{{ komga_port_http }}:8080" + - "{{ komga_port_http }}:25600" env: TZ: "{{ ansible_nas_timezone }}" PUID: "{{ komga_user_id }}" @@ -35,7 +35,7 @@ traefik.http.routers.komga.tls.certresolver: "letsencrypt" traefik.http.routers.komga.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.komga.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.komga.loadbalancer.server.port: "8080" + traefik.http.services.komga.loadbalancer.server.port: "25600" when: komga_enabled is true - name: Stop Komga From 44f26faa6efb2685fadd0f88fee0ec66812d270f Mon Sep 17 00:00:00 2001 From: Chao Date: Tue, 24 Oct 2023 22:49:57 +0200 Subject: [PATCH 218/286] Fixed deluge download volume bug. --- roles/deluge/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roles/deluge/tasks/main.yml b/roles/deluge/tasks/main.yml index 16cd3fa966..7c0284f7b8 100644 --- a/roles/deluge/tasks/main.yml +++ b/roles/deluge/tasks/main.yml @@ -16,7 +16,7 @@ pull: true volumes: - "{{ deluge_config_directory }}:/config:rw" - - "{{ deluge_download_directory }}:/root/Downloads:rw" + - "{{ deluge_download_directory }}:/downloads:rw" ports: - "{{ deluge_port }}:8112" env: From 2ac93e4a2de06de87899c9e80063983dcb0314c3 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 12 Nov 2023 21:49:24 +0000 Subject: [PATCH 219/286] Fixes #628 --- roles/syncthing/tasks/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/roles/syncthing/tasks/main.yml b/roles/syncthing/tasks/main.yml index a9fc6f2bf1..38f98e0a11 100644 --- a/roles/syncthing/tasks/main.yml +++ b/roles/syncthing/tasks/main.yml @@ -15,8 +15,9 @@ pull: true ports: - "{{ syncthing_port }}:8384" - - "22000:22000/tcp" + - "21027:21027/udp" - "22000:22000/udp" + - "22000:22000/tcp" env: PUID: "{{ syncthing_user_id }}" PGID: "{{ syncthing_group_id }}" From 9931de57f8201789c0b688223a8c04653191fd92 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 12 Nov 2023 22:34:23 +0000 Subject: [PATCH 220/286] Add LazyDocker, fixes #122 --- roles/ansible-nas-general/tasks/main.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/roles/ansible-nas-general/tasks/main.yml b/roles/ansible-nas-general/tasks/main.yml index fa0e126e79..b12eb11347 100644 --- a/roles/ansible-nas-general/tasks/main.yml +++ b/roles/ansible-nas-general/tasks/main.yml @@ -26,7 +26,13 @@ register: result until: result is succeeded -# - name: Configure smartmontools +- name: Install LazyDocker + ansible.builtin.shell: + cmd: curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash + args: + creates: /usr/local/bin/lazydocker + environment: + DIR: /usr/local/bin - name: "Set hostname to {{ ansible_nas_hostname }}" ansible.builtin.hostname: From b00c2e2917c7cd45b5aec10479b095fbea15a527 Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 12 Nov 2023 22:55:55 +0000 Subject: [PATCH 221/286] Fix Komga port --- roles/komga/tasks/main.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/roles/komga/tasks/main.yml b/roles/komga/tasks/main.yml index 1c1ae34f2f..16694f3b8c 100644 --- a/roles/komga/tasks/main.yml +++ b/roles/komga/tasks/main.yml @@ -5,7 +5,6 @@ ansible.builtin.file: path: "{{ item }}" state: directory - # mode: 0755 with_items: - "{{ komga_data_directory }}" - "{{ komga_data_directory }}/config" @@ -22,7 +21,7 @@ - "{{ komga_data_directory }}/config:/config:rw" network_mode: "bridge" ports: - - "{{ komga_port_http }}:8080" + - "{{ komga_port_http }}:25600" env: TZ: "{{ ansible_nas_timezone }}" PUID: "{{ komga_user_id }}" @@ -35,7 +34,7 @@ traefik.http.routers.komga.tls.certresolver: "letsencrypt" traefik.http.routers.komga.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.komga.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" - traefik.http.services.komga.loadbalancer.server.port: "8080" + traefik.http.services.komga.loadbalancer.server.port: "25600" when: komga_enabled is true - name: Stop Komga From 545d0252aa011eaa6b79801e865500889513495c Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 12 Nov 2023 23:07:33 +0000 Subject: [PATCH 222/286] Update install instructions to mention not installing Docker --- website/docs/getting-started/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/getting-started/installation.md b/website/docs/getting-started/installation.md index 10e7e20c21..8aaab400e1 100644 --- a/website/docs/getting-started/installation.md +++ b/website/docs/getting-started/installation.md @@ -9,7 +9,7 @@ Ansible-NAS is an Ansible playbook that sets up applications of your choice on y ## Requirements - A Linux environment with Ansible installed (in Ansible terms the "control node"). See the official [Installing Ansible](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) docs for more info. -- SSH access to an Ubuntu 22.04 server that'll become your Ansible-NAS box. It's recommended to use a fresh Ubuntu Server 22.04 installation. Do not use non-LTS releases. +- SSH access to an Ubuntu 22.04 server that'll become your Ansible-NAS box. It's recommended to use a fresh Ubuntu Server 22.04 installation. Do not use non-LTS releases. Do not install Docker during the Ubuntu installation. :::tip From 248f418a5014b5f15bed5d6dbd86ba2fa0e6b5ab Mon Sep 17 00:00:00 2001 From: David Stephens Date: Sun, 12 Nov 2023 23:11:24 +0000 Subject: [PATCH 223/286] Not using mkdocs --- mkdocs.yml | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index b677c9e0db..0000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -# Project information -site_name: 'Ansible-NAS' -site_description: 'Build a fully functional NAS with an Ubuntu box and this playbook' -site_author: 'David Stephens' -site_url: 'https://davestephens.uk/ansible-nas' - -# Configuration -theme: - name: 'material' - language: 'en' - palette: - primary: 'indigo' - accent: 'indigo' - font: - text: 'Roboto' - code: 'Roboto Mono' - - -# Repository -repo_name: 'davestephens/ansible-nas' -repo_url: 'https://github.com/davestephens/ansible-nas' - -# Copyright -copyright: 'Copyright © 2017 - 2022 David Stephens' - -# Customization -extra: - manifest: 'manifest.webmanifest' - social: - - icon: 'fontawesome/brands/github-alt' - link: 'https://github.com/davestephens' From e73bd60569c4b18346e2bd49ae6bbd2aff770e9a Mon Sep 17 00:00:00 2001 From: Primoz Cankar Date: Sat, 23 Sep 2023 15:53:01 +0200 Subject: [PATCH 224/286] portainer: option to set whielisted ips in traefik --- roles/portainer/defaults/main.yml | 1 + roles/portainer/tasks/main.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/roles/portainer/defaults/main.yml b/roles/portainer/defaults/main.yml index e5dd813898..be0522f4e1 100644 --- a/roles/portainer/defaults/main.yml +++ b/roles/portainer/defaults/main.yml @@ -8,6 +8,7 @@ portainer_data_directory: "{{ docker_home }}/portainer/config" # network portainer_port: "9000" portainer_hostname: "portainer" +portainer_ip_whitelist: "0.0.0.0/0" # docker portainer_container_name: "portainer" diff --git a/roles/portainer/tasks/main.yml b/roles/portainer/tasks/main.yml index cf0c387603..e6f690cc01 100644 --- a/roles/portainer/tasks/main.yml +++ b/roles/portainer/tasks/main.yml @@ -28,6 +28,8 @@ traefik.http.routers.portainer.tls.domains[0].main: "{{ ansible_nas_domain }}" traefik.http.routers.portainer.tls.domains[0].sans: "*.{{ ansible_nas_domain }}" traefik.http.services.portainer.loadbalancer.server.port: "9443" + traefik.http.routers.portainer.middlewares: "portainer-ipwhitelist@docker" + traefik.http.middlewares.portainer-ipwhitelist.ipwhitelist.sourcerange: "{{ portainer_ip_whitelist }}" when: portainer_enabled is true - name: Stop Portainer From 6b743dc4db43313d9768e2e60dcf064c3f45fc3c Mon Sep 17 00:00:00 2001 From: Anarion Date: Sun, 26 Nov 2023 10:37:14 +0100 Subject: [PATCH 225/286] Update branch references from master to main --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/docs-deploy.yml | 2 +- .github/workflows/docs-test.yml | 2 +- README.md | 2 +- website/docs/upgrading.md | 2 +- website/docusaurus.config.js | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0c43cd7cc4..07b036a223 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,6 @@